6

主に人間が読める形式のフレーズや単語(Python、VB.NETなど)で構成されるプログラミング言語の開発環境エラーフィードバックとオートコンプリートを提供するために必要なチェックが少なく、コード分析が厳密ではありませんか?これは、コード構造を記号や句読点に依存するCスタイルの言語とは対照的です。

4

1 に答える 1

5

私は経験があり、数十の言語フロントエンドを構築する責任があります。

言葉の多い言語と句読点のある言語は、一般に、構文解析と静的分析が同じように困難です。

どちらの種類の言語も定義する人々は、何十年もの間それらを装飾しているか(たとえば、1958年以来のCOBOL)、複雑な構文と複雑な名前解決および型推論規則の両方を備えた洗練された言語(C ++、Scala、Ruby)を構築してきました。次に、コンパイラベンダーは、彼らが行う奇妙なことをサポートするため、または顧客ロックを提供するために、あいまいな構文を追加します(たとえば、MS「マネージC ++」、DLL宣言など)。お粗末な定義の3番目の問題があります。上位の言語には、それらがどのように機能するかについて正確なルールがあるかもしれませんが、多くの言語には、実際の実装での骨の折れる実験によって解決しなければならない暗いコーナーケースを作成するずさんな定義(たとえば、PHP)があります。

C ++は、特に最悪でした。C ++ 11委員会は、最近大規模な混乱を引き起こしています。完全なC++パーサーがありますが、C++98実装に加えてC++11の完全な名前解決に取り組んでいます。(名前解決コードは約250,000行のコードであり、十分ではありません!)

IBMCOBOLはすぐ近くにあります。言語は巨大であり、あらゆる種類の面白い名前解決ルールがあります(「参照が明確である場合、修飾されていない名前は修飾なしで特定の名前を参照できます」したがって、この名前はこのコンテキストでの明確な参照ですか?)。

解析と名前/タイプの解決を通過すると、制御フロー、データフロー、ポイントツー分析、範囲分析、コールグラフの構築などが始まります。これらは、通常、前のフェーズとほぼ同じ量の作業です。これらのタスクをサポートする非常に優れたライブラリを用意することで、コストを削減できます。

これらすべてをバックグラウンド分析として使用すると、人々が望むスマートな種類の「静的分析」を開始できます。

別の投稿者は、構文エラーからの回復と(強調)「意味のあるエラーメッセージの生成を継続する」と述べています。私が言えるのは「アーメン、兄弟」だけです。「部分的なプログラム」がある場合に何がうまくいかないかについては、このSO回答https://stackoverflow.com/a/6657974/120163を参照してください。これは、基本的に、構文エラーの修復で修正が推測されたときに得られるものです。

于 2012-05-22T17:23:18.620 に答える