Чому Python пишеться на C, а не на C ++?


76

У підручнику Python можна прочитати, що початкова реалізація Python знаходиться в C;

З іншого боку, реалізація Python, написана на C, (...)

Мені дуже цікаво, чому Python був написаний на C, а не на C ++?

Мені хотілося б знати міркування цього рішення, і відповідь має підтримуватися історичними посиланнями (а не на основі думки).


10
Я не знаю чому, але підозрюю щось близьке до цього: thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Матьє

13
@Ларрі Коулман: Ніколи не бачив тиражів Лінуса? Ви повинні уникати "інтернетів" ...> _>
dr Hannibal Lecter

18
@Larry Я бачив цю гніт і втратив майже всю повагу до Лінуса, прочитавши його. Сором йому.
Пьотр Доброгост

5
Ну, це відповідь на гучні слова Лінуса, що з цього приводу: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
AVI

6
Я не бачу сенсу запитати "чому (популярна програма) написана (мова X), а не (мова Y)?". А точніше, те саме питання можна змінити: чому Y, а не X?
Андрес Ф.

Відповіді:


119

З усього, що я бачив, це поєднання практичних та історичних причин. Історична причина (в основному) полягає в тому, що CPython 1.0 був випущений в 1989 році. На той час C був нещодавно стандартизований. C ++ був майже невідомий і, очевидно, не портативний, тому що майже ніхто не мав компілятора C ++.

Хоча C ++ сьогодні набагато більш розповсюджений і легко доступний, для перезапису CPython у підмножину C, сумісна з C ++, знадобиться досить багато роботи. Сама по собі ця робота мало б мало жодної реальної користі.

Це трохи схоже на публікацію в блозі Джоеля про те, як почати спочатку і зробити повне перезапис - це найгірша помилка, яку може зробити компанія, що займається програмним забезпеченням. Я протидію цьому, вказуючи на перетворення Microsoft з ядра Windows 3.0 в ядро ​​Windows NT та перетворення Apple з MacOS 9 на Mac OS / X. Ніхто не вбив компанію - але обидва були, безумовно, великими, дорогими, довгостроковими проектами. І те й інше вказують на те, що є ключовим для успіху: збереження обох баз коду досить довго, щоб (більшість) користувачів переходили на нову базу коду на своєму дозвіллі на основі (принаймні сприйнятих) переваг.

Однак для команди, яка займається розробкою, розмір Python змінити набагато складніше. Навіть перехід від Python 2 на 3 зайняв досить багато роботи і вимагав подібного перекриття. Принаймні, у цьому випадку є прямі вигоди від змін, які переписування на C ++ (само собою) не забезпечить (принаймні негайно).

Злобу Лінуса Торвальдса проти C ++ виховували, тож я також зазначу це. Ніщо, що я бачив від Гвідо, не свідчить про те, що він має такі сильні, негативні почуття до C ++. Про найгірше, що я бачив, він говорить про те, що викладання C ++ часто є катастрофою, - але він негайно продовжував говорити, що це багато в чому тому, що викладачі не знали C ++.

Я також думаю, що хоча можна перетворити багато C коду в C ++ з відносною легкістю, що для отримання реальної переваги від C ++ потрібно не тільки трохи більше переписування, ніж це, але й вимагає значної переосвіти більшості залучених розробників. Більшість добре написаних C ++ істотно відрізняються від добре написаних C, щоб робити те саме. Це НЕ тільки питання про зміну mallocв newі printfдо cout, будь-натяжки.


2
+1 Ви цитуєте багато; вони цікаві. Здається, було б ще краще, якби посилання могли бути додані.
n611x007

1
Щойно надіслали редагування із посиланням на допис у щоденнику Джоела, що переписується joelonsoftware.com/articles/fog0000000069.html
MarkJ

Це була відмінна відповідь. Я багато чому навчився з цього.
Ігри Brainiac

1
+1 спеціально для згадування c, який можна перенести на c ++ з відносною легкістю, ймовірно, не варто робити. Я знав це вже давно, але відповідь справді посилила точку зору, а також додала кілька аспектів, щоб подивитися на це.
fkl

1
"Перетворення Apple з MacOS 9 на Mac OS / X" зауважте, що OS / X не є переписанням з нуля: це, скоріше, перехід з MacOS9 на NeXTStep, вдосконалений та ребрендований для Apple
Jivan

30

Я думаю, що причина, по якій вона спочатку була написана в ANSI C89, є досить простою, оскільки тоді C ++ просто не був обґрунтованим вибором, що стосується несумісності між різними компіляторами та подібними. Я маю на увазі, поки не було, що це було, 2005 рік, щоб розробити специфікацію ABI, яка дозволила б коду, зібраному з одним компілятором, викликати код, зібраний з іншим компілятором?

