コンパイラーを作成してプログラミング言語を作成しますか?


8

たとえば、自分でプログラミング言語を作成したいと考えました。見た目と動作をどのように決定するかをすべて決定したと仮定すると、そのためのコンパイラーを作成するだけでよいですか?

たとえば、高レベルのJavaコードはテキスト以外の何かであり、このテキストは、コンパイラがそれを受け入れて別の何かに変換するための正しい形式になっていますか?

私の質問は、プログラミング言語の作成はコンパイラを介して行われるのですか?ハイレベルで結構です。


プログラミング言語の定義を正確にすることについての質問はありますか?
アントントルノフ2016年

あんまり。それだけではありません。理論的には、テキストを解析するコンパイラを作成するだけで、唯一の言語を純粋に作成できますか?このテキストは、私の構文における私の作り上げた言語です。たとえば、System.out.println()JavaはJavaコンパイラがそれを受け入れるか、他に何か機能しているためです。
Haych 2016年

3
「プログラミング言語の作成」とはどういう意味ですか?「完了」とはどういう意味ですか?私があなたが何を求めているのか正確に伝えるのは難しいです。言語の外観と動作をどのように決定するかについては、すでにすべての決定を行っていると言います。あなたの観点から、プログラミング言語の作成には他に何がありますか?達成しようとしていることを詳しく説明しようとすると、それを達成する方法について、より役立つ回答を提供できる可能性があります。現在、あなたが何を求めているのかを推測する必要があるようです。
DW

回答:


10

短い答えはノーです。

プログラミング言語は、計算を表現するために使用される数学的形式論と考えることができます。コンパイラ/インタプリタは、その計算を実行する実際のソフトウェアのほんの一部であり、言語仕様として機能するべきではありません。

そうは言っても、言語の字句仕様と構文仕様に加えて、意味仕様も定義する必要があります。最初に明らかなセマンティクスは運用上のセマンティクスであり、プログラムの意味は、プログラムが実際に実行される方法に関して与えられます。つまり、プログラムの実行方法を(数学的に)正確に定義します。このセマンティクスに加えて、最適化などを使用して実際のコンパイラー/インタープリターを構築する必要があります。

言語の完全な運用セマンティクスを指定すると、正式な言語ドキュメントが提供され、言語を非常に詳細に理解できるようになります。また、言語のいくつかの側面について正式に推論することができます。運用上のセマンティクスを書き留めることは、本当に良い習慣です。

公理的表示的、およびゲームのセマンティクスなど、他の有用なセマンティクスもあります。ただし、これらはより高度で、通常はコンパイラー/インタープリターに組み込まれません。


3
これは間違っています。正式な仕様のないプログラミング言語は、依然としてプログラミング言語です。
reinierpost 2016年

3
@reinierpostでは、「プログラミング言語の作成はコンパイラを介して行われるのか」という質問に対する答えは「はい」ですか。もしそうなら、あなたはそれを答えとして書くべきだと思います。
ベルピース2016年

4
@reinierpost:建築家によって設計されなかった家はまだ家です。しかし、どのような家に住みたいですか?
Andrej Bauer

1
述べられている質問はあいまいです。コンパイラーを作成してプログラミング言語を作成できますか?絶対に。これはプログラミング言語を作成する方法ですか?いいえ、それは1つの可能な方法にすぎません。
reinierpost 2016年

2
@johanプログラミング言語は、正確に定義されていない概念として残しておくには、実用的かつ理論的に非常に重要です。たとえば、Cとは何か、またはCがどのように正確に機能するかを誰かにどのように正確に説明しますか?彼女にCコンパイラを与えることによって?しかし、それらは非常に多く、それらは異なります!さらに、多くの場合、Cコンパイラが何をするかさえわかりません(ヒント:並行性、メモリモデル)。厳密に``誘導する」プログラミング言語intepreter /、コンパイラを話すが、単なる実装などのプログラミング言語の思考は、それが解決よりも多くの問題を提起する。
bellpeace

5

たとえば、自分でプログラミング言語を作成したいと考えました。見た目と動作をどのように決定するかをすべて決定したと仮定すると、そのためのコンパイラーを作成するだけでよいですか?

いいえ。言語の外観と動作をどのように決定するかによって、独自のプログラミング言語作成されます。プログラミング言語を作成するためにコンパイラやインタプリタは必要ありません。プログラミング言語でプログラムを作成するためにコンパイラーやインタープリターは必要ありません。

作成したプログラムを実際に実行する場合にのみ、コンパイラーまたはインタープリターが必要です。

私の質問は、プログラミング言語の作成はコンパイラを介して行われるのですか?ハイレベルで結構です。

いいえ。プログラミング言語の作成は、次の2つのルールセットを考え出すことによって行われます。

  1. 法的プログラムはどのように見えるか(構文)
  2. 法的プログラムが行うこと(セマンティクス)

それでおしまい。

実装されていないプログラミング言語があります。または、長い間実装されていませんでした。

たとえば、コンラートズーゼは1940年代半ばにプランカルキュルを作成しましたが、戦争のために彼はそれを実装することができませんでした。それは1975年に論文の一部として最初に実装されました。しかし、それは確かに1950年代と1960年代に存在しました。

LISPはもともと、計算を研究するためのλ計算のより扱いやすい代替手段として設計されました。John McCarthyの学生であるSteve Russellによって実装されました。マッカーシー自身も、LISPが実装できるかどうかさえ疑っていました。

