Tại sao Python được viết bằng C mà không phải bằng C ++?


76

Trong hướng dẫn của Python, người ta có thể đọc rằng triển khai ban đầu của Python là bằng C;

Mặt khác, việc triển khai Python, được viết bằng C, (...)

Tôi rất tò mò tại sao Python được viết bằng C mà không phải C ++?

Tôi muốn biết lý do đằng sau quyết định này và câu trả lời nên được hỗ trợ bởi các tài liệu tham khảo lịch sử (và không dựa trên ý kiến).


10
Tôi không biết tại sao, nhưng tôi nghi ngờ một cái gì đó gần với điều này: thread.gmane.org/gmane.comp.version-control.git/57643/ trộm :)
Matthieu

13
@Larry Coleman: Chưa bao giờ thấy Linus nổi giận? Bạn phải tránh "các mạng nội bộ" ...> _>
dr Hannibal Lecter

18
@ Tôi đã thấy điều này và đã mất gần như tất cả sự tôn trọng dành cho Linus sau khi đọc nó. Xấu hổ với anh.
Piotr Dobrogost

5
Chà, đây là câu trả lời cho câu nói của Linus, còn cái này thì sao: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi

6
Tôi không thấy được câu hỏi "tại sao (chương trình phổ biến) được viết bằng (ngôn ngữ X) mà không phải (ngôn ngữ Y)?". Hay đúng hơn, cùng một câu hỏi có thể được đảo ngược: tại sao Y mà không phải X?
Andres F.

Câu trả lời:


119

Từ mọi thứ tôi đã thấy, đó là sự kết hợp của lý do thực tế và lịch sử. Lý do lịch sử (chủ yếu) là CPython 1.0 được phát hành vào năm 1989. Vào thời điểm đó, C mới được chuẩn hóa gần đây. C ++ gần như không được biết đến và quyết định không thể mang theo được, vì hầu như không ai có trình biên dịch C ++.

Mặc dù C ++ phổ biến rộng rãi hơn và dễ dàng có sẵn ngày nay, nhưng vẫn cần một lượng công việc khá lớn để viết lại CPython vào tập hợp con của C tương thích với C ++. Chính nó, công việc đó sẽ cung cấp rất ít hoặc không có lợi ích thực sự.

Nó hơi giống bài đăng trên blog của Joel về việc bắt đầu lại và viết lại hoàn toàn là sai lầm tồi tệ nhất mà một công ty phần mềm có thể mắc phải. Tôi phản bác điều đó bằng cách chỉ ra chuyển đổi của Microsoft từ lõi Windows 3.0 sang lõi Windows NT và chuyển đổi của Apple từ MacOS 9 sang Mac OS / X. Không ai giết công ty - nhưng cả hai chắc chắn là những dự án lớn, đắt tiền, dài hạn. Cả hai cũng chỉ ra một điều rất quan trọng để thành công: duy trì cả hai cơ sở mã đủ lâu để (hầu hết) người dùng có thể chuyển sang cơ sở mã mới một cách thoải mái, dựa trên lợi ích (ít nhất là nhận thức được).

Tuy nhiên, đối với nhóm phát triển kích thước của Python, loại thay đổi đó khó khăn hơn nhiều. Ngay cả việc thay đổi từ Python 2 thành 3 cũng mất khá nhiều công sức và yêu cầu một sự chồng chéo tương tự. Tuy nhiên, ít nhất trong trường hợp đó, có những lợi ích trực tiếp đối với các thay đổi, việc viết lại thành C ++ (tự nó) sẽ không (ít nhất là ngay lập tức) cung cấp.

Sự giận dữ của Linus Torvalds đối với C ++ đã được đưa lên, vì vậy tôi cũng sẽ đề cập đến điều đó. Không có gì tôi thấy từ Guido cho thấy anh ta có cảm giác tiêu cực, mạnh mẽ đối với C ++. Về điều tồi tệ nhất tôi từng thấy anh ấy nói là việc dạy C ++ thường là một thảm họa - nhưng anh ấy ngay lập tức nói rằng điều này phần lớn là do các giáo viên không / không biết về C ++.

