1. C++ / Говнокод #17093

    +50

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 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;
    }

    http://ideone.com/63tRls
    gcc extension

    Запостил: DlangGovno, 10 Ноября 2014

    Комментарии (108) RSS

    • Ну так это же скелет наверное?
      Ответить
    • А прыжок в середину инструкции (на CISC-процессоре) так сделать можно?
      Ответить
      • Можно, это ж обычный указатель. Но не нужно, т.к. хрен знает, куда там надо прыгать. Разве что в асм блок.

        http://ideone.com/7CEueK
        Ответить
      • Регистр EIP (или как там его) можно ткнуть куда угодно, но это троллейбус из буханки же
        Ответить
        • Троллейбус компании Борманд Борланд:
          ; Assign standard procedure (PChar)
          AssignFileC:
          	DB	0BAH			;MOV DX,immed
          ; Assign standard procedure (String)
          AssignFile:
          	XOR	DX,DX

          Расшифровка: DB 0BAH + XOR DX,DX = MOV DX, 0D233h. А дальше будет проверка DX на равенство нулю: http://govnokod.ru/13242
          Ответить
          • Я представил себе мир, в котором среди асемблерщиков высшим шиком считается написать часто программы прямо в кодах, посредством DB. Потом нубы их спрашивают "а что это такое?", а они (голосом усталого перловика) объясняют что быстрее написать код, чем мнемонику.
            Ответить
          • Это пиздец. Просто сокровище. Я про такое и не слыхивал!
            Ответить
            • Ещё немного золота:
              ; Rename standard procedure (PChar)
              
              RenameFileC:
              
              	DB	0BAH			;MOV DX,immed
              
              ; Rename standard procedure (String)
              
              RenameFile:
              
              	ARG	FileP,DWORD,1
              	ARG	NameP,DWORD,1
              	LOC	NewName,BYTE,80
              
              	XOR	DX,DX
              	ENTRY	FAR
              Ответить
              • Зачем они байтоёбят в заведомо медленных функциях? Или там такой код во всех-всех-всех функциях?
                Ответить
                • Не во всех. Только в медленных, чтобы они были быстрее. В более новых библиотеках (начиная с Delphi 3 или 2) такой точки входа уже нет: там строки перед вызовом файловых функций автоматически приводятся к нехорошему ASCIIZ.
                  Ответить
                  • 20% кода занимает 80% времени, потому оптимизировать надо только то, что действительно боттлнек.

                    Скажите, Борланд правда думал что именно это боттлнек?
                    Ответить
                    • Увы, Борланд мне не сообщил, что он думал... Осмелюсь предположить, что в Борланде (по крайней мере, тогда) писать по-другому не умели.
                      Ответить
                      • ))тоесть для них такая вот байтоебская оптимизация так же естественна как для нас код-стайл использовать?

                        Типа "а как же еще"?
                        Ответить
          • Вот оно, байтоёбство моей мечты!

            P.S. И ведь оно абсолютно бессмысленно, т.к. сам assign подразумевает последующее чтение с диска и т.п., по сравнению с которым один единственный jmp не был бы заметен.
            Ответить
    • я не С++ программист, но в с++ разве нельзя просто использовать switch(int i) или аналог?
      Ответить
      • можно, это просто древнее извращение.
        Ответить
        • не такое уж и древнее.

          другого способа заставить компилятор соптимизировать switch/case через таблицу переходов не существует.

          сам никогда не пользовался, но видел что пользуются этой фичей в паре интерпретаторов.
          Ответить
          • >не такое уж и древнее.
            В фортране уже было.
            Ответить
            • но в С этого нету. только как расширение в гцц.
              Ответить
              • А в гцц это когда появилось? Вряд ли недавно.
                Ответить
                • Борманд как-то говорил, что это эта фича бородата как Керниган, и тянется с первых ревизий сишки. Её просто в стандарт не включили.
                  Ответить
                • где-то в 2.х версиях. в 1.х не было.
                  Ответить
            • какой-то ты старый
              Ответить
    • FYI: http://eli.thegreenplace.net/2012/07/12/computed-goto-for-efficient-dispatch-tables
      Ответить
    • Прав был Тарас. Директивы компилятора нужны.
      Гораздо удобнее же было бы написать что-нибудь вроде
      #pragma GCC optimize_switch_as_goto_table
      Без необходимости переписывать весь код на компиляторо-зависимое говно.
      Ответить
      • >optimize_switch_as_goto_table
        А switch разве не за O(1)?
        Ответить
        • O(1) бывает разный. Вон там по ссылке +15-20% пирфоманса насчитали.
          Ответить
          • По ссылке показали два неэквивалентных кода. Там сигсегвом пахнет.
            Ответить
            • Из-за отсутствия default ветки? да, мне это тоже не понравилось. С другой стороны, можно валидацию байткода делать при его загрузке, тогда это оправдано.
              Ответить
          • Кстати, когда-то я в институте писал парсер/вычислитель формул. И вот там виртуальный eval() у узлов дерева, внезапно, оказался быстрее, чем свич. Наверное как раз из-за этой проверки.
            Ответить
    • ON...GOTO из Бейсика, теперь и в C++!
      Ответить
      • Это совсем не то. В Бейсике нет перехода на переменную метку. И даже в Паскале нет.
        Ответить
        • в Бейсике есть вычисление адреса перехода
          Ответить
          • Пример кода не покажете?
            Ответить
            • 1 GOSUB 94: A=3.4
              2 I=0: GOSUB 30: B=1: I=A: FOR A=0 TO 9 STEP 3: GOTO 18
              3 NEXT A: A=I: I=9: GOTO 9
              //
              4 I=1: C=0: GOTO 70
              5 GOTO 8
              6 H=G: C=0: GOTO 2
              7 PRINT "Died": END
              8 I=ASCI KEY: IF I=0 THEN 8: IF I<55; C=.2: IF I=52; C=-C
              9 D=J: B=8: IF I=56; D=15: I=-1: IF 0=LEN T$(8+A) THEN 70: I=1.7
              10 FOR E=A TO F=A+C*D STEP C+.1: IF 3=LEN T$(8+E) THEN 8: NEXT E: GOTO 16
              //
              15 IF A=F THEN 4+LEN V$(18+A): IF I<J; A=A+C: B=B+I: I=I-.566
              16 A=A+C: IF J<=ABS(A-J); A=9.4-.9*INT A: G=G+C: GOTO 2
              18 E=J*FRAC A: CSR A: FOR D=A+16 TO A+18: $=L$+V$(E)+L$
              19 LETC K$(D)+ MID(B+LEN K$(D),7-LEN K$(D)-LEN W$(D)) +W$(D)
              20 PRINT K$;: E=E-J: NEXT D: IF B>1 THEN 15: GOTO 3
              //
              30 GOSUB G: D=D(J*FRAC G): FOR F=29 TO 18 STEP -1: $="V": E$=$
              31 D=D*.1: GOSUB 34+10*FRAC D: IF I>=0; I$(F)=$
              32 IF I<=0; U$(F)=E$
              33 NEXT F
              34 RETURN
              35 E$="": RETURN
              36 GOSUB 35
              37 $="": RETURN
              38 E$="KLV": RETURN
              39 IF H=G THEN 34: E$="VH": RETURN
              40 IF 2=ABS(H-G); RETURN
              41 $="VEE": E$="EEEV": RETURN
              42 $="V4LE": RETURN
              //
              55 E=71500140: F=106187: RETURN
              56 D=71600140508: E=52044360: F=701345370: RETURN
              57 D=782047310880: E=703880106: F=543107880: RETURN
              58 D=703456034058: E=56380: F=380617: RETURN
              59 PRINT "Win": END
              //
              70 G=G+I: GOSUB 30: CSR A+1: LETC S$: PRINT K$;
              71 FOR E=-I*3 TO -E STEP I: FOR D=18 TO 29: $=L$+U$(D)+"V"+I$(D)+L$
              72 IF 15<LEN $; LETC MID(5+E+LEN U$(D),7): CSR D-18: PRINT K$;
              73 NEXT D: NEXT E: GOTO 2
              //
              94 VAC: DEFM 24: D=16: E=254: F=186: G=56: H=40: I=108: FOR A TO 14
              95 $="": B=2^A: FOR J=-2 TO 4: K=48+FRAC(E(J)/B)*32: IF K>=58; K=K+7
              96 $=$+CHR K: NEXT J: L$(A)=$: NEXT A: K$=CHR 96: RETURN
              Ответить
              • Код так написан вынужденно, и взят он из абсолютно фрически-ебанутого (в хорошем, уважительном смысле) проекта, суть которого можете прочитать тут: http://www.gamedev.ru/flame/forum/?id=192812

                код со страницы 14.
                на странице 15 про вычисление адреса:

                > Да, строка 7 также не может быть сдвинута. Переход на неё осуществляется из строки 15, и её номер семь вычисляется через длину строковой переменной, в которой хранится картинка шипов. На которых и происходит смерть. Шипы высотой 3 пикселя (строка 38), поэтому позиционирование на шипах ведёт к переходу на 4+3 (строка 15) строку.
                Ответить
              • Это замечательно!
                GOSUB 34+10*FRAC D

                Радует, что здесь переход к номеру строки, а не к адресу в памяти. Тут хотя бы тяжёлое зависание и крах системы не грозит, в отличие от той же сишки, где повсюду адресная арифметика.

                Кстати, в QB была команда CALL ABSOLUTE, которая позволяла прыгнуть на произвольный адрес памяти.
                Ответить
                • А на денди с клавой, емнип, были PEEK, POKE, и какая-то функция для вызова нативных функций, не помню ее уже... В общем можно было заливать байтики в свободную область и кодить на асме 6502го проца. Но я в то время в библиотеке книжки по этому асму не нашел, а методом тыка его изучить не получилось...
                  Ответить
                  • Вот для «Агата», который был на аналоге 6502: http://govnokod.ru/3694

                    Доки по асму у нас не было (у учителей в шкафу где-то были книжки от него, но нам спрашивать было лень), поэтому мы развлекались, записывая в случайные ячейки памяти случайные числа.
                    Ответить
                    • > записывая в случайные ячейки памяти случайные числа
                      Я так нашел регистры управления видеочипом и джойстиком и даже разобрался с ними... Ну и полный список команд бейсика вытряс, листая дамп памяти.
                      Ответить
                      • Записал что-то в порт 220, и вдруг что-то запищало. Так он узнал что у него есть звуковая карта.
                        Ответить
                    • А у нас был запаролен биос, я написал прогу на пасцале, которая сбросила ячейки, отвечающие за этот пароль, а потом комп не захотел грузиться с матами на ошибку crc cmos (у меня дома все работало) и меня перестали пускать в комп класс вне уроков.
                      Ответить
                      • Вообще подстава... Обычно после этого хватало нажать F1, и всё загружалось.
                        Ответить
                        • Кстати, мне понравилось сообщение: «Keyboard not detected. Press F1 to continue».
                          Ответить
                • Залазинья в левую память тут конечно не будет, но за код в котором метка для прыжка вычисляется таким образом надо убивать все равно. Хуже этого были только люди, которые в рантайме модифицировали код в памяти.

                  Благо, в реальном режиме это можно было сделать.
                  Ответить
                  • gcc и в защищённом режиме умудряется создавать трамплины, что почти то же самое по ужасности.

                    P.S. Оставлю здесь для истории: http://govnokod.ru/13162
                    Ответить
                    • Ружжо для выстрела в ногу)

                      Вот тут говорят товарищи что это дескать сильно быстрее и потому вот так.
                      Но если они это знают, то почему это не может знать компилятор и почему нельзя ввести в си какую-то конструкцию которая выглядела бы как няшечка, а внутри гоутушничала бы по разным адресам.
                      Ответить
                  • Это можно в любом режиме делать. VirtualProtect же.
                    Ответить
                    • Можно) Но все таки надо явно пометить страничку как доступную для записи посредством той самой функции, просто так это делать не будут.

                      В реальном режиме, особенно когда код писался в tiny mode (или как там режим когда один сегмент был) такая практика встречалась куда чаще.
                      Ответить
                      • В реальном режиме и large mode не проблема, потому что сегменты никаких ограничений на запись/исполнение не накладывали.
                        Ответить
                        • Но там хотя-бы надо было указывать регистр (far адресация, или как там его) и было понятно что если ты пишешь что-то по адресу CS то наверное ты му рискуешь. Собссно интел и придумал сегменты для удобства программистов не мешая им стрелять в ногу, но давая добрый совет держать код в одном сегменте, данные в другом, стек в третьем (как это по-питонячи!)

                          Кстати, был еще режим когда сегменты были, а страниц не было (тоесть он protected, но без страниц и свапа соответственно). Кажется, он был в 286, ни одна ОС его не использовала, и он почил в бозе.
                          Ответить
                          • Ну у x86 paging отдельно включается. Так что этот режим и во всех новых процах есть. Просто он нинужен.
                            Ответить
                            • Ещё был нереальный режим: устанавливаем размер всех сегментов в 4 гига, возвращаемся в реальный режим... И с помощью префикса длины смещения можем адресовать все 4 гигабайта из программы реального режима.

                              Только этот режим тоже не использовался, потому что программа, завязанная на него, не будет работать в виртуальном режиме (из Windows, например).
                              Ответить
                              • Причем он не работал на двойке, потому что нельзя было вернуться в реальный режим не перегрузившись. В тройке можно стало)

                                Но это же какой-то дикий хак был, я даже не уверен что это где-то документировано интелом. Кошернее было переключаца на время программы в протектед мод. Dos4GW жеж!
                                Ответить
                                • Dos4GW (и его аналоги) крут, ибо можно было и код, и данные хранить за пределами первого мегабайта. Так я узнал про Watcom C/C++ и про Borland Power Pack.

                                  Несмотря на это, в ДОСе слишком долго эксплуатировались программы, использующие оперативку через дикие костыли типа XMS и EMS, позволяющие за пределами первого мегабайта размещать только данные. А некоторые и этого не умели. Ага, 640 к хватит всем.
                                  Ответить
                                  • Вообще меня всегда удивляло что i386 появился в 1985м, первая популярная ОС под protected mode with paging была написана спустя пять с лишним лет, и еще потом лет семь всё равно писали для real mode. То есть почти 15 лет понадобилось чтоб совсем от реал мода уйти! И это не смотря на то, что еще в конце 80х стало понятно что не всем программам хватит 640к памяти (и ведь еще кусок биос резервировал для себя и MMIO)

                                    И были всякие удлиннялки вроде EMM386 и himem.sys которые выталкивали туда TSRки, и у меня в config.sys было прописано несколько конфигов: полный и минимальный, потому что если загрузить драйвер мышки, русификатор клавиатуры и драйвер звука и сидирома то гоблины уже не запускались ввиду отсутствия памяти)

                                    История IBM PC это вообще сплошные костыли, чего стоит только Gate A20)
                                    Ответить
                                    • >То есть почти 15 лет понадобилось чтоб совсем от реал мода уйти!
                                      Посчитай, сколько лет переходили со свиньи на семерку, сколько лет добавляли поддержку юникода в программы, когда его уже полностью поддерживала как минимум NT4.

                                      >И были всякие удлиннялки вроде EMM386 и himem.sys которые выталкивали туда TSRки, и у меня в config.sys было прописано несколько конфигов: полный и минимальный, потому что если загрузить драйвер мышки, русификатор клавиатуры и драйвер звука и сидирома то гоблины уже не запускались ввиду отсутствия памяти)
                                      Хорошо что я это не застал.
                                      Ответить
                                      • > переходили со свиньи на семерку
                                        Переходили? :)
                                        Ответить
                                        • судя по скриншотам с мест, много у кого до сих пор xp на работе стоит
                                          слава путину там хотя бы работают современные браузеры
                                          Ответить
                                      • А уж на ipv6 сколько переходят)

                                        Кстати ничего стращного в древних компах не было. ОС были проще и тупее, всё было понятно, никаких тебе реинсталлов)
                                        Ответить
                            • да-да, его именно что никто не использует. Еще можно сегменты с пейджингом юзать одновременно, но и это вроде бы не используют.
                              Причем в IA-32e (который x64) этот режим и вовсе отключили за ненадобностью. Только страницы, никаких сегментов.

                              Злые языки вообще говорят что сегменты изобрели чтоб адресовать память с помощью двух регистров (в один не влезало же), но я верю что интел придумал их чтоб программисту удобнее было разделять куски памяти под разные нужды.
                              Ответить
                              • > Злые языки вообще говорят что сегменты изобрели чтоб адресовать память с помощью двух регистров (в один не влезало же)
                                Но ведь это так и было ;)
                                Ответить
                                • Но вообще 64 килобайта же получалось, а первый PC именно столько и имел. Неужели Интел глядели в будущее?
                                  Ответить
                          • В общем-то вот тот самый режим (32-битный flat без страниц), если интересно:
                            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 (или как там папка проекта называется). Но там, все таки, депенденсы руками не прописывают же)
                                  Ответить
                                  • > их sln/proj прекрасно собирается msbuild, прямо с консоли
                                    У них там баг есть. Если в в папке солюшена находится папка, имя которой начинается с пробела, и мы на неё ссылаемся. Вижак скомпилирует верно, а msbuild сделает трим. По крайней мере так с 2010й было.
                                    Ответить
                                    • Хм.. а это идея, как делать магические солюшены - у всех компилятся и работают нормально, а на сервере компилятся, но получается фигня. Надо просто две папки сделать с разным кодом.
                                      Ответить
                                  • >Например взял я как-то библиотеку lettuce для python. А там процесс сборки и тестирования пострен на шелл скриптах. Очень удобно под виндой запускать!

                                    Например, юзал я одну http библиотеку для питона, обертку для pycurl. Однажды я поставил другую библиотеку, которая обновила первую, и внезапно оказалось, что бинарник pycurl, лежащий на сайте этой библиотеки, скомпилирован без поддержки gzip, а сама библиотека хочет эту поддержку. Т.е. библиотека не фурычит с бинарным модулем, лежащим на ее же сайте и у меня в одно мгновение перестали работать все проги, юзавшие http. Питон на венду срал и будет срать, одно то, что он юникод в консоли до сих пор не поддерживает уже о чем-то должно говорить.
                                    Ответить
                                  • > А как же менеджились депенденсы?
                                    Сишные проги пересобирались ручками из вижуалки. А асмовские модули компилились быстро и батник пересобирал их целиком.
                                    Ответить
                                    • То есть проект без запуска студии было-бы не собрать?)

                                      Фаулер бы Вас проклял!
                                      Ответить
                                      • > То есть проект без запуска студии было-бы не собрать?
                                        Да его и сейчас без студии не собрать. Я не пробовал под mingw, но скорее всего трансформ не отработает.

                                        P.S. А, без запуска студии... Да мне в те дни на это было вообще насрать: как-то собирается - и то хорошо. Студенчество же :)
                                        Ответить
                                        • Ну теперь-то Вы понимаете что проект должен собираться одной коммандой с консоли, например чтоб работать в CI сервере?
                                          Ответить
                                          • >с консоли
                                            Пошёл на хуй, выродок.
                                            Ответить
                                            • Чойта у тебя так подгорает от одного упоминания консоли?
                                              Ответить
                                              • Ну консоль еще у машины бывает. Может быть он в детстве в незнакомую машину сел, ну и воспоминания дурные теперь.
                                                Ответить
                                                • А еще - у зданий. Консоль это типа верхушки колонны / подставки. Может он проходил мимо ремонтирующегося здания?
                                                  Ответить
                                                  • > Консоль это типа верхушки колонны / подставки. Может он проходил мимо ремонтирующегося здания?
                                                    И на него из этой консоли упал кирпич... Да, это всё объясняет.
                                                    Ответить
                                            • Пожалуй мне стоит вступить с тобой в дискуссию о консоли. Иначе я теперь не усну, ведь в Интернете гость не прав!
                                              Ответить
                                              • > Консоль это типа верхушки колонны / подставки.
                                                Нет, это когда балка одним концом закреплена.
                                                Ответить
                                                • Это наверное, смотря что учить. Если историю искусства, то это верхушка колонны (с волютами в дорическом / иноническом стиле). А если строительное дело, то балка.
                                                  (Вообще, само по себе слово "консоль" значит "подставка", т.е. пюпитр тоже своего рода консоль, или канделябр, который на рояль ставят - в том смысле, что он поддерживает что-то чем освещают, например).
                                                  Ответить
                                                  • > Это наверное, смотря что учить.
                                                    > с волютами
                                                    Учил кто-нибудь экономику, комментарии оставлял в разделе про 1С, а тут вдруг зашёл в C++ и валюты какие-то на колоннах увидел.
                                                    "Вот жеж тупые ахретехторы - всю валюту в колонны пустили!"
                                                    Ответить
                                                    • "Волюта" и "валюта" все-таки достаточно отличаются.
                                                      Ответить
                                                      • Внутренняя аппроксимация/коррекция ошибок работает. Когда "валюта" встречаешь раз в 1000-10000 раз чаще, чем "волюта", когда твои коллеги говорят "ну я ж экономист, а не филолог" (интересно, это действительно так?) и пишут с ошибками, мало кто прочитает "волюта" с первого раза.

                                                        P.S. Вспомнил, как после паскаля вместо else на автомате дописывал "end". Да и после отладки распечатыванием в голову впечатывается writeln/printf/std::cout/console.log.
                                                        Ответить
                      • > просто так это делать не будут.
                        Мне кажется, или просто так переписывать код в рантайме вообще не самая лучшая идея?)))
                        Ответить
                        • Не лучшая)
                          Просто окружение (язык и пр) могут явно НЕ поощрять какие-то вещи, а могут быть к ним индифферентными.

                          Вот НЕ tiny mode не поощряет, protected mode еще больше НЕ поощряет, а tiny mode индифферентен:)
                          Ответить
                        • Ну я читал, что это на асме был не такой уж и плохой вариант. Для асма естественно, там любая ошибка фатальна.
                          Ответить
                          • Ну как бы на асме сам код превращается в программу. Получается, ты должен взять и затереть какой-то её кусок? По мне, так всё расно как-то странно...
                            Ответить
                            • Чего странного-то? Так jit, например, работает. Возьмёт, да и превратит байткод в машинный код. Потом передумает, удалит старый кусок, сгенерит новый.
                              Ответить
                              • JIT не программист. Ему-то можно такое делать, а вот программисту не стоит писать код, который в рантайме модифицирует уже загруженный код.
                                Ответить
                                • Ну, помнится виндовый BitBlt генерил на лету оптимальный код для заданного опцией преобразования, чтобы внутри него свичи по опкодам не тормозили.
                                  Ответить
                                  • >генерил на лету оптимальный код для заданного
                                    FFTW - очень хороший пример селф-тюнинга.
                                    Ответить
                            • Для асма это не странно. В то время.
                              Ответить
                              • Самомодифицирующийся код — это не странно не только для асма и не только в то время. Вспомним ECMAScript с его изменением объектов в рантайме и с эвалами.
                                Ответить
                                • Жопаскрипт частный случай екмы. Екма 262. Сцыдиез тоже екма
                                  Ответить
        • В разных диалектах по-разному. В некоторых есть.Сука, как же мне когда-то этой фичи не хватало, вы не представляете!
          >И даже в Паскале нет.
          Паскаль не показатель. Он алголоподобный.
          Бейсик же произошёл от немного другого языка, а в фортране оно изначально было.
          Ответить
    • > DlangGovno

      Кстати, а RustGovno и ClayGovno у нас уже были?
      Ответить
    • Об боже сколько разговоров и про что? Про то что машинные комманды тоже располагаются в памяти и как следвие имеют адреса или вы только что открыли jmp умеет принимать как аргумент не только константы?
      Ответить
      • То, что jmp умеет косвенную адресацию, ни для кого не секрет. Другое дело, что не во всех языках есть goto на переменное выражение, потому и открытие. Вон, в старом Бейсике вообще был GOTO/GOSUB на номер строки, а не на адрес.
        Ответить
      • Спасибо капитан, бОльшая часть местной публики представляет архитектуру фон-неймана.

        Просто не всем кажется верным вытарчивать в более высокоуровневые языки столь низкими вещами
        ---
        >> jmp принимать как аргумент не только константы?
        Наверное Вы хотели сказаать "не только литерал может быть операндом JMP"
        Ответить
    • <a href=http://dogruzov.ru/perevozki-dogruzom-po-rossii/>стоимость перевозки газель</a>
      Ответить

    Добавить комментарий