3

私はSebesta bookを読んで、コンパイラはほとんどの時間をソースコードのレキシングに費やしています。したがって、構文解析ツールとは異なり、レクサーを最適化する必要があります。コンパイラは、解析中にどこでほとんどの時間を費やしますか?

これが当てはまる場合、一般的な構文解析に比べて、字句解析の段階に時間がかかるのはなぜですか?

私は構文解析によって派生プロセスを意味します。

+0

なぜ両方を最適化しないのですか? – bbqchickenrobot

答えて

7

まず、私は実際にそれが真実だとは思わない:多くのコンパイラでは、ほとんどの時間はソースコードのレキシングに費やされない。たとえば、C++コンパイラ(g ++など)では、意味解析、特に過負荷解決(実行する暗黙的なテンプレートのインスタンス化を調べようとする)において、ほとんどの時間が費やされます。また、CやC++では、ほとんどの時間が最適化に費やされます(個々の関数や翻訳単位全体のグラフ表現を作成し、これらのグラフで長いアルゴリズムを実行する)。

字句分析と構文分析を比較すると、語彙分析が実際より高価な場合があります。これは、両方とも状態機械を使用する、すなわち要素ごとに一定数のアクションが存在するためであるが、構文解析(トークン)よりも字句解析(文字)において要素の数がはるかに多いからである。

+0

私は全くわかりませんが、多分、レキシェッドトークンタイプ(例えば、100個のトークンタイプと比較して2^16の可能なキャラクタ値)が存在する、より多様なキャラクタ値もあります。 – ChrisW

+0

さらに、特定のトークンを指定すると、このタイプのトークンに合法的に従うことができるトークンタイプは非常に少数です(たぶん1つだけのトークンタイプですらあります)。つまり、構文アナライザの各トークンのswitch文は、レクサーの各文字のswitch文よりもはるかに少ない場合があります。 – ChrisW

1

レキシカル分析は、ソースコード内のすべての文字をトークンに変換するプロセスです。字句アナライザはない「の」など、(「foreachの」見られるキーワードを決定しなければならない「F」、「O」、等

- インスタンス

foreach (x in o) 

ための文字ずつ読み出されます。)

構文解析が行われるまでに、プログラムコードは一連のトークンだけです。つまり、上記の答えには、字句解析は必ずしも時間がかかる処理ではなく、その処理に最大の流れがあるということに同意します。

0

これは、実際にレキシングと解析の間の線を引く場所によって異なります。私はトークンが何であるかについて非常に限られた見方をする傾向があります。その結果、パーザはレキシングよりも構文解析に多くの時間を費やします。

0

レキシングが高価だったのは確かです。その一部は、限られたメモリを使用し、複数のファイル操作を実行してプログラムの一部を読み込む必要がありました。今ではメモリがGBで測定されているので、これはもはや問題ではなく、同じ理由でもっと多くの作業ができるため、最適化がより重要になります。もちろん、最適化が多くを助けるかどうかは別の問題です。

関連する問題