Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Прочее

Нерабочий код

Как уже отмечалось в статье о комментариях, обычные скобочные комментарии по некоторым причинам не могут вложенными. Но тем не менее весьма желательная возможность «выключить» из работы некоторый кусок кода. С программой на каком-нибудь обычном языке невозможно «выключить» код, не обращая на его содержимое. Если в Си-шной программе использовать для этого «/* ... */», то это будет правильным в том случае, если коментируемый участок кода не содержит «*/».

/*
	// некий код
	// если ли гарантия, что он не содержит «*/»?

*/      // нет гарантии, что комментарий закончится именно здесь
        Используемая нами скобочная структура позволяет создать такой вид комментариев, которые могут быть вложенными. Встретив начало такого комментария, компилятор продолжает разбирать программу на лексемы. Лексемы внутри такого комментария лишь должны помогать найти его конец. Но не должны повлечь за собой работу с таблицей идентификаторов и т.д., для этих участков кода не должна выполняться генерация кода. Рассмотрим пример:
(if a > b
    z = 0
 else
    z = 10
    q = 1
    (int  i=0 loop  i < z; ++i
	q += f(i);
        (if q < N
           exit
        )
    )
)
        Если мы начнём этот новый вид комментариев перед «if a > b», то закончится он там, где должен был закончиться оператор «if»:
(**if a > b
    z = 0
 else
    z = 10
    q = 1
    (int  i=0 loop  i < z; ++i
	q += f(i);
        (if q < N
           exit
        )
    )
)  // Это был конец «if», а теперь это конец нерабочего кода
        А ещё мы стремились к тому, чтобы этот вид комментариев был вложенным. Теперь это решается легко:
(**if a > b	             // комментарий 1-го уровня: начало
    z = 0
 else
    z = 10
    q = 1
    (**int i=0 loop i < z; ++i  // комментарий 2-го уровня: начало
	q += f(i);
        (**if q < N          // комментарий 3-го уровня: начало
           exit
        )                    // комментарий 3-го уровня: конец
    )                        // комментарий 2-го уровня: конец
)                            // комментарий 1-го уровня: конец
        Такой нерабочий код должен отображаться в IDE в несколько изменённом стиле, который бы подчёркивал, что это код не выполняется. Однако основы стиля должны сохраняться: те же отступы, пиктограммы, расцветка и т.д.

Последняя правка: 2015-11-02    10:44

ОценитеОценки посетителей
   ▌ 0
   ██████████████████████████████████████████ 1 (100%)
   ▌ 0
   ▌ 0

Отзывы

     2014/02/03 13:10, Pensulo

Благодаря Вам, мне только что пришла в голову гениальная идея (сам себя не похвалишь...)!

Действительно, а почему мы собственно используем метод комментариев в программе для деактивации части кода?! Ведь наша задача в этом случае именно что ДЕАКТИВИРОВАТЬ до поры до времени часть программного кода, а вовсе не прокомментировать (с целью разъяснения) часть программного кода. Вот и надо использовать другой принцип для деактивации участков кода, не зависящий от употреблённых комментариев.

К тому же, если использовать какой-либо специальный метод для деактивации части кода, который не конфликтует с обычными комментариями, то и проблема вложенных комментариев решится сама собою.

     2014/02/03 17:49, Автор сайта

Вы правильно поняли, задача именно деактивировать код. В распространённых языках нет средств, заточенных под эту задачу. Да нет таких языков, в которых часть кода можно было бы отключить, не прибегая к комментариям! С целью отключения куска программы приходится (чаще всего) использовать длинные комментарии. А они не могут быть вложенными. Поэтому для деактивации кода – один синтаксис, для длинных комментариев – другой, чтобы они друг другу не мешали. При этом конструкция «нерабочий код» может иметь вложения другого «нерабочего кода». В этом и состоит идея.

Назвал статью «нерабочий код», потому что наш язык всё-таки надо беречь от чрезмерной иностранщины. «Деактивированный код» в этом смысле проигрывает «нерабочему коду».

     2014/02/04 12:02, Pensulo

Предлагаю подобрать такую комбинацию символов (пока не ясно сколько и каких точно этих символов должно быть), чтобы она с очень большой вероятностью не встречалась ни в коде программы ни в комментариях любого вида. И тогда можно будет выполнять "деактивацию" любого участка кода и с любой степенью вложенности "деактиваций" друг в друга. И вложенность комментариев в этом случае тоже реализовывать не потребуется, ведь тогда они (комментарии) будут использоваться сугубо по своему первоначальному предназначению.

     2014/02/04 18:17, Автор сайта

