OSDev
http://osdev.ru/

Беседа о создании нового языка программирования
http://osdev.ru/viewtopic.php?f=18&t=1026
Страница 26 из 29

Автор:  Yoda [ 17 фев 2015, 18:39 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

Юрий писал(а):
Если коротко, то объяснение такое:
Код:
/* начало комментария
   char  x[] = "*/";    // ошибка, начиная с «";»
конец комментария */

Такой код внутри комментария «ломает» этот комментарий. Чтобы правильно определить начало и конец всех вложенных комментариев, нужно проводить, как минимум, лексический анализ.

Этот момент решается очень просто – маскированием символов внутри строковой константы, например так:
Код:
/* начало комментария
   char  x[] = "*\/";    // больше нет ошибки
конец комментария */

И, кстати, в данном случае вложенность комментариев не играет никакой роли, такая конструкция ломает и невложенный комментарий.
Хуже обстоит дело с так называемыми raw strings, там где вся предварительная обработка отключена, но они в целом и так представляют собой кошмар лексического анализатора.
ЕМНИП, я пытался оставить свои комментарии на вашем сайте, но почему-то они не оставлялись.

Автор:  Himik [ 17 фев 2015, 18:50 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

Ещё можно использовать слияние строк
char x[] = "*" "/";

Автор:  Bargest [ 17 фев 2015, 18:56 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

По поводу elseif:
Цитата:
Оператор условия: <...>
и именно так и должно восприниматься компилятором. Создавать лишнее ключевое слово типа elif нет никакого смысла.
запретить нафиг блоки кода с одним оператором без указания скобок.

Добавление новых ключевых слов - плохо, особенно когда то же самое можно было бы записать без них. Но отказ elseif в купе с обязательным наличием операторных скобок может превратить цепочку условий в нечто ужасное:
Код:
if str1 = "123" {}
else
{
    if str2 = "234" {}
    else
    {
        if str3 = "345" {}
        else
        {
            if str4 = "456" {}
            else
            {
                doSomething;
            }
        }
    }
}

И так может продолжаться долго. Иногда switch/case не применим, например, когда условия в цепочке сложные, касаются разных переменных, или когда идет не просто проверка на числа. И это будет ужас.
Возможно имеет смысл сделать единственный случай отсутствия операторных скобок - наличие if после else. Это, конечно, несколько идет вразрез с обсуждаемой концепцией, но во всяком случае поможет избежать вышеописанной ситуации.
А слово elseif мне не нравится по самому смыслу - это ж склейка двух уже существующих ключевых слов в третье, причем какое-то противоестественное, да еще и так сказать создающее новый тип блока ветвления.

Автор:  Freeman [ 17 фев 2015, 19:38 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

Yoda писал(а):
Этот момент решается очень просто – маскированием символов внутри строковой константы

Если правильно понял, Юрий подразумевает синтаксическое обособление нерабочего кода одной командой, необязательно в IDE. Кто будет маскировать строковые константы -- IDE или программист? Если программист, то чем это отличается от обычных комментариев?

Идею спецразметки для нерабочего кода я нахожу годной, рассматриваю вариант реализации. В Канторе это наверняка будет еще один DSL -- разбираемый синтаксическим анализатором Кантора в /dev/null. Нужно только символ придумать.

Bargest писал(а):
Возможно имеет смысл сделать единственный случай отсутствия операторных скобок - наличие if после else. Это, конечно, несколько идет вразрез с обсуждаемой концепцией, но во всяком случае поможет избежать вышеописанной ситуации.

Я уже на это напоролся. Вначале принял опрометчивое решение, заменив elsif совмещением else if, а теперь его приходится исправлять, чтобы не возвращать уродца в синтаксис.

Автор:  Bargest [ 17 фев 2015, 20:40 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

Да, действительно, неоднозначность ввиду отсутствия открывающих операторных скобок - проблема. Похоже, что при сохранении else и if отдельными словами решить эту проблему могут только строгие отступы (конкретно, else if - это тот самый elseif, а else \r\n if - это уже новая команда в блоке, требующем отдельного end). Хотя это все равно несколько нарушает концепцию и не есть комильфо.

Автор:  Yoda [ 18 фев 2015, 11:34 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

Freeman писал(а):
Если правильно понял, Юрий подразумевает синтаксическое обособление нерабочего кода одной командой, необязательно в IDE. Кто будет маскировать строковые константы -- IDE или программист? Если программист, то чем это отличается от обычных комментариев?

Не совсем понимаю, о чём вы. Можно маскировать автоматически в IDE, это делается довольно просто - достаточно парсить все строковые и символьные константы и заменять последовательности */ на *\/, семантика от этого не меняется. Может это делать и программист, особенно удачно совмещается с подсветкой синтаксиса, – после комментирования участка кода случайно оставшаяся часть будет подсвечена как код. В конце концов, не проблема столкнуться с синтаксической ошибкой – это будет мгновенно обнаружено при ближайшей компиляции. Проблема – столкнуться с ситуацией, когда синтаксических и грамматических ошибок не возникнет, и код начнёт компилироваться с другой семантикой. Такая ситуация здесь практически исключена, т.к. закрывающая кавычка превратится в открывающую и чтобы сохранить компилируемость, надо сильно извратиться с содержимым строки, последующими комментариями и кодом вокруг этого участка.

Bargest писал(а):
Но отказ elseif в купе с обязательным наличием операторных скобок может превратить цепочку условий в нечто ужасное:
Код:
if str1 = "123" {}
else
{
    if str2 = "234" {}
    else
    {
        if str3 = "345" {}
        else
        {
            if str4 = "456" {}
            else
            {
                doSomething;
            }
        }
    }
}

И так может продолжаться долго.

Я эту проблему давно решил для себя даже в C/C++ следующим образом:
Код:
if (num1=123) {
  ...;
} else if (num2=234) {
  ...;
} else if (num3=345) {
  ...;
} else if (num4=456) {
  ...;
} else {
  ...;
}

Автор:  Himik [ 18 фев 2015, 13:37 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

Чтобы не смешивать управляющие символы с выражениями, можно применить ограничение, запрещающее управляющие символы в середине строки, а только в начале и в конце. Можно так
/* ... */
или так
/* ...
...
... */
так же можно
/*
...
*/
а так нельзя
... /* ... */ ...

Автор:  rst256 [ 18 фев 2015, 14:28 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

Yoda писал(а):
Юрий писал(а):
Если коротко, то объяснение такое:
Код:
/* начало комментария
   char  x[] = "*/";    // ошибка, начиная с «";»
конец комментария */

Такой код внутри комментария «ломает» этот комментарий. Чтобы правильно определить начало и конец всех вложенных комментариев, нужно проводить, как минимум, лексический анализ.

Этот момент решается очень просто – маскированием символов внутри строковой константы, например так:
Код:
/* начало комментария
   char  x[] = "*\/";    // больше нет ошибки
конец комментария */

И, кстати, в данном случае вложенность комментариев не играет никакой роли, такая конструкция ломает и невложенный комментарий.
Хуже обстоит дело с так называемыми raw strings, там где вся предварительная обработка отключена, но они в целом и так представляют собой кошмар лексического анализатора.
ЕМНИП, я пытался оставить свои комментарии на вашем сайте, но почему-то они не оставлялись.


Извините, а зачем вы вообще суете в комментарии код, они же не для этого? что-то надо выкинуть из программы, но возможно вернуть или просто временно отключить?
Есть такая вещь как Система управления версиями, удалил что не надо сделал коммит. не понравилось вернул.
Разумеется можно внести в блок токенизатора, обходящий комментарии, обработку строковых констант, и даже вложенные обработать (только если используется формат begin-end здесь /*...*/) это вообще то тривиально.
и можно дальше продолжать спокойно есть свой суп вилкой.

Автор:  Freeman [ 18 фев 2015, 17:04 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

Yoda писал(а):
особенно удачно совмещается с подсветкой синтаксиса, – после комментирования участка кода случайно оставшаяся часть будет подсвечена как код. В конце концов, не проблема столкнуться с синтаксической ошибкой – это будет мгновенно обнаружено при ближайшей компиляции.

Идея в том, чтобы иметь в языке синтаксическое средство для гарантированного комментирования нерабочего кода, безо всяких там случайностей. Во время творческого процесса программист не должен отвлекаться на мелочи. А то тут компромисс, там компромисс, на авось понадеялись... и знакомое УГ вышло.

Автор:  Himik [ 18 фев 2015, 17:20 ]
Заголовок сообщения:  Re: Беседа о создании нового языка программирования

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

Страница 26 из 29 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/