Python ตีความหรือรวบรวมหรือทั้งสองอย่าง?


190

จากความเข้าใจของฉัน:

ตีความภาษาวิ่งภาษาระดับสูงและดำเนินการโดยล่าม (โปรแกรมที่แปลงภาษาระดับสูงเพื่อรหัสเครื่องแล้วรัน) ในระหว่างการเดินทาง; มันประมวลผลโปรแกรมครั้งละเล็กน้อย

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

แก้ไขฉันถ้าคำจำกัดความของฉันไม่ถูกต้อง

ตอนนี้กลับมาที่ Python ฉันสับสนเล็กน้อยเกี่ยวกับเรื่องนี้ ทุกที่ที่คุณเรียนรู้ว่า Python เป็นภาษาที่ถูกตีความ แต่มันถูกตีความไปยังรหัสกลางบางอย่าง (เช่นไบต์ - โค้ดหรือ IL) และไม่ใช่รหัสเครื่อง ดังนั้นโปรแกรมใดที่รันโค้ด IM? โปรดช่วยฉันเข้าใจวิธีจัดการและเรียกใช้สคริปต์ Python


2
เป็นไปได้ที่ซ้ำกันของPython ตีความหรือไม่ (เช่น Javascript หรือ PHP)
miku

2
Python สร้างไฟล์. pyc (เรียกว่า byecode) ทุกครั้งที่มีการนำเข้าไลบรารี AFAIK bytecode สามารถเร่งความเร็วในการโหลดได้เท่านั้นไม่ใช่การประมวลผลครั้ง
Jesvin Jose

2
@ aitchnyu: การแคช bytecode ในไฟล์. pyc จะเพิ่มความเร็วในการโหลดเท่านั้น แต่ในกรณีที่รหัส Python นั้นถูกคอมไพล์ไปเป็น bytecode ก่อนที่จะทำการประมวลผล แม้ว่าฉันจะไม่คิดว่ามันถูกใช้กับ Python โดยเฉพาะการใช้ภาษาอื่น ๆ แสดงว่า bytecode นั้นง่ายต่อการตีความอย่างมีประสิทธิภาพมากกว่า AST ธรรมดาหรือแย่กว่านั้นคือซอร์สโค้ดที่ไม่มีการแยกวิเคราะห์ รุ่น Ruby ที่เก่ากว่าตีความจาก AST และ AFAIK มีประสิทธิภาพที่ดีกว่าเล็กน้อยโดยเวอร์ชั่นที่ใหม่กว่าซึ่งคอมไพล์ไปเป็น bytecode

ไม่ต้องการที่จะฟังดูหยาบคาย แต่นั่นไม่ใช่สิ่งที่ฉันหมายถึง (แต่ไม่ทราบเท่าที่คุณ)?
Jesvin Jose

1
@ aitchnyu: ฉันไม่รู้ว่าคุณหมายถึงอะไร ฉันเพิ่งรู้ว่าความคิดเห็นของคุณไม่ถูกต้อง แต่ให้โอกาสที่ดีสำหรับข้อมูลพื้นฐานบางอย่างว่าทำไมมันเพิ่มความเร็วในการโหลดเท่านั้นดังนั้นฉันจึงตัดสินใจเพิ่มข้อมูลนั้น ไม่มีการกระทำความผิดหรือหมายถึง :)

คำตอบ:


232

ก่อนอื่นตีความ / รวบรวมไม่ได้เป็นทรัพย์สินของภาษา แต่เป็นทรัพย์สินของการใช้งาน สำหรับภาษาส่วนใหญ่การใช้งานที่ไม่ใช่ทั้งหมดนั้นอยู่ในหมวดหมู่เดียวดังนั้นคน ๆ หนึ่งอาจบันทึกคำสองสามคำที่แปลภาษา / แปลแล้วเช่นกัน แต่ก็ยังคงมีความแตกต่างที่สำคัญทั้งสองเพราะช่วยทำความเข้าใจ ด้วยการใช้งานที่ใช้ได้ทั้งสองชนิด (ส่วนใหญ่อยู่ในขอบเขตของภาษาที่ใช้งานได้ดู Haskell และ ML) นอกจากนี้ยังมีล่ามและโครงการ C ที่พยายามรวบรวมชุดย่อยของ Python เป็นรหัส C หรือรหัส C ++ (และต่อมาเป็นรหัสเครื่อง)

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

