18

私が使用するほとんどの言語では、ブロック コメントをネストすることはできません。これは、「閉じる」コメント構文が最初に出現すると、それが「内側」のコメントであってもコメントが閉じられるためです。

たとえば、HTML では

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

この場合、外側のコメントは-->、対応する最後のコメントではなく最初のコメントで終了し、最後のコメントが出力さ<p>れるべきではないときに出力されます。

/* */java、php、css、javascript などのブロック コメントを使用する言語でも同じことが起こります。

しかし、私の質問は、なぜそうなのかということです。設計上、許可されないのはなぜですか。「設計による」と言及したのは、解析の問題が原因であるとは思えないためです。パーサーは、オープニングを完全に追跡/*し、対応するクロージングでコメントを閉じることができると思いますが*/、どういうわけか、それは良い考えではないと判断しました.

これの回避策は、内部の閉じコメントを何らかの方法で変更し、それらが閉じないようにし、最後の閉じコメントのみを残すことであることをすでに知っています。たとえば、 sおよびs の内部-->s および*/s を変更します。しかし、これは明らかに便利ではなく、デバッグ目的でコードのブロックを破棄するだけの場合は困難です。(他のテクニックは、すべてをブロックに入れ子にすることですが、それはここでは重要ではありません。- ->* /if(false){}

それで、私が知りたいのは、ネストされたコメントが一般的にいくつかの現代言語で許可されていないのはなぜですか? 「他の人もやらないし、自分たちもやらない」以外にちゃんとした理由があるはずですよね?

さらに、入れ子になったブロック コメントを許可する他の (あまり目立たない) 言語はありますか?

4

3 に答える 3

18

その理由は歴史的なものであり、コンパイラのアーキテクチャに関係しています。

効率を高めるために、ほとんどのコンパイラは従来、ソース コードを 2 段階で解析します。字句解析と、字句解析によって生成されたトークン ストリームの実際の解析です。字句解析は、キーワード、文字列、数値リテラル、コメントなどの個々のトークンを認識する部分です。

ここでも効率上の理由から、字句解析は伝統的に有限状態マシンを介して実装されます。これらの有限状態マシンはたまたま、上記のトークンに完全に適合する通常の言語を認識 (= 処理) します。ただし、ネストされた構造を認識することはできません。これには、より強力なマシンが必要になります (スタックによって増強されます)。

したがって、ネストされたコメントを許可しないことは、単にパフォーマンスと利便性をトレードオフする決定であり、その後の言語はおおむねこの規則を採用しています。

さらに、入れ子になったブロック コメントを許可する他の (あまり目立たない) 言語はありますか?

幾つかある。コメントはすでに Haskell と Pascal について言及しています。他の言語は D と F# です。

于 2013-06-26T19:02:41.197 に答える
0

HTML は一般的に、ずさんな、強制されていないタイプのマークアップです。ブラウザーは、何が正しいか、何が現実的かを判断する必要があり、時には 2 番目を選択することもありました。

HTML の一部を本当にコメントアウトしたい場合、HTML タグを含む 1 つのコメントを使用することさえ、通常は良い考えではありませんが、コメントをネストし始めるのは特に悪いことです。

ブラウザーが構文を解析するときに、ブラウザーがこれをどのように処理するかを完全に確信することはできません。

于 2013-06-26T19:05:10.233 に答える
-3

この動作は、コメント文字間のすべてがコメントであり、さらにコメント文字が含まれているために発生します。はい、あなたが説明したようにパーサーをネストされたコメントとして扱うように簡単にプログラムすることは可能ですが、それはコメントと完全には一致しません。コメントは、それが何であるかに関係なく、開始文字と終了文字の間のすべてを非存在にすることを目的としています。テキスト、コード、およびコメント文字はすべてコメント アウトされます。

残念ながら、「他の人がやらないから、私たちもやらない」というあなたの提案もまったく正しいです。人々は、ブロック コメントが特定の方法で動作することを期待しており、そうでない場合は混乱します。

于 2013-06-26T19:05:49.017 に答える