ทำไม Python เขียนใน C และไม่ใช่ C ++


76

ในแบบฝึกหัดของ Python ผู้คนสามารถอ่านได้ว่าการนำ Python ไปใช้ใน C คือ

ในทางกลับกันการใช้งาน Python ที่เขียนด้วยภาษา C, (... )

ฉันสงสัยมากว่าทำไม Python เขียนใน C ไม่ใช่ C ++

ฉันต้องการทราบเหตุผลของการตัดสินใจครั้งนี้และคำตอบควรได้รับการสนับสนุนโดยการอ้างอิงทางประวัติศาสตร์ (และไม่ใช่ความคิดเห็นตาม)


10
ฉันไม่รู้ว่าทำไม แต่ฉันสงสัยว่ามีบางอย่างใกล้เคียงนี้: thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu

13
@ Larry Coleman: ไม่เคยเห็น Linus พูดพร่ำเพรื่อ? คุณต้องหลีกเลี่ยง "the internets" ... > _>
dr Hannibal Lecter

18
@ แลร์รี่ฉันเห็นคำพูดนี้และสูญเสียความเคารพต่อไลนัสเกือบทั้งหมดหลังจากอ่าน น่าละอายกับเขา
Piotr Dobrogost

5
เอาละนี่เป็นการตอบสนองต่อการพูดจาโผงผางของไลนัสเกี่ยวกับสิ่งนี้: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi

6
ฉันไม่เห็นจุดถามว่า "ทำไม (โปรแกรมยอดนิยม) เขียนใน (ภาษา X) และไม่ใช่ (ภาษา Y)?" หรือค่อนข้างคำถามเดียวกันสามารถกลับรายการได้: ทำไมต้อง Y และไม่ใช่ X
Andres F.

คำตอบ:


119

จากทุกสิ่งที่ฉันเห็นมันเป็นการผสมผสานระหว่างเหตุผลเชิงปฏิบัติและประวัติศาสตร์ เหตุผลทางประวัติศาสตร์ (ส่วนใหญ่) คือ CPython 1.0 เปิดตัวในปี 1989 ในเวลานั้น C เพิ่งเป็นมาตรฐานเมื่อเร็ว ๆ นี้ C ++ แทบไม่เป็นที่รู้จักและไม่ได้พกพาสะดวกเพราะเกือบจะไม่มีใครมีคอมไพเลอร์ C ++

แม้ว่า C ++ จะแพร่หลายมากขึ้นและพร้อมให้ใช้งานได้ง่ายขึ้นในวันนี้ โดยตัวของมันเองงานนั้นจะให้ผลประโยชน์เพียงเล็กน้อยหรือไม่มีเลย

มันเหมือนกับการโพสต์บล็อกของ Joelเกี่ยวกับการเริ่มต้นใหม่และการเขียนใหม่ทั้งหมดถือเป็นความผิดพลาดที่เลวร้ายที่สุดที่ บริษัท ซอฟต์แวร์สามารถทำได้ ฉันตอบโต้ด้วยการชี้ไปที่การแปลงของ Microsoft จากแกน Windows 3.0 ไปเป็นแกน Windows NT และการแปลงของ Apple จาก MacOS 9 เป็น Mac OS / X ไม่มีใครฆ่า บริษัท - แต่ทั้งคู่มีขนาดใหญ่มากราคาแพงโครงการระยะยาว ทั้งสองยังชี้ไปที่บางสิ่งที่สำคัญต่อความสำเร็จ: การรักษาฐานรหัสทั้งสองไว้นานพอที่ผู้ใช้ (ส่วนใหญ่) สามารถเปลี่ยนไปใช้รหัสฐานใหม่ได้ตามเวลาว่างโดยคำนึงถึงประโยชน์ที่ได้รับ

สำหรับทีมพัฒนาขนาดของ Python อย่างไรก็ตามการเปลี่ยนแปลงแบบนั้นยากกว่ามาก แม้แต่การเปลี่ยนจาก Python 2 เป็น 3 ก็ใช้งานได้ค่อนข้างนานและต้องการการเหลื่อมกันคล้ายกัน อย่างไรก็ตามอย่างน้อยในกรณีนั้นมีประโยชน์โดยตรงต่อการเปลี่ยนแปลงซึ่งการเขียนใหม่ใน C ++ (ด้วยตัวเอง) จะไม่ได้รับ (อย่างน้อยทันที)

