プログラミング言語の設計と実装

Sub-field of computer science

プログラミング言語は通常、コンピュータプログラムの表現形式を設計し、開発された概念の実装を記述することによって作成されます。[1]通常はインタプリタまたはコンパイラです。インタプリタは、通常はテキスト形式のプログラムを読み取り、読み取った内容に基づいてアクションを実行するように設計されています。一方、コンパイラはコードをオブジェクトコードなどの低レベルの形式に変換します。[2]

デザイン

プログラミング言語の設計には、考慮すべき要素が多岐にわたります。中には、互いに排他的な要素(例えば、セキュリティと速度)もあります。プログラミング言語のパフォーマンスがインタープリタ型とコンパイル型のどちらに優れているか、言語を動的型付けと静的型付けのどちらにすべきか、継承の有無、そして言語の一般的な構文などを考慮する必要があるかもしれません。[3]言語の設計に関わる多くの要素は、その言語の背後にある目標によって決定されます。言語の対象読者、言語固有の機能、そしてその目的を考慮することが重要です。[4]言語が目的を果たすことを確認するために、既存の言語に何が欠けているか、または何が困難であるかを確認することは良い習慣です。[4]

さまざまな専門家が、役立つ設計原則を提案しています。

  • 1972年に発表された記事の最後の段落で、トニー・ホーアはあらゆるソフトウェアプロジェクトに対する一般的なアドバイスを提供しています。[5]
    未来のソフトウェアの設計者や実装者への私のアドバイスは、一言で言えば次のようになります。「やり方が分かるまでは、何をするかを正確に決めてはいけない。そして、品質に関するすべての基準に照らして計画を評価するまでは、どのようにするかを決めてはいけない。それができないなら、できるまで設計を簡素化しなさい。」
  • 1973年のSIGPLANシンポジウムで、トニー・ホーアは言語の様々な側面について詳細に議論しました。[6]彼はまた、当時のプログラミング言語のいくつかの欠点を指摘しています。
    「プログラミング言語は、プログラマーの技術の中で最も難しい部分、つまりプログラムの設計、ドキュメント作成、デバッグを支援するツールです。」
    「優れた言語設計の客観的な基準は、シンプルさ、セキュリティ、高速な翻訳、効率的なオブジェクト コード、読みやすさという 5 つのキャッチフレーズにまとめることができます。」
    結果に全く信頼を置いていないデバッグ実行時に、入念なセキュリティチェックを実施しておきながら、誤った結果が大きな損失や悲惨な結果をもたらす可能性がある本番実行時に、そのチェックを外すというのは、全くもって不合理です。陸上での訓練ではライフジャケットを着用しているのに、海に出るとすぐに脱ぐセーリング愛好家を、私たちはどう思うでしょうか?
  • 1974年のIFIP会議において、パスカルの設計者であるニクラウス・ヴィルトは「プログラミング言語の設計について」という論文を発表しました。[7]ヴィルトは、言語は学習と使用が容易であること、新機能を追加しなくても使用可能であること、コンパイラは効率的なコードを生成すること、コンパイラは高速であること、そして、言語はライブラリ、その言語が実行されるシステム、そして他の言語で書かれたプログラムと互換性があることなど、いくつかの競合する提案を挙げました。

多くのプログラミング言語には、少なくとも最初のバージョンのコンパイラやインタープリタの実装を容易にするための設計上の特徴があります。例えば、Pascal、Forth、そして多くのアセンブリ言語は、ワンパスコンパイルをサポートするように特別に設計されています。

新しいプログラミング言語は、多くの場合、以前のプログラミング言語の(認識されていた)問題を修正するために設計されており、通常は(インタプリタやコンパイラは複雑になるかもしれませんが)その言語で書かれたプログラムをよりシンプルにする機能を追加することで対応しています。例えば、自動メモリ管理とガベージコレクションが組み込まれた言語、連想配列が組み込まれた言語などが挙げられます。

一方、BCPLPascalRPythonなど、コンパイルを困難にする機能を意図的に省くことで、セルフホスティング コンパイラを比較的簡単に作成できるように特別に設計されたプログラミング言語もいくつかあります。

実装

通常、インタープリタとコンパイラはどちらも何らかのシンボル テーブルを実装します。

通訳者

インタプリタとは、他のプログラムを通常はテキストとして読み込むプログラムであり、[4] Pythonのような言語に見られるように[2]インタプリタはコードを読み取り、結果を直接生成します。[8]インタプリタは通常、コードを1行ずつ読み取り、解析してコードを操作やアクションに変換して実行します。[9]

コンパイラ