APLはもともと数学を教えるための表記法として設計されました。その後、IBM System / 360の仕様言語として機能するように拡張されました。言語が既に使用されていた後、実装は後で来ました。

PLANNERは非常に影響力のある言語でしたが、実際に実装されたのは、他の言語にすでに影響を与えた後でした。それは1969年に設計され、1973年に実装されました。

古典力学の構造と解釈は、動的システムを記述するために数学の代わりにスキームを使用する物理教科書です。Schemeにはインタプリタとコンパイラがあるという事実は本にとって本質的ではなく、プログラムを実行するのではなく、思考を伝えるための言語として使用されています。

ご覧のとおり、プログラミング言語は実装がなくても便利です。「プログラムは人間が読むために、そして偶然にコンピューターが実行するためだけに書かれるべきである」とは、コンピュータープログラムの構造と解釈からの有名な引用です。プログラミング言語は、複雑なプロセスを明確に説明するための正式な言語です。人間が理解できるほど正確にプロセスを説明すると、偶然にもマシンによって実行可能であるという事実は、副作用です。これは非常に望ましい、便利で強力な副作用ですが、副作用です。

最初の「プログラミング言語」であるλ計算、SKI計算、チューリングマシン、μ再帰関数は、実行用に作成されていませんでした。これらは、論理と数学の基本的な質問を理解するために作成されました。


0

プログラミング言語の作成はコンパイラを介して行われますか?

3つのオプションがあります。

  • アセンブラー
  • 通訳者
  • コンパイラ


人間が作成したアセンブラソースコードは、1対1をCPUが消費するマシンコードに変換します。

インタープリター
プログラムは、コードの各行を読み取り、指示に従い、これらを順番に実行します。

コンパイラ
プログラムは、抽象構文ツリーを使用してステートメントを解析し、それを使用してオブジェクトコードを生成します。
コンパイラは、実際のマシンまたは仮想マシンで使用できるオブジェクトコードの形式を生成します。

線をぼかす
ここには仲介人がたくさんいます。
RubyはASTから実行されます。Javaは架空のCPUのバイトコードを実行することで有名です。
SQLは解釈されますが、記述どおりに実行されず、クエリプランに変換されます。

Javascriptが奇妙な薄暮地帯に存在します。ほとんどの部分は解釈されますが、重要な部分はJITコンパイラを介して実行され、標準化されていないバイトコードを生成し、一部のコンパイラのオブジェクトコードとしても使用されます。
Phpは純粋なインタプリタ言語でしたが、Facebookは独自のphpコンパイラを使用しています。


プログラミング言語の作成を実験したい場合の私の推奨事項
通訳から始めます。

コンパイラーを理解したい場合は、ASTを調べてください。
Pascalのような言語はAST用にカスタマイズされており、シングルパスでソースからマシンコードに移行できるため、コンパイラーでの実装は比較的簡単です。
インタプリタではなくコンパイラの研究にこだわる場合は、この件に関するワースの著作を研究することをお勧めします。


3つ以上のオプションがあります。たとえば、1つのオプションは、何もしないことです。ルールを記述するだけでプログラミング言語を作成できます。それらを実装する必要はまったくありません。Plankalkülは、作成されてから60年(?)まで実装されませんでした。LISPとAPLは元々まったく実装されることを意図していませんでした。LISPは計算を研究するためのλ計算のより扱いやすいバージョンとして設計され、APLは数学を教えるための表記法として設計されました。古典力学のブックの構造と解釈はない...ように、動的システムを説明するための表記法としてスキームを使用する
イェルクWミッターク

実際に実行されるプログラムを書くための言語。
イェルクWミッターク

0

コンパイラが行うすべてのことは、与えられた入力がコンパイラが理解する言語を使用し、その言語と同じ意味構造を持つことを保証することです。

コンパイラーは、入力を字句的に分析し、あいまいさを導入することなく意図された意味を持つ順序にトークンを解析するために、レクサーとパーサーを使用してインテリジェンスを偽装します。

あなたの質問に答えるために、あなたは、CAN、コンパイラを作成することによって、プログラミング言語を作成しますが、コンパイラが完了する前に、そうすることで、プログラミング言語は、実際に作成されます。

プログラミング言語は、英語、フランス語、ドイツ語など、他の言語と同じように考えてください。コンパイラの仕事は、入力がある場合、その入力で使用されている単語が、ビルド対象の言語で使用されている単語と一致することを確認することです。単語の順序がそれが構築された言語で意味をなすことを確認し、最後にその入力をマシンが理解できる言語に翻訳します


これは必ずしも本当ではありません。言語を処理するために作成されたプログラムとともに作成された言語の例はたくさんあります。FORTRANは言語ではなくコンパイラの名前でした。
reinierpost 2016年

@reinierpost私の要点は、コンパイラが特定の言語内の一連のトークンを認識する前に、それらのトークンが最初に存在している必要があるということです...したがって、コンパイラが完了する前に言語が存在します。言語は、その言語内の語句である最も基本的なコンポーネントなしでは存在できません。意味論は後で来ることができます。ほとんど同じように、コンパイラがさえ、それは、その言語を構成する単語を知らない場合、それは言語をコンパイルするふりをし始めることはできません
smac89

「所定の」言語である必要はありません。コンパイラーは、有効な入力を構成するものを具体的に定義せずに入力を処理できます。Cプログラマの群衆に、Cプログラムとそうでないものを正確に一致させるようにしてください。幸運を!
reinierpost 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.