Автор Тема: [BlackBox] Compiler trap.  (Прочитано 35829 раз)

DddIzer

  • Гость
Re: [BlackBox] Compiler trap.
« Ответ #75 : Май 24, 2013, 06:24:02 pm »
Кто нибудь натыкался на русские версии стандартов языков Си,С++  новее чем 1998 г. - хотя бы пре релизные? - киньте ссылку плиз...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #76 : Май 24, 2013, 06:39:26 pm »
Кто нибудь натыкался на русские версии стандартов языков Си,С++  новее чем 1998 г. - хотя бы пре релизные? - киньте ссылку плиз...

Евгений Зуев переводит (может уже перевёл) современный стандарт С++ на русский, но вряд ли этот перевод будет выложен в онлайн. Хотя запиратят и на торрент наверняка выложат...

http://zouev.blogspot.ru/2010/01/blog-post_07.html
http://zouev.blogspot.ru/2011/01/blog-post.html

Не знаю, в каком состоянии эта работа, других вроде нет (по С++)
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #77 : Май 24, 2013, 06:51:01 pm »
Для контраста, возьмем с++ и его ключевое слово alignas 
Цитировать
alignas( expression )       (since C++11)
Ну, да. В современном С++ это есть. В С++ 15ти летней давности (С++98 - предыдущий стандарт) этого не было. Не вижу смысла ориентироваться на допотопные версии языка.
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #78 : Май 24, 2013, 07:26:16 pm »
Если перевести на русский: до 2011 года в С++ выравнивания не было (как и массы других вещей). А как следствие, в 99% существующего кода не используется. Хорошо, что добавили, но никого не волнует скорость выхода стандартов С++. Важно, сколько лет функциональности не было и когда она появилась.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #79 : Май 24, 2013, 07:37:10 pm »
Если перевести на русский: до 2011 года в С++ выравнивания не было (как и массы других вещей). А как следствие, в 99% существующего кода не используется. Хорошо, что добавили, но никого не волнует скорость выхода стандартов С++. Важно, сколько лет функциональности не было и когда она появилась.
Важно что есть сейчас. До того были нестандартные расширизмы (правда через стандартные механизмы создания расширений, например через директиву препроцессора #pragma), впрочем как и в паскале по факту.

Если уж с чем и сравнивать С++ в этом плане, так это с Адой - вот Ада да, она крута, там выравнивание как минимум со стандарта Ада-95 (а может и с Ада-83). Причем в нормальном, а не в паскалевском виде: http://oopweb.com/Ada/Documents/Ada95RM/Volume/13-03.htm

Причем это действительно фактический стандарт, он используется. В отличае от стандарта паскаля (который по сути - фикция).
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #80 : Май 24, 2013, 07:46:15 pm »
Ada вообще прекрасна! Смотрите (http://oopweb.com/Ada/Documents/Ada95RM/Volume/13-05-01.htm):
       Word : constant := 4;  --  storage element is byte, 4 bytes per word

       type State         is (A,M,W,P);
       type Mode          is (Fix, Dec, Exp, Signif);

       type Byte_Mask     is array (0..7)  of Boolean;
       type State_Mask    is array (State) of Boolean;
       type Mode_Mask     is array (Mode)  of Boolean;

       type Program_Status_Word is
         record
             System_Mask        : Byte_Mask;
             Protection_Key     : Integer range 0 .. 3;
             Machine_State      : State_Mask;
             Interrupt_Cause    : Interruption_Code;
             Ilc                : Integer range 0 .. 3;
             Cc                 : Integer range 0 .. 3;
             Program_Mask       : Mode_Mask;
             Inst_Address       : Address;
       end record;

       for Program_Status_Word use
         record
             System_Mask      at 0*Word range 0  .. 7;
             Protection_Key   at 0*Word range 10 .. 11; -- bits 8,9 unused
             Machine_State    at 0*Word range 12 .. 15;
             Interrupt_Cause  at 0*Word range 16 .. 31;
             Ilc              at 1*Word range 0  .. 1;  -- second word
             Cc               at 1*Word range 2  .. 3;
             Program_Mask     at 1*Word range 4  .. 7;
             Inst_Address     at 1*Word range 8  .. 31;
         end record;

       for Program_Status_Word'Size use 8*System.Storage_Unit;
       for Program_Status_Word'Alignment use 8;
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #81 : Май 24, 2013, 08:03:29 pm »
Цитировать
Причем это действительно фактический стандарт, он используется. В отличае от стандарта паскаля (который по сути - фикция).
Не соглашусь с Вами, Алексей. Что лучше — несовместимые расширения без стандарта де-юре или де-факто совместимые расширения, аналог теневого стандарта? Если PACKED есть во всех популярных компиляторах, то он и есть стандарт. А вот с прагмами и declspec я натыкался на грабли, когда писал простейший SDK. Учитывая, что третьи лица используют стандарт древнее 11х невозможно не тащить за собой весь воз костылей. Так что паскалисты молодцы — там и соглашения о вызовах и выравнивания единообразно присутствуют, из-за чего код де-факто переносим. А что ещё нужно практикам?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #82 : Май 24, 2013, 08:22:23 pm »
Цитировать
Причем это действительно фактический стандарт, он используется. В отличае от стандарта паскаля (который по сути - фикция).
Не соглашусь с Вами, Алексей. Что лучше — несовместимые расширения без стандарта де-юре или де-факто совместимые расширения, аналог теневого стандарта? Если PACKED есть во всех популярных компиляторах, то он и есть стандарт. А вот с прагмами и declspec я натыкался на грабли, когда писал простейший SDK. Учитывая, что третьи лица используют стандарт древнее 11х невозможно не тащить за собой весь воз костылей. Так что паскалисты молодцы — там и соглашения о вызовах и выравнивания единообразно присутствуют, из-за чего код де-факто переносим. А что ещё нужно практикам?
Я не слишком понимаю о чем речь. Берем произвольное приложение писанное скажем на FreePascal'e - оно соберется на Delphi? А на VirtualPascal'e? А на Object Pascal'e (нет, не том что TurboPascal, а тот который от apple)? Вот что-то я сомневаюсь.

packed в стандартном паскале есть, и это не расширизм. Только он (packed) вот не гарантирует ничего в том виде, в котором он там описан. Кроме того, насколько я понимаю, по сути софта писанного на стандартном паскале просто нет. Все используют несовместимые (со стандартом и друг с другом) диалекты.

А прописать соглашения о вызовах в диалектах паскаля тоже можно (а главное - нужно, иначе там это не появилось бы). Причина появления явного прописывания соглашения о вызове в сигнатуре функции ровно та же что и в случае появления её в реализациях Си.
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #83 : Май 24, 2013, 08:32:13 pm »
Соберётся, если писалось с использованием общей части языка (в большей степени равняются на Delphi). В VirtualPascal есть режим Делфи (не полный) и в FreePascal тоже. Я переносил свои программы между тремя. А суть в следующем: PACKED для структур во всех трёх обеспечивает alignas(1), STDCALL/CDECL/THISCALL и т.д. — правильное соглашение о вызове для функций. Паскаль не приветствует сложных кодирований расширений, вроде __xxxxx(yyy(__zzz)), поэтому есть определённое единообразие.

Это просто констатация факта, а не нападки на С++.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #84 : Май 24, 2013, 08:45:56 pm »
Соберётся, если писалось с использованием общей части языка (в большей степени равняются на Delphi). В VirtualPascal есть режим Делфи (не полный) и в FreePascal тоже. Я переносил свои программы между тремя. А суть в следующем: PACKED для структур во всех трёх обеспечивает alignas(1), STDCALL/CDECL/THISCALL и т.д. — правильное соглашение о вызове для функций. Паскаль не приветствует сложных кодирований расширений, вроде __xxxxx(yyy(__zzz)), поэтому есть определённое единообразие.

Это просто констатация факта, а не нападки на С++.
Глянул стандарт паскаля - ничего не нашел про STDCALL и так далее. Можешь ткнуть носом?

Ну, то есть похоже, что эти атрибуты соглашения о вызове явно тоже расширизм. Как и в сях/плюсах.

В плюсах и сях вообще просто - это все заруливается макросом, содержимое которого зависит (и автоматически выбирается) в зависимости от типа компилятора. У нас на работе код небольшого-среднего проекта (то есть порядка 100-200 тыс. строк кода) собирается и gcc (под линукс) и msvs под винду. И проблем со всем этим никаких. Естественно там используются в том числе и сторонние библиотеки.
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #85 : Май 24, 2013, 08:51:36 pm »
Да, это расширения. Просто они одинаковые и ведут себя одинаково. Получается неформальный стандарт без применения условной компиляции.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #86 : Май 24, 2013, 08:55:32 pm »
Да, это расширения. Просто они одинаковые и ведут себя одинаково. Получается неформальный стандарт без применения условной компиляции.
Ну, можно и так. Хотя я все же предпочитаю условную компиляцию, то есть чтобы если нас собирают неизвестным (и не оттестированым) компилятором, то в месте где мы используем расширизм, вывелся бы warning во время компиляции. Благо таковая условная компиляция ровно ничего не стоит.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #87 : Май 24, 2013, 09:39:21 pm »
Ada вообще прекрасна! Смотрите (http://oopweb.com/Ada/Documents/Ada95RM/Volume/13-05-01.htm):
       Word : constant := 4;  --  storage element is byte, 4 bytes per word

       type State         is (A,M,W,P);
       type Mode          is (Fix, Dec, Exp, Signif);

       type Byte_Mask     is array (0..7)  of Boolean;
       type State_Mask    is array (State) of Boolean;
       type Mode_Mask     is array (Mode)  of Boolean;

       type Program_Status_Word is
         record
             System_Mask        : Byte_Mask;
             Protection_Key     : Integer range 0 .. 3;
             Machine_State      : State_Mask;
             Interrupt_Cause    : Interruption_Code;
             Ilc                : Integer range 0 .. 3;
             Cc                 : Integer range 0 .. 3;
             Program_Mask       : Mode_Mask;
             Inst_Address       : Address;
       end record;

       for Program_Status_Word use
         record
             System_Mask      at 0*Word range 0  .. 7;
             Protection_Key   at 0*Word range 10 .. 11; -- bits 8,9 unused
             Machine_State    at 0*Word range 12 .. 15;
             Interrupt_Cause  at 0*Word range 16 .. 31;
             Ilc              at 1*Word range 0  .. 1;  -- second word
             Cc               at 1*Word range 2  .. 3;
             Program_Mask     at 1*Word range 4  .. 7;
             Inst_Address     at 1*Word range 8  .. 31;
         end record;

       for Program_Status_Word'Size use 8*System.Storage_Unit;
       for Program_Status_Word'Alignment use 8;

Этот пример ещё в Аде-83 указан:
http://archive.adaic.com/standards/83lrm/html/lrm-13-04.html

Оно и понятно -- Ада изначально разрабатывалась для того, что бы работать с железом на низком уровне, вот и заложили в неё сразу же средства низкоуровнего представления типов данных...

   WORD : constant := 4;  --  storage unit is byte, 4 bytes per word

   type STATE         is (A,M,W,P);
   type MODE          is (FIX, DEC, EXP, SIGNIF);

   type BYTE_MASK     is array (0.. 7) of BOOLEAN;
   type STATE_MASK    is array (STATE) of BOOLEAN;
   type MODE_MASK     is array (MODE)  of BOOLEAN;

   type PROGRAM_STATUS_WORD is

     record
       SYSTEM_MASK        : BYTE_MASK;
       PROTECTION_KEY     : INTEGER range 0 .. 3;
       MACHINE_STATE      : STATE_MASK;
       INTERRUPT_CAUSE    : INTERRUPTION_CODE;
       ILC                : INTEGER range 0 .. 3;
       CC                 : INTEGER range 0 .. 3;
       PROGRAM_MASK       : MODE_MASK;
       INST_ADDRESS       : ADDRESS;
    end record;

  for PROGRAM_STATUS_WORD use
    record at mod 8;
        SYSTEM_MASK      at 0*WORD range 0  .. 7; 
        PROTECTION_KEY   at 0*WORD range 10 .. 11; -- bits 8,9 unused
        MACHINE_STATE    at 0*WORD range 12 .. 15;
        INTERRUPT_CAUSE  at 0*WORD range 16 .. 31;
        ILC              at 1*WORD range 0  .. 1;  -- second word
        CC               at 1*WORD range 2  .. 3;
        PROGRAM_MASK     at 1*WORD range 4  .. 7;
        INST_ADDRESS     at 1*WORD range 8  .. 31;
    end record;

  for PROGRAM_STATUS_WORD'SIZE use 8*SYSTEM.STORAGE_UNIT;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #88 : Май 24, 2013, 09:55:23 pm »
Ada вообще прекрасна! Смотрите (http://oopweb.com/Ada/Documents/Ada95RM/Volume/13-05-01.htm):
       Word : constant := 4;  --  storage element is byte, 4 bytes per word

       type State         is (A,M,W,P);
       type Mode          is (Fix, Dec, Exp, Signif);

       type Byte_Mask     is array (0..7)  of Boolean;
       type State_Mask    is array (State) of Boolean;
       type Mode_Mask     is array (Mode)  of Boolean;

       type Program_Status_Word is
         record
             System_Mask        : Byte_Mask;
             Protection_Key     : Integer range 0 .. 3;
             Machine_State      : State_Mask;
             Interrupt_Cause    : Interruption_Code;
             Ilc                : Integer range 0 .. 3;
             Cc                 : Integer range 0 .. 3;
             Program_Mask       : Mode_Mask;
             Inst_Address       : Address;
       end record;

       for Program_Status_Word use
         record
             System_Mask      at 0*Word range 0  .. 7;
             Protection_Key   at 0*Word range 10 .. 11; -- bits 8,9 unused
             Machine_State    at 0*Word range 12 .. 15;
             Interrupt_Cause  at 0*Word range 16 .. 31;
             Ilc              at 1*Word range 0  .. 1;  -- second word
             Cc               at 1*Word range 2  .. 3;
             Program_Mask     at 1*Word range 4  .. 7;
             Inst_Address     at 1*Word range 8  .. 31;
         end record;

       for Program_Status_Word'Size use 8*System.Storage_Unit;
       for Program_Status_Word'Alignment use 8;

Этот пример ещё в Аде-83 указан:
http://archive.adaic.com/standards/83lrm/html/lrm-13-04.html

Оно и понятно -- Ада изначально разрабатывалась для того, что бы работать с железом на низком уровне, вот и заложили в неё сразу же средства низкоуровнего представления типов данных...

   WORD : constant := 4;  --  storage unit is byte, 4 bytes per word

   type STATE         is (A,M,W,P);
   type MODE          is (FIX, DEC, EXP, SIGNIF);

   type BYTE_MASK     is array (0.. 7) of BOOLEAN;
   type STATE_MASK    is array (STATE) of BOOLEAN;
   type MODE_MASK     is array (MODE)  of BOOLEAN;

   type PROGRAM_STATUS_WORD is

     record
       SYSTEM_MASK        : BYTE_MASK;
       PROTECTION_KEY     : INTEGER range 0 .. 3;
       MACHINE_STATE      : STATE_MASK;
       INTERRUPT_CAUSE    : INTERRUPTION_CODE;
       ILC                : INTEGER range 0 .. 3;
       CC                 : INTEGER range 0 .. 3;
       PROGRAM_MASK       : MODE_MASK;
       INST_ADDRESS       : ADDRESS;
    end record;

  for PROGRAM_STATUS_WORD use
    record at mod 8;
        SYSTEM_MASK      at 0*WORD range 0  .. 7; 
        PROTECTION_KEY   at 0*WORD range 10 .. 11; -- bits 8,9 unused
        MACHINE_STATE    at 0*WORD range 12 .. 15;
        INTERRUPT_CAUSE  at 0*WORD range 16 .. 31;
        ILC              at 1*WORD range 0  .. 1;  -- second word
        CC               at 1*WORD range 2  .. 3;
        PROGRAM_MASK     at 1*WORD range 4  .. 7;
        INST_ADDRESS     at 1*WORD range 8  .. 31;
    end record;

  for PROGRAM_STATUS_WORD'SIZE use 8*SYSTEM.STORAGE_UNIT;

Я видел. Но пример таки отличаются (кстати, обратите внимание на капс в Аде-83 :-) ).

Кроме того, атрибутов про выравнивание там, в Аде-83, похоже не было.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #89 : Май 24, 2013, 10:49:38 pm »
Кроме того, атрибутов про выравнивание там, в Аде-83, похоже не было.

Таки было: http://archive.adaic.com/standards/83rat/html/ratl-15-04.html#15.4.3

Цитировать
Alignment Clauses:

 When it is important that the objects of a given record type be allocated on a given storage boundary, this can be specified by means of an alignment clause. The alignment is expressed as a number of storage units, and all addresses at which the objects are allocated must be exact multiples of the specified number of storage units (the address modulo the alignment expression must be zero).

    for PAGE_BUFFER use at mod 512;

Затем, в http://archive.adaic.com/standards/95lrm/LRMascii/chg83.txt это было переделано. Alignment Clauses были переименованы в Mod Clauses:

Цитировать
A record_representation_clause of the form:

       for r use
           record at mod a
               ...
           end record;

is equivalent to:

       for r'Alignment use a;
       for r use
           record
               ...
           end record;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…