PythonがC ++ではなくCで書かれているのはなぜですか?


76

Pythonのチュートリアル 1は、Pythonのオリジナル実装はCであることを読み取ることができます。

一方、Cで書かれたPython実装(...)

PythonがC ++ではなくCで作成されたのはなぜですか?

この決定の背景にある理由を知りたいのですが、その答えは歴史的な参考文献によって支持されるべきです(意見に基づくものではありません)。


10
理由はわかりませんが、これに近いものが疑われます:thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu

13
@ラリーコールマン:ライナスの暴言を見たことがない?「インターネット」を避ける必要があります...> _>
ハンニバルレクター博士

18
@Larry私はこの暴言を見て、それを読んだ後、Linusに対するほとんどすべての尊敬を失いました。彼の恥。
ピョートルドブロゴスト

5
さて、これはLinusの暴言への応答です。これについてはどうでしょうか。warp.povusers.org
avi

6
「(人気プログラム)が(言語X)で書かれており(言語Y)ではないのはなぜ?」と尋ねるポイントがありません。むしろ、同じ質問を逆にすることができます:なぜXではなくYですか?
アンドレスF.

回答:


119

私が見たすべてのものから、それは実用的および歴史的な理由の組み合わせです。(ほとんど)歴史的な理由は、CPython 1.0が1989年にリリースされたことです。当時、Cは最近標準化されました。C ++コンパイラはほとんど誰も持っていなかったため、C ++はほとんど未知であり、明らかに移植性がありませんでした。

C ++は現在でははるかに広く普及しており、簡単に入手できますが、CPythonをC ++と互換性のあるCのサブセットに書き換えるにはかなりの作業が必要です。それ自体では、その作業は実質的な利益をほとんどまたはまったく提供しません。

これは、Joelが最初からやり直し、ソフトウェア会社が犯す最悪の間違いである完全な書き直しについてのブログ投稿に少し似ています。MicrosoftのWindows 3.0コアからWindows NTコアへの変換、およびAppleのMacOS 9からMac OS / Xへの変換を指すことで、私はそれに反論します。どちらも会社を殺しませんでしたが、どちらも間違いなく大規模で高価な長期プロジェクトでした。両方とも、成功に不可欠なものを指します。両方のコードベースを十分に長く維持し、(ほとんどの)ユーザーが(少なくとも知覚される)利点に基づいて、余暇に新しいコードベースに切り替えることができるようにします。

ただし、Pythonの規模の開発チームにとって、この種の変更ははるかに困難です。Python 2から3への変更でさえかなりの労力を要し、同様の重複が必要でした。ただし、少なくともその場合、変更には直接的な利点があり、C ++への書き換え(単独では)が(少なくともすぐには)提供しません。

Linus TorvaldsのC ++に対する暴言が持ち上がったので、それについても言及します。Guidoからは、彼がC ++に対してそのような強い否定的な感情を持っていることを示したことはありません。私が彼に言った最悪のことについて、C ++教えることはしばしば災害であるということですが、彼はすぐにこれは主に教師がC ++を知らなかった/知らなかったためだと言いました。

また、多くのCコードを比較的簡単にC ++に変換することは可能ですが、C ++ から大きな利点を得るには、それよりもかなり多くの書き換えが必要になるだけでなく、関係するほとんどの開発者の大幅な再教育も必要になると思います。よく書かれたC ++のほとんどは、同じことを行うためによく書かれたCとは大きく異なります。それはだていない変更だけの問題mallocnewしてprintfcout想像力の任意のストレッチで、。


2
+1たくさん引用します。彼らは面白いです。リンクを追加できればさらに良いと思われます。
n611x007


これは素晴らしい答えでした。私はそれから多くを学びました。
ゲームBrainiac

1
比較的簡単にc ++に移植できるcに言及するための+1は、おそらく実行する価値がないでしょう。私はこれをすでに長い間知っていましたが、答えは視点を本当に強化し、さらにそれを見るためにいくつかの次元を追加しました。
fkl

1
OS / Xは最初から書き直していないことに注意してください「のMac OS / XへのMacOS 9からAppleの変換」:それは改善されたとAppleのために改名、むしろあるNeXTStepへMacOS9から切り替えた
Jivan

30

ANSI C89で最初に記述された理由は、その当時、C ++が異なるコンパイラなどの間に互換性がないため、実行可能な選択ではなかったからだと思います。つまり、2005年に、あるコンパイラでコンパイルされたコードが別のコンパイラでコンパイルされたコードを呼び出すことを許可するABI仕様を思い付くまでに何がかかったのでしょうか。

