Кілька з них, але не одна з популярних, наскільки я знаю. Чи є щось погане в коментарях для вкладання?
Я планую розміщувати блокові коментарі (малою) мовою, над якою я працюю, але хотілося б знати, чи це погана ідея.
Кілька з них, але не одна з популярних, наскільки я знаю. Чи є щось погане в коментарях для вкладання?
Я планую розміщувати блокові коментарі (малою) мовою, над якою я працюю, але хотілося б знати, чи це погана ідея.
Відповіді:
Одне ще ніхто не згадував, тому я зазначу це: Бажання вкладати коментарі часто вказує на те, що програміст робить це неправильно.
По-перше, погодимось, що єдиний час, коли "вкладення" або "не вкладення" видно програмісту, коли програміст пише щось структурно так:
do_something();
/* comment /* nested comment */ more comment */
do_something_else();
Тепер, коли таке відбувається на практиці? Звичайно, програміст не збирається писати вкладені коментарі, які буквально виглядають як описаний вище фрагмент! Ні, на практиці, коли ми вкладаємо коментарі (або хочемо, щоб ми могли їх вкласти), це тому, що ми хочемо написати щось подібне:
do_something(); /* do a thing */
/* [ajo] 2017-12-03 this turned out to be unnecessary
do_something_else(); /* do another thing */
*/
І це БАД. Це не зразок, який ми (як мовні дизайнери) хочемо заохочувати! Правильний спосіб написання фрагмента коди вище:
do_something(); /* do a thing */
Цей "неправильний" код, той помилковий старт або будь-який він не належить до бази даних коду. Це належить, в кращому випадку, до історії контролю джерел. В ідеалі ви ніколи навіть не напишете неправильний код для початку, правда? І якщо там неправильний код слугував цілі, попереджаючи обслуговуючого персоналу не відновлювати його чомусь, ну, мабуть, це робота для добре написаного та навмисного коментаря до коду. Спроба висловити "не робити X", просто залишивши якийсь старий код, який робить X, але прокоментував це, - це не самий читабельний чи ефективний спосіб утримати людей від X.
Це все зводиться до простого правила, яке ви, можливо, чули раніше: Не коментуйте код. (Пошук по цій фразі поверне вгору багато з думок в угоді .)
Перед тим, як поставити запитання: так, такі мови, як C, C # і C ++ вже дають програмісту ще один інструмент для «закомментировать» великі блоки коду: #if 0
. Але це лише конкретне застосування препроцесора С, яке є самим великим і корисним інструментом. Насправді, мовою було б дуже важко і особливо важко підтримувати умовну компіляцію з, #if
але ще не підтримувати #if 0
.
Отже, ми встановили, що вкладені коментарі є актуальними лише тоді, коли програміст коментує код; і ми встановили (за умови консенсусу багатьох досвідчених програмістів), що коментувати код - це погана річ.
Щоб завершити силогізм, ми повинні визнати, що мовні дизайнери зацікавлені в просуванні добрих речей і відволіканні від поганих речей (якщо вважати, що всі інші рівні).
У разі вкладених коментарів, все інше є рівним - ви можете сміливо ігнорувати низько проголосував відповіді , які стверджують , що розбір вкладені /*
буде яким - то чином бути «важким» для синтаксичного аналізу. (Вкладені /*
не складніше, ніж вкладені (
, з якими майже кожен аналізатор у світі вже повинен впоратися.)
Отже, при рівності, чи повинен мовний дизайнер легко вносити коментарі (тобто коментувати код) чи важко? Нагадаємо, що коментувати код - це погана річ.
QED
Зноска Зверніть увагу, що якщо ви не дозволяєте вкладені коментарі, тоді
hello /* foo*/bar.txt */ world
є оманливим "коментарем" - це рівнозначно
hello bar.txt */ world
(що, ймовірно, синтаксична помилка). Але якщо ви робите дозволити вкладені коментарі, то
hello /* foo/*.txt */ world
є оманливим "коментарем" - це рівнозначно
hello
але залишає коментар відкритим аж до кінця файлу (що знову ж таки майже напевно є синтаксичною помилкою). Тож жоден спосіб не є особливо схильним до ненавмисних синтаксичних помилок. Єдина відмінність полягає в тому, як вони обробляють навмисний антипатент коментованого коду.
#if DEAD
- канонічний і найкраще розроблений приклад. На багатьох мовах можна просто загорнути мертвий код в еквівалент if (DEAD)
. І в багатьох IDE ви можете фактично видалити мертвий код і покластись на Ctrl + Z та / або контроль версій, щоб отримати його назад, якщо ви цього хочете. Залишаючи коментар, docstring, незалежно від того, чий текст є купою мертвого коду, все ще є найгіршим варіантом для читабельності.
Тому що більшість реалізацій використовують окремі стадії лексингу та розбору, а для лексингу вони використовують звичайні старі регулярні вирази. Зауваження трактуються як пробіли, тобто ігноровані лексеми, і тому їх слід вирішувати цілком за допомогою лексичного пропуску. Єдина перевага такого підходу - швидкість аналізу. Численні недоліки включають суворі обмеження синтаксису (наприклад, необхідність підтримувати фіксований, не залежний від контексту набір ключових слів).
Цілком можливо зробити лексер, який може обробляти вкладені коментарі. Коли він їсть пробіл, коли він бачить, /*
він може збільшувати лічильник глибини, і зменшувати його, коли бачить */
, і зупинятися, коли глибина дорівнює нулю. Це означає, що я зробив багато аналізаторів, і ніколи не знайшов вагомої причини для коментарів, щоб гніздо.
Якщо коментарі можуть гніздитися, то недоліком стає легко збалансувати їх кінці, і якщо у вас не є вигадливий редактор, він може непомітно приховати код, який, на вашу думку, є.
Перелік коментарів, які не гніздяться, є приблизно таким:
/*
some code
more code
blah blah blah
/**/
де ви можете легко коментувати код або вимикати, видаляючи чи додаючи перший рядок - редагування в 1 рядок. Звичайно, якщо сам код містить коментар, це порушиться, якщо ви також не дозволите //
коментарі у стилі C ++ . Тож це те, що я схильний робити.
//
коментарі також у стилі C99.
/*$token
, де identifier
є будь-який буквено-цифровий знак, а кінець коментаря token$*/
. Токенізатору було б досить просто включити код, щоб переконатися, що кожна позначка кінцевого коментаря містить належний маркер відповідного блоку стартового коментаря.
Оскільки ніхто інший не згадував про це, я перерахую кілька мов, які підтримують вкладені коментарі: Rexx, Modula-2, Modula-3, Oberon. Незважаючи на всі скарги, що виникають тут щодо складності та швидкості, жодна з них, мабуть, не має великих проблем.
Хорошим моментом вкладення блокових коментарів є те, що ви можете легко коментувати великі частини коду (ну, майже, якщо ви не маєте послідовності завершення блоку коментування блоків у рядковій постійній).
Альтернативний метод полягає в тому, щоб додати купу рядка до послідовності початку коментарів до рядка, якщо у вас є редактор, який його підтримує.
Haskell вклав блокові коментарі, але більшість людей, здається, не помічають або не скаржаться на це. Я думаю, це тому, що люди, які не очікують вкладених коментарів, як правило, уникають їх, оскільки це було б лексичною помилкою в інших мовах.
Підтримка вкладених коментарів блоків ускладнює аналізатор, що є і більшою роботою, і це може збільшити час компіляції. Я думаю, що це не дуже потрібна функція для мови, тому краще використати час та зусилля на інші вдосконалення та оптимізації.
На мою думку, простота - це завжди гарна річ у розробці будь-чого. Майте на увазі, що додати функцію простіше, ніж видалити її. Щойно ви дозволите вкладені коментарі і там є програми, які використовують їх, ви не зможете витягнути їх, не порушуючи сумісності.
/*/**/
Однією з можливих причин є те, що вкладені коментарі повинні оброблятися парсером, оскільки аромат регулярних виразів, що зазвичай використовуються в лексерах, не підтримує рекурсії. Прості з них можна усунути як пробіл лексером, тому їх легше реалізувати таким чином.
Хто знає? Я б здогадався, тому що підтримка вкладених коментарів - це більше роботи - вам доведеться підтримувати стек якоїсь форми, і це ускладнює мовну граматику.
Вкладені коментарі означають додаткову роботу для аналізатора. Зазвичай, коли ви бачите початок коментаря, ви ігноруєте все до остаточного маркера коментаря. Для підтримки вкладених коментарів вам слід також проаналізувати текст у коментарях. Найбільша проблема, однак, полягає в тому, що програміст повинен бути обережним, щоб правильно закрити всі вкладені коментарі, або це призведе до помилок компіляції. Правильно реалізувати компілятор - це щось, що можна зробити, але відстеження вкладених коментарів як програміста є досить схильним до помилок і дратує.