เหตุใดจึงไม่มีภาษาโปรแกรมอื่นที่คอมไพล์ไปยัง Python bytecode


51

ใน Java มีหลายภาษาที่คอมไพล์ไปยัง Java bytecode และสามารถรันบน JVM - Clojure, Groovy และ Scala เป็นภาษาหลักที่ฉันจำได้จากส่วนบนของหัว

อย่างไรก็ตาม Python จะเปลี่ยนเป็น bytecode (ไฟล์. pyc) ก่อนที่จะถูกเรียกใช้โดย Python interpreter ฉันอาจจะงมงาย แต่ทำไมไม่มีภาษาการเขียนโปรแกรมอื่นใดที่คอมไพล์ไปยัง python bytecode?

มันเป็นเพียงเพราะไม่มีใครใส่ใจหรือมีข้อ จำกัด หรือสิ่งกีดขวางบางอย่างที่ทำให้ยากลำบาก?


30
... เพราะพวกเขาไม่ต้องการจัดการกับ GIL? ;)
Mason Wheeler

4
สัญชาตญาณจะบอกฉันว่ามันมีหลายอย่างที่เกี่ยวข้องกับความสมบูรณ์ของ JVM ที่ระบุไว้อย่างดีและ JVM อยู่บนแทบทุกแพลตฟอร์มหรือโง่ง่ายที่จะได้รับ
Rig

4
ฉันสงสัยด้วยว่า JVM ส่วนใหญ่จะเร็วกว่าล่ามงูใหญ่
ปีเตอร์สมิ ธ

19
ด้วยการกำหนดเป้าหมาย Java bytecode คุณจะได้รับคุณสมบัติทั้งหมดของ JVM (ความปลอดภัย, ประสิทธิภาพ, ความสามารถในการพกพา, ความสามารถในการปรับขยายได้และอื่น ๆ ) การกำหนดเป้าหมาย Python bytecode ไม่ได้ช่วยอะไรคุณมากนัก
David Schwartz

3
Python bytecode ไม่รู้จักโดย Python interpreter รุ่นที่ใหม่กว่า ทุกคนสามารถใช้ภาษาโปรแกรมที่คอมไพล์กับ Python bytecode ได้อย่างไร
กัส

คำตอบ:


77

เรียบง่าย - ครั้งสุดท้ายที่ฉันตรวจสอบ Python ไม่มีคุณสมบัติที่เป็นทางการรวมถึง bytecode CPython เป็นข้อมูลจำเพาะและความสามารถในการรับส่งสัญญาณแบบ bytecode นั้นไม่จำเป็นต้องใช้ IIRC ดังนั้นจึงเป็นเป้าหมายที่เคลื่อนไหวและไม่มีเอกสารออกแบบมาสำหรับภาษาเฉพาะ


22
ในความเป็นจริงรายละเอียดของรูปแบบ bytecode มักจะเปลี่ยนแปลงระหว่างรุ่นรองและแม้กระทั่ง PyPy ที่ใช้งานร่วมกันได้ 99% ก็ไม่ลองด้วยซ้ำ (อันที่จริงแล้ว

หมายเหตุ: Python - ภาษา - มีข้อกำหนดอย่างเป็นทางการ (ดู "PEPs") Python Virtual Machine นั้นไม่มี นี่เป็นสิ่งที่แตกต่างจาก (เช่น) Java โดยที่ทั้งสองจะถูกระบุ
อัลเบิร์ต

56

มี JVM ภาษาหลายเพราะมีคนที่มีพรสวรรค์ที่อยากจะเขียนโค้ดที่จะทำงานร่วมกับรหัส Java ที่มีอยู่พวกเขาไม่ได้ต้องการที่จะเขียน Java

เห็นได้ชัดว่าไม่มีโปรแกรมเมอร์ที่ต้องการทำงานกับรหัส Python ที่มีอยู่ แต่เกลียด Python มากพอที่จะแปลภาษาอื่นให้กับ Python bytecode interpreter

คุณสามารถดูได้สองวิธี: มีภาษาทางเลือกสำหรับ JVM เพราะ Java แพร่หลายมากหรือไม่มีภาษาอื่นสำหรับล่าม Python bytecode เนื่องจาก Python ไม่ดูด


7
ฉันหวังว่าคุณจะไม่ได้หมายความว่า Java ดูดหรือ Java ดูดมากกว่างูหลาม :-)
Giorgio

8
@Giorgio: ฉันหมายความว่าผู้สร้าง Groovy, Scala, Clojure และอื่น ๆ คิดว่ามันมีพื้นที่เหลือเฟือสำหรับการปรับปรุง คุณหมายความว่างูใหญ่ดูดไหม?
วินไคลน์