さらに興味深い質問は、なぜそれがまだ C89で書かれているのかということです。

そして驚くべき答えがあります。人々が実際にC ++とC99コンパイラが存在しないプラットフォームでPythonを使用しているからです!Forthにヒントを得たスレッドコードインタープリターの最適化がマージされたとき、C89の一部ではない計算されたコードが(必然的に)使用されたため、それについて大きな議論がありましたgoto。Pythonが現在使用されている一部のプラットフォームでは、この機能が利用できない可能性があるという懸念が明らかにありました。

Unladen Swallowでも同じことが起こりました。C++で書かれたLLVMを使用しています。Unladen SwallowをCPythonにマージするための要件は、Pythonを実行するプラットフォームがあり、C ++コンパイラが存在しないため、JITコンパイラなしでコンパイルできることです。

もちろん、最近では、CPythonが唯一のPython実装ではなくなりました。PyPyは、RPython(静的に型付けされたPythonのサブセット)、JavaのJython、C#のIronPython、NQPおよびPIRのPynieなどで記述されています。


3
私はこの半分をupvoteしたくなるんだけど、私は(特にコモーC ++はCにコンパイルすることを考えると)C ++コンパイラが存在しない、そのようなプラットフォームを知っている
ビリーONealに

1
ABIに言及するための+1
jk。

3
@Abdul:いいえ、Pythonはソフトウェアではありません。仕様です。その仕様には複数の言語で書かれた複数の実装があります。IronPythonはC♯、JavaのJython、RPythonのPyPy、NQP、PIR、Perl6のPynie、C ++のPyston、CのCPythonで記述されています。「PythonはCで記述されています」という文は意味がありません。Pythonはソフトウェアではありません。仕様です。プログラミング言語ではなく、英語で書かれています。「JavaはCの派生物です」は主に間違っています。JavaはObjective-Cに触発されていますが、ほとんどのCパーツを取り除き、Smalltalkパーツをほとんど取ります。
ヨルグWミットタグ

3
@MilesRout:仕様がCPythonから逸脱する場合が複数あります。たとえば、Python仕様は確定的なファイナライズを保証していませんが、少なくとも非循環参照についてはCPythonは保証しています。しかし、CPythonは非循環参照の決定論的なファイナライズを保証していますが、その事実に依存するコードの記述は仕様の一部ではないため壊れています。(私は今引用を見つけることができませんが、GvRは決定論的なファイナライズと参照カウントはCPythonのプライベートな内部実装の詳細であると明示的に述べています。)
JörgW Mittag

2
同様に、CPythonは2つのPythonスレッドが並行して実行できないことを保証しますが、それもCPythonのプライベートな内部実装の詳細であり、言語仕様によって保証されません。あなたの言うことが真実なら、他の実装はあり得ないでしょう。なぜなら、代替の実装は必ずCPythonと同じように振る舞う必要があり、したがって同じでなければならないからです。(観測可能な動作を変更しないモジュロリファクタリング。)
ヨルグWミットタグ

10

より良い質問は、「なぜPythonはPythonで書かれていないのですか?」です。

さらに重要なことに、Pythonクラスとオブジェクトに十分なプリミティブがCで記述されると、それらをインタプリタの残りの記述に使用できるため、代わりにC ++を使用しても何も得られません。


1
私の答えの最初のリンクをたどると、PythonでのPythonの実装への参照が表示されます。それはまだ生産準備ができていません。それはEUによって資金提供されています。私の答えから見つけるのが難しい場合、codespeak.net / pypy / dist / pypy / docはリンクです。
vpit3833

2
これは実際にはかなり深い答えです。GuidoのPythonが文字通りPythonで記述されているのではなく、Cの低レベル構造が高レベル構造を記述するために使用されているということではありません。
ジェレミー

1
私は通訳がで書かれているどのような言語(インタプリタ自体に働いている人のために)かなりの違いがありますよう、あなたがポイントを逃すと思います。言語の影響これらのどのプリミティブは次のようになり、彼らがどのように相互作用しますか。たとえば、現在、PythonのC実装では、参照カウントを手動でインクリメントおよびデクリメントする必要がありますが、これにはC ++でスマートポインターを使用できる場合があります。
ピョートルドブロゴスト14

PyPyが利用可能になり、興味深いことにCPythonよりも優れている場合があるので、私は思うに、それは素晴らしいアイデアだったでしょう。
サイクマールバッティノジュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.