파이썬이 C ++가 아닌 C로 작성된 이유는 무엇입니까?


76

에서 파이썬의 튜토리얼 하나는 파이썬의 원래 구현은 C에 있음을 읽을 수있다;

반면에 C로 작성된 Python 구현은 (...)

파이썬이 C ++가 아닌 C로 작성된 이유가 무엇인지 궁금합니다.

이 결정의 근거가되는 이유를 알고 싶습니다. 답변은 역사적 참고 자료로 뒷받침되어야합니다 (의견이 아닌).


10
왜 그런지 모르겠지만, 이것에 가까운 것으로 의심됩니다 : thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu

13
@Larry Coleman : Linus의 음란물을 본 적이 없습니까? "인터넷"을 피해야합니다 ...> _>
Dr Hannibal Lecter

18
@Larry 나는이 소리를 보았고 그것을 읽은 후 Linus에 대한 거의 모든 존경을 잃었다. 그에게 수치심.
Piotr Dobrogost

5
글쎄, 이것은 Linus의 rant에 대한 반응이다. 이것
avi

6
나는 왜 "(인기 프로그램)이 (언어 Y)가 아닌 (언어 X)로 작성 되었는가?"라는 요점을 알지 못한다. 또는 오히려 같은 질문을 뒤집을 수 있습니다. 왜 X가 아닌 Y입니까?
Andres 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 로의 전환을 지적함으로써 반대했습니다. 어느 쪽도 회사를 죽이지 않았지만 둘 다 확실히 크고 비싸고 장기적인 프로젝트였습니다. 또한 둘 다 성공에 결정적인 요소를 지적한다. (대부분의) 사용자는 (적어도인지 된) 이점에 따라 여가 시간에 새로운 코드베이스로 전환 할 수있을 정도로 오랫동안 코드베이스를 유지 하는 것이다.

그러나 개발 팀에게는 파이썬의 규모와 같은 종류의 변화가 훨씬 더 어렵습니다. 파이썬 2에서 3으로의 변경조차도 꽤 많은 작업이 필요했으며 비슷한 오버랩이 필요했습니다. 그러나 적어도 그 경우에는 변경 사항에 직접적인 이점이 있으며 C ++ 자체로 다시 쓰는 것이 (적어도 즉시) 제공하지는 않습니다.

C ++에 대한 Linus Torvalds의 분노가 제기되었으므로 이에 대해서도 언급하겠습니다. 귀도에서 내가 본 것은 C ++에 대한 강하고 부정적인 감정이 있다는 것을 나타냅니다. 내가 겪은 최악의 상황에 대해서는 C ++가르치는 것은 종종 재앙이라는 것이지만, 그는 교사가 C ++을 알지 못했거나 알지 못했기 때문에 이것이 바로 이것이라고 말했다.

또한 많은 C 코드를 비교적 쉽게 C ++로 변환 할 수는 있지만 C ++ 에서 실제로 많은 이점을 얻으려면 그보다 약간 더 많은 재 작성이 필요할뿐만 아니라 관련된 대부분의 개발자에게 상당한 재교육이 필요하다고 생각합니다. 잘 작성된 C ++ 대부분은 같은 작업을 수행하기 위해 잘 작성된 C와 크게 다릅니다. 그것은이다 없는 변화의 문제 mallocnewprintfcout상상력의 스트레칭으로.


2
+1 당신은 많은 것을 인용합니다; 그들은 흥미 롭습니다. 링크를 추가하면 더 좋을 것 같습니다.
n611x007

1
그냥 재 작성에 조엘의 블로그 게시물에 대한 링크와 함께 편집을 제출는 joelonsoftware.com/articles/fog0000000069.html
MarkJ

이것은 훌륭한 답변이었습니다. 나는 그것으로부터 많은 것을 배웠다.
게임 Brainiac

1
상대적으로 쉽게 c ++로 이식 할 수있는 c를 언급하면 ​​+1은 가치가 없습니다. 나는 이것을 이미 오랫동안 알고 있었지만 대답은 실제로 견해를 강화하고 여러 차원을 추가했습니다.
fkl

1
"Apple의 MacOS 9에서 Mac OS / X 로의 전환"OS / X는 처음부터 다시 작성하는 것이 아니라, MacOS9에서 NeXTStep으로의 전환으로, Apple을 위해 개선되고 브랜드가 변경되었습니다.
Jivan

30