8
หลังจากทำงานกับหลามฉันจะบอกว่า "ปัจจัยการดูดต่ำ" จะไม่ถูกต้อง มันทำให้สิ่งที่ยอมรับกันมากเกินไปและสิ่งที่ 'ตัวเอง' ทั้งหมดนั้นต่อต้านไม่ได้ ในความเป็นจริงเป็นใบ้ วิธีการเรียนไม่ทราบว่ามันอยู่ที่ไหน
Rig

6
@Rig ส่วนตัวฉันคิดว่าวิธีการของ Python นั้นสง่างามกว่า OO ตามด้วยออร์แกนิกจากไวยากรณ์แทนที่จะต้องการคีย์เวิร์ดพิเศษที่ดูเหมือนตัวแปร สาเหตุที่วิธีการเรียนไม่ทราบว่าอยู่ที่ไหนมันเป็นเพราะคำจำกัดความของคลาส Python เป็นเพียงรหัสและรหัสนี้ไม่ได้ถูกทำให้เป็นส่วนตัวเพราะมันจะอยู่ภายในนิยามของคลาส คุณสามารถกำหนดวิธีการได้ทุกที่และเพิ่มไปยังคลาสเมื่อรันไทม์ ในความเป็นจริงคุณสามารถใช้ฟังก์ชั่นเดียวกันและใช้เป็นวิธีการในหลายชั้นเรียนซึ่งเป็นสิ่งที่ไม่สามารถใช้ได้กับthisกระบวนทัศน์
พลวง

6
ฉันคิดว่ามันเป็นเรื่องของ VM ไม่ใช่ภาษา JVM เป็น VM นักแสดงที่มีตัวรวบรวมขยะทั่วไป, JIT ฯลฯ ขณะที่ CPython ใช้การนับการอ้างอิงและเป็นล่าม มันเป็น CPython ที่ดูดเป็น plataform Btw hyhy มีอยู่
PuercoPop

26

มีข้อบกพร่องทางเทคนิคเช่น GIL ​​ใน CPython แต่มีข้อบกพร่องเล็กน้อยที่รับรู้ภาษาดังนั้น runtime จึงไม่ใช่จุดขายของชุมชน Python ตรงกันข้ามมีตัวเลือกรันไทม์ของแบ็กเอนด์มากขึ้นเนื่องจากความไม่พอใจกับการใช้ GIL / CPython

ภาษา Java นั้นมีความร้ายกาจมากกว่า JVM (แม้แต่ในชุมชน Java)

JVM นั้นค่อนข้างได้รับการยกย่องในแวดวงส่วนใหญ่ ดังนั้นความปรารถนาในการใช้ภาษาที่แตกต่าง / ดีกว่านั้นจบลงด้วยประโยชน์ของ JVM ด้านหลังที่ได้รับการปรับปรุงให้ดีที่สุด


10

ฉันบอกว่า Mason Wheeler พูดถูก ส่วนใหญ่เป็นปัญหาเกี่ยวกับ Global Interpreter Lock ซึ่งทำให้การเห็นพ้องด้วยเป็นปัญหาที่ยุ่งยากมาก เนื่องจากมีเวอร์ชวลอื่น ๆ ที่ทำงานพร้อมกันได้ดีมากจริงๆแล้วมันสมเหตุสมผลที่จะพัฒนาภาษาสำหรับสิ่งเหล่านั้น นอกจากนี้ Python ก็มีการเปลี่ยนแปลงภาษาที่สำคัญเมื่อเร็ว ๆ นี้และห้องสมุดจำนวนมากก็ไม่ได้ทำให้ความเข้ากันได้เป็นฝันร้ายที่บางครั้ง ตัวอย่างเช่นเนื่องจากฉันใช้ PIL สำหรับการมองเห็นฉันต้องเขียนโค้ดใน Python 2.7 หรือต่ำกว่า นี่ไม่ใช่กรณีที่มีการตั้งค่า JVM หรือ CLI ซึ่งโดยเฉพาะในกรณีหลังได้รับการออกแบบโดยคำนึงถึงการใช้ภาษาเป็นหลัก

ทำการวิจัยเพิ่มเติมและเห็นได้ชัดว่ามีสอง GIL จริง ๆ ไม่ใช่เพียงหนึ่งเดียว การควบคุมอื่น ๆนำเข้า


1
"GIL ฟรี" เป็นหนึ่งในเหตุผลทางเทคนิคที่กล่าวถึงใน "เหตุผลที่โปรแกรมเมอร์ CPython อาจจะสนใจใน IronPython" ในวิกิพีเดียหลาม
yannis

