Нерабочий код
Как уже отмечалось в статье о комментариях,
обычные скобочные комментарии по некоторым причинам не могут вложенными.
Но тем не менее весьма желательная возможность «выключить» из работы некоторый кусок кода.
С программой на каком-нибудь обычном языке невозможно «выключить» код, не обращая на его содержимое.
Если в Си-шной программе использовать для этого «/* ... */», то это будет правильным в том случае,
если коментируемый участок кода не содержит «*/».
/*
// некий код
// если ли гарантия, что он не содержит «*/»?
*/ // нет гарантии, что комментарий закончится именно здесь
Используемая нами скобочная структура позволяет создать такой вид комментариев, которые могут быть вложенными.
Встретив начало такого комментария, компилятор продолжает разбирать программу на лексемы.
Лексемы внутри такого комментария лишь должны помогать найти его конец.
Но не должны повлечь за собой работу с таблицей идентификаторов и т.д., для этих участков кода не должна выполняться генерация кода.
Рассмотрим пример:
(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
Отзывы
✅ 2014/02/03 13:10, Pensulo #0
Благодаря Вам, мне только что пришла в голову гениальная идея (сам себя не похвалишь...)!
Действительно, а почему мы собственно используем метод комментариев в программе для деактивации части кода?! Ведь наша задача в этом случае именно что ДЕАКТИВИРОВАТЬ до поры до времени часть программного кода, а вовсе не прокомментировать (с целью разъяснения) часть программного кода. Вот и надо использовать другой принцип для деактивации участков кода, не зависящий от употреблённых комментариев.
К тому же, если использовать какой-либо специальный метод для деактивации части кода, который не конфликтует с обычными комментариями, то и проблема вложенных комментариев решится сама собою.✅ 2014/02/03 17:49, Автор сайта #1
Вы правильно поняли, задача именно деактивировать код. В распространённых языках нет средств, заточенных под эту задачу. Да нет таких языков, в которых часть кода можно было бы отключить, не прибегая к комментариям! С целью отключения куска программы приходится (чаще всего) использовать длинные комментарии. А они не могут быть вложенными. Поэтому для деактивации кода — один синтаксис, для длинных комментариев — другой, чтобы они друг другу не мешали. При этом конструкция «нерабочий код» может иметь вложения другого «нерабочего кода». В этом и состоит идея.
Назвал статью «нерабочий код», потому что наш язык всё-таки надо беречь от чрезмерной иностранщины. «Деактивированный код» в этом смысле проигрывает «нерабочему коду».✅ 2014/02/04 12:02, Pensulo #2
Предлагаю подобрать такую комбинацию символов (пока не ясно сколько и каких точно этих символов должно быть), чтобы она с очень большой вероятностью не встречалась ни в коде программы ни в комментариях любого вида. И тогда можно будет выполнять "деактивацию" любого участка кода и с любой степенью вложенности "деактиваций" друг в друга. И вложенность комментариев в этом случае тоже реализовывать не потребуется, ведь тогда они (комментарии) будут использоваться сугубо по своему первоначальному предназначению.✅ 2014/02/04 18:17, Автор сайта #3
Если Вы обратили внимание, то выше, в статье, уже предложен такой синтаксис этого особого комментариев («нерабочий код»):
(** код, который надо отключить (** вложенный «нерабочий код», который тоже отключен )) В результате нет смысла задумываться о том, как сделать длинные комментарии вложенными — в этой вложенности теперь нет необходимости.✅ 2015/02/22 06:43, rst256 #4
Ещё ни один компилятор не делался с расчетом на то, что им будет пользоваться человек, не освоивший git, svn или hg. Ибо человек, освоивший их, такой ..., таким вопросом не страдает. Загонять в комменты большие куски кода, снимать комменты, вспоминать что кое-что из кода, что уже удалил, так как комментов становилось сильно много, неожиданно стало нужно и т.д. — Bad way, very bad way. Реализация такой бяки, должна стыдливо прятаться в starter ide for children. Дональд Кнут, наверное инфаркт получил, прочти он такое обсуждение, слава богу он кажется не читает по-русски.✅ 2015/02/25 13:48, Автор сайта #5
Компиляторы делались половину столетия без учёта факта существования github. Когда Вирт писал свой Паскаль, почему он не выкладывал свой код github? А Дональд Кнут, писавший код для своих книг «Искусство программирования», почему не хранил этот код в svn? Странные они, эти Керниганы, Ритчи и прочие олдскульные людишки. У них был такой bad way.
Есть такое поучение: «уважайте своих родителей, они выучились без Гугла и Википедии». Мне кажется, к подходам в разработке ПО «старой школы» можно отнестись с пониманием.✅ 2015/10/31 02:53, Nick #6
А как будет работать ваш комментарий на пример в таком случае:(** print ')'; ) В perl'е есть комментарии, которые документируют код. Первый символ на строке «=» дальше спец слово, заканчивается блок комбинацией «=cut» например:=item комментарий =cut Я для отключения блоков использовал:=rem ..... =cut Комбинации «=rem» в языке нет, но perl это проглатывал, а при генерации документации просто варнинг вылетал...
Но этот способ не вложенный, в общем в новом языке можно, нечто подобное сделать.✅ 2015/10/31 23:28, Автор сайта #7
Задумка в том, чтобы любые вложенные блоки можно отключить:(** print ')'; (** print ')'; ) ) Осталось это воплотить в языке :)✅ 2015/11/02 00:28, Nick #8
Чем же тогда ваша скобочная структура лучше комментариев в стиле С? Вы в статье пишете, что ваш комментарий (** ) позволяет делать вложенные комментарии без разбора вложенного кода (только отследив скобки). Говорите, что сишные комментарии такого не позволяют, т.к. нет гарантии, что в отключаемом коде не встретится комбинация '*/'. Если же компилятор делает разбор кода внутри скобок, то это просто другое обозначение комментария и существенной разницы между таким (** ) и таким /* */ обозначением комментария нет...✅ 2015/11/02 10:45, Автор сайта #9
Процитирую написанное выше: Встретив начало такого комментария, компилятор продолжает разбирать программу на лексемы. Лексемы внутри такого комментария лишь должны помогать найти его конец. Но не должны повлечь за собой работу с таблицей идентификаторов и т.д., для этих участков кода не должна выполняться генерация кода. . Этот вид комментариев позволяет делать вложенные комментарии с разбором вложенного кода. Но этот разбор не влёчёт за собой включение разобранных конструкций в семантику программы.✅ 2016/06/21 22:07, rst256 #10
Ересь всё это. Самый удобный вариант для подобной задачи — это короткие комментарии, они же позволяют отключить любой код и обрабатываются они в разы быстрее по сравнению с предложенным вариантом.✅ 2016/06/22 12:17, Автор сайта #11
Короткие комментарии отключают одну единственную строку. Если блок занимает 20 строк, то потребуется 20 коротких комментариев. А как отключить блок целиком, «одним движением»?✅ 2016/08/22 15:09, xDDGx #12
Комментарии действительно не предназначены для отключения участков кода. В тех же 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 #13
Короткие комментарии отключают одну единственную строку. Если блок занимает 20 строк, то потребуется 20 коротких комментариев. А как отключить блок целиком, «одним движением»? Выделить его и нажать ctrl+Q. Комбинация клавиш дана для примера. Можно даже ваш любимый ворд научить этому несложному фокусу.#ifdef UNDEFINED_MACRO /* этот код не будет даже компилироваться */ #endif В последнем случае мы можем включить исключённый код, даже не редактируя исходник, просто добавив при компиляции параметр -DUNDEFINED_MACRO.
Кстати, это пожалуй единственное упоминание о подобном использовании комментариев, я его видел только один раз в книге Горбунов-Посадов М.М. "Расширяемые программы". (http://keldysh.ru/gorbunov/p107.htm) в качестве способа оформления варианта, и там же обоснование преимуществ применения для этих целей операции условной компиляции именно потому, что можно включить исключённый код, не редактируя исходник.✅ 2018/11/11 14:01, Александр Коновалов aka Маздайщик #14
Хочу добавить два уточнения. 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, Виталий Монастырский #15
Нет, я считаю этот подход не разумным и изначально провоцирующем ошибки. Например, в том же pythone """ может вызвать ужас летящий на крыльях ночи, если каким-либо чудом неправильно расставить эти самые операторы комментария. Возможно кто-то не поверит, но у меня реально был не один случай, когда включался код, который по идее должен был быть закомментированным и выполнялся, полностью искажая результат вычислений, а я часами ломал голову над тем — где же вычисления выполняются не правильно. А все дело было в том, что отвлекся где-то на секундочку, а потом забыл, что именно в это время удалял пару операторов комментария и недоудалял нижний, который находился глубоко внизу кода. В результате весь запасной и заменный код, который был глубоко внизу файла, получился рабочим. И это было не раз и не два.
Так что я считаю, что идеи подобные этой — изначально ошибко-генерирующие. А это значит, что для целей блокировки кода от исполнения:
а) должны применяться только разносторонние комментарии;
б) не должны применяться зарезервированные операторы языка.
У меня это отдельный вид разностороннего комментария: @_ какой-то код _@ Ни с чем не спутаешь, нигде ни с чем не перекрестится и никак не повлияет на рабочий код. Добавить свой отзыв
Написать автору можно на электронную почту mail(аt)compiler.su
|