コンパイラは、プログラムを読み取り、通常は何らかのテキスト形式で記述されたコードを低レベルの機械語または演算に変換するプログラムです。[4]コンパイラによって生成されたコンパイル済みフォーマットは、低レベルのアクションをファイルとして保存します。[2]コンパイルされた言語を機械語に変換すると、低レベルの演算の実行が容易になり、結果を事前に予測してコンパイルできるため、処理速度が大幅に向上する傾向があります。[9]

プロセス

プログラミング言語を作成するプロセスは開発者によって異なる場合がありますが、共通の概念を含むプログラミング言語を作成する一般的なプロセスは次のとおりです。

  • 設計:言語を開発する際には、型、構文、意味、ライブラリの使用などの設計面が考慮されます。[10]
  • 考慮点:構文、実装、その他の要素が考慮されます。Pythonのような言語は実行時にコードを解釈しますが、C++のような言語はCのコンパイラをベースにコンパイラを構築するというアプローチを採用しています。 [11]
  • 実装の作成:最初の実装が記述されます。コンパイラは他の形式に変換しますが、通常はアセンブリ言語のような低レベル言語、さらにはバイナリ言語にまで変換されます。[12]
  • 実装の改善:実装は改善されるべきです。プログラミング言語を拡張し、ブートストラップに必要な機能を備え、プログラミング言語が自ら実装を記述できるレベルを目指しましょう。
  • ブートストラッピング:コンパイラを使用する場合、開発者はブートストラッピングというプロセスを使用する場合があります。これは、プログラミング言語のコンパイラ自体を書き換えるプロセスです。[13]これはバグチェックや機能の証明に適しています。[14]ブートストラッピングには、その後は言語自体をプログラムするだけで済むという利点もあります。

参考文献

  1. ^ Tomassetti, Federico (2019年5月8日). 「プログラミング言語を作成するにはどうすればいいでしょうか?」Strumenta . 2023年3月3日閲覧
  2. ^ abc 「コンパイラ vs インタープリタ」. Geeks For Geeks . 2022年1月17日. 2023年3月3日閲覧
  3. ^ 「プログラミング言語と学習」ワシントンEDU .ワシントン大学. 2023年3月2日閲覧
  4. ^ abcd 「プログラミング言語はどのように作られるのか」GoNoCode . 2021年12月8日. 2023年3月2日閲覧
  5. ^ Hoare, CAR (1972). 「ソフトウェアの品質」.ソフトウェア:実践と経験. 2 (2): 103– 105. doi : 10.1002/spe.4380020202 . S2CID  62662609.
  6. ^ 「プログラミング言語設計のヒント」(PDF) 1973年. 2023年3月7日閲覧
  7. ^ 「プログラミング言語の設計について」(PDF) 1974年. 2023年3月9日閲覧
  8. ^ Diver, Laurence (2021年12月7日). 「2021年12月7日発行 コードのルールの解釈:パフォーマンス、パフォーマティビティ、そしてプロダクション」. MIT計算法レポート.
  9. ^ ab Rathi, Mukul (2017年3月31日). 「私が独自の「適切な」プログラミング言語を書いた方法」. mukulrathi . 2023年3月2日閲覧
  10. ^ Chouchanian, Vic. 「プログラミング言語」カリフォルニア州立大学ノースリッジ校. 2023年3月2日閲覧
  11. ^ Stroustrup, Bjarne. 「C++の歴史:1979−1991」(PDF) . 2019年2月2日時点のオリジナルよりアーカイブ(PDF) 。 2013年7月18日閲覧
  12. ^ Ferguson, Andrew. 「コンピュータプログラミング言語の歴史」ブラウン大学. 2023年3月2日閲覧
  13. ^ Glück, Robert (2012). 「部分評価器からのコンパイラジェネレータのブートストラップ」。Clarke, Edmund、Virbitskaite, Irina、Voronkov, Andrei (編). Perspectives of Systems Informatics: 8th International Andrei Ershov Memorial Conference, PSI 2011, Novosibirsk, Russia, June 27 – July 1, 2011, Revised Selected Papers . Lecture Notes in Computer Science. Vol. 7162. Springer. pp.  125– 141. doi :10.1007/978-3-642-29709-0_13.本書の「Getting Started」では、コンパイラ構築でお馴染みの「鶏が先か卵が先か」問題が提示されます。コンパイラをブートストラップするにはコンパイラが必要であり、コンパイラジェネレータのブートストラップも例外ではありません。
  14. ^ 「GCCのインストール:ビルド」。GNUプロジェクト - フリーソフトウェア財団(FSF) .
Retrieved from "https://en.wikipedia.org/w/index.php?title=Programming_language_design_and_implementation&oldid=1323415321"