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


31

言語Aは言語Bで書かれているという言葉をよく耳にします。たとえば、PHPCで書かれ、C#C ++で書かれています

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

さらに、実装言語の選択の基礎となる要因は何ですか?


19
厳密に言えば、「PHPはCで作成されています」は間違っています。言語自体は正式な定義であるため、別のプログラマー言語では作成されません(むしろ英語で作成されます)。コンパイラ、インタプリタ、および/またはライブラリのみをC、C ++などで記述できます。実際には、多くの言語には1つの主要なコンパイラーまたはインタープリターがあり、言語の定義と実装の区別はされていません。
user281377

興味深いことに、BCPLはほとんどがBCPLで書かれていました
OldCurmudgeon

7
PHP自体は、正式な定義ではありません。Cプログラムです。
カズ

8
s/written/implemented/そして、それははるかに明確です。
TMN

2
@ugorenアセンブリで書かれたCコンパイラがたくさんありました。しかし、今世紀はそうではありません。
ロスパターソン

回答:


30

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

コンパイルされた言語は、コンパイラによってマシンコードに翻訳されます。これは、CPUが段階的に直接実行する言語です。一方、インタープリター言語では、インタープリターであるインタープリターを使用して言語コードを実行します。インタープリター自体は別のプログラムであり、通常はそれ自体がマシンコードにコンパイルされます。

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

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

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

  • Python:Pythonインタープリターは、PythonコードをPythonバイトコードにコンパイルしてから、バイトコードを解釈します。インタープリター自体はCで書かれています。その後、IronPythonと呼ばれるC#に使用される同じCLIで実行するようにPythonをコンパイルするものや、Java仮想マシンJythonで実行されるものなど、新しい実装が追加されました。円を完成させるために、Python(PyPyの一部)で記述されたPythonバージョンがあります。
  • Ruby:Rubyは純粋なインタプリタ言語として始まりましたが、最新バージョンではバイトコードを使用するようになりました。Rubyにも、IronRubyという名前のCLIにコンパイルするプロジェクトと、Java VMのJRubyに対応するプロジェクトがあります。

申し訳ありませんが、仮想マシンとインタープリターの違いは何ですか?どれを使用することがコンパイルの中間点であるかわかりません。バイトコードが半分コンパイルされていると言っていますか?
フィリップ

1
@Philip:バイトコードはマシンコードではありません。そのため、CPUに直接命令を提供する代わりに、バイトコードを取得して解釈し、それをマシン命令に変換するインタープリターが必要です。利点は、仮想マシンを他のアーキテクチャに移植するのが簡単であり、JITコンパイルなどのトリックを適用できることです
マーティンピーターズ

「コンパイル済み」という用語がマーケティングの目的で薄められていると感じている人はいますか?
フィリップ

2
おっ!私はそれを取り戻します。しばらくの間、間違った道を進んでいた。「コンパイルされた」とは、マシンコードとマシンコードのみになることを意味すると推測しましたが、実際にはそうではありません。コードを他のコードに変換するための単なる用語です。そのマシンコード、バイトコード、またはあなたが望むどんな言語でも。また、PHPコンパイラーが存在することが判明しているため、「通常」解釈されているとしか言えません。
フィリップ

また、優れた情報源:youtube.com/watch
Adam

34

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

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

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

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


投稿した瞬間に3つの賛成票が表示される理由を知っている人はいますか?
トーステンミュラー

1
現在4つ表示されていますが、あなたが何を求めているのかよくわかりません。アップボットの表示が速すぎましたか?もしそうなら、まあ、質問に多くの目(ほぼ同時に3つの答え)、あなたの答えは良いです。
ヤニス

うーん、はい。たぶん私はそれを保存してから編集し、再び保存して、最初の保存を忘れていたかもしれません(私は年を取りました)。私にとっては、投稿した瞬間に最初の3つの賛成票を受け取ったように見えました。
トーステンミュラー

