プログラミング言語はいくつかの段階を経るようです。まず、誰かが新しい言語、Foo 言語を思いつきます。コンパイラ/インタプリタは別の言語で書かれており、通常は C またはその他の低レベル言語です。ある時点で、FooL は成熟して成長し、最終的に誰かがどこかで、FooL 自体に FooL 用のコンパイラーおよび/またはインタープリターを作成します。
私の質問は次のとおりです。誰かがその言語自体を実装できるような、言語機能の最小サブセットは何ですか?
プログラミング言語はいくつかの段階を経るようです。まず、誰かが新しい言語、Foo 言語を思いつきます。コンパイラ/インタプリタは別の言語で書かれており、通常は C またはその他の低レベル言語です。ある時点で、FooL は成熟して成長し、最終的に誰かがどこかで、FooL 自体に FooL 用のコンパイラーおよび/またはインタープリターを作成します。
私の質問は次のとおりです。誰かがその言語自体を実装できるような、言語機能の最小サブセットは何ですか?
コンパイラは、チューリング マシンを使用しても記述できます。ユニバーサル チューリング マシンは、基本的に任意のチューリング マシンのコンパイラ/インタープリタであるため、チューリング完全な言語で十分なはずです :)
理論的には、驚くほど少ない。計算可能性の理論家は、必要なのはミュー再帰またはチューリング マシンなどであると言うでしょう。
ただし、実際的な観点からは、チューリング マシンにプログラミング言語を実装しようとして満足することはありません。少なくとも、通常の制御フロー構造、プリミティブ データ型、サブルーチン、および配列と構造体がすべて必要です。言語自体にその言語のサブセットを実装するには、これで十分なはずです。その後、そこから自分自身をブートストラップできます。
1 つのオプションはread-eval-print loopです。これは、多くの高レベルの構造を構築するために使用できます。これが LISP がたどった道だと思います。
C の始まりについては定かではありませんが、分岐、ループ、割り当て、および単一文字 I/O を実装するためのいくつかのシステム コールから始まり、そこから構築されたと思います。
私の質問はこれです:誰かがそれ自体でその言語を実装できるような言語機能の最小限のサブセットは何ですか?
言語がそれ自体をコンパイルする以外の目的で役立つ必要はありませんか?Useless
すべてのテキストが適切なプログラムであり、「任意の入力を受け取り、それ自体を生成するプログラム」を意味する言語を紹介します(これはコンパイラーUseless
とも呼ばれます)。
Id assume a assembler would make the cut.