1
@YannisRizos: การเข้าใช้งาน. NET Framework อย่างแท้จริงนั้นไม่ได้เป็นไปอย่างสมบูรณ์ แน่นอนว่าเป็นไปได้ว่าผู้ใช้ CPython อาจไม่สนใจอย่างสมบูรณ์
Robert Harvey

@RobertHarvey Ninja แก้ไขแล้ว แม้ว่าฉันจะไม่คิดว่า "การเข้าถึงของเล่นใหม่ ๆ ที่แปลกใหม่" เป็นเหตุผลทางเทคนิค (ไม่ใช่ของเล่นที่ไม่ยอดเยี่ยม) แต่วิกิยังกล่าวว่า IronPython ง่ายต่อการขยาย
yannis

8

คำตอบอื่น ๆ ให้ความรู้สึกเป็นอย่างมาก แต่จริงๆแล้วตอนนี้มีภาษาที่คอมไพล์ให้กับ Python ที่ซึ่งจะมี ...

ฉันไม่รู้อะไรเลยเกี่ยวกับภาษาเหล่านี้ แต่ดูเหมือนว่าพวกเขาจะทำงานได้โดยการแปลงซอร์สโค้ดเป็น Python ASTs และให้ Python รวบรวมต้นไม้ไปยัง bytecode หลีกเลี่ยงปัญหาที่กล่าวถึงในคำตอบอื่น ๆ

จากความคิดเห็นเราทราบถึงภาษาทางเลือกสามภาษาที่ใช้ Python VM (อย่าลังเลที่จะเพิ่มภาษาอื่น ๆ ที่นี่):

  • Mochiอธิบายตัวเองเป็นภาษาโปรแกรมพิมพ์แบบไดนามิกสำหรับการเขียนโปรแกรมและนักแสดงในรูปแบบการทำงานการเขียนโปรแกรม
  • Hy : อธิบายตัวเองเป็นภาษาถิ่นของเสียงกระเพื่อมที่ฝังตัวอยู่ในหลาม
  • DG : อธิบายตัวเองเป็นA (เทคนิค) ภาษาที่ง่ายที่รวบรวมเพื่อ CPython bytecode

2
นอกจากนี้ควรพูดถึง HyLang ด้วย
Manman42 42

1
และDG
hakatashi

6

อีกเหตุผลหนึ่งคือ JVM ได้รับการปรับแต่งอย่างดีที่สุดมีการพัฒนาที่ดีและมีความสมบูรณ์ของระบบนิเวศ ด้วยตัวของมันเองมันแข่งขันได้ดีมากกับภาษาที่คอมไพล์อื่น ๆ (ฉันจะไม่บอกว่ามันเป็นจุดประสงค์ทั่วไปที่ดีที่สุดของ VM แต่ฉันได้ทำอาชีพของฉันอย่างนั้น) ดังนั้นการเข้าถึง JVM โดยย่อจากการเขียน bytecode นั้นเป็นที่ต้องการในตัวของมันเอง

อย่างไรก็ตาม Python VM นั้นดี แต่ (ไม่มีอะไรเทียบกับ Python) มีข้อบกพร่องที่ร้ายแรง สภาพแวดล้อมรันไทม์ของ Python นั้นเหมาะสมกับลักษณะของภาษาที่ดี แต่สามารถทำให้คุณประหลาดใจเมื่อคุณคุ้นเคยกับการใช้หน่วยความจำการล็อกแบบโกลบอลหรือแบบจำลองเกลียว

ในการเปรียบเทียบแบบตัวต่อตัวโดยทั่วไปแล้ว JVM นั้นเร็วกว่า Python VM สองเท่า JVM (surprizingly) สามารถแข่งขันกับโค้ดที่คอมไพล์ได้ดีขึ้นอยู่กับการเพิ่มประสิทธิภาพ "ร้อน" ที่มันทำงาน และนั่นไม่ได้นับการจัดการด้ายที่ซับซ้อนยิ่งขึ้น ฯลฯ

ฉันรัก Python ฉันทำจริงๆและเกลียดที่จะพูด แต่บางครั้งการแสดงก็เตะฉันในฟัน - ไม่เช่นนั้นทำไมห้องสมุด Python ที่สำคัญเช่น numpy หรือ scipy ต้องถอยกลับไปเป็นรหัส C?

ในคำอื่น ๆ คนที่ไหลไปหลามทำเช่นนั้นเพราะพวกเขาชอบภาษา แต่ถ้าคุณต้องการเขียนภาษาใหม่เพื่อให้เหมาะกับความต้องการของคุณคุณจะดีกว่าการรวบรวม JVM เพราะภาษาที่แปลกใหม่ของคุณจะเริ่มต้นในสภาพแวดล้อมการทำงานที่ดีที่สุด

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