誰かが新しいプログラミング言語を書くとき、彼らはそれを何と書きますか?

StackOverflow https://stackoverflow.com/questions/1629513

  •  06-07-2019
  •  | 
  •  

質問

私の無知を許してください。私はPHPに手を出して、ブラウジングを開始し、何年もの間疑問に思っていた質問をせざるを得ませんでした。

まったく新しいプログラミング言語を書くとき、で何を書くのですか?

これはおそらく、私が非常に尊敬しているすべてのプログラマーにとっては本当にばかげているように聞こえますが、それはややこしいことです。私に卵の事。職業はなんですか?自分に言い聞かせてください今日は新しい言語を発明します!そして起動します...メモ帳?すべてのコンパイラは既存の言語に基づいて構築されており、わざわざ1つの巨大な分岐ツリーに考案されたすべてのプログラミング言語をグラフ化して、最終的には... ... / p>

弱い知性で、これは魅力的だと思います...私を教育してください!

役に立ちましたか?

解決

これは愚かな質問ではありません。素晴らしい質問です。

すでに答えたように、短い答えは「別の言語」です。

それは興味深い質問につながりますか?その最初の言語が  あなたの特定のハードウェア?組み込みデバイスで働く人々にとって非常に現実的な問題。既に「別のコンピューターの言語」と答えたように。実際、一部の組み込みデバイスはコンパイラーを取得しないため、プログラムは常に別のコンピューターでコンパイルされます。

ただし、さらにプッシュバックできます。これまでに書かれた最初のプログラムはどうですか?

「高水準言語」向けの最初のコンパイラ「アセンブリ言語」と呼ばれるもので書かれていたでしょう。アセンブリ言語は、言語の各命令がCPUへの単一の命令に対応する言語です。非常に低レベルの言語であり、非常に冗長で、書くのは非常に労働集約的です。

ただし、アセンブリ言語を記述する場合でも、アセンブリ言語を「マシン言語」に変換するには、アセンブラと呼ばれるプログラムが必要です。さらに戻ります。最初のアセンブラは「マシンコード」で記述されていました。コンピューター自体の生の言語と直接1対1で対応する2進数で完全に構成されるプログラム。

しかし、まだ終わらない。生の数字だけが入っているファイルであっても、翻訳が必要です 。ファイル内のこれらの生の数字をコンピューターに取り込む必要があります。

初期のコンピューターの前面にスイッチの列があったかどうかはわかりません。 2進数を表すまでスイッチをひっくり返してから、別のスイッチをフリックすると、その1つの数字がコンピューターのメモリに読み込まれました。その後、ディスクファイルまたはパンチカードからプログラムを読み取ることができる最小限のコンピュータープログラムを読み込むまで、フリックを切り替え続けました。別のスイッチをフリックすると、プログラムの実行が開始されました。 80年代に大学に行ったとき、その容量はあるが、スイッチを使用してプログラムを読み込む仕事が与えられなかったコンピューターを見ました。

それよりも早く、コンピュータープログラムはプラグボード

他のヒント

最も一般的な答えは C です。ほとんどの言語は、Cまたはコールバックと「レクサー」を備えたCのハイブリッドで実装されます。 Flex など、および YACC 。これらは、1つの目的に使用される言語です-別の言語の構文を記述するために。コンパイルされた言語については、最初にCで実装される場合があります。次に、言語の最初のバージョンが新しいバージョンの作成に使用されます。 ( Haskell のように。)

多くの言語がブートストラップされています。つまり、それ自体で記述されています。これを行う理由については、多くの場合、自分のドッグフードを食べる

参照するウィキペディアの記事では、鶏と卵について説明しています。問題。かなりおもしろいと思います。

ほとんどすべての言語ですが、グラフやその他の複雑なデータ構造の操作に適した言語を使用すると、多くのことが簡単になります。プロダクションコンパイラは、パフォーマンス上の理由からCまたはC ++で記述されることがよくありますが、OCaml、SML、Prolog、Lispなどの言語は、言語のプロトタイピングには間違いなく優れています。

いくつかの「小さな言語」もあります。言語設計で使用されます。 Lexとyaccは、たとえば構文と文法を指定するために使用され、Cにコンパイルされます(ocamllex / ocamlyaccなど、他の多くの同様のツールなど、他の言語用のポートがあります。)

特殊なケースとして、新しいLisp方言は、既存のLisp実装上に構築されることがよくあります。これは、同じインフラストラクチャのほとんどに便乗できるためです。 Schemeインタープリターの記述は、コードページの下のSchemeで行うことができます。この時点で、新しい機能を簡単に追加できます。

基本的に、コンパイラは、何かを読み込んで別のものに変換するプログラムです-LaTeXソースをDVIに変換し、Cコードをアセンブリに変換してから機械語に変換し、文法仕様をパーサーのCコードに変換します。その設計者は、ソース形式の構造(解析)、それらの構造の意味、データを単純化する方法(最適化)、および生成する出力の種類を指定します。通訳者はソースを読み、それを直接実行します。 (通訳は通常、記述が簡単ですが、はるかに遅くなります。)

実際には、好きなほぼすべての言語で書くことができます。 RubyでCコンパイラを書くことを妨げるものは何もありません。 「すべて」あなたがしなければならないことは、プログラムを解析し、対応するマシンコードを出力することです。ファイルの読み取り/書き込みができる場合は、おそらくプログラミング言語で十分です。