แต่การที่จะหยุด nitpicking และตอบคำถามที่คุณหมายถึงการถาม: จวน (อ่าน: ใช้ที่เป็นที่นิยมค่อนข้างเป็นผู้ใหญ่และการดำเนินงาน), Python เป็นที่รวบรวม ไม่ได้รวบรวมรหัสของเครื่องจักรล่วงหน้า (เช่น "รวบรวม" โดยข้อ จำกัด และไม่ถูกต้อง แต่เป็นคำจำกัดความทั่วไป) "เพียง" รวบรวมเป็นรหัสไบต์แต่ก็ยังคงรวบรวมประโยชน์อย่างน้อย ยกตัวอย่างเช่นคำสั่งที่a = b.c()จะรวบรวมไปยังกระแส byte ซึ่งเมื่อ "ชิ้นส่วน" load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)มีลักษณะคล้าย นี่คือการทำให้เข้าใจง่ายมันอ่านได้น้อยกว่าและระดับต่ำกว่าเล็กน้อย - คุณสามารถทดลองกับdisโมดูลไลบรารีมาตรฐานและดูว่าข้อตกลงที่แท้จริงเป็นอย่างไร

bytecode นั้นถูกตีความอย่างใดอย่างหนึ่ง (โปรดทราบว่ามีความแตกต่างทั้งในทางทฤษฎีและในทางปฏิบัติระหว่างการตีความโดยตรงและการคอมไพล์ครั้งแรกจนถึงการเป็นตัวแทนระดับกลางและการตีความนั้น) เช่นเดียวกับการดำเนินการอ้างอิง (CPython) หรือทั้งตีความและเรียบเรียง รหัสเครื่องที่ดีที่สุดที่รันไทม์เช่นเดียวกับPyPy


2
เอาล่ะนี่หมายความว่าสคริปต์ไพ ธ อนจะถูกคอมไพล์เป็นครั้งแรกโดยไบต์และจากนั้นจะถูกนำมาใช้โดยล่ามเช่น CPython, Jython หรือ IronPython เป็นต้น
Pankaj Upadhyay

19
ไม่มันถูกรวบรวมเป็น bytecode และจากนั้น bytecode จะถูกดำเนินการโดย VM ที่เกี่ยวข้อง CPython เป็นทั้งคอมไพเลอร์และ VM แต่ Jython และ IronPython เป็นเพียงคอมไพเลอร์
Ignacio Vazquez-Abrams

1
@Igacio: ฉันไม่ได้มีประสบการณ์กับ IronPython / Jython มากนัก แต่อย่างน้อย Jython ก็ให้เลเยอร์เหมือนล่าม? ฉันไม่เชื่อว่าเป็นไปได้ที่จะลองเปลี่ยน Python ให้เป็น JVM bytecode ที่พิมพ์แบบสแตติก ถึงกระนั้นจุดที่ดีเกี่ยวกับคอมไพเลอร์และล่ามก็เป็นส่วนหนึ่งของแพ็คเกจเดียวกัน

2
+1 "... คุณสมบัติของการใช้งาน" ฉันเองก็บอกว่า "มันช่วยให้เปลือกโต้ตอบ"
Jesvin Jose

2
@delnan: Jython ทำหน้าที่เป็นตัวกลางระหว่างภาษา Python และ Java VM แต่จะรวบรวมเป็น Java bytecode
Ignacio Vazquez-Abrams

34

