Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 09.06.05 09:33
Оценка: 9 (3) +3 -58 :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :)
1) Известно, что Си-образный синтаксис использует больше лексем чем это реально необходимо.
2) Известно, что стандарты оформления Си-образного кода требуют использования большего количества строчек чем это реально необходимо (чтобы читающему понятно стало где что написано).

Давайте посчитаем количественно этот перерасход?
Хочется понять на сколько он "минимален", так сказать.




  • Цикл с проверкой условия в начале итерации
    a — условие выполнения итерации
    x — выполняемое действие
    Си-образный синтаксис:
    while(a)
    {
         x();
    }

    Реально необходимый и достаточный синтаксис:
    WHILE a DO x END

    синтаксический оверхед = 10/5 = 2.00
    перерасход строчек кода = 4/1 = 4.00


  • Цикл с проверкой условия в середине итерации
    a — условие завершения
    x, y, z — выполняемые действия
    Си-образный синтаксис:
    while(true)
    {
         x();
         if(a)
         {
              y();
              break;
         }
         z();
    }

    Реально необходимый и достаточный синтаксис:
    LOOP 
      x;
      IF a THEN y; EXIT END;
      z
    END

    синтаксический оверхед = 26/13 = 2.00
    перерасход строчек кода = 10/5 = 2.00


  • Цикл с проверкой условия в конце итерации
    a — условие продолжения
    b — условие завершения
    x — выполняемое действие
    Си-образный синтаксис:
    do
    {
         x();
    }
    while(a);

    Реально необходимый и достаточный синтаксис:
    REPEAT x UNTIL b

    синтаксический оверхед = 12/4 = 3.00
    перерасход строчек кода = 5/1 = 5.00

  • Инструкция выполнения по условию
    a — условие
    x — выполняемое действие
    Си-образный синтаксис:
    if(a)
    {
         x();
    }

    Реально необходимый и достаточный синтаксис:
    IF a THEN x END

    синтаксический оверхед = 10/5 = 2.00
    перерасход строчек кода = 4/1 = 4.00

  • Инструкция выполнения по условию с альтернативой
    a — условие
    x, y — выполняемые действия
    Си-образный синтаксис:
    if(a)
    {
         x();
    }
    else
    {
         y();
    }

    Реально необходимый и достаточный синтаксис:
    IF a THEN x ELSE y END

    синтаксический оверхед = 17/7 = 2.43
    перерасход строчек кода = 8/1 = 8.00

  • Сложная инструкция выполнения по условию
    a, b — условия
    x, y, z — выполняемые действия
    Си-образный синтаксис:
    if(a)
    {
         x();
    }
    else
    {
         if(b)
         {
              y();
         }
         else
         {
              z();
         }
    }

    Реально необходимый и достаточный синтаксис:
    IF a THEN x ELSIF b THEN y ELSE z END

    синтаксический оверхед = 30/11 = 2.73
    перерасход строчек кода = 15/1 = 15.0


  • Инструкция выбора варианта выполнения
    n, a, b — параметры для определения варианта
    x, y, z — выполняемые действия
    Си-образный синтаксис:
    switch(n)
    {
         case a:
              x();
              break;
         case b:
              y();
              break;
         default:
              z();
    }

    Реально необходимый и достаточный синтаксис:
    CASE n OF a: x | b: y ELSE z END

    синтаксический оверхед = 30/13 = 2.31
    перерасход строчек кода = 11/1 = 11.0

  • Усредненные результаты

    Просто усреднённый синтаксический оверхед составляет:
    (2.00 + 2.00 + 3.00 + 2.00 + 2.43 + 2.73 + 2.31) / 7 = 2.35

    Просто усреднённый перерасход строчек кода составляет:
    (4.00 + 2.00 + 5.00 + 4.00 + 8.00 + 15.0 + 11.0) / 7 = 7.00

  • Резюме

    Программа записанная в Си-образном синтаксисе содержит в разы, а не на проценты больше лексем и строчек кода чем это реально необходимо. Спрашивается, и как долго этот синтаксис еще будет существовать?




    09.06.05 15:53: Перенесено из 'Философия программирования'
    08.07.05 14:39: Перенесено модератором из 'Коллеги, улыбнитесь' — Хитрик Денис
    08.07.05 15:12: Перенесено модератором из 'Коллеги, улыбнитесь' — Хитрик Денис
  • Re: Синтаксический оверхед
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.06.05 09:38
    Оценка: 1 (1) +5
    Здравствуйте, Сергей Губанов, Вы писали:

    <skipped/>

    Вопрос с ходу — ты всегда будешь циклы и комлексные условия с операциями в 1 строчку писать? И что помешало на сишном синтаксисе сделать также?
    Re: Синтаксический оверхед
    От: CrystaX Россия https://www.crystax.net/
    Дата: 09.06.05 09:44
    Оценка: +7
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Программа записанная в Си-образном синтаксисе содержит в разы, а не на проценты больше лексем и строчек кода чем это реально необходимо. Спрашивается, и как долго этот синтаксис еще будет существовать?


    Вообще говоря меня как прграммиста это очень мало волнует. Вот компилятор — он да, наверняка возмущается, когда столько лексем, бедняге, приходится обрабатывать.
    Но компилятор — наш раб, а не наоборот, поэтому все ок.
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>
    Re: Синтаксический оверхед
    От: g_i  
    Дата: 09.06.05 09:45
    Оценка: +3
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Программа записанная в Си-образном синтаксисе содержит в разы, а не на проценты больше лексем и строчек кода чем это реально необходимо.


    А в чем, собственно, проблема? Простое выражение я и в C так в одну строку записать могу.
    А сложное — наверное, не стоит?

    >Спрашивается, и как долго этот синтаксис еще будет существовать?

    Вопрос, я так думаю, риторический.
    Re: Синтаксический оверхед
    От: Privalov  
    Дата: 09.06.05 09:47
    Оценка: +1 -1
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Реально необходимый и достаточный синтаксис:

    СГ>
    СГ>WHILE a DO x END
    СГ>


    А если вставляешь больше одного оператора?

    WHILE a DO 
      BEGIN
         x1;
         x2;
       .....
      END


    while(a)
    {
       x1();
       x2();
    }


    И в чем разница? В BEGIN/END? И еще путаница с ";".

    А еще вспомни, что можно вообще обойтись только циклом while.
    Re: Синтаксический оверхед
    От: Дарней Россия  
    Дата: 09.06.05 09:48
    Оценка: 7 (3) +4 :))) :))) :))) :)
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Программа записанная в Си-образном синтаксисе содержит в разы, а не на проценты больше лексем и строчек кода чем это реально необходимо. Спрашивается, и как долго этот синтаксис еще будет существовать?


    Автора в очередной раз подвело незнание предмета (С)
    Всех излечит, исцелит
    добрый Ctrl+Alt+Delete
    Re[2]: Синтаксический оверхед
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 09.06.05 09:58
    Оценка: -7 :)
    Здравствуйте, Курилка, Вы писали:

    К>Вопрос с ходу — ты всегда будешь циклы и комлексные условия с операциями в 1 строчку писать? И что помешало на сишном синтаксисе сделать также?


    Я соблюдал общепринятые стандарты кодирования. Хочешь верь, а хочешь нет, но инструкции навроде:

    WHILE a DO x END

    REPEAT x UNTIL b

    IF a THEN x ELSE y END

    CASE n OF a: x | b: y ELSE z END

    ну натурально принято писать в одну строчку.
    Re[3]: Синтаксический оверхед
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.06.05 10:03
    Оценка: 2 (2) +7
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, Курилка, Вы писали:


    К>>Вопрос с ходу — ты всегда будешь циклы и комлексные условия с операциями в 1 строчку писать? И что помешало на сишном синтаксисе сделать также?


    СГ>Я соблюдал общепринятые стандарты кодирования. Хочешь верь, а хочешь нет, но инструкции навроде:


    СГ>WHILE a DO x END


    СГ>REPEAT x UNTIL b


    СГ>IF a THEN x ELSE y END


    СГ>CASE n OF a: x | b: y ELSE z END


    СГ>ну натурально принято писать в одну строчку.


    У тебя всегда тело цикла состоит из вызова функции x?
    И скобки обязательно в сишном стиле так ставить? И вообще обязательно? И строки переводить?
    Напрашивающийся вопрос: ты вообще знаешь синтаксис Си?
    Re[2]: Ошибка
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 09.06.05 10:05
    Оценка: +1 -2 :)))
    Здравствуйте, Privalov, Вы писали:

    P>Здравствуйте, Сергей Губанов, Вы писали:


    СГ>>Реально необходимый и достаточный синтаксис:

    СГ>>
    СГ>>WHILE a DO x END
    СГ>>


    P>А если вставляешь больше одного оператора?


    P>
    P>WHILE a DO 
    P>  BEGIN
    P>     x1;
    P>     x2;
    P>   .....
    P>  END
    P>


    Упомянутый Вами синтаксис устарел более чем двадцать пять лет тому назад.

    Где-то в середине 1970-тых годов был открыт реально необходимый и достаточный синтаксис (Modula-2, 1979 год)
    WHILE a DO x; y; z END

    Обратите внимание: слово "BEGIN" отсутствует вообще во всех инструкциях — оно лишнее.
    Re[4]: Синтаксический оверхед
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 09.06.05 10:10
    Оценка: 3 (1) :))
    Здравствуйте, Курилка, Вы писали:

    К>У тебя всегда тело цикла состоит из вызова функции x?


    Только тогда когда тело цикла большое, его можно написать на нескольких строчках.

    К>И скобки обязательно в сишном стиле так ставить? И вообще обязательно? И строки переводить?


    В принципе это не обязательно, но если писать промышленный код, то надо следовать стандартам оформления кода, а они таковы, что скобки {} надо писать всегда и на новой строчке.
    Re: Синтаксический оверхед
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.06.05 10:12
    Оценка: 3 (1) :)
    Здравствуйте, Сергей Губанов, Вы писали:

    Эх... не поленюсь

    СГ>Си-образный синтаксис:

    СГ>
    СГ>while(a)
    СГ>{
    СГ>     x();
    СГ>}
    СГ>

    СГ>Реально необходимый и достаточный синтаксис:
    СГ>
    СГ>WHILE a DO x END
    СГ>

    Вот:

    while (a) x();


    СГ>Си-образный синтаксис:

    СГ>
    СГ>while(true)
    СГ>{
    СГ>     x();
    СГ>     if(a)
    СГ>     {
    СГ>          y();
    СГ>          break;
    СГ>     }
    СГ>     z();
    СГ>}
    СГ>

    СГ>Реально необходимый и достаточный синтаксис:
    СГ>
    СГ>LOOP 
    СГ>  x;
    СГ>  IF a THEN y; EXIT END;
    СГ>  z
    СГ>END
    СГ>

    Пожалуйста:

    while (true) {
        x();
        if (a) { y(); break; }
        z();
    }


    СГ>Си-образный синтаксис:

    СГ>
    СГ>do
    СГ>{
    СГ>     x();
    СГ>}
    СГ>while(a);
    СГ>

    СГ>Реально необходимый и достаточный синтаксис:
    СГ>
    СГ>REPEAT x UNTIL b
    СГ>

    Чем плохо так?:

    do x(); while (a);


    СГ>Си-образный синтаксис:

    СГ>
    СГ>if(a)
    СГ>{
    СГ>     x();
    СГ>}
    СГ>

    СГ>Реально необходимый и достаточный синтаксис:
    СГ>
    СГ>IF a THEN x END
    СГ>

    Без проблем:

    if (a) x();


    СГ>Си-образный синтаксис:

    СГ>
    СГ>if(a)
    СГ>{
    СГ>     x();
    СГ>}
    СГ>else
    СГ>{
    СГ>     y();
    СГ>}
    СГ>

    СГ>Реально необходимый и достаточный синтаксис:
    СГ>
    СГ>IF a THEN x ELSE y END
    СГ>

    Ну если хочется...:

    if (a) x(); else y();


    СГ>Си-образный синтаксис:

    СГ>
    СГ>if(a)
    СГ>{
    СГ>     x();
    СГ>}
    СГ>else
    СГ>{
    СГ>     if(b)
    СГ>     {
    СГ>          y();
    СГ>     }
    СГ>     else
    СГ>     {
    СГ>          z();
    СГ>     }
    СГ>}
    СГ>

    СГ>Реально необходимый и достаточный синтаксис:
    СГ>
    СГ>IF a THEN x ELSIF b THEN y ELSE z END
    СГ>

    И так тоже можно:

    if (a) x(); else if (b) y(); else z();


    СГ>Си-образный синтаксис:

    СГ>
    СГ>switch(n)
    СГ>{
    СГ>     case a:
    СГ>          x();
    СГ>          break;
    СГ>     case b:
    СГ>          y();
    СГ>          break;
    СГ>     default:
    СГ>          z();
    СГ>}
    СГ>

    СГ>Реально необходимый и достаточный синтаксис:
    СГ>
    СГ>CASE n OF a: x | b: y ELSE z END
    СГ>

    Да и так, при желании:

    switch (n) { case a: x(); break; case b: y(); break; default: z(); }



    Ну и?...

    Намёк: всё от тебя зависит.
    http://rsdn.org/File/27948/bf.gif
    Re[5]: Синтаксический оверхед
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 09.06.05 10:13
    Оценка: 2 (2) +2 :))) :)
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, Курилка, Вы писали:


    К>>У тебя всегда тело цикла состоит из вызова функции x?


    СГ>Только тогда когда тело цикла большое, его можно написать на нескольких строчках.


    К>>И скобки обязательно в сишном стиле так ставить? И вообще обязательно? И строки переводить?


    СГ>В принципе это не обязательно, но если писать промышленный код, то надо следовать стандартам оформления кода, а они таковы, что скобки {} надо писать всегда и на новой строчке.


    Т.е. на паскалеподобном языке не пишут промышленный код?
    Ой держите меня
    Видимо это просто не возможно
    Re[2]: Синтаксический оверхед
    От: UGN  
    Дата: 09.06.05 10:15
    Оценка: 2 (1)
    Здравствуйте, Oyster, Вы писали:

    OСГ>>Реально необходимый и достаточный синтаксис:

    СГ>>IF a THEN x ELSIF b THEN y ELSE z END


    O>И так тоже можно:

    O>if (a) x(); else if (b) y(); else z();


    А можно и так:

    a ? x() : (b ? y() : z())
    Re[2]: Синтаксический оверхед
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 09.06.05 10:16
    Оценка: -2 :))
    Здравствуйте, Oyster, Вы писали:

    O>Эх... не поленюсь


    Дык, а лексический оверхед кто за Вас подсчитывать-то будет, Пушкин?

    У меня получилось 235 процентов, а у Вас?
    Re[3]: Ошибка
    От: Privalov  
    Дата: 09.06.05 10:16
    Оценка: :)
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Упомянутый Вами синтаксис устарел более чем двадцать пять лет тому назад.


    СГ>Где-то в середине 1970-тых годов был открыт реально необходимый и достаточный синтаксис (Modula-2, 1979 год)


    Есть математическое доказательство "необходимости и достаточности"?

    СГ>
    СГ>WHILE a DO x; y; z END
    СГ>

    СГ>Обратите внимание: слово "BEGIN" отсутствует вообще во всех инструкциях — оно лишнее.

    Ну в одном слове ошибся. Это разве принципиально? Все равно, если вместо x, y, z что-нибудь реальное подставить, в одну строку вряд ли уложишься.
    Опять же, углубляясь в детали, отметим, что ";" является разделителем между операторами, в результате возникает путаница, когда ее ставить, а когда нет. В литературе можно встретить довольно подробное обсуждение этой темы. Если найду дома книгу, сообщу название.
    Re[3]: Синтаксический оверхед
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.06.05 10:17
    Оценка: 3 (1) +1 :))) :))) :)
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, Oyster, Вы писали:


    O>>Эх... не поленюсь


    СГ>Дык, а лексический оверхед кто за Вас подсчитывать-то будет, Пушкин?


    СГ>У меня получилось 235 процентов, а у Вас?


    Переживаете из-за скобочек?
    http://rsdn.org/File/27948/bf.gif
    Re: Синтаксический оверхед
    От: Sergey Россия  
    Дата: 09.06.05 10:18
    Оценка: 7 (3) +5 :))) :))) :))
    Hello, Сергей!
    You wrote on Thu, 09 Jun 2005 09:33:38 GMT:

    СГ>
  • Цикл с проверкой условия в начале итерации
    СГ> a — условие выполнения итерации
    СГ> x — выполняемое действие
    СГ> Си-образный синтаксис:
    СГ>
     СГ> while(a)
     СГ> {
     СГ>      x();
     СГ> }
     СГ>


    Никто так не пишет Пишут
    while(a) x();

    СГ> Реально необходимый и достаточный синтаксис:

    СГ>
     СГ> WHILE a DO x END
     СГ>

    СГ> синтаксический оверхед = 10/5 = 2.00
    СГ> перерасход строчек кода = 4/1 = 4.00

    Ты раз в сишном варианте скобки не по делу ставишь, в паскалевском пиши
    BEGIN/END И подсчитай оверхед в буквах

    СГ>
  • Цикл с проверкой условия в середине итерации
    СГ> a — условие завершения
    СГ> x, y, z — выполняемые действия
    СГ> Си-образный синтаксис:
    СГ>
     СГ> while(true)
     СГ> {
     СГ>      x();
     СГ>      if(a)
     СГ>      {
     СГ>           y();
     СГ>           break;
     СГ>      }
     СГ>      z();
     СГ> }
     СГ>


    Если yt нравится многословность, будем сокращать. Только чур не обижацца на
    читаемость
    for (; x(), a; z());
    y();


    СГ> Реально необходимый и достаточный синтаксис:

    СГ>
     СГ> LOOP
     СГ>   x;
     СГ>   IF a THEN y; EXIT END;
     СГ>   z
     СГ> END
     СГ>

    СГ> синтаксический оверхед = 26/13 = 2.00
    СГ> перерасход строчек кода = 10/5 = 2.00

    Буквы посчитай Их человек пишет, а лексемы компутер перемалывает, он
    железный, не развалицца

    СГ>
  • Цикл с проверкой условия в конце итерации
    СГ> a — условие продолжения
    СГ> b — условие завершения
    СГ> x — выполняемое действие
    СГ> Си-образный синтаксис:
    СГ>
     СГ> do
     СГ> {
     СГ>      x();
     СГ> }
     СГ> while(a);
     СГ>

    СГ> Реально необходимый и достаточный синтаксис:
    СГ>
     СГ> REPEAT x UNTIL b
     СГ>


    Ну это даже не смешно

    СГ>
  • Инструкция выполнения по условию
    СГ> a — условие
    СГ> x — выполняемое действие
    СГ> Си-образный синтаксис:
    СГ>
     СГ> if(a)
     СГ> {
     СГ>      x();
     СГ> }
     СГ>

    СГ> Реально необходимый и достаточный синтаксис:
    СГ>
     СГ> IF a THEN x END
     СГ>

    СГ> синтаксический оверхед = 10/5 = 2.00
    СГ> перерасход строчек кода = 4/1 = 4.00

    if (a) x();



    СГ>
  • Инструкция выбора варианта выполнения
    СГ> n, a, b — параметры для определения варианта
    СГ> x, y, z — выполняемые действия
    СГ> Си-образный синтаксис:
    СГ>
     СГ> switch(n)
     СГ> {
     СГ>      case a:
     СГ>           x();
     СГ>           break;
     СГ>      case b:
     СГ>           y();
     СГ>           break;
     СГ>      default:
     СГ>           z();
     СГ> }
     СГ>


    Вот свичи в сях действительно дурацкие.

    СГ>
  • Усредненные результаты

    СГ> Просто усреднённый синтаксический оверхед составляет:

    СГ> (2.00 + 2.00 + 3.00 + 2.00 + 2.43 + 2.73 + 2.31) / 7 = 2.35

    СГ> Просто усреднённый перерасход строчек кода составляет:

    СГ> (4.00 + 2.00 + 5.00 + 4.00 + 8.00 + 15.0 + 11.0) / 7 = 7.00

    СГ>
  • Резюме

    СГ> Программа записанная в Си-образном синтаксисе содержит в разы, а не на

    СГ> проценты больше лексем и строчек кода чем это реально необходимо.
    СГ> Спрашивается, и как долго этот синтаксис еще будет существовать?

    Резюме: АМ/КГ. Перерасход лексем аффтаром — 10000%. Мог бы просто сказать —
    ну не нравиццо мне си, си маст дай!

    With best regards, Sergey.
    Posted via RSDN NNTP Server 1.9
  • Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
    Re[5]: Синтаксический оверхед
    От: Cyberax Марс  
    Дата: 09.06.05 10:18
    Оценка: +3
    Сергей Губанов wrote:

    > К>У тебя всегда тело цикла состоит из вызова функции x?

    > Только тогда когда тело цикла большое, его можно написать на
    > нескольких строчках.
    >

    > К>И скобки обязательно в сишном стиле так ставить? И вообще

    > обязательно? И строки переводить?
    > В принципе это не обязательно, но если писать промышленный код, то
    > надо следовать стандартам оформления кода, а они таковы, что скобки {}
    > надо писать всегда и на новой строчке.

    Хахахахаххахахаха.... ROTFL.

    Промышленных coding-standart'ов для С++ — как собак нерезанных. Причем в
    большинстве из них НЕ РЕКОМЕНДУЕТСЯ ставить скобки вокруг одиноких
    операторов.

    Кстати, если рассуждать о синтаксической избыточности, то зачем в
    Обероне/Паскале абсолютно ненужные лексемы:
    procedure
    function
    var
    do
    to, downto
    ...

    А?

    --
    С уважением,
    Alex Besogonov (alexy@izh.com)
    Posted via RSDN NNTP Server 1.9
    Sapienti sat!
    Re[6]: Синтаксический оверхед
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 09.06.05 10:20
    Оценка: -2 :)))
    Здравствуйте, Курилка, Вы писали:

    К>Т.е. на паскалеподобном языке не пишут промышленный код?


    1) Не на Паскале подобном (он устарел более чем двадцать пять лет назад), а на Modula/Oberon — подобном.
    2) Для разных языков общепринятые способы оформления текста — разные. Для Си-образного языка, я насчитал оверхед по оформлению в 700 процентов по сравнению с минимально возможным.
    Re[4]: Ошибка
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 09.06.05 10:23
    Оценка: +1
    Здравствуйте, Privalov, Вы писали:

    P>Опять же, углубляясь в детали, отметим, что ";" является разделителем между операторами, в результате возникает путаница, когда ее ставить, а когда нет.


    Путаницы не возникает ни когда — любые две инструкции всегда разделяются разделителем.
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.