Если Вы обратили внимание, то выше, в статье, уже предложен такой синтаксис этого особого комментариев («нерабочий код»):
 (**  код, который надо отключить
      (** вложенный «нерабочий код», который тоже отключен ))
В результате нет смысла задумываться о том, как сделать длинные комментарии вложенными – в этой вложенности теперь нет необходимости.

     2015/02/22 06:43, rst256

Ещё ни один компилятор не делался с расчетом на то, что им будет пользоваться человек, не освоивший git, svn или hg. Ибо человек, освоивший их, такой ..., таким вопросом не страдает. Загонять в комменты большие куски кода, снимать комменты, вспоминать что кое-что из кода, что уже удалил, так как комментов становилось сильно много, неожиданно стало нужно и т.д. - Bad way, very bad way.
Реализация такой бяки, должна стыдливо прятаться в starter ide for children. Дональд Кнут, наверное инфаркт получил, прочти он такое обсуждение, слава богу он кажется не читает по-русски.

     2015/02/25 13:48, Автор сайта

Компиляторы делались половину столетия без учёта факта существования github. Когда Вирт писал свой Паскаль, почему он не выкладывал свой код github? А Дональд Кнут, писавший код для своих книг «Искусство программирования», почему не хранил этот код в svn? Странные они, эти Керниганы, Ритчи и прочие олдскульные людишки. У них был такой bad way.

Есть такое поучение: «уважайте своих родителей, они выучились без Гугла и Википедии». Мне кажется, к подходам в разработке ПО «старой школы» можно отнестись с пониманием.

     2015/10/31 02:53, Nick

А как будет работать ваш комментарий на пример в таком случае:
(**
print ')';
)
В perl'е есть комментарии, которые документируют код. Первый символ на строке «=» дальше спец слово, заканчивается блок комбинацией «=cut» например:
=item
комментарий
=cut
Я для отключения блоков использовал:
=rem
.....
=cut
Комбинации «=rem» в языке нет, но perl это проглатывал, а при генерации документации просто варнинг вылетал...

Но этот способ не вложенный, в общем в новом языке можно, нечто подобное сделать.

     2015/10/31 23:28, Автор сайта

Задумка в том, чтобы любые вложенные блоки можно отключить:
(**
print ')';
(** print ')';
)
)
Осталось это воплотить в языке :)

     2015/11/02 00:28, Nick

Чем же тогда ваша скобочная структура лучше комментариев в стиле С?
Вы в статье пишете, что ваш комментарий (** ) позволяет делать вложенные комментарии без разбора вложенного кода (только отследив скобки). Говорите, что сишные комментарии такого не позволяют, т.к. нет гарантии, что в отключаемом коде не встретится комбинация '*/'. Если же компилятор делает разбор кода внутри скобок, то это просто другое обозначение комментария и существенной разницы между таким (** ) и таким /* */ обозначением комментария нет...

     2015/11/02 10:45, Автор сайта

Процитирую написанное выше:

Встретив начало такого комментария, компилятор продолжает разбирать программу на лексемы. Лексемы внутри такого комментария лишь должны помогать найти его конец. Но не должны повлечь за собой работу с таблицей идентификаторов и т.д., для этих участков кода не должна выполняться генерация кода.

. Этот вид комментариев позволяет делать вложенные комментарии с разбором вложенного кода. Но этот разбор не влёчёт за собой включение разобранных конструкций в семантику программы.

     2016/06/21 22:07, rst256

Ересь всё это. Самый удобный вариант для подобной задачи – это короткие комментарии, они же позволяют отключить любой код и обрабатываются они в разы быстрее по сравнению с предложенным вариантом.

     2016/06/22 12:17, Автор сайта

Короткие комментарии отключают одну единственную строку. Если блок занимает 20 строк, то потребуется 20 коротких комментариев. А как отключить блок целиком, «одним движением»?

     2016/08/22 15:09, xDDGx

Комментарии действительно не предназначены для отключения участков кода. В тех же C/C++ этого можно достичь другими методами:
if (false){
/* этот код никогда не выполнится и может быть выброшен компилятором при оптимизации */
}
или так
#ifdef UNDEFINED_MACRO
/* этот код не будет даже компилироваться */
#endif
В последнем случае мы можем включить исключённый код, даже не редактируя исходник, просто добавив при компиляции параметр -DUNDEFINED_MACRO