新しいプラットフォームでゼロから始める場合は、クロスコンパイルを実行できます。Javaまたはx86でネイティブに実行される新しいプラットフォーム用のコンパイラを作成します。 PCで開発し、プログラムを新しいターゲットプラットフォームに転送します。

最も基本的なコンパイラは、おそらくアセンブラーとCです。

"新しいプログラミング言語の作成"技術的にはコードを一切使用しません。あなたの言語がどのように見え、どのように機能するかについての仕様を作成しているところです。自分の言語がどのようなものであるかがわかったら、翻訳者と通訳者を作成して、実際にあなたの言語を「仕事」にしてください。

翻訳者は、ある言語でプログラムを入力し、別の言語で同等のプログラムを出力します。インタプリタはある言語のプログラムを入力して実行します。

たとえば、Cコンパイラは通常、Cソースコード(入力言語)をアセンブリ言語プログラム(出力言語)に翻訳します。次に、アセンブラはアセンブリ言語プログラムを取得して、機械語を生成します。出力が得られたら、プログラムを実行するのに翻訳者は必要ありません。機械語プログラムが作成されたため、CPUがインタープリターとして機能します。

多くの言語の実装方法は異なります。たとえば、 javac は、JavaソースコードをJVMバイトコードに変換するトランスレーターです。 JVMは、Javaバイトコードを実行するインタープリター[1]です。 javac を実行してバイトコードを取得したら、 javac はもう必要ありません。ただし、プログラムを実行する場合は常にJVMが必要です。

翻訳者がプログラムを実行するために保持する必要がないという事実は、「ブートストラップ」を可能にするものです。最終的に「上で」実行されることなく、あなたの言語レイヤーおよび他の言語のレイヤー。

[1]ほとんどのJVMは舞台裏で翻訳を行いますが、JVMへのインターフェースが「入力言語」ではないという点で、実際には翻訳者ではありません->出力言語"。

一般に、好きな言語を使用できます。たとえば、PHPはCで書かれています。コンパイラにまったくアクセスできない場合は、アセンブリ言語を記述し、手動で機械語にコンパイルすることに頼らなければなりません。

多くの言語は最初に利用可能な別の言語で記述され、その後、それ自体で再実装され、その方法でブートストラップされました(または、PHPやperlなどの外国語で実装を維持しました)が、最初のアセンブラーのような一部の言語は、最初のCコンパイラのようなマシンコードは、手動でアセンブリにコンパイルされました。

私はそれについて読んで以来、ブートストラップに興味がありました。さらに学ぶために、自分でBFのスーパーセットを書いて自分でやってみました。それは EBF と呼ばれていました。 EBFの最初のバージョンには3つの追加プリミティブがあり、最初のバイナリを手でコンパイルしました。そうすると、2段階のリズムを見つけました。 1つのリリースで現在の言語の機能を実装し、実装された機能を利用するためにコードを書き直した甘いリリースがありました。この言語は、 LISPインタープリターを作成するのに十分な表現力を備えていました。

最初のリリースタグで、コードは非常に小さいです。最後のバージョンは、サイズとコードが12倍大きく、コードをよりコンパクトにすることができるため、現在のバージョンを手作業でコンパイルするのは困難です。

Edmund Grimley Evansは、 HEX言語

これを自分で行うことの興味深い点の1つは、なぜあるものがそのままあるのかを理解することです。私のコードは、小さな増分調整が製品であり、ゼロから設計されたものではなく、進化したように見えます。今日コードを読むとき、私はそれを覚えていますが、少しおかしいと思います。

通常、システム開発に適した汎用プログラミング言語を使用します。 C、Haskell、ML、Lispなど。ただし、オプションのリストは長い。また、通常、言語実装用のいくつかのドメイン固有言語、つまりパーサーと字句解析ジェネレータ、 LLVM などの中間言語おそらく、いくつかのシェルスクリプト、テストフレームワーク、ビルド構成システムなど。 autoconf。

ほとんどのコンパイラはCまたはACのようなプログラムであり、cでない場合はアセンブリlangを使用します独自の機能を今どの言語で? Fortranの基本的なアルゴリズムLispのようなオブジェクト指向の構造化lang仕様からのbnf文法のように見えるマシンにpsedocodeと呼ばれるソースコードのフォームを書くことができます。そのため、これらの言語構文のいずれかに似たクロスコードを記述するイメージは、擬似コードです

さらにバイナリ、またはアセンブリ操作を関数に変換する必要があります。それはアセンブラ/コンパイラジョブであり、データと関数からオブジェクトに変換する必要があります(ソースファイルがない場合)。言語実装でこれらのオブジェクト機能をどのように表現するか、そして「見る」ことを認識しなければなりません多くの知識を必要とする独自の関数、手順、およびデータ構造を実装または定義します。これは、関数とは何かを自問する必要があります。それから、あなたの心は言語シミュレーションになります。 p>

この質問も数か月前にありました。そして、私はいくつかの記事を読んで、ソフトと呼ばれる自分の言語を書き始めるのを助けたいくつかのビデオを見ました。まだ完全ではありませんが、この旅から多くのことを学びました。

知っておくべき基本的なことは、コードスニペットを実行する必要がある場合のコンパイラの動作です。コンパイラには、字句解析、セマンティックアナライザー、AST(Abstract Syntax Tree)などのような多くのフェーズがあります。

新しい言語で行ったことはここにあります- http:/ /www.singhajit.com/writing-a-new-programming-language/

初めて言語を作成する場合、すべてのベストを尽くし、長い道のりがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top