Почему Python написан на C, а не на C ++?

76

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

С другой стороны, реализация Python, написанная на C, (...)

Мне очень любопытно, почему Python был написан на C, а не на C ++?

Я хотел бы знать причину этого решения, и ответ должен быть подкреплен историческими ссылками (а не основанными на мнении).

Петр Доброгост
источник
10
Я не знаю почему, но я подозреваю, что что-то похожее на это: thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Матье
13
@Larry Coleman: Никогда не видел, как Линус разгорается? Вы должны избегать "интернетов" ...> _>
доктор Ганнибал Лектер
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 тем же. Это не только вопрос об изменении mallocв newи printfк cout, любой натяжке.

Джерри Гроб
источник
2
+1 Вы много цитируете; они интересные. Кажется, было бы еще лучше, если бы ссылки могли быть добавлены.
n611x007
1
Только что отправил изменения со ссылкой на сообщение в блоге Джоэла о переписывании joelonsoftware.com/articles/fog0000000069.html
MarkJ
Это был отличный ответ. Я многому научился от этого.
Игры Brainiac
1
+1 специально для упоминания c, который можно относительно легко перенести на c ++, вероятно, не стоит делать. Я знал это уже давно, но ответ действительно укрепил точку зрения плюс добавил несколько аспектов, чтобы взглянуть на это.
ФКЛ
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.

То же самое произошло с Unladen Swallow, который использует 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)
Billy 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.
Йорг Миттаг
3
@MilesRout: во многих случаях спецификация отличается от CPython. Например: спецификация Python не гарантирует детерминированную финализацию, но CPython делает, по крайней мере, для некруглых ссылок. Но даже если CPython гарантирует детерминированный финализации для некруглых ссылок, написание кода , который опирается на тот факт нарушается , так как он не является частью спецификации. (Я не могу найти цитату прямо сейчас, но GvR прямо сказал, что детерминированная финализация и подсчет ссылок являются частными внутренними деталями реализации CPython.)
Йорг W Mittag
2
Аналогично, CPython гарантирует, что два потока Python не могут выполняться параллельно, но это также является частной внутренней деталью реализации CPython и не гарантируется спецификацией языка. Если то, что вы говорите, было правдой, не могло быть никаких других реализаций, поскольку любая альтернативная реализация должна обязательно вести себя идентично CPython и, следовательно, обязательно должна быть идентична. (Рефакторинг по модулю, который не меняет наблюдаемого поведения.)
Йорг W Mittag
10

Лучший вопрос может быть: «Почему Python не написан на Python?»

Более того, когда в C написано достаточное количество примитивов для классов и объектов Python, они могут быть использованы для написания остальной части интерпретатора, поэтому вы ничего не получите, используя вместо этого C ++.

Ларри Коулман
источник
1
Если вы перейдете по первой ссылке в моем ответе, вы увидите ссылку на реализацию Python в Python. Это еще не готово к производству. Это финансируется ЕС. codespeak.net/pypy/dist/pypy/doc - это ссылка, если по моему ответу это сложно определить.
vpit3833
2
Это на самом деле довольно глубокий ответ. Не то, что Python Гвидо буквально написан на Python, но что низкоуровневые структуры в C используются для написания высокоуровневых структур.
Джереми
1
Я думаю, что вы упускаете суть, так как существует большая разница (для людей, работающих над самим переводчиком), на каком языке написан переводчик. Язык влияет на то, как эти примитивы выглядят и как они взаимодействуют друг с другом. Например, сейчас, в C-реализации Python, нужно не забывать увеличивать и уменьшать счетчик ссылок вручную, тогда как для этого можно было бы использовать умные указатели в C ++.
Петр Доброгост
Теперь, когда PyPy доступен и иногда интересно превосходит CPython, я думаю, это была бы отличная идея.
Саи Кумар Баттиною