- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
#include <iostream>
using namespace std;
void f(int i)
{
cout << "----" << endl;
void *array[] = { &&foo, &&bar, &&baz };
goto *array[i];
foo:
cout << "Foo" << endl;
bar:
cout << "Bar" << endl;
baz:
cout << "Baz" << endl;
}
int main() {
// your code goes here
f(0);
f(1);
f(2);
return 0;
}
Я не знал что это gcc only, потому не понял к чему вообще.
http://ideone.com/7CEueK
Расшифровка: DB 0BAH + XOR DX,DX = MOV DX, 0D233h. А дальше будет проверка DX на равенство нулю: http://govnokod.ru/13242
Скажите, Борланд правда думал что именно это боттлнек?
Типа "а как же еще"?
P.S. И ведь оно абсолютно бессмысленно, т.к. сам assign подразумевает последующее чтение с диска и т.п., по сравнению с которым один единственный jmp не был бы заметен.
другого способа заставить компилятор соптимизировать switch/case через таблицу переходов не существует.
сам никогда не пользовался, но видел что пользуются этой фичей в паре интерпретаторов.
В фортране уже было.
Гораздо удобнее же было бы написать что-нибудь вроде Без необходимости переписывать весь код на компиляторо-зависимое говно.
А switch разве не за O(1)?
код со страницы 14.
на странице 15 про вычисление адреса:
> Да, строка 7 также не может быть сдвинута. Переход на неё осуществляется из строки 15, и её номер семь вычисляется через длину строковой переменной, в которой хранится картинка шипов. На которых и происходит смерть. Шипы высотой 3 пикселя (строка 38), поэтому позиционирование на шипах ведёт к переходу на 4+3 (строка 15) строку.
Радует, что здесь переход к номеру строки, а не к адресу в памяти. Тут хотя бы тяжёлое зависание и крах системы не грозит, в отличие от той же сишки, где повсюду адресная арифметика.
Кстати, в QB была команда CALL ABSOLUTE, которая позволяла прыгнуть на произвольный адрес памяти.
Доки по асму у нас не было (у учителей в шкафу где-то были книжки от него, но нам спрашивать было лень), поэтому мы развлекались, записывая в случайные ячейки памяти случайные числа.
Я так нашел регистры управления видеочипом и джойстиком и даже разобрался с ними... Ну и полный список команд бейсика вытряс, листая дамп памяти.
Благо, в реальном режиме это можно было сделать.
P.S. Оставлю здесь для истории: http://govnokod.ru/13162
Вот тут говорят товарищи что это дескать сильно быстрее и потому вот так.
Но если они это знают, то почему это не может знать компилятор и почему нельзя ввести в си какую-то конструкцию которая выглядела бы как няшечка, а внутри гоутушничала бы по разным адресам.
В реальном режиме, особенно когда код писался в tiny mode (или как там режим когда один сегмент был) такая практика встречалась куда чаще.
Кстати, был еще режим когда сегменты были, а страниц не было (тоесть он protected, но без страниц и свапа соответственно). Кажется, он был в 286, ни одна ОС его не использовала, и он почил в бозе.
Только этот режим тоже не использовался, потому что программа, завязанная на него, не будет работать в виртуальном режиме (из Windows, например).
Но это же какой-то дикий хак был, я даже не уверен что это где-то документировано интелом. Кошернее было переключаца на время программы в протектед мод. Dos4GW жеж!
Несмотря на это, в ДОСе слишком долго эксплуатировались программы, использующие оперативку через дикие костыли типа XMS и EMS, позволяющие за пределами первого мегабайта размещать только данные. А некоторые и этого не умели. Ага, 640 к хватит всем.
И были всякие удлиннялки вроде EMM386 и himem.sys которые выталкивали туда TSRки, и у меня в config.sys было прописано несколько конфигов: полный и минимальный, потому что если загрузить драйвер мышки, русификатор клавиатуры и драйвер звука и сидирома то гоблины уже не запускались ввиду отсутствия памяти)
История IBM PC это вообще сплошные костыли, чего стоит только Gate A20)
Посчитай, сколько лет переходили со свиньи на семерку, сколько лет добавляли поддержку юникода в программы, когда его уже полностью поддерживала как минимум NT4.
>И были всякие удлиннялки вроде EMM386 и himem.sys которые выталкивали туда TSRки, и у меня в config.sys было прописано несколько конфигов: полный и минимальный, потому что если загрузить драйвер мышки, русификатор клавиатуры и драйвер звука и сидирома то гоблины уже не запускались ввиду отсутствия памяти)
Хорошо что я это не застал.
Переходили? :)
слава путину там хотя бы работают современные браузеры
Кстати ничего стращного в древних компах не было. ОС были проще и тупее, всё было понятно, никаких тебе реинсталлов)
Причем в IA-32e (который x64) этот режим и вовсе отключили за ненадобностью. Только страницы, никаких сегментов.
Злые языки вообще говорят что сегменты изобрели чтоб адресовать память с помощью двух регистров (в один не влезало же), но я верю что интел придумал их чтоб программисту удобнее было разделять куски памяти под разные нужды.
Но ведь это так и было ;)
https://github.com/bormand/tryos/blob/master/src/bootcode/kernelloader.asm
На страницы и свап мне тогда запала не хватило ;)
да, со страницами там же надо таблицы загружать, page fault обрабатывать итд.
Эх, давно это было... я еще вижуалку юзал. Этот код изначально то ли 2003 то ли 2005й вижуалкой собирался. А вместо мейкфайла был угрёбищный батник и vcproj для transform'а и kernel'а.
Это уже недавно, когда на гитхаб выкладывал, запилил makefile под vs 2012 да повыкидывал нафиг все sln/vcproj. Под gcc портировать было лень, т.к. transform перепиливать пришлось бы чуть более чем полностью. Да и ненужно это никому, разве что почитать, посмеяться над моей тогдашней наивностью...
А как же менеджились депенденсы? Или каждый раз все модули пересобирались?
Вообще подобные сюрпризы встречаются тут и там.
Например взял я как-то библиотеку lettuce для python. А там процесс сборки и тестирования пострен на шелл скриптах. Очень удобно под виндой запускать!
Хорошо обстоят дела только в дотнете (их sln/proj прекрасно собирается msbuild, прямо с консоли) и наверное в android studio: их скрипты на gradle отлично синкаются с .idea (или как там папка проекта называется). Но там, все таки, депенденсы руками не прописывают же)
У них там баг есть. Если в в папке солюшена находится папка, имя которой начинается с пробела, и мы на неё ссылаемся. Вижак скомпилирует верно, а msbuild сделает трим. По крайней мере так с 2010й было.
Например, юзал я одну http библиотеку для питона, обертку для pycurl. Однажды я поставил другую библиотеку, которая обновила первую, и внезапно оказалось, что бинарник pycurl, лежащий на сайте этой библиотеки, скомпилирован без поддержки gzip, а сама библиотека хочет эту поддержку. Т.е. библиотека не фурычит с бинарным модулем, лежащим на ее же сайте и у меня в одно мгновение перестали работать все проги, юзавшие http. Питон на венду срал и будет срать, одно то, что он юникод в консоли до сих пор не поддерживает уже о чем-то должно говорить.
Сишные проги пересобирались ручками из вижуалки. А асмовские модули компилились быстро и батник пересобирал их целиком.
Фаулер бы Вас проклял!
Да его и сейчас без студии не собрать. Я не пробовал под mingw, но скорее всего трансформ не отработает.
P.S. А, без запуска студии... Да мне в те дни на это было вообще насрать: как-то собирается - и то хорошо. Студенчество же :)
Пошёл на хуй, выродок.
И на него из этой консоли упал кирпич... Да, это всё объясняет.
Нет, это когда балка одним концом закреплена.
(Вообще, само по себе слово "консоль" значит "подставка", т.е. пюпитр тоже своего рода консоль, или канделябр, который на рояль ставят - в том смысле, что он поддерживает что-то чем освещают, например).
> с волютами
Учил кто-нибудь экономику, комментарии оставлял в разделе про 1С, а тут вдруг зашёл в C++ и валюты какие-то на колоннах увидел.
"Вот жеж тупые ахретехторы - всю валюту в колонны пустили!"
P.S. Вспомнил, как после паскаля вместо else на автомате дописывал "end". Да и после отладки распечатыванием в голову впечатывается writeln/printf/std::cout/console.log.
Мне кажется, или просто так переписывать код в рантайме вообще не самая лучшая идея?)))
Просто окружение (язык и пр) могут явно НЕ поощрять какие-то вещи, а могут быть к ним индифферентными.
Вот НЕ tiny mode не поощряет, protected mode еще больше НЕ поощряет, а tiny mode индифферентен:)
FFTW - очень хороший пример селф-тюнинга.
>И даже в Паскале нет.
Паскаль не показатель. Он алголоподобный.
Бейсик же произошёл от немного другого языка, а в фортране оно изначально было.
Кстати, а RustGovno и ClayGovno у нас уже были?
Просто не всем кажется верным вытарчивать в более высокоуровневые языки столь низкими вещами
---
>> jmp принимать как аргумент не только константы?
Наверное Вы хотели сказаать "не только литерал может быть операндом JMP"