CPU สามารถเข้าใจรหัสเครื่องได้อย่างแน่นอน สำหรับโปรแกรมที่แปลแล้วเป้าหมายสูงสุดของล่ามคือ "ตีความ" รหัสโปรแกรมลงในรหัสเครื่อง อย่างไรก็ตามโดยทั่วไปแล้วภาษาที่ตีความสมัยใหม่จะไม่ตีความรหัสของมนุษย์โดยตรงเนื่องจากไม่มีประสิทธิภาพเกินไป

Python interpreter จะอ่านรหัสมนุษย์ก่อนและปรับให้เหมาะสมกับรหัสกลางบางส่วนก่อนที่จะตีความเป็นรหัสเครื่อง นั่นเป็นเหตุผลที่คุณต้องการโปรแกรมอื่นเพื่อเรียกใช้สคริปต์ Python ซึ่งแตกต่างจาก C ++ ที่คุณสามารถเรียกใช้โค้ดที่คอมไพล์ได้ที่คอมไพล์โดยตรง ยกตัวอย่างเช่นหรือc:\Python27\python.exe/usr/bin/python


11
ฉันชอบประเด็นเกี่ยวกับ "ต้องการให้โปรแกรมอื่นทำงาน [มัน]" นั่นช่วยอธิบายความคิดของฉัน
แมตต์

ดังนั้น python.exe จึงปรับรหัสให้เหมาะสมก่อนแล้วจึงตีความมัน
Koray Tugay

@KorayTugay เมื่อ python.exe ได้รับซอร์สโค้ดข้อความที่มนุษย์สามารถอ่านได้มันจะสร้างรหัสไบต์ที่ปรับให้เหมาะสมก่อนแล้วจึงตีความว่า (ตามที่คุณพูด); อย่างไรก็ตามเมื่อมีไฟล์รหัสไบต์ (รวบรวมไว้ล่วงหน้า) แล้วก็ไม่จำเป็นต้องทำขั้นตอนแรกซึ่งจะช่วยประหยัดเวลา
GordonBGood

31

คำตอบนั้นขึ้นอยู่กับการใช้งานของไพ ธ อน หากคุณกำลังใช้สมมติว่าCPython (The Standard Implementation of Python) หรือJython (เป้าหมายสำหรับการรวมกับภาษาการเขียนโปรแกรมภาษาจาวา) มันจะถูกแปลเป็นbytecodeเป็นครั้งแรกและขึ้นอยู่กับการใช้งานของ Python ที่คุณใช้อยู่ เครื่องเสมือนสำหรับการตีความ PVM (Python Virtual Machine) สำหรับ CPython และJVM (Java Virtual Machine) สำหรับ Jython

แต่สมมุติว่าคุณกำลังใช้PyPyซึ่งเป็นอีกหนึ่งการติดตั้ง CPython มาตรฐาน มันจะใช้Just-In-Time คอมไพเลอร์


ในระหว่างการแปลเป็น bytecode นั้นจำเป็นต้องมี compiler ตัวที่หนึ่งนั่นคืออะไร?
RICKY

Pypy เป็นการใช้งานPythonไม่ใช่การใช้งาน "CPython" ในความเป็นจริง Pypy เป็นทางเลือกแทน CPython ( pypy.org/features.html )
Giorgio

13

ตามเว็บไซต์ทางการของ Python มันเป็นภาษาที่ตีความ

https://www.python.org/doc/essays/blurb/

Python เป็นภาษาการเขียนโปรแกรมเชิงวัตถุระดับสูงตีความ ...

...

เนื่องจากไม่มีขั้นตอนการรวบรวม ...

...

Python interpreter และไลบรารี่มาตรฐานมีให้เลือกมากมาย ...

...

แต่เมื่อล่ามพบข้อผิดพลาดจะทำให้เกิดข้อยกเว้น เมื่อโปรแกรมไม่พบข้อยกเว้นล่ามจะพิมพ์การติดตามสแต็ก


7

ใช่มันเป็นทั้งภาษาที่รวบรวมและตีความ ถ้าอย่างนั้นทำไมเราถึงเรียกมันว่าเป็นภาษาที่ตีความ?

