プログラミング言語の作り方

ページ名:プログラミング言語の作り方

多くの人が、毎日使っているプログラミング言語に困難や不満を持っている。物事をもっと抽象的に扱ってほしいと思う人もいれば、「標準的」であってほしいと思う機能の実装を嫌う人もいる。ITプロフェッショナルであれ、単なる趣味人であれ、新しいプログラミング言語を作りたいと思うことは多々あるだろう。

  • 1
    技術に精通する。コンピューターの使い方を知らなければ、プログラミング言語を作ることはできない。
  • 2
    専門用語に慣れる。コンパイラを書く人は、しばしば聞き慣れない専門用語を使います。先に進む前に、コンパイラについてよく読みましょう。必要なことはすべて知っておきましょう。
  • 3
    あなたの言語がどのような問題を解決しようとしているのかを決めましょう。ドメイン固有の問題に取り組むのか、それとも汎用言語なのか。
  • 4
    言語のセマンティクスとその概念について考えましょう。
    • ポインタの直接アクセスを許すのか許さないのか。
    • 言語のデータ型は?
    • 静的言語か動的言語か?
    • メモリ・モデルは?ガベージ・コレクタを使うのか、それとも手動のメモリ管理を使うのか?(ガベージ・コレクタを使う場合は、ガベージ・コレクタを書く準備をするか、既存のものをあなたの言語に適合させる)
    • 並行処理はどうするのか?単純なスレッド/ロッキング・モデルを使うのか、それともリンダやアクター・モデルのような複雑なものを使うのか?(最近のコンピューターはマルチコアなので)。
    • 言語にプリミティブな関数が組み込まれているのか、それともすべてライブラリから入手するのか?
    • 言語のパラダイムは何ですか?関数型?オブジェクト指向?プロトタイプ(JavaScriptのような)?アスペクト指向?テンプレート指向?それともまったく新しいもの?
    • 既存のライブラリや言語(主にC言語)とのインターフェイスは?ドメインに特化した言語を作る場合、この点は重要だ。
    • 最後に、これらの質問に対する答えのいくつかは、2つ目のステップで答えることになり、次のステップの答えに役立ちます。
  • 5
    あなたの言語を使って、誰かができるようになりたいと思うような具体的なタスクをいくつか考えてください。例えば、「ロボットに線をたどらせたい」とか、「比較的移植性の高いデスクトップ・プログラムを作りたい」とか、「ウェブ・アプリケーションを作りたい」とか。
  • 6
    上記の例について、構文のアイデア(言語のテキスト)を実験してみましょう。
    • あなたの言語が文脈自由言語の範疇に入るか、その内側に入るように注意してください。あなたのパーサー・ジェネレーターとあなたは、後でそれを高く評価することになるでしょう。
  • 7
    構文の正式な文法を書き出す。
  • 8
    言語がインタプリタ型かコンパイル型かを決める。つまり、インタプリタ型の世界では、ユーザーは通常エディタでプログラムを編集し、インタプリタ上で直接実行します。一方、コンパイル型の世界では、ユーザーはプログラムを編集し、コンパイルし、出来上がった実行ファイルをどこかに保存して実行します。
  • 9
    フロントエンドのスキャナとパーサーを書くか、これを助けてくれるツールを探しましょう。
    • また、コンパイラやインタープリタが、誤ったプログラムや構文エラーについてどのようにユーザーに警告するかについても考えてください。
  • 10
    パーサーの情報を使って、オブジェクトコードや中間表現を書きましょう。パーサーにASTを作成させ、そのASTから3つのアドレス・コードまたはその兄貴分であるSSAを使ってオブジェクト・コードを作成し、関数やグローバル変数などを定義するシンボル・テーブルを作成します。
    • また、言語によっては、(リフレクションやRTTIをサポートするために)クラスの仮想ポインタ・テーブルや情報テーブルを作成したい場合もあります。
  • 11
    すべてを束ねるエクゼキュータやコードジェネレータを書く。
  • 12
    言語をテストするために、たくさんのテスト・プログラムを書きましょう。
    • コンパイラがあなたの定義にあるものはすべて受け入れ、定義にないものはすべて拒否することを確認するために、形式文法の負担を強調するプログラムを作りたい。
  • 13
    ユーザーが自分のプログラムをどのようにデバッグするかを考えましょう。
  • 14
    もしあなたの言語が標準ライブラリを使うなら、それを書きたいでしょう。必要であれば、ガベージ・コレクタやその他のランタイム機能も一緒に。
    • 具体的には、コンパイラを書く場合、ユーザー・コードの実行を開始するためにオペレーティング・システムが実行するコード(たとえば、すべてのグローバル変数の割り当て)が必要になります。
  • 15
    その言語の仕様と、その言語で何ができるかのいくつかの例とともに、あなたの言語を発表してください。
    • 既存のライブラリや言語とどのように統合できるか、ランタイム機能や標準ライブラリをどのように使うかを文書化することも忘れずに。
  • この記事は、CC BY-NC-SAの下で公開されている " How to Create a Programming Language " を改変して作成しました。特に断りのない限り、CC BY-NC-SAの下で利用可能です。

    シェアボタン: このページをSNSに投稿するのに便利です。

    コメント

    返信元返信をやめる

    ※ 悪質なユーザーの書き込みは制限します。

    最新を表示する

    NG表示方式

    NGID一覧