web-dev-qa-db-ja.com

プログラミング言語での実装の定義は何ですか? CPythonとは何ですか?

私はこの「実装」という言葉に出くわしました。 CPythonは、Pythonの最も一般的な実装の1つです。実装とは正確には何ですか?

Pythonコードの実行方法について少し調べました。最初に、コードがコンパイルされてバイトコードに変換され、次にPVMまたはインタープリター(不明)を使用して、機械語に変換されます。 CPUによって実行されます。

これらすべての手順で、CPython(またはJython、PyPyなど)はどこにありますか?

PVMとインタープリターは同じですか?

次に、PVMがCで書かれていることをどこかで読みました。本当ですか?彼らが実装がCであると彼らが言うとき、それはそれが意味することですか?

1

人間の言語がどのように機能するかを考えてください。理論的には、「英語」を構成するもののルールが何であるかを説明するドキュメントの種類があります。単語の定義セット、文法がそれらの単語を意味のある文章に組み立てる方法のルールなどがあります。私たち一人一人は、それらの単語の意味と英語の文法がどのように機能するかについての私たち自身の考えを使用して英語でコミュニケーションします。

したがって、これをプログラミング言語にたとえることができます。あなたはPythonのような言語を持っています。 Pythonこの類推で話す "人"はプログラマではありません; Pythonの "話し手"は私たちが "実装"と呼んでいるものです。これらはPython=を理解し、コンピュータに実際にPythonの指示に示されていることを実行させる)ツール.

CPythonは、Pythonのそのような「スピーカー」の1つです。かつて、これは唯一のPython実装でした。CPythonは主にCで記述された特定の実装です。JythonはPython Javaで記述された実装です。どちらも同じことを効果的に行い、同じ目的で同じ文法を理解しますが、方法は異なります。

最初の段落では、「理論上」の言語には、それらの意味を定義するいくつかのドキュメントがあることだけを述べました。 formalルールを持たない人間の言語がたくさんあるからです。そして、正式な規則の範囲内であっても、言語が自然に進化するにつれ、方言や新造語などが常に存在します。これにより、1つの言語を話す1人が、同じ言語を表面的に話す人を理解できない可能性があることに注意してください。

これは、2人の「実装」という2人が、言語が実際に何であるかについて同意しないために起こります。

プログラミング言語は、定義、つまり「標準化」に関して、2つの方法のいずれかを採用する傾向があります。彼らは、事実上の標準または陪審員の標準を持つことができます。実際、この文脈での「実装」という言葉は、「標準」を「実装」することを意味します。

De-jure規格の言語には、言語が何であるかについてのすべてを規定するハードドキュメントがあります。うまくいけば、それは言語に関するすべてを正式に指定し、すべての構文構造の動作を詳細に詳述します。同じコードを指定したときに2つの実装の動作が異なる場合、次のいずれかが発生しています。

  1. それらの一方または両方が標準を正しく実装していません。
  2. 標準はその特定の言語に対して不十分に指定されています。つまり、それは振る舞いがどうあるべきかを述べていないか、または曖昧にするために混乱して表現されています。
  3. 標準では、コードの動作は実装によって定義されるか、完全に未定義であると明示的に規定されています。 C++lovesがこれを言っています。

言語の正式な仕様とリファレンスドキュメントの間にはhugeの違いがあることに注意してください。

事実上の標準では、1つの実装を選択し、「Xは言語Xは言語Xです」と言って言語を定義します。これは、2つの実装が異なる場合、事実上の標準の実装が正しいことを意味します。

これはまた、事実上の標準に癖がある場合、その言語のすべての実装はそれらの癖を再現する必要があることを意味します。たとえば、事実上の標準に何らかの理由で32個の関数パラメーターのみのハード制限がある場合、より多くの関数パラメーターを許可するその言語の実装は技術的に間違っています。

事実上の標準に(クラッシュしない)バグが含まれている場合は、それが問題ですにはバグがありません。 「バグ」は標準に関連して定義されます。そして、事実上の標準の実装が標準です;したがって、その中の「バグ」は機能であり、物事を変更する次のバージョンが出るまで続きます。そして、そのようなことは、ある程度、言語機能の変更であり、バグ修正ではありません。

多くの言語はデファクトスタンダードから始まり、デジュールスタンダードへと進化しています。 C#とJavaは正式な言語仕様なしで開始されましたが、どちらも現在それらを持っています。C++は、C++ 98がC++の意味を正式化するまで、不明確なもののミッシュマッシュでした。

現時点では、Pythonは半々です。言語を定義することを示唆する 言語参照ドキュメント がありますが、これは「正式な仕様」ではありません。言語リファレンスから:

私は、構文と字句解析以外のすべてについて、正式な仕様ではなく英語を使用することにしました。これにより、平均的な読者にとってドキュメントが理解しやすくなりますが、あいまいさを残す余地があります。したがって、火星から来て、このドキュメントだけからPythonを再実装しようとした場合、推測する必要があり、実際にはまったく異なる言語を実装することになるでしょう。

そのため、あいまいな場合は、通常、CPythonの動作に依存します。さらに、あいまいな領域を持つ正式な仕様がたくさんあります。

4
Nicol Bolas

大まかに言えば、「Python」は概念です。これはプログラミング言語のアイデアです。もちろん、それは単なるアイデアではなく、プログラミング言語の完全に具体化された仕様です。ただし、.pyファイルを読み取ってコードを実行できる実際のプログラムができるまでは、それは単なる概念です。

.pyファイルが役立つためには、言語を理解し、それを基礎となるマシンの言語に変換できるプログラムによって処理される必要があります。

python言語(例:python.exe、/ usr/local/bin/pythonなど))で記述されたファイルを処理できるプログラムを誰かまたはいくつかのチームが作成すると、そのプログラムは実装言語の。

.pyファイルを処理するこれらのプログラムは、多くの言語で記述できます。たとえば、ironpythonは.pyファイルを処理できる.netプログラムです。 Jythonは.pyファイルを処理できるJavaプログラムです。CPythonは.pyファイルを処理できるCベースのプログラムです。これらはそれぞれpythonの実装です。

3
Bryan Oakley