Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки 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 в несколько изменённом стиле, который бы подчёркивал, что это код не выполняется. Однако основы стиля должны сохраняться: те же отступы, пиктограммы, расцветка и т.д.

Опубликовано: 2012.09.25, последняя правка: 2015.11.02    07:44

ОценитеОценки посетителей
   ██████████████ 2 (33.3%)
   █████████████████████ 3 (50%)
   ▌ 0
   ███████ 1 (16.6%)

Отзывы

     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) в качестве способа оформления варианта, и там же обоснование преимуществ применения для этих целей операции условной компиляции именно потому, что можно включить исключённый код, не редактируя исходник.

     2018/11/11 14:01, Александр Коновалов aka Маздайщик          # 

Хочу добавить два уточнения. xDDGx писал, что надо использовать синтаксис
disabled code (
bla-bla-bla
)
Автор сайта, между прочим, предлагает тоже самое. Но, поскольку у него вместо if (...) { ... } используется синтаксис вида (if ... ...), он предлагает вариант
(disabled code
bla-bla-bla
)
только вместо ключевой фразы «disabled code» используются две звёздочки:
(**
bla-bla-bla
)

rst256 пишет про использование препроцессора Си. Я программирую на Си/Си++ и хочу добавить, что рекомендуемая практика выключения фрагментов кода в нём
#if 0
отключённый код
#endif
Причём, кстати, некоторые текстовые редакторы с подсветкой синтаксиса (даже не IDE, а просто редакторы) такой код подсвечивают как комментарий.

Согласен с комментаторами выше, что комментировать код в общем случае — моветон. Код, подлежащий удалению, должен удаляться, поскольку его всегда можно достать из бэкапов, особенно, если бэкап — система контроля версий. Но вот хорошей практикой может быть комментирование «будущего кода»:
container.push_back(x);
/* container.emplace_back(x);*/
/* TODO: uncomment on new compiler С++14 */
Сейчас используется старый компилятор C++, стандартная библиотека которого не знает более эффективного метода emplace_back. При переходе на более свежий компилятор нужно будет заменить вызов push_back на emplace_back. Это из того ПО, которое я поддерживаю на работе.

     2021/03/27 12:40, Виталий Монастырский          # 

Нет, я считаю этот подход не разумным и изначально провоцирующем ошибки. Например, в том же pythone """ может вызвать ужас летящий на крыльях ночи, если каким-либо чудом неправильно расставить эти самые операторы комментария. Возможно кто-то не поверит, но у меня реально был не один случай, когда включался код, который по идее должен был быть закомментированным и выполнялся, полностью искажая результат вычислений, а я часами ломал голову над тем — где же вычисления выполняются не правильно. А все дело было в том, что отвлекся где-то на секундочку, а потом забыл, что именно в это время удалял пару операторов комментария и недоудалял нижний, который находился глубоко внизу кода. В результате весь запасной и заменный код, который был глубоко внизу файла, получился рабочим. И это было не раз и не два.

Так что я считаю, что идеи подобные этой — изначально ошибко-генерирующие. А это значит, что для целей блокировки кода от исполнения:

а) должны применяться только разносторонние комментарии;

б) не должны применяться зарезервированные операторы языка.

У меня это отдельный вид разностороннего комментария:
@_
какой-то код
_@
Ни с чем не спутаешь, нигде ни с чем не перекрестится и никак не повлияет на рабочий код.

Добавить свой отзыв

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

Авторизация

Регистрация

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

Карта сайта


Содержание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

●●  Помеченные комментарии

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

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

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

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

●  Циклы

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

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

●  Изменение приоритетов операций

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

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

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

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

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

●●  О неправомерном доступе к памяти через указатели

●  Обработка ошибок

●  Функциональное программирование

●●  Нечистые действия в чистых функциях

●●  О чистоте и нечистоте функций и языков

●●  Макросы — это чистые функции, исполняемые во время компиляции

●●  Хаскелл, детище британских учёных

●●  Измеряем замедление при вызове функций высших порядков

●●  C vs Haskell: сравнение скорости на простом примере

●●  Уникальность имён функций: за и против

●●  Каррирование: для чего и как

●●  О тестах, доказывающих отсутствие ошибок

●  Надёжные программы из ненадёжных компонентов

●●  О многократном резервировании функций

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

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

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

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

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

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

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

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

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

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

●●  Изменение длины объекта в стеке во время исполнения

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

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

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

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

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

●  Реализация параметрического полиморфизма

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

Компилятор

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

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

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

Новости и прочее




Последние отзывы

2024/04/19 22:13 ••• Автор сайта
Признаки устаревшего языка

2024/04/18 11:14 ••• Ivan
Энтузиасты-разработчики компиляторов и их проекты

2024/04/11 00:08 ••• Автор сайта
Постфиксные инкремент и декремент

2024/04/09 23:50 ••• Автор сайта
Русский язык и программирование

2024/04/07 15:33 ••• MihalNik
Все языки эквивалентны. Но некоторые из них эквивалентнее других

2024/04/01 23:39 ••• Бурановский дедушка
Новости и прочее

2024/04/01 23:32 ••• Бурановский дедушка
Русской операционной системой должна стать ReactOS

2024/03/22 20:41 ••• void
Раскрутка компилятора

2024/03/20 19:54 ••• kt
О многократном резервировании функций

2024/03/20 13:13 ••• Неслучайный читатель
Надёжные программы из ненадёжных компонентов

2024/03/07 14:16 ••• Неслучайный читатель
«Двухмерный» синтаксис Python

2024/03/03 16:49 ••• Автор сайта
О неправомерном доступе к памяти через указатели

2024/02/28 18:59 ••• Вежливый Лис
Про лебедей, раков и щук