Почему, в общем, вложенные комментарии блока не допускаются?

В большинстве языков, которые я использую, вы просто не можете вставлять комментарии блоков, потому что первое вхождение комментария "закрыть" sintaxis закрывает комментарий, даже если это был только "внутренний" комментарий.

Например, в HTML

<!-- outer comment
<p>hello</p><!-- inner comment <p>world</p> -->
<p>this should BE commented</p>
-->

в этом случае внешний комментарий заканчивается на первом --> вместо соответствующего последнего, заставляя последний <p> печатать, когда он не должен.

То же самое происходит для языков, которые используют /* */ для комментариев блоков, например, в java, php, css, javascript и т.д.

Но мой вопрос: ПОЧЕМУ это так? Почему, по дизайну, это запрещено? Я упоминаю "по дизайну", потому что я действительно сомневаюсь, что это из-за проблем с синтаксическим разбором, я думаю, что синтаксические анализаторы отлично умеют отслеживать открытие /* и закрывают комментарии с соответствующим закрытием */. Но они просто почему-то решили, что это не очень хорошая идея.

Я уже знаю, что обходной путь для этого заключается в том, чтобы каким-то образом изменить внутренние комментарии закрытия, чтобы избежать их закрытия, и оставить только последний закрывающий. например изменение внутренних --> и */ для - -> и * /. Но это, очевидно, не удобно и трудно сделать, когда вы хотите отказаться от блоков кода для целей отладки. (другие методы заключают в себе все в блоках if(false){}, но здесь дело не в этом.

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

И как плюс, есть ли другие (не столь неясные) языки, которые разрешают вложенные комментарии блока?

Ответ 1

Причина исторична и связана с архитектурой компиляторов.

Для большей эффективности большинство компиляторов традиционно анализируют исходный код в два этапа: лексический анализ и фактический parsing потока токенов (который был получен указанным лексическим анализом). Лексический анализ - это часть, которая распознает отдельные токены, такие как ключевые слова, строки, литералы чисел и комментарии.

Снова по соображениям эффективности лексический анализ традиционно реализуется с помощью конечного автомата. Эти машины с конечным состоянием распознают (= handle) обычные языки, которые идеально подходят для вышеупомянутых токенов. Однако он не может распознать вложенные конструкции - для этого потребуется более мощная машина (дополненная стекем).

Не допускать вложенных комментариев было, таким образом, просто решение, которое торговалось с удобством для производительности, а последующие языки в целом приняли соглашение.

И как плюс, есть ли другие (не столь неясные) языки, которые разрешают вложенные комментарии блока?

Есть некоторые. В комментариях уже упоминались Хаскелл и Паскаль. Другими языками являются D и F #.

Ответ 2

HTML обычно является неаккуратным, не принудительным типом разметки. Браузеры должны были принимать решения между тем, что право и что реалистично, иногда они выбирают второй.

Если вы действительно хотите прокомментировать фрагмент HTML, вообще не рекомендуется даже использовать один комментарий с тегами HTML внутри него, но особенно плохо начать вложенные комментарии.

Вы никогда не сможете быть абсолютно уверены, как браузер справится с этим при синтаксисе синтаксиса.

Ответ 3

Это поведение проявляется потому, что любое из символов комментария является комментарием, включая больше символов комментария. Да, было бы легко запрограммировать синтаксический анализатор, чтобы рассматривать их как вложенные комментарии, как вы описываете, но это не совсем согласуется с комментарием. Комментарий предназначен для того, чтобы сделать все между открытым персонажем и близким персонажем несуществующим, независимо от того, что это такое. Текст, код и комментарии charcters все закомментированы.

К сожалению, ваше предположение, что причина в том, что "другие не делают этого, так что мы не будем", также вполне корректны. Люди ожидают, что комментарии блоков будут вести себя определенным образом и запутаться, когда они этого не сделают.