でPythonのチュートリアル 1は、Pythonのオリジナル実装はCであることを読み取ることができます。
一方、Cで書かれたPython実装(...)
PythonがC ++ではなくCで作成されたのはなぜですか?
この決定の背景にある理由を知りたいのですが、その答えは歴史的な参考文献によって支持されるべきです(意見に基づくものではありません)。
でPythonのチュートリアル 1は、Pythonのオリジナル実装はCであることを読み取ることができます。
一方、Cで書かれたPython実装(...)
PythonがC ++ではなくCで作成されたのはなぜですか?
この決定の背景にある理由を知りたいのですが、その答えは歴史的な参考文献によって支持されるべきです(意見に基づくものではありません)。
回答:
私が見たすべてのものから、それは実用的および歴史的な理由の組み合わせです。(ほとんど)歴史的な理由は、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とは大きく異なります。それはだていない変更だけの問題malloc
にnew
してprintf
にcout
想像力の任意のストレッチで、。
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などで記述されています。
より良い質問は、「なぜPythonはPythonで書かれていないのですか?」です。
さらに重要なことに、Pythonクラスとオブジェクトに十分なプリミティブがCで記述されると、それらをインタプリタの残りの記述に使用できるため、代わりにC ++を使用しても何も得られません。