Tôi cũng nghĩ rằng trong khi nó có thể chuyển đổi rất nhiều mã C đến C ++ với tương đối dễ dàng, mà nhận được nhiều lợi ích thực sự từ C ++ đòi hỏi không chỉ viết lại khá hơn một chút hơn thế, nhưng cũng đòi hỏi đáng kể cải tạo của hầu hết các nhà phát triển có liên quan. Hầu hết C ++ được viết tốt khác biệt đáng kể so với C được viết tốt để làm những điều tương tự. Nó không chỉ là vấn đề thay đổi mallocđể newprintfđể cout, bởi bất kỳ căng của trí tưởng tượng.


2
+1 Bạn trích dẫn nhiều; Họ rất thú vị. Có vẻ như sẽ tốt hơn nếu các liên kết có thể được thêm vào.
n611x007

1
Chỉ cần gửi một bản chỉnh sửa với một liên kết đến bài đăng trên blog của Joel về việc viết lại joelonsoftware.com/articles/fog0000000069.html
MarkJ

Đây là một câu trả lời tuyệt vời. Tôi học được rất nhiều từ nó.
Trò chơi Brainiac

1
+1 đặc biệt để đề cập đến c có thể được chuyển sang c ++ một cách dễ dàng có lẽ không đáng để thực hiện. Tôi đã biết điều này từ lâu nhưng câu trả lời thực sự củng cố quan điểm cộng với thêm một số chiều để xem xét nó.
fkl

1
"Chuyển đổi của Apple từ MacOS 9 sang Mac OS / X" lưu ý rằng OS / X không phải là bản viết lại từ đầu: đó là một sự chuyển đổi từ MacOS9 sang NeXTStep, được cải tiến và đổi thương hiệu cho Apple
Jivan

30

Tôi nghĩ lý do tại sao ban đầu nó được viết bằng ANSI C89 khá đơn giản bởi vì hồi đó, C ++ không phải là một lựa chọn khả thi với sự không tương thích giữa các trình biên dịch khác nhau và như vậy. Ý tôi là, phải mất đến năm 2005, nó mới đưa ra một đặc tả ABI cho phép mã được biên dịch với một trình biên dịch để gọi mã được biên dịch với một trình biên dịch khác?

Câu hỏi thú vị hơn là tại sao nó vẫn được viết bằng C89.

Và có một câu trả lời đáng ngạc nhiên: bởi vì mọi người thực sự sử dụng Python trên các nền tảng không có trình biên dịch C ++ và C99! Khi tối ưu hóa trình thông dịch mã luồng lấy cảm hứng từ Forth được hợp nhất, đã có một cuộc thảo luận lớn về nó, bởi vì mã (nhất thiết) được sử dụng được tính toán gotokhông phải là một phần của C89. Rõ ràng có những lo ngại thực sự rằng tính năng này có thể không khả dụng trên một số nền tảng mà Python hiện đang sử dụng.

Điều tương tự cũng xảy ra với Unladen Swallow, sử dụng LLVM, được viết bằng C ++. Một điều rất rõ ràng là yêu cầu sáp nhập Unladen Swallow vào CPython là bạn có thể biên dịch nó mà không cần trình biên dịch JIT, vì có những nền tảng mọi người chạy Python trên đó, không có trình biên dịch C ++ nào tồn tại.

Tất nhiên, ngày nay, CPython không còn là triển khai Python duy nhất. Có PyPy, được viết bằng RPython (một tập hợp con được gõ tĩnh của Python), Jython trong Java, IronPython trong C #, Pynie trong NQP và Pir, v.v.


3
Tôi bị cám dỗ một nửa để nâng cấp điều này, nhưng tôi biết không có nền tảng nào như vậy mà trình biên dịch C ++ không tồn tại (Đặc biệt là Comeau C ++ biên dịch thành C)
Billy ONeal 14/211

1
+1 khi đề cập đến ABI
jk.