@thorstenmüller+1「Cでインタプリタを作成し、C ++でライブラリを作成することを妨げるものは何もありません」について、私はちょうどこれについて尋ねようとしていました。インタープリター/コンパイラーが1つの言語であり、コアライブラリーが別の言語である、このための有名な実装はありますか?
松o

@thorstenmüller私は時々それを数回起こしました。あなたが投稿したように複数の誰かが質問を見ている場合、あなたが2、3秒以内に「新しい回答が投稿されました」という小さなメッセージがあります。あなたの投稿の。さらに、回答を投稿してから5分以内に行われた編集は、編集履歴に表示されないため、あなたの側でさらに混乱を招く可能性があります。
イズカタ

10

これは単に、言語Aのコアのほとんどが言語Bで書かれていることを意味します。「言語Aのコア」とは言語によって異なる場合がありますが、一般的に言えば、それはコンパイラーまたはインタープリターであることを意味します。他の言語を作成する言語を選択する決定要因は、ほとんどすべてのプロジェクトと同様に、開発者がどの言語に慣れているかです。

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

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


2
PsycoをCPythonの拡張として実行するため、別の実装とは呼びません。
マーティンピーターズ

@MartijnPietersサイトによると、これは死んだプロジェクトでもあります。削除されました。
ヤニス

@YannisRizos Unladen Swallowも死んでいませんか?
アンドレスF.

1
@Songo:それ以外string.lower(s)return s.lower()、それをに委任するpython関数があります、それは正しいです。CPythonの3.3文字列ケース操作は Cで実装されている
マルタインピータース


3

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

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


興味深い点。基本的に、PHPにexplodeを受け取り、Stringを返す組み込み関数があるArray場合、その実装(つまり、文字列を操作して配列を生成するコード)はCで書かれていますよね?
松o

@Songo:正しい。繰り返しになりますが、PHPは単なるプログラムであり、Word、Apache、Notepad、vi、またはemacsと同じです。言語仕様に従ってデータを読み取り、解析してから、言語仕様が行うべきことを実行します。
ブライアンオークリー

この答えは、実装と言語をひどく混同します。
ラッセル

これは最も単純で最も直接的な答えだと思いますが、どのように圧縮されるかわかりません。PHPの実装が複数あることさえ示唆しています。実際には、元のPHPとFacebookのいくつかがありますが、他にもあるかもしれません。
ウォーレンP

@RussellBorogove:「プログラミング言語の使用という観点から」答えを明確にするのに役立つと思いませんか?覚えておいてください、私たちはこの質問に絶対的な初心者を扱っているので、ポイントを説明するために少し正確さを犠牲にすることは公正です、IMO。
ブライアンオークリー

3

完全に異なる意味を持つ非常によく似た言い回しは、「言語Bで言語Aを書く」、例えば「JavaでCを書く」です。

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

通常、これは、誰かが長い間1つの言語で作業している場合(特にその言語でのみ作業している場合)に発生し、現在の言語では非常に新しい(またはクリーンコードの作成に興味がない)場合に発生します。


「CPythonはCで書かれています」は、「このユーザーがCのようにPythonで書いている」という意味ではありません。それはCPythonの(Windows上Python.exe Unix上では/ usr / binに/ pythonの)はCで書かれていることを意味
ウォーレンP

@Warren P:確かに、フレーズは非常に似ているため、どちらにも慣れていない人は簡単に説明を求めてここにたどり着く可能性があります。
マイケルボルグワード

3

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

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


0

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


C ++の正式な実装はありません。C ++の場合、仕様は正しいものであり、仕様の未定義の動作は実装で何でもすることがあります。いいえ、これは正しくありません。
ウォーレンP

以前のコメントが私の答えとどう関係しているかわかりません。私はすべての言語について普遍的に定量化されたステートメントを作成しなかったため、C ++の反例は適用できません。「A is written in B」(Aは「C ++」)という形式のステートメントは、Bが「English」の場合を除いて意味を成しません。
カズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.