Чому більшість мов програмування не блокують коментарі?


18

Кілька з них, але не одна з популярних, наскільки я знаю. Чи є щось погане в коментарях для вкладання?

Я планую розміщувати блокові коментарі (малою) мовою, над якою я працюю, але хотілося б знати, чи це погана ідея.


ще кілька відповідей: о, це має сенс =) я повністю роблю вкладені блокові коментарі; хоча у мене є окремий етап лексінгу, це не обмежений опис SK-логіки.

@Vuntic: Якщо у вас є окремий етап лексінгу, в якому використовуються речі складніші, ніж звичайні вирази, у вас можуть виникнути проблеми з ефективністю. ЗР швидко та легко використовувати, застосовуючи DFA.
Девід Торнлі

Він виявляє більше помилок раніше, щоб не допустити вкладення

4
@David: ... зовсім не так. Це насправді дуже швидко.
amara

Я б запропонував, що якщо ви хочете дозволити вкладені коментарі, ви дозволяєте теги стартових коментарів позначати маркером і вимагати, якщо тег стартового коментаря таким чином позначений, його тег кінцевого коментаря повинен бути позначений однаково. Це дозволить швидко ідентифікувати незбалансовані теги початку та кінця та уникнути можливості помилок, викликаних невиявленими неврівноваженими тегами.
supercat

Відповіді:


6

Одне ще ніхто не згадував, тому я зазначу це: Бажання вкладати коментарі часто вказує на те, що програміст робить це неправильно.

По-перше, погодимось, що єдиний час, коли "вкладення" або "не вкладення" видно програмісту, коли програміст пише щось структурно так:

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

але залишає коментар відкритим аж до кінця файлу (що знову ж таки майже напевно є синтаксичною помилкою). Тож жоден спосіб не є особливо схильним до ненавмисних синтаксичних помилок. Єдина відмінність полягає в тому, як вони обробляють навмисний антипатент коментованого коду.


1
У мене інша думка, що ґрунтується просто на фактах - я не бачив усього (і ні ви). Тож як ці золоті правила типу "Не коментуй код" виглядають приємно, життя має свої шляхи. У цьому конкретному випадку я це роблю дуже часто, як перемикач, коли я перевіряю якусь нову функцію і потрібно поступово вводити якийсь код, тому я коментую код, потім все менше, менше, менше, і нарешті у мене є робочий фрагмент, і я може видалити всі коментарі (над кодом). Моя ідеальна мова, звичайно, підтримуватиме вкладені коментарі :-).
greenoldman

@greenoldman: Більшість мов не мають нестабільних коментарів, але вони матимуть якусь фактичну функцію для "видалення блоку коду", яка використовується менш, ніж функція "залишити коментар". C's #if DEAD- канонічний і найкраще розроблений приклад. На багатьох мовах можна просто загорнути мертвий код в еквівалент if (DEAD). І в багатьох IDE ви можете фактично видалити мертвий код і покластись на Ctrl + Z та / або контроль версій, щоб отримати його назад, якщо ви цього хочете. Залишаючи коментар, docstring, незалежно від того, чий текст є купою мертвого коду, все ще є найгіршим варіантом для читабельності.
Квомплусон

11

Тому що більшість реалізацій використовують окремі стадії лексингу та розбору, а для лексингу вони використовують звичайні старі регулярні вирази. Зауваження трактуються як пробіли, тобто ігноровані лексеми, і тому їх слід вирішувати цілком за допомогою лексичного пропуску. Єдина перевага такого підходу - швидкість аналізу. Численні недоліки включають суворі обмеження синтаксису (наприклад, необхідність підтримувати фіксований, не залежний від контексту набір ключових слів).


3
Я б не погодився з "більшості" сьогодні. Звичайно, це традиційний спосіб, але я знаю, що для C EDG поєднує препроцесор, лексинг та синтаксичний аналіз, і я підозрюю, що і GCC, і Microsoft теж роблять. Перевага полягає в тому, що вона дозволяє реалізувати їх окремо, якщо вам потрібно.
Ендрю Ейлетт

Кланг робить теж те саме. Але це ще лише невелика частка існуючих укладачів популярних мов.
SK-логіка

@Neil Butterworth, погляньте на mcs, javac, gcc (так, це зворотний патч лексеру, але все-таки це спеціальний пропуск lexing), clang (те саме, що gcc), dmd, fpc та багато-багато іншого.
SK-логіка

Ніхто не використовує регулярні вирази в їх лексиці для будь-якого нетривіального компілятора.
Nuoji

@Nuoji - для нетривіального - точно. Але ті, хто покладається на флекс та подібні інструменти, так і роблять.
SK-логіка

7

Цілком можливо зробити лексер, який може обробляти вкладені коментарі. Коли він їсть пробіл, коли він бачить, /*він може збільшувати лічильник глибини, і зменшувати його, коли бачить */, і зупинятися, коли глибина дорівнює нулю. Це означає, що я зробив багато аналізаторів, і ніколи не знайшов вагомої причини для коментарів, щоб гніздо.