การพูดจาโผงผางของ Linus Torvalds เทียบกับ C ++ ถูกนำขึ้นมาดังนั้นฉันจะพูดถึงเรื่องนี้เช่นกัน ไม่มีอะไรที่ฉันเห็นจากกุยโดบ่งบอกว่าเขามีความรู้สึกที่รุนแรงและเป็นลบต่อซีพลัสพลัส เกี่ยวกับสิ่งที่แย่ที่สุดที่ฉันเคยเห็นเขาบอกว่าการสอน C ++ มักจะเป็นหายนะ - แต่เขาก็พูดต่อไปทันทีว่าสิ่งนี้เป็นเรื่องใหญ่เพราะครูไม่ทราบ / ไม่รู้จัก C ++

ผมยังคิดว่าในขณะที่มันเป็นไปได้ที่จะแปลงมากรหัส C เพื่อ C ++ กับญาติสบายใจว่าได้รับประโยชน์จริงมากจาก c ++ ต้องไม่เพียง แต่ค่อนข้างน้อยมากเขียนใหม่กว่านั้น แต่ยังต้องใช้อย่างมีนัยสำคัญการศึกษาใหม่ของนักพัฒนาส่วนใหญ่ที่เกี่ยวข้องกับ C ++ ที่เขียนได้ดีส่วนใหญ่จะแตกต่างจาก C ที่เขียนดีเพื่อทำสิ่งเดียวกัน มันไม่ได้เป็นเพียงเรื่องของการเปลี่ยนแปลงmallocไปnewและprintfไปcoutโดยยืดของจินตนาการใด ๆ


2
+1 คุณพูดมาก พวกเขาน่าสนใจ ดูเหมือนว่าจะดียิ่งขึ้นหากสามารถเพิ่มลิงก์ได้
n611x007

1
เพิ่งส่งการแก้ไขพร้อมลิงก์ไปยังบล็อกโพสต์ของ Joel เมื่อเขียนใหม่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 อยู่! เมื่อการรวมล่ามโค้ดที่ได้รับแรงบันดาลใจมาจากการเพิ่มประสิทธิภาพของเธรดมีการอภิปรายอย่างมากเกี่ยวกับเรื่องนี้เนื่องจากรหัส (จำเป็น) ที่ใช้ในการคำนวณ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
Jörg W Mittag

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 นั่นยังไม่พร้อมสำหรับการผลิต ที่ได้รับทุนจากสหภาพยุโรป codespeak.net/pypy/dist/pypy/docเป็นลิงค์ถ้ามันยากที่จะค้นพบจากคำตอบของฉัน
vpit3833

2
นี่เป็นคำตอบที่ค่อนข้างลึก ไม่ใช่ว่างูหลามของกุยโด้นั้นเขียนด้วยภาษา Python แต่โครงสร้างระดับต่ำใน C ใช้เพื่อเขียนโครงสร้างระดับสูงกว่า
Jeremy

1
ฉันคิดว่าคุณพลาดประเด็นไปแล้วเนื่องจากมีความแตกต่างกันมาก (สำหรับคนที่ทำงานกับล่ามเอง) ภาษาที่ใช้ในการแปลล่ามภาษานั้นมีอิทธิพลต่อลักษณะดั้งเดิมของสิ่งเหล่านี้และวิธีการโต้ตอบกัน ยกตัวอย่างเช่นตอนนี้ใน C Implementation ของ Python เราต้องจำไว้ว่าการเพิ่มและลดการอ้างอิงจะนับด้วยตนเองในขณะที่มันอาจเป็นไปได้ที่จะใช้ตัวชี้อัจฉริยะใน C ++ สำหรับสิ่งนี้
Piotr Dobrogost

ตอนนี้ PyPy สามารถใช้งานได้และมีประสิทธิภาพสูงกว่า CPython บางครั้งมันน่าจะเป็นความคิดที่ยอดเยี่ยมที่ฉันคิด
Sai Kumar Battinoju
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.