Re: Синтаксический оверхед
От: tarkil Россия http://5209.copi.ru/
Дата: 09.06.05 10:29
Оценка: 15 (9) +4
Здравствуйте, Сергей Губанов, Вы писали:

СГ>1) Известно, что...


Анонимный источник, близкий к правительству сообщает...

СГ>2) Известно, что стандарты оформления Си-образного кода требуют использования большего количества строчек чем это реально необходимо


Стандарты есть разные, Вы о каком их них?

СГ>синтаксический оверхед = a/b = c


Чтобы не возвращаться к этому впоследствии, скажу, что простой подсчёт количества лексем, включая сюда все скобочки, малоосмыслен. Фишка синтаксиса в удобном восприятии, а лишняя пара скобок практически никогда этому не мешает — они маленькие

  • Цикл с проверкой условия в начале итерации

    while(a) x();

    Я предпочитаю выносить x() на отдельную строку, чтобы было удобно ставить breakpoint. Для Виртовских языков это тоже актуально, кстати.

  • Цикл с проверкой условия в середине итерации
    Если уж мы взялись оптимизировать кол-во строчек (занятие почти бессмысленное, но тем не менее...), то никто ничего не теряет от помещения открывающей скобки на одну строку с предваряющей конструкцией.

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


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

    В Вашем синтаксисе неясно, что "y" это вызов функции. Если эта функция принимает параметры, то скобочки и в Обероне потребуются. Новые перерасходы считайте сами.

  • Цикл с проверкой условия в конце итерации

    do x(); while(a);

  • Инструкция выполнения по условию

    if(a) x();

  • Инструкция выполнения по условию с альтернативой

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

  • Сложная инструкция выполнения по условию

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

    Здесь я не стал вытягивать оператор в одну строку, но порекомендовал бы и d Обероне разбить его на три. Для наглядности.

  • Инструкция выбора варианта выполнения
    Реально необходимый и достаточный синтаксис:

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

    Давайте всё-таки не будем громоздить спецсимволы один на другой и напишем красиво, тем более, что в реальном коде вместо x, y, z наверняка будет что-то помассивнее. А если записать в пять строк, явно видна асимметрия синтаксиса Оберона: каждая строка завершается по-своему.

    Я везде поубирал в примерах лишние {} и предвижу возражение: мол, если действия будут сложнее x(), y(), z(), то сишный синтаксис потребует лишних скобок, а обероновский — нет. На это я сразу отвечу, что тогда и в Обероне для наглядности потребуется перенос по строчкам, а пара скобочек в массе кода просто визуально потеряется. Пример (скопировал кусок отлаживаемого кода):

    "Сиобразный":

    if(a) {
        ItemIndex.Index = atoi( Buff.POSTINDEX );
        ItemIndex.IndexState = ItemIndex.Index == 0 ? INDEX_UNKNOWN : INDEX_EXACT;
        Syncronize( ItemIndex );
    }
    else {
        ItemIndex.IndexState =
            Buff.FLAGS & ADDR_FLAG_ACTUAL ? INDEXES_DIFFERENT : INDEX_UNKNOWN;
    }
    if( FirstItem ) //...

    "Оберонообразный" (сорри, выражения внутри я не преобразовал, не знаю, как; скажу спасибо, если кто-то это за меня сделает)

    IF a THEN
        ItemIndex.Index = atoi( Buff.POSTINDEX );
        ItemIndex.IndexState = ItemIndex.Index == 0 ? INDEX_UNKNOWN : INDEX_EXACT;
        Syncronize( ItemIndex );
    ELSE
        ItemIndex.IndexState =
            Buff.FLAGS & ADDR_FLAG_ACTUAL ? INDEXES_DIFFERENT : INDEX_UNKNOWN;
    END
    
    IF FirstItem THEN //...

    Что видим? Те же 10 строк.

    Ну и финальный плевок в Оберон — идентификаторы ЗАГЛАВНЫМИ буквами. Вот это напрягает втрое больше, чем все сишные скобочки вместе взятые — ну не ориентированы шрифты на то, чтоб подряд идущие заглавные хорошо читались! Те, кто рисуют шрифты добиваются того, чтобы строчные буквочки плавно взглядом воспринимались, а на заглавных взгляд чтобы наоборот — спотыкался.

    Резюме

    Синтаксис языка C++ (Java, C#...) возможно страдает некоторой избыточностью, но её масштабы сильно преувеличены в исходном сообщении. Вопрос удобочитаемости остаётся открытым — люди, уже знакомые с сишным синтаксисом как правило не испытывают ни малейших затруднений в чтении программ, данных про Оберон не имею, полагаю, ситуация та же. Компактность кода (измеряемая в количестве лексем или символов), как таковая, является сомнительным приоритетом, никак не обосновано то, что буквы надо экономить. Количество строк более обоснованный критерий, ибо когда функция/алгоритм занимаешь меньше места (а особенно, если целиком влазит на экран), он проще понимается, "охватывается одним взглядом". Однако для этого нужно брать какой-то реальный код и сравнивать его (как сделал я в примере выше и который не показал никаких преимуществ Оберона). Отдельные синтаксические конструкции тут роли не играют.

    Берёшься сравнивать — сравнивай добросовестно. Мы технари, а не рекламисты. Imho.
  • --
    wbr, Peter Taran
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.