Більш цікаве питання, чому це все ще написано в C89.

І є дивовижна відповідь: адже люди насправді використовують Python на платформах, для яких немає C ++ і жодного компілятора C99! Коли оптимізатори інтерпретації різьбового коду, натхнені Forth, були об'єднані, про це велика дискусія, тому що в коді (обов'язково) використовується обчислений, gotoякий не входить до складу C89. Очевидно, були реальні побоювання, що ця функція може бути недоступною на деяких платформах, на яких Python зараз використовується.

Те саме трапилося з Ластівкою без навантаження, яка використовує LLVM, написаний на C ++. Було зрозуміло, що вимога для об'єднання Unladen Swallow в CPython полягатиме в тому, що ви можете її компілювати без компілятора JIT, оскільки є платформи, на яких працює Python, для яких немає компілятора C ++.

Звичайно, на сьогодні CPython вже не є єдиною реалізацією Python. Є PyPy, який записаний в RPython (статично типізована підмножина Python), Jython на Java, IronPython в C #, Pynie в NQP та PIR тощо.


3
Я наполовину спокушаюсь це схвалити, але я не знаю жодної такої платформи, де компілятор C ++ не існує (Особливо враховуючи, що Comeau C ++ компілюється в C)
Біллі ONeal

1
+1 для згадки про ABI
jk.

3
@Abdul: Ні, Python - це зовсім не програмне забезпечення. Це специфікація. Існує кілька реалізацій цієї специфікації, написаних на декількох мовах. IronPython написаний на C♯, Jython на Java, PyPy в RPython, Pynie в NQP, PIR та Perl6, Pyston в C ++, CPython в C. Вислів „Python пишеться на C“ не має сенсу. Python - це не програмне забезпечення. Це специфікація. Він написаний англійською мовою, а не будь-якою мовою програмування. "Java - похідна від C", в основному, неправильна. Java натхненна Objective-C, але вона позбавляється більшості частин C і займає в основному частини Smalltalk.
Йорг W Міттаг

3
@MilesRout: Є кілька випадків, коли специфікація відхиляється від CPython. Наприклад: специфікація Python не гарантує детермінованої доопрацювання, але CPython робить, принаймні, для некруглих посилань. Але навіть незважаючи на те, що CPython гарантує детерміновану доопрацювання для некруглих посилань, написання коду, який спирається на цей факт, порушено , оскільки він не є частиною специфікації. (Я зараз не можу знайти цитату, але GvR чітко сказав, що детерміновані доопрацювання та підрахунок посилань - це приватні внутрішні деталі впровадження CPython.)
Jörg W Mittag

2
Аналогічно, CPython гарантує, що два потоки Python не можуть виконуватись паралельно, але це також є приватною внутрішньою інформацією про реалізацію CPython і не гарантується мовою. Якщо те, що ви говорите, було істинним, не могло бути ніяких інших реалізацій, оскільки будь-яка альтернативна реалізація повинна обов'язково поводитися ідентично CPython, а значить, обов'язково повинна бути ідентичною. (Модульні рефактори, які не змінюють спостережувану поведінку.)
Jörg W Mittag

10

Краще питання може бути: "Чому Python не написаний на Python?"

Більш того, коли достатньо примітивів для класів та об’єктів Python записано на C, вони можуть бути використані для запису решти інтерпретатора, тому ви нічого не отримаєте, використовуючи C ++.


1
Якщо ви перейдете за першим посиланням у моїй відповіді, ви побачите посилання на реалізацію Python в Python. Це ще не готове виробництво. Це фінансується ЄС. codepeak.net/pypy/dist/pypy/doc є посиланням, якщо це важко знайти з моєї відповіді.
vpit3833

2
Це насправді досить глибока відповідь. Справа не в тому, що Python Guido буквально написана на Python, але в тому, що структури низького рівня в C використовуються для запису вищих рівнів.
Джеремі

1
Я думаю, ви пропускаєте думку, оскільки існує велика різниця (для людей, які працюють над самим перекладачем), якою мовою написаний перекладач. Мова впливає на те, як виглядають ці примітиви та як вони взаємодіють між собою. Наприклад, зараз у C реалізації Python потрібно пам’ятати про збільшення посилань на збільшення та зменшення вручну, тоді як для цього можливо використовувати інтелектуальні покажчики на C ++.
Пьотр Доброгост

Тепер, коли PyPy доступний і що цікаво перевершує CPython іноді, це було б дуже чудовою ідеєю.
Сай Кумар Баттіною
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.