ดูว่ามันถูกรวบรวมและตีความอย่างไร?

ก่อนอื่นฉันอยากจะบอกว่าคุณจะชอบคำตอบของฉันมากขึ้นถ้าคุณมาจากโลก Java

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

javac Hello.java -------> สร้างไฟล์Hello.class

java สวัสดี --------> นำ bytecode ไปยังJVMเพื่อวัตถุประสงค์ในการดำเนินการ

สิ่งเดียวกันนี้เกิดขึ้นกับไพ ธ อนเช่นแรกคือซอร์สโค้ดที่ได้รับการแปลงเป็น bytecode ผ่านคอมไพเลอร์แล้วนำไปยังPVM (รับผิดชอบในการสร้างโค้ดเนทีฟเพื่อการทำงาน) ตอนนี้ฉันต้องการแสดงให้คุณเห็นว่าเรามักจะเรียก Python เป็นภาษาที่ตีความเพราะการรวบรวมเกิดขึ้นหลังฉาก และเมื่อเราเรียกใช้ไพ ธ อนผ่าน:

หลาม Hello.py -------> แก้ปัญหารหัสโดยตรงและเราสามารถเห็นผลลัพธ์ที่พิสูจน์ว่ารหัสนั้นถูกต้องตามหลักไวยากรณ์

@ python Hello.pyดูเหมือนว่าจะดำเนินการโดยตรง แต่จริงๆแล้วมันจะสร้าง bytecode ที่ล่ามแปลความหมายเพื่อสร้างรหัสเนทีฟเพื่อวัตถุประสงค์ในการดำเนินการ

CPython - รับผิดชอบทั้งการรวบรวมและการตีความ

ดูบรรทัดด้านล่างหากคุณต้องการรายละเอียดเพิ่มเติม :

ดังที่ฉันได้กล่าวว่าCPythonรวบรวมซอร์สโค้ด แต่การคอมไพล์จริงเกิดขึ้นด้วยความช่วยเหลือของcythonจากนั้นการตีความเกิดขึ้นกับความช่วยเหลือของCPython

ตอนนี้เราจะมาพูดถึงบทบาทของคอมไพเลอร์ Just-In-Time ใน Java และ Python

ใน JVM Java Interpreter มีอยู่ซึ่งตีความ bytesode ทีละบรรทัดเพื่อให้ได้รหัสเครื่องดั้งเดิมสำหรับการดำเนินการ แต่เมื่อ Java bytecode ถูกดำเนินการโดยล่ามการดำเนินการจะช้าลงเสมอ แล้วทางออกคืออะไร? วิธีแก้ไขคือJust-In-Time คอมไพเลอร์ซึ่งสร้างโค้ดเนทีฟซึ่งสามารถประมวลผลได้เร็วกว่าที่ตีความได้ บางผู้ผลิต JVM ใช้Java ล่ามและบางส่วนใช้Just-In-Time คอมไพเลอร์ อ้างอิง: คลิกที่นี่

ในหลามจะได้รับรอบล่ามเพื่อให้เกิดการดำเนินการอย่างรวดเร็วใช้การดำเนินการหลามอื่น ( PyPy ) แทนCPython คลิกที่นี่สำหรับการดำเนินงานอื่น ๆ ของงูหลามรวมทั้งPyPy


6

ถ้า (คุณรู้จาวา) {

โค้ดไพ ธ อนจะถูกแปลงเป็น bytecode เหมือนจาวา
bytecode นั้นจะถูกดำเนินการอีกครั้งทุกครั้งที่คุณพยายามเข้าถึง

} else {

รหัสไพ ธ อนเริ่มแรกถูกแปลเป็นสิ่งที่เรียกว่า bytecode
ซึ่งค่อนข้างใกล้เคียงกับภาษาเครื่อง แต่ไม่ใช่รหัสเครื่องจริง
ดังนั้นในแต่ละครั้งที่เราเข้าถึงหรือเรียกใช้นั้นจะเรียกใช้ bytecode อีกครั้ง

}