Тем не менее, иметь отдельный, специально заточенный синтаксис для такой функции было бы неплохо.
На мой взгляд, вместо того, чтобы использовать ещё один вид "комментариев", лучше зарезервировать ещё одно ключевое слово.
Например,
disable (
bla-bla-bla...
)
или даже
disable code (
bla-bla-bla...
)
Полагаю, такой синтаксис будет проще понять тем, кто впервые сталкивается с языком.

     2016/11/06 08:24, rst256

Короткие комментарии отключают одну единственную строку. Если блок занимает 20 строк, то потребуется 20 коротких комментариев. А как отключить блок целиком, «одним движением»?

Выделить его и нажать ctrl+Q. Комбинация клавиш дана для примера. Можно даже ваш любимый ворд научить этому несложному фокусу.

#ifdef UNDEFINED_MACRO
/* этот код не будет даже компилироваться */
#endif

В последнем случае мы можем включить исключённый код, даже не редактируя исходник, просто добавив при компиляции параметр -DUNDEFINED_MACRO.

Кстати, это пожалуй единственное упоминание о подобном использовании комментариев, я его видел только один раз в книге Горбунов-Посадов М.М. "Расширяемые программы". (http://keldysh.ru/gorbunov/p107.htm) в качестве способа оформления варианта, и там же обоснование преимуществ применения для этих целей операции условной компиляции именно потому, что можно включить исключённый код, не редактируя исходник.

Написать отзыв

Написать автору можно на электронную почту mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Каким должен быть язык программирования?

Анализ и критика

Устарел ли текст как форма представления программы

Русский язык и программирование

Многоязыковое программирование

Синтаксис языков программирования

Синтаксический сахар

Некоторые «вкусности» Алгол-68

«Двухмерный» синтаксис Python

Почему языки с синтаксисом Си популярнее языков с синтаксисом Паскаля?

Должна ли программа быть удобочитаемой?

Стиль языка программирования

Тексто-графическое представление программы

●  Разделители

●  Строки программы

●  Слева направо или справа налево?

Комментарии

●  Длинные комментарии

●  Короткие комментарии

●  Комментарии автоматической генерации документации

●  Нерабочий код

Нужны ли беззнаковые целые?

Шестнадцатиричные и двоичные константы

Условные операторы

Переключатель

Циклы

●  Продолжение цикла и выход из него

Некошерный «goto»

Операции присвоения и проверки на равенство. Возможно ли однаковое обозначение?

Так ли нужны операции «&&», «||» и «^^»?

Постфиксные инкремент и декремент

Почему в PHP для конкатенации строк используется «.»?

Указатели и ссылки в C++

Использование памяти

Почему динамическое распределение памяти – это плохо

Как обеспечить возврат функциями объектов переменной длины?

●  Типы переменного размера (dynamically sized types, DST) в языке Rust

●  Массивы переменной длины в C/C++

●  Размещение объектов в стеке, традиционный подход

●  Размещение объектов переменной длины с использованием множества стеков

●  Размещение объектов переменной длины с использованием двух стеков

●  Реализация двухстековой модели размещения данных

●  Двухстековая модель: тесты на скорость

●  Размещение объектов переменной длины с использованием одного стека

Можно ли забыть о «куче», если объекты переменной длины хранить в стеке

Безопасность и размещение объектов переменной длины в стеке

Массивы, структуры, типы, классы переменной длины

О хранении данных в стеке, вместо заключения

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Прочее

Последние комментарии

2018/10/11 22:29, Автор сайта
Формула расчета точности для умножения

2018/10/08 14:00, Неслучайный читатель
Сколько проходов должно быть у транслятора?

2018/10/06 12:19, Автор сайта
Тексто-графическое представление программы

2018/10/04 17:39, Автор сайта
Об исключенных командах или за что «списали» инструкцию INTO?

2018/09/29 16:52, Автор сайта
Как отличить унарный минус от бинарного

2018/09/22 20:13, Д.Ю.Караваев
Идеальный транслятор

2018/09/22 12:32, Автор сайта
Типы в инженерных задачах

2018/09/22 12:20, Д.Ю.Караваев
О русском языке в программировании