コンピューティングにおいて、コンパイラの正確性は、コンパイラが言語仕様に従って動作することを示すことを目的とするコンピュータサイエンスの分野です。[要出典]手法には、形式手法を 使用してコンパイラを開発することや、既存のコンパイラに対して厳密なテスト (コンパイラ検証と呼ばれることが多い) を使用することが含まれます。
形式検証
コンパイルの正確性を確立するための2 つの主な形式検証アプローチは、すべての入力に対するコンパイラの正確性を証明することと、特定のプログラムのコンパイルの正確性を証明すること (翻訳検証) です。
すべての入力プログラムに対するコンパイラの正確性
形式手法によるコンパイラ検証には、長い一連の形式的演繹論理が含まれます。[1] しかし、証明を見つけるためのツール(定理証明器)はソフトウェアで実装されており、複雑なため、エラーが含まれる可能性が高くなります。1つのアプローチは、証明を検証するツール(証明チェッカー)を使用することです。これは、証明ファインダーよりもはるかに単純なため、エラーが含まれる可能性が低くなります。
このアプローチの顕著な例はCompCertであり、これはC99の大規模なサブセットの形式検証された最適化コンパイラである。[2] [3] [4]
CakeMLプロジェクト[5]では、別の検証済みコンパイラが開発され、HOL(証明支援システム)を使用して標準MLプログラミング言語 のかなりのサブセットの正しさを確立しました。
形式的に正しいコンパイラを得るためのもう一つのアプローチは、セマンティクス指向のコンパイラ生成を使用することである。[6]
翻訳検証: 特定のプログラムに対するコンパイラの正しさ
コンパイラがすべての有効な入力プログラムに対して正しいことを証明しようとするのとは対照的に、翻訳検証 [7] は、与えられた入力プログラムが正しくコンパイルされたことを自動的に確立することを目指しています。与えられたプログラムの正しいコンパイルを証明することは、コンパイラがすべてのプログラムに対して正しいことを証明するよりも潜在的に簡単ですが、固定されたプログラムは依然として任意の大きな入力で動作し、任意の長い時間実行される可能性があるため、依然として記号推論が必要です。翻訳検証は、与えられたコンパイルに対してコンパイルが正しかったことの証明を生成することにより、既存のコンパイラ実装を再利用できます。翻訳検証は、与えられたプログラムに対してこの誤りが明らかにならない限り、時々誤ったコードを生成するコンパイラでも使用できます。入力プログラムによっては、翻訳検証が失敗することがあります (生成されたコードが間違っているか、翻訳検証手法が正しさを示すには弱すぎるため)。ただし、翻訳検証が成功した場合、コンパイルされたプログラムはすべての入力に対して正しいことが保証されます。
テスト
テストはコンパイラの出荷における作業のかなりの部分を占めるが、標準的な文献では比較的あまり取り上げられていない。1986 年版のAho、Sethi、Ullman には、コンパイラのテストに関する 1 ページのセクションがあるが、具体的な例は示されていない。[8] 2006 年版ではテストのセクションが省略されているが、その重要性は強調されている。「最適化コンパイラを正しく動作させることは非常に難しいため、完全にエラーのない最適化コンパイラは存在しないと言っても過言ではない。したがって、コンパイラを書く上で最も重要な目的は、それが正しいことである。」[9] Fraser と Hanson 1995 には、回帰テスト に関する短いセクションがあり、ソース コードが利用可能である。[10] Bailey と Davidson 2003 では、プロシージャ呼び出しのテストについて取り上げている。 [11] 多くのリリースされたコンパイラには、重大なコード正当性のバグがあることを多くの記事が確認している。[12] Sheridan 2007 は、一般的なコンパイラ テストに関する最新のジャーナル記事であると思われる。[13]ほとんどの場合、コンパイラテストに関して入手可能な最大の情報は、Fortran [14]とCobol [15]の検証スイートです。
コンパイラをテストする際によく使われる手法としては、ファジング[16](コンパイラのバグを見つけるためにランダムなプログラムを生成する)やテストケース削減(見つかったテストケースを最小化して理解しやすくする)などがあります。[17]
参照
- コンパイラ
- 検証と検証(ソフトウェア)
- 正確性(コンピュータサイエンス)
- CompCert C コンパイラ— 形式検証済みの C コンパイラ
- 信頼を信頼することについての考察
参考文献
- ^ De Millo, RA; Lipton, RJ; Perlis, AJ (1979). 「社会プロセスと定理およびプログラムの証明」Communications of the ACM . 22 (5): 271–280. doi : 10.1145/359104.359106 . S2CID 6794058.
- ^ Leroy, X. (2006). 「コンパイラバックエンドの正式な認証、または証明アシスタントを使用したコンパイラのプログラミング」ACM SIGPLAN Notices . 41 : 42–54. doi :10.1145/1111320.1111042.
- ^ Leroy, Xavier (2009-12-01). 「形式的に検証されたコンパイラバックエンド」. Journal of Automated Reasoning . 43 (4): 363–446. arXiv : 0902.2137 . doi :10.1007/s10817-009-9155-4. ISSN 0168-7433. S2CID 87730.
- ^ 「CompCert - CompCert C コンパイラ」。compcert.inria.fr。2017年 7 月 21 日閲覧。
- ^ 「CakeML: 検証済みの ML 実装」。
- ^ Stephan Diehl、「自然意味論によるコンパイラと抽象マシンの生成」、Formal Aspects of Computing、Vol. 12 (2)、Springer Verlag、2000年。doi : 10.1007/PL00003929
- ^ Pnueli, Amir; Siegel, Michael; Singerman, Eli.翻訳検証。システムの構築と分析のためのツールとアルゴリズム、第 4 回国際会議、TACAS '98。
- ^ コンパイラ:原理、テクニック、ツール、 infra 1986、p. 731。
- ^ 同上、 2006年、16ページ。
- ^ Christopher Fraser、David Hanson (1995)。再ターゲット可能な C コンパイラ: 設計と実装。Benjamin /Cummings Publishing。ISBN 978-0-8053-1670-4。、pp.531-533。
- ^ Mark W. Bailey、Jack W. Davidson (2003)。「プロシージャ呼び出し用に生成されたコード内の障害の自動検出と診断」(PDF)。IEEE Transactions on Software Engineering。29 ( 11): 1031–1042。CiteSeerX 10.1.1.15.4829。doi : 10.1109 / tse.2003.1245304。2003-04-28にオリジナル(PDF)からアーカイブ。2009-03-24に取得。 、1040ページ。
- ^ 例えば、Christian Lindig (2005)。「C 呼び出し規約のランダムテスト」( PDF)。第 6 回国際自動デバッグワークショップの議事録。ACM。ISBN 1-59593-050-7. 2011年7月11日時点のオリジナル(PDF)からアーカイブ。2009年3月24日閲覧。、 Eric Eide、John Regehr (2008)。「Volatile が誤ってコンパイルされ、その対処法」(PDF)。第 7 回 ACM 国際組み込みソフトウェア会議の議事録。ACM。ISBN 978-1-60558-468-3. 2009年3月24日閲覧。
- ^ Flash Sheridan (2007). 「出力比較を使用した C99 コンパイラの実践的テスト」(PDF) .ソフトウェア: 実践と経験. 37 (14): 1475–1488. arXiv : 2202.07390 . doi :10.1002/spe.812. S2CID 9752084 . 2009-03-24に取得。「コンパイラテスト参考文献」 の参考文献。2009年 3 月 13 日取得。。
- ^ 「Fortran 検証スイートのソース」 。2011年 9 月 1 日閲覧。
- ^ 「Cobol 検証スイートのソース」 。2011年 9 月 1 日閲覧。
- ^ Chen, Yang; Groce, Alex; Zhang, Chaoqiang; Wong, Weng-Keen; Fern, Xiaoli; Eide, Eric; Regehr, John (2013). 「コンパイラ ファザーの使いこなし」。第 34 回 ACM SIGPLAN プログラミング言語設計および実装会議の議事録。PLDI '13。ニューヨーク、ニューヨーク、米国: ACM。pp. 197–208。CiteSeerX 10.1.1.308.5541。doi : 10.1145 / 2491956.2462173。ISBN 9781450320146. S2CID 207205614。
- ^ Regehr, John; Chen, Yang; Cuoq, Pascal; Eide, Eric; Ellison, Chucky; Yang, Xuejun (2012). 「C コンパイラのバグに対するテストケース削減」。第33 回 ACM SIGPLAN プログラミング言語設計および実装会議の議事録。PLDI '12。ニューヨーク、ニューヨーク、米国: ACM。pp. 335–346。doi :10.1145/ 2254064.2254104。ISBN 9781450312059. S2CID 1025409。
