it-swarm-eu.dev

Proč je Python napsáno v C a ne v C ++?

V Pythonův tutoriál si můžeme přečíst, že Pythonova původní implementace je v C;

Na druhé straně, implementace Python, psaná v C, (...)

Jsem velmi zvědavý, proč byl Python napsán v C a ne C++?

Chtěl bych znát důvody tohoto rozhodnutí a odpověď by měla být podložena historickými odkazy (a nikoli založenými na názorech).

79
Piotr Dobrogost

Ze všeho, co jsem viděl, je to kombinace praktických a historických důvodů. (Většinou) historický důvod je ten CPython 1.0 byl propuštěn v roce 1989. V té době, C byl jen nedávno standardizovaný. C++ byl téměř neznámý a rozhodně nepřenosný, protože téměř nikdo neměl kompilátor C++.

Ačkoliv je C++ dnes mnohem rozšířenější a snadno dostupnější, bylo by nutné přepsat CPython do podmnožiny C, která je kompatibilní s C++, ještě slušné množství práce. Sama o sobě by tato práce přinesla malý nebo žádný skutečný přínos.

Je to trochu jako Joelův blogový příspěvek o tom, jak začít znovu a dělat úplné přepsání, což je nejhorší chyba, kterou může softwarová společnost udělat. Já bych tomu čelil tím, že bych poukázal na převod Microsoftu z jádra Windows 3.0 na jádro Windows NT a Apple na převod z MacOS 9 na Mac OS/X. Ani jeden nezabil společnost - ale oba to byly rozhodně velké, drahé, dlouhodobé projekty. Oba také poukazují na něco, co je rozhodující pro úspěch: udržování obou kódových základen na tak dlouhou dobu, aby (většina) uživatelů mohla ve svém volném čase přejít na novou kódovou základnu , na základě (alespoň vnímaných) výhod.

Pro vývojový tým je však velikost tohoto Pythonu mnohem obtížnější. I změna z Python 2 = 3) zabrala docela dost práce a vyžadovala podobné překrývání. Alespoň v tom případě však existují přímé výhody změn, které se přepisují do C++ (sám o sobě) by neposkytl (alespoň okamžitě).

Linus Torvaldsův výkřik proti C++ byl vychován, takže to také zmíním. Nic, co jsem z Guida viděl, nenaznačuje, že má vůči C++ takové silné a negativní pocity. Nejhorší, co jsem ho viděl říkat, je to, že výuka C++ je často katastrofa - ale okamžitě řekl, že je to do značné míry proto, že učitelé C++ neznali/nevěděli.

Také si myslím, že i když je možné převést hodně C kódu na C++ s relativním snadností, že získání hodně skutečné výhody z C++ vyžaduje nejen docela trochu více přepisování než to, ale také vyžaduje podstatné přeškolení většiny zapojených vývojářů. Většina dobře napsaných C++ se podstatně liší od dobře napsaných C, aby dělala stejné věci. Není to , jde pouze o změnu malloc na new a printf na cout, jakýmkoli úsekem fantazie.

122
Jerry Coffin

Myslím, že důvod, proč to bylo původně napsané v ANSI C89, je docela jednoduše proto, že tehdy nebyl C++ jednoduše proveditelnou volbou, co s nekompatibilitou mezi různými kompilátory a takovými. Myslím tím, že trvalo, než to, co bylo v roce 2005, přijít se specifikací ABI, která by umožnila kódu kompilovanému s jedním kompilátorem volat kód kompilovaný s jiným kompilátorem?

Zajímavější otázkou je, proč je stále napsáno v C89.

A existuje překvapivá odpověď: protože lidé skutečně používají Python na platformách, pro které neexistuje kompilátor C++ a žádný C99!) Když se sloučily optimalizace interpretů závitových kódů inspirovaných Forthem, došlo k - obrovský diskuse o tom, protože kód (nutně) používal vypočítaný goto, který není součástí C89. Existovaly zjevně skutečné obavy, že tato funkce nemusí být na některých platformách k dispozici to Python je aktuálně používán.

Totéž se stalo s Unladen Swallow, který používá LLVM, který je napsán v C++. Bylo jasně řečeno, že požadavek na sloučení Unladen Swallow do CPythonu by byl takový, že jej můžete kompilovat bez kompilátoru JIT, protože existují platformy, na kterých lidé běží Python on, pro které neexistuje žádný kompilátor C++) .

Samozřejmě, v dnešní době, CPython již není jedinou implementací Python. Existuje PyPy, který je psán v RPythonu (staticky typovaná podmnožina Pythonu), Jython v Javě, IronPython v C #, Pynie v NQP a PIR atd.

30
Jörg W Mittag

Lepší otázkou může být: „Proč není v Pythonu napsáno Python)?“

A co víc, jakmile je dost primitivů pro Python třídy a objekty jsou psány v C, ty mohou být použity pro zápis zbytku tlumočníka, takže byste nic nezískali pomocí C++ místo toho .

10
Larry Coleman