원래 ANSI C89로 작성된 이유 는 아주 간단하기 때문입니다. 당시 C ++은 다른 컴파일러와의 비 호환성으로 인해 실행 가능한 선택이 아니기 때문입니다. 하나의 컴파일러로 컴파일 된 코드가 다른 컴파일러로 컴파일 된 코드를 호출 할 수있게 해주는 ABI 사양을 만들 때까지 2005 년이 걸렸습니다.

더 흥미로운 질문은 여전히 C89로 작성된 이유 입니다.

사람들은 실제로 C ++과 C99 컴파일러가없는 플랫폼에서 파이썬을 사용하기 때문에 놀라운 대답이 있습니다! 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
나는 이것을 반박하려고 유혹하지만 C ++ 컴파일러가 존재하지 않는 플랫폼 (특히 Comeau C ++이 C로 컴파일된다는 것을 감안할 때)은 없다.
Billy ONeal

1
ABI
jk

3
@Abdul : 아니요, Python은 전혀 소프트웨어가 아닙니다. 사양입니다. 해당 사양에는 여러 언어로 작성된 여러 가지 구현이 있습니다. IronPython은 C♯, Java의 Jython, PyPy의 RPython, Pynie의 NQP, PIR 및 Perl6, C의 Pyston, C의 CPython으로 작성되었습니다. "Python은 C로 작성되었습니다"라는 말은 의미가 없습니다. 파이썬은 소프트웨어가 아닙니다. 사양입니다. 프로그래밍 언어가 아닌 영어로 작성됩니다. "자바는 C의 파생물이다"는 주로 틀렸다. Java는 Objective-C에서 영감을 얻었지만 대부분의 C 부분을 제거하고 대부분 Smalltalk 부분을 사용합니다.
Jörg W Mittag

3
@MilesRout : 사양이 CPython과 다른 경우가 여러 가지 있습니다. 예를 들어, 파이썬 사양은 결정 론적 마무리를 보장하지 않지만 CPython은 적어도 비 원형 참조에 대해서는 보장합니다. 그러나 CPython은 비 원형 참조에 대한 결정 론적 마무리를 보장하지만, 그 사실에 의존하는 코드 작성 은 사양의 일부가 아니기 때문에 중단 됩니다. (현재 견적을 찾을 수는 없지만 GvR은 결정 론적 마무리와 참조 횟수는 CPython의 내부 구현 세부 정보라고 명시 적으로 언급했습니다.)
Jörg W Mittag

2
마찬가지로 CPython은 두 개의 Python 스레드가 병렬로 실행될 수는 없지만 CPython의 개인용 내부 구현 세부 사항이며 언어 사양에 의해 보장되지는 않습니다. 당신이 말한 것이 사실이라면, 다른 구현은 아마도 CPython과 동일하게 행동해야하므로 반드시 동일해야하기 때문에 다른 구현이 없었을 것입니다. (모듈로 리팩토링은 관찰 동작을 변경하지 않는.)
요 르그 W MITTAG에게

10

더 좋은 질문은 "파이썬이 파이썬으로 작성되지 않은 이유는 무엇입니까?"입니다.

요컨대, 파이썬 클래스와 객체에 대한 충분한 프리미티브가 C로 작성되면 나머지 인터프리터를 작성하는 데 사용될 수 있으므로 C ++을 사용하여 아무것도 얻지 못합니다.


1
내 대답의 첫 번째 링크를 따르면 Python에서 Python 구현에 대한 참조가 표시됩니다. 아직 생산 준비가되지 않았습니다. 그것은 EU에 의해 자금이 지원됩니다. codespeak.net/pypy/dist/pypy/doc 는 내 대답에서 찾기가 어려운 경우 링크입니다.
vpit3833

2
이것은 실제로 매우 깊은 대답입니다. Guido의 Python은 문자 그대로 Python으로 작성되었지만 C의 하위 구조는 상위 계층 구조를 작성하는 데 사용됩니다.
제레미

1
난 당신이 인터프리터에 기록 된 어떤 언어 (인터프리터 자체에 일하는 사람들을위한) 차이가 꽤 거기로 포인트를 놓칠 생각합니다.이 방법을 언어의 영향 프리미티브 처럼 그들은 서로 상호 작용하는 방법을. 예를 들어, 파이썬의 C 구현에서 참조 횟수를 수동으로 늘리고 줄이는 것을 기억 해야 하지만 C ++에서 스마트 포인터를 사용할 수 있습니다.
Piotr Dobrogost

PyPy를 사용할 수 있고 CPython보다 우월하게 성능이 뛰어 나기 때문에 제 생각에는 그렇게 훌륭한 아이디어였습니다.
Sai Kumar Battinoju
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.