Якщо коментарі можуть гніздитися, то недоліком стає легко збалансувати їх кінці, і якщо у вас не є вигадливий редактор, він може непомітно приховати код, який, на вашу думку, є.

Перелік коментарів, які не гніздяться, є приблизно таким:

/*
some code
more code
blah blah blah
/**/

де ви можете легко коментувати код або вимикати, видаляючи чи додаючи перший рядок - редагування в 1 рядок. Звичайно, якщо сам код містить коментар, це порушиться, якщо ви також не дозволите //коментарі у стилі C ++ . Тож це те, що я схильний робити.


1
//коментарі також у стилі C99.
JAB

Крім того, мова може вказати початок коментаря /*$token, де identifierє будь-який буквено-цифровий знак, а кінець коментаря token$*/. Токенізатору було б досить просто включити код, щоб переконатися, що кожна позначка кінцевого коментаря містить належний маркер відповідного блоку стартового коментаря.
supercat

5

Оскільки ніхто інший не згадував про це, я перерахую кілька мов, які підтримують вкладені коментарі: Rexx, Modula-2, Modula-3, Oberon. Незважаючи на всі скарги, що виникають тут щодо складності та швидкості, жодна з них, мабуть, не має великих проблем.


4
До чого додаю: Haskell, Frege
Ingo

Підтримується і Scala.
Matt R

4

Хорошим моментом вкладення блокових коментарів є те, що ви можете легко коментувати великі частини коду (ну, майже, якщо ви не маєте послідовності завершення блоку коментування блоків у рядковій постійній).

Альтернативний метод полягає в тому, щоб додати купу рядка до послідовності початку коментарів до рядка, якщо у вас є редактор, який його підтримує.

Haskell вклав блокові коментарі, але більшість людей, здається, не помічають або не скаржаться на це. Я думаю, це тому, що люди, які не очікують вкладених коментарів, як правило, уникають їх, оскільки це було б лексичною помилкою в інших мовах.


3

Підтримка вкладених коментарів блоків ускладнює аналізатор, що є і більшою роботою, і це може збільшити час компіляції. Я думаю, що це не дуже потрібна функція для мови, тому краще використати час та зусилля на інші вдосконалення та оптимізації.

На мою думку, простота - це завжди гарна річ у розробці будь-чого. Майте на увазі, що додати функцію простіше, ніж видалити її. Щойно ви дозволите вкладені коментарі і там є програми, які використовують їх, ви не зможете витягнути їх, не порушуючи сумісності.


1
+1 для "простіше додати функцію, ніж видалити її".
R .. GitHub ЗАСТАНІТЬ ДОПОМОГАТИ

3
як тільки ви забороните вкладені коментарі, ви також не зможете їх дозволити, оскільки вони порушать такі коментарі:/*/**/
RiaD

2

Однією з можливих причин є те, що вкладені коментарі повинні оброблятися парсером, оскільки аромат регулярних виразів, що зазвичай використовуються в лексерах, не підтримує рекурсії. Прості з них можна усунути як пробіл лексером, тому їх легше реалізувати таким чином.


3
Це не «аромат». Слово "регулярний" у регулярному виразі по суті виключає рекурсію.
R .. GitHub ЗАСТАНІТЬ ДОПОМОГА ВІД

3
@ R: З математики, звичайно. Але в програмуванні у нас є речі, які ми називаємо регулярними виразами, які підтримують рекурсію.
amara

Питання: це навіть питання? Більшість мов уже мають справу з вкладеними дужками. Щоб назвати деякі: Lisp, C, Java, Python, Ruby, Perl.
Томас Едінг

Вкладені круглі дужки чудово, тому що речі, що знаходяться в дужках, такі ж, як і речі зовні: нормальні лексеми. У коментарях у вас немає лексем, у вас просто текст. Потрібно вміти співставляти початкові та кінцеві лексеми коментарів, щоб ви знали, чи є "int" типом чи просто словом у коментарі. (Особливо, якщо ви виключите коментарі в лексемі.)
Алан Шутко,

2
@ThePopMachine: Я впевнений у тому, що я заявив, що регулярний має визначене формальне значення, а не значення, яке ви використовуєте, і що для цього значення було обрано "регулярний" у "регулярному вираженні". Бути нерекурсивним є одним з результатів його визначення.
R .. GitHub СТОП ДОПОМОГАТИ ВІД

-1

Хто знає? Я б здогадався, тому що підтримка вкладених коментарів - це більше роботи - вам доведеться підтримувати стек якоїсь форми, і це ускладнює мовну граматику.


-1

Вкладені коментарі означають додаткову роботу для аналізатора. Зазвичай, коли ви бачите початок коментаря, ви ігноруєте все до остаточного маркера коментаря. Для підтримки вкладених коментарів вам слід також проаналізувати текст у коментарях. Найбільша проблема, однак, полягає в тому, що програміст повинен бути обережним, щоб правильно закрити всі вкладені коментарі, або це призведе до помилок компіляції. Правильно реалізувати компілятор - це щось, що можна зробити, але відстеження вкладених коментарів як програміста є досить схильним до помилок і дратує.


3
-1: неправда. Здорові парсери не працюють так.
amara
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.