3
@Abdul: Không, Python hoàn toàn không phải là một phần mềm. Đây là một đặc điểm kỹ thuật. Có nhiều triển khai của đặc tả đó, được viết bằng nhiều ngôn ngữ. IronPython được viết bằng C♯, Jython bằng Java, PyPy bằng RPython, Pynie bằng NQP, Pir và Perl6, Pyston bằng C ++, CPython trong C. Câu nói "Python được viết bằng C" không có nghĩa. Python không phải là một phần mềm. Đây là một đặc điểm kỹ thuật. Nó được viết bằng tiếng Anh, không phải bằng bất kỳ ngôn ngữ lập trình nào. "Java là một dẫn xuất của C" chủ yếu là sai. Java được lấy cảm hứng từ Objective-C, nhưng nó đã loại bỏ hầu hết các phần C và chiếm phần lớn các phần Smalltalk.
Jörg W Mittag

3
@MilesRout: Có nhiều trường hợp đặc tả sai lệch với CPython. Ví dụ: đặc tả Python không đảm bảo quyết toán xác định, nhưng CPython, ít nhất là đối với các tham chiếu không tuần hoàn. Nhưng ngay cả khi CPython đảm bảo quyết toán xác định cho các tham chiếu không tuần hoàn, việc viết mã dựa trên thực tế đó đã bị hỏng , vì nó không phải là một phần của thông số kỹ thuật. (Tôi không thể tìm ra quote ngay bây giờ, nhưng GVR đã dứt khoát nói rằng quyết toán xác định và tính tham khảo là chi tiết thực hiện nội bộ riêng của CPython.)
Jörg W Mittag

2
Tương tự, CPython đảm bảo rằng hai luồng Python không thể thực thi song song, nhưng đó cũng là một chi tiết triển khai bên trong riêng của CPython và không được đảm bảo bởi thông số ngôn ngữ. Nếu những gì bạn nói là đúng, thì không thể có bất kỳ triển khai nào khác, vì bất kỳ triển khai thay thế nào cũng nhất thiết phải hành xử giống hệt với CPython, và do đó nhất thiết phải giống hệt nhau. (Tái cấu trúc Modulo không thay đổi hành vi có thể quan sát được.)
Jörg W Mittag

10

Một câu hỏi hay hơn có thể là: "Tại sao Python không được viết bằng Python?"

Hơn nữa, một khi đủ các nguyên hàm cho các lớp và đối tượng Python được viết bằng C, chúng có thể được sử dụng để viết phần còn lại của trình thông dịch, vì vậy bạn sẽ không nhận được bất cứ điều gì bằng cách sử dụng C ++ thay thế.


1
Nếu bạn theo liên kết đầu tiên trong câu trả lời của tôi, bạn sẽ thấy một tham chiếu đến việc triển khai Python trong Python. Đó là chưa sẵn sàng sản xuất. Điều đó được tài trợ bởi EU. Codepeak.net/pypy/dist/pypy/doc là liên kết nếu khó tìm ra câu trả lời của tôi.
vpit3833

2
Đây thực sự là một câu trả lời khá sâu sắc. Không phải Python của Guido được viết bằng Python theo nghĩa đen mà là các cấu trúc cấp thấp trong C được sử dụng để viết các cấu trúc cấp cao hơn.
Jeremy

1
Tôi nghĩ rằng bạn bỏ lỡ vấn đề vì có một sự khác biệt (đối với những người làm việc trên chính trình thông dịch) ngôn ngữ mà trình thông dịch được viết bằng ngôn ngữ nào. Ngôn ngữ ảnh hưởng đến cách những người nguyên thủy này trông như thế nào và cách họ tương tác với nhau. Ví dụ, trong triển khai C của Python, người ta phải nhớ tăng và giảm số lượng tham chiếu theo cách thủ công trong khi có thể sử dụng các con trỏ thông minh trong C ++ cho việc này.
Piotr Dobrogost

Bây giờ PyPy đã có sẵn và thú vị vượt trội so với CPython, đôi khi tôi nghĩ đó là một ý tưởng tuyệt vời.
Sai Kumar Battinoju
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.