2

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


1

สำหรับมือใหม่

Python รวบรวมสคริปต์ของคุณเพื่อรวบรวมรหัสโดยอัตโนมัติเรียกว่ารหัสไบต์ก่อนที่จะเรียกใช้

การเรียกใช้สคริปต์ไม่ถือเป็นการอิมพอร์ตและจะไม่มีการสร้าง. pyc

ตัวอย่างเช่นหากคุณมีไฟล์สคริปต์ abc.py ที่นำเข้าโมดูล xyz.py อีกโมดูลหนึ่งเมื่อคุณเรียกใช้ abc.py xyz.pyc จะถูกสร้างขึ้นเนื่องจาก xyz ถูกนำเข้า แต่จะไม่มีการสร้างไฟล์ abc.pyc มาตั้งแต่ abc py ไม่ได้ถูกนำเข้า


1

มันเป็นความสับสนอย่างมากสำหรับผู้ที่เริ่มต้นทำงานกับไพ ธ อนและคำตอบที่นี่ยากที่จะเข้าใจดังนั้นฉันจะทำให้ง่ายขึ้น

เมื่อเราสั่งให้ Python เรียกใช้สคริปต์ของเรามีเพียงไม่กี่ขั้นตอนที่ Python จะดำเนินการก่อนที่รหัสของเราจะเริ่มกระทืบไป

  • มันถูกรวบรวมเป็น bytecode
  • จากนั้นจะถูกส่งไปยังเครื่องเสมือน

เมื่อเรารันซอร์สโค้ดไพ ธ อนจะคอมไพล์มันเป็นรหัสไบต์ การคอมไพล์เป็นขั้นตอนการแปลและโค้ดไบต์เป็นการแสดงซอร์สโค้ดที่ไม่ขึ้นกับแพลตฟอร์มในระดับต่ำ โปรดทราบว่ารหัสไบต์ Python ไม่ใช่รหัสเครื่องไบนารี (เช่นคำแนะนำสำหรับชิป Intel)

ที่จริงแล้ว Python แปลแต่ละคำสั่งของซอร์สโค้ดเป็นคำแนะนำโค้ดไบต์โดยแยกย่อยคำเหล่านั้นออกเป็นแต่ละขั้นตอน การแปลรหัสไบต์จะดำเนินการเพื่อเพิ่มความเร็วในการประมวลผล โค้ดไบต์สามารถรันได้เร็วกว่างบต้นฉบับซอร์ส มันมี. pyc นามสกุลและมันจะถูกเขียนถ้ามันสามารถเขียนไปยังเครื่องของเรา

ดังนั้นในครั้งต่อไปที่เราเรียกใช้โปรแกรมเดียวกัน Python จะโหลดไฟล์. pyc และข้ามขั้นตอนการรวบรวมจนกว่าจะมีการเปลี่ยนแปลง Python จะตรวจสอบการประทับเวลาของซอร์สและไฟล์รหัสไบต์โดยอัตโนมัติเพื่อให้รู้ว่าเมื่อใดที่ต้องทำการคอมไพล์ใหม่ หากเราบันทึกรหัสต้นฉบับใหม่รหัสไบต์จะถูกสร้างขึ้นใหม่โดยอัตโนมัติอีกครั้งในครั้งต่อไปที่โปรแกรมทำงาน

ถ้า Python ไม่สามารถเขียนไฟล์รหัสไบต์ไปยังเครื่องของเราได้โปรแกรมของเราก็ยังใช้งานได้ รหัสไบต์ถูกสร้างขึ้นในหน่วยความจำและจะถูกยกเลิกเมื่อออกจากโปรแกรม แต่เนื่องจากเวลาเริ่มต้นของไฟล์. pyc เราอาจต้องการตรวจสอบให้แน่ใจว่ามันถูกเขียนขึ้นสำหรับโปรแกรมขนาดใหญ่

