metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2007-01-17 11:55 am

Ну кому в голову пришел такой язык?

Оригинальный код:
((void (*)())0)();

Чтобы понять происходящее, я его сначала откомпилировал, затем дизассемблировал, получилось такое:
xor eax,eax
call eax

Затем я это дело разделил собственно на объявление указателя на функцию и на вызов:

typedef void (*fptr)();

void main(){
((fptr)0)();
}

Особо бесит указание имени объявляемого типа в середине объявления. Очень логично. Это как если бы присвоение var1=var2 в стиле va(=var1)r2;

[identity profile] sbj-ss.livejournal.com 2007-01-17 10:27 am (UTC)(link)
процитирую Богатырёва:

Приведем прием (позаимствованный из журнала "Communications of
the ACM"), позволяющий прояснить смысл описания. Описание на Си переводится в описа-
ние в стиле языка Algol-68. Далее
    ref      ТИП    означает  "указатель на ТИП"
    proc()   ТИП              "функция, возвращающая ТИП"
    array of ТИП              "массив из элементов ТИПа"
    x:       ТИП              "x имеет тип ТИП"

Приведем несколько примеров, из которых ясен и способ преобразования:
    int (*f())();     означает
            (*f())()  :                    int
             *f()     :             proc() int
              f()     :         ref proc() int
              f       :  proc() ref proc() int

то есть f - функция, возвращающая указатель на функцию, возвращающую целое.
    int (*f[3])();    означает
            (*f[])()  :                      int
             *f[]     :               proc() int
              f[]     :           ref proc() int
              f       :  array of ref proc() int

f - массив указателей на функции, возвращающие целые. Обратно: опишем g как указа-
тель на функцию, возвращающую указатель на массив из 5и указателей на функции, возв-
ращающие указатели на целые.

           g          : ref p() ref array of ref p() ref int
          *g          :     p() ref array of ref p() ref int
         (*g)()       :         ref array of ref p() ref int
        *(*g)()       :             array of ref p() ref int
       (*(*g)())[5]   :                      ref p() ref int
      *(*(*g)())[5]   :                          p() ref int
     (*(*(*g)())[5])():                              ref int
    *(*(*(*g)())[5])():                                  int
                         int *(*(*(*g)())[5])();


Помнится, когда-то писал программку, которая по этому алгоритму "раскручивает" навёрнутые описания. А то одни скобочки. Лисп блять.

[identity profile] eu3eu.livejournal.com 2007-01-17 11:35 am (UTC)(link)
Зато этот язык дал миру новый вид искусства, во владении котором состязаются в Obfuscated C Contest. А язык, в общем, красивый и удобный - в нём всё под контролем. А самый угрёбищный из популярных - это Перл.

[identity profile] 1ceheart.livejournal.com 2007-01-17 12:04 pm (UTC)(link)
Да ну. Конструкции вида той, которая сверху - целиком на совести их авторов, поленившихся - в данном конкретном случае - написать typedef. Тот же автор и на питоне смог бы написать код, который пришлось бы компилить и дизассемблить.

[identity profile] dpla.livejournal.com 2007-01-17 01:14 pm (UTC)(link)
Пишите на Паскале. Всё понятно будет. А приверженцев "Си" надо холокостить холокостом.