web-dev-qa-db-ja.com

「言語Aは言語Bで書かれている」とはどういう意味ですか?

言語Aは言語Bで書かれているという言葉をよく耳にします。たとえば、[〜#〜] php [〜#〜]と書かれています[〜#〜] c [〜 #〜]C#C++で記述されています。

誰かがそれが何を意味するのか、それが正しいかどうかを説明できますか?言語が使用するインタープリターのコンパイラーと何か関係がありますか?

さらに、実装言語の選択に基づいている要素は何ですか?

31
Songo

ほとんどのプログラミング言語は、インタプリタ言語とコンパイル言語の2つのカテゴリに分類されます。

コンパイルされた言語は compiler によって machine code に変換されます。この言語は、CPUが直接実行する言語です。一方、インタープリター型言語は、中間体である インタープリター を使用して言語コードを実行します。インタプリタはそれ自体が別のプログラムであり、通常はそれ自体がマシンコードにコンパイルされています。

PHPはインタプリタ言語です。 runPHPコードを実行するには、別のプログラムが必要です。コンピューターはプログラムを直接実行しません。その別のプログラム、 PHPインタプリタ、それ自体はCで書かれています。

C#はコンパイルされた言語ですが、マシンコードにコンパイルされていません。代わりに、仮想マシン上で実行するために、特殊な言語であるバイトコードにコンパイルされます。 Javaは、このような設定のもう1つの例です。仮想マシンがインタープリターである場合、コンパイルと解釈のハイブリッドとして見ることができます。C#の仮想マシン(CLI、または- 共通言語インフラストラクチャ )はC++で記述されています。

その他の例は次のとおりです。

  • Python:PythonインタプリタはPythonコードをPythonバイトコードにコンパイルし、バイトコードを解釈します。インタプリタ自体はC.以降、新しい実装が追加されました。これには、C#に使用されるのと同じCLIで実行するためにpythonをコンパイルして IronPython と呼ばれる)、および=で実行されるものが含まれますJava仮想マシン、 Jython 。サークルを完成させるために、Python Python(のサブセット)で記述されたバージョン)があります- PyPy
  • Ruby:Rubyは純粋なインタプリタ言語として開始されましたが、最新バージョンはバイトコードの使用に切り替わりました。Rubyの場合も、CLIにコンパイルされるプロジェクト IronRuby 、およびJava VM、 JRuby の1つ。
30
Martijn Pieters

あなたは基本的に正しいです。 RubyがCで記述されている場合、これは言語インタープリターとコアライブラリの一部がCで記述されていることを意味します。

したがって、Rubyインタープリターは、テキストファイルを入力として受け取り、それを処理してから、別のテキストファイル(Rubyで記述されている場合)にある関数またはコンパイルされたCコードである関数を呼び出すCプログラムです、メモリやファイルシステムなどのシステムリソースに直接アクセスするために必要な基本機能と、非常に高いパフォーマンスを必要とする一部の機能。

したがって、他の言語で記述できる、または記述しなければならない言語のさまざまな部分があります。インタープリターをCで作成したり、ライブラリーをC++で作成したりすることを妨げるものは何もありません(ただし、いくつかのことをより困難にすることがあります)。複数のステップを用意し、テキスト処理に非常に優れた言語を使用して中間データを生成してから、Cデータで処理することもできます。

決定の要因は、他の複雑なアプリケーションの場合とまったく同じかもしれません。性能は一つです。システムリソースに直接アクセスできるコードを作成する機能。したがって、ほとんどの場合、それはコンパイルされた言語である必要があります(理論的には、Ruby Pythonでインタプリタを書くことができます)。Linuxで言語を実行する場合は、さまざまなシステムでの可用性が重要です。 Win、OS Xなど。

34

それは単に、言語Aのコアのmostが言語Bで書かれていることを意味します。「言語Aのコア」とは言語ごとに異なる可能性がありますが、一般的な用語では正しいと思います、それはコンパイラまたはインタプリタであることを意味します。言語を選択して別の言語を記述する際の決定的な要因は、ほとんどすべてのプロジェクトと同様に、開発者がより慣れている言語です。

とはいえ、「言語Aは言語Bで書かれている」とは、ほとんどの現代の言語では単純化しすぎです。 Pythonを例に取ると、リファレンス実装 CPython が実際にCで記述されている場合、 Jythonのような他の言語で記述された実装があります。 (Javaで記述)、 IronPython (C#で記述)、 PyPy (Pythonで記述)、 CLPython (Common LISPで記述) )、 Stackless Python (CおよびPythonで記述)および nladen Swallow (C++で記述)。

プログラミング言語は定義であり、Pythonの例が示すように、コンパイラー、インタープリター、およびライブラリーがどの言語で記述できるかについては、実際に制限はありません。もちろん、それも可能です。 bootstrapping と呼ばれるプロセスを通じて、言語がそれ自体で記述されるため。

10
yannis

プログラミング言語を使用する観点から見ると、プログラミング言語は単なるプログラムです。それはコンパイラかもしれないし、インタプリタかもしれないし、ある種の仮想マシンかもしれない。これらはすべてコンピュータプログラムであるため、任意の言語で記述できます。

したがって、独自のバージョンのPHPを作成したい場合は、最も流暢な言語で開始することができます。次に、PHP形式のコードを読み取り、PHP仕様は、プログラムで実行する必要があることを示しています。つまり、PHP言語をX言語で作成しています。

3
Bryan Oakley

完全に異なる意味を持つ非常に類似した表現は、「言語Aを言語Bで書く」ことです。 「JavaでCを書く」。

これは、ある言語では構文的に正しいが、別の言語の構造、イディオム、規則を使用するコードについて説明しています。 「JavaでのCの記述」の例では、列挙の代わりに整数定数を使用したり、identifiers_with_underscoresを使用したりするなど、各メソッドの上にすべてのローカル変数を宣言することになります。

これは通常、誰かが1つの言語を長期間使用していて(特に、その言語でonlyを使用している場合)、現在の言語が非常に新しい(またはクリーンなコードを書くことに興味がない)場合に発生します。

3

テクノロジーは本質的に反復的なプロセスです。シンプルなツールから始めて、それらのツールを使用してより良いツールを作成します。最初のアセンブリ言語は、チップの標準化された命令バイトコードのほぼ1:1変換でした。 8086アーキテクチャとそのアセンブラがZ80、RISCなどの他のアーキテクチャよりも優勢になったため、FORTRAN、COBOL、Pascal、Cなどの8086アセンブリに分解できる言語の開発を開始しました。ソースコードを解釈するプログラムこれらの言語はもっと原始的なもので書かなければなりません、そうでなければあなたは鶏と卵の議論に終わります。最初のCコンパイラのソースコードがCで記述されている場合、そのCソースコードをコンパイルしたものは何ですか。定義上、これは最初のCコンパイラではないでしょうか。

基本的に、「C#はC++で書かれている」とは、C#言語の仕様(Microsoftの.NET Framework、およびコマンドラインコンパイラー)に準拠する最初および/または最も人気のあるコンパイラーとランタイム/コアライブラリーを意味するプログラムCSC.exe)はC++で記述されています。

3
KeithS

「言語Aは言語Bで書かれている」とは、言語Aの唯一の実装(または広く使用されている唯一の実装)が、実際に言語Bで開発されたプロジェクトであり、完全で最新の唯一の実装であることを意味しますAの仕様はBのソースコードであり、ドキュメントとBプログラムが一致しない場合、Bプログラムは通常正しいと見なされます。

0
Kaz