มาสรุปสิ่งที่เกิดขึ้นเบื้องหลัง เมื่อ Python เรียกใช้งานโปรแกรม Python จะอ่าน. py ลงในหน่วยความจำและแยกวิเคราะห์เพื่อรับ bytecode จากนั้นดำเนินการต่อ สำหรับแต่ละโมดูลที่นำเข้าโดยโปรแกรม Python ตรวจสอบก่อนเพื่อดูว่ามีรุ่น bytecode ที่คอมไพล์แล้วใน. pyo หรือ. pyc ที่มีการประทับเวลาซึ่งสอดคล้องกับไฟล์. py ของมัน Python ใช้รุ่น bytecode ถ้ามี มิฉะนั้นจะแยกวิเคราะห์ไฟล์. py ของโมดูลบันทึกลงในไฟล์. pyc และใช้โค้ดไบต์ที่เพิ่งสร้างขึ้น

ไฟล์รหัสไบต์เป็นวิธีหนึ่งในการจัดส่งรหัส Python Python จะยังคงเรียกใช้โปรแกรมหากไฟล์ทั้งหมดเป็นไฟล์. pyc แม้ว่าไฟล์. py ดั้งเดิมจะไม่มีอยู่ก็ตาม

Python Virtual Machine (PVM)

เมื่อโปรแกรมของเราได้รับการคอมไพล์เป็นโค้ดไบต์แล้วมันจะถูกส่งไปยัง Python Virtual Machine (PVM) PVM ไม่ใช่โปรแกรมแยกต่างหาก มันไม่จำเป็นต้องติดตั้งด้วยตัวเอง ที่จริงแล้ว PVM เป็นเพียงลูปขนาดใหญ่ที่วนซ้ำผ่านคำสั่งไบต์ของเราทีละหนึ่งเพื่อดำเนินการของพวกเขา PVM เป็นเอ็นจิ้นรันไทม์ของ Python มันมีอยู่เสมอเป็นส่วนหนึ่งของระบบ Python เป็นองค์ประกอบที่ใช้งานสคริปต์ของเราอย่างแท้จริง ในทางเทคนิคแล้วเป็นเพียงขั้นตอนสุดท้ายของสิ่งที่เรียกว่า Python interpreter


0

รหัสไพ ธ อนที่คุณเขียนถูกคอมไพล์เป็นไพ ธ อนไบต์รหัสซึ่งสร้างไฟล์ที่มีนามสกุล. pyc หากรวบรวมคำถามอีกครั้งคือทำไมไม่รวบรวมภาษา

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

กลับไปที่กระบวนการดำเนินการ bytecode ของคุณซึ่งอยู่ในไฟล์ pyc สร้างขึ้นในขั้นตอนการคอมไพล์จากนั้นจะดำเนินการโดยเครื่องเสมือนที่เหมาะสมในกรณีของเรา CPython VM การประทับเวลา (เรียกว่าเป็นหมายเลขเวทย์) จะใช้ในการตรวจสอบว่า ไฟล์ py มีการเปลี่ยนแปลงหรือไม่ขึ้นอยู่กับไฟล์ pyc ใหม่ที่สร้างขึ้น ถ้า pyc เป็นรหัสปัจจุบันก็แค่ข้ามขั้นตอนการคอมไพล์


0

งูหลาม (ล่าม) จะรวบรวม

พิสูจน์: มันจะไม่ได้รวบรวมรหัสของคุณถ้ามีข้อผิดพลาดทางไวยากรณ์

ตัวอย่างที่ 1:

print("This should print") 
a = 9/0 

เอาท์พุท:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

รวบรวมรหัสเรียบร้อยแล้ว บรรทัดแรกได้รับการดำเนินการ ( print) บรรทัดที่สองพ่นZeroDivisionError(ข้อผิดพลาดเวลารัน)

ตัวอย่างที่ 2:

print("This should not print")
/0         

เอาท์พุท:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

สรุป : หากไฟล์รหัสของคุณSyntaxErrorไม่มีสิ่งใดที่จะดำเนินการตามการรวบรวมล้มเหลว

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