Python Runtime ทำงานอย่างไร


26

ฉันมีปัญหาบางอย่างที่เข้าใจแนวคิดของ a runtime libraryโดยเฉพาะ Python ดังนั้นผมจึงได้เขียนบางโปรแกรม Hello World python ./hello_world.pyหลามและตั้งใจที่จะดำเนินการได้ดังนั้นฉันเขียน

เกิดอะไรขึ้นระหว่างฉันกดปุ่ม Enter และรหัสเครื่องที่สร้างจากรหัสไพ ธ อนของฉันที่ถูกเรียกใช้งานบน CPU ของฉัน และสิ่งนี้เกี่ยวข้องกับระบบ Python runtime และ / หรือไลบรารี่อย่างไร?


ทั้งสองเธรดให้ข้อมูลเชิงลึกที่ยอดเยี่ยมเกี่ยวกับ Python runtime - Python ตีความหรือรวบรวมหรือทั้งสองอย่าง? & Python ตีความ (เช่น Javascript หรือ PHP) หรือไม่ . รันไทม์และไลบรารีรันไทม์ไม่เหมือนกัน การแม็ปกับ. NET ระดับโลกที่ฉันรู้จัก - Common Language Runtime (CLR) และ Framework / Library Class Library (FCL / BCL) ไม่เหมือนกัน
RBT

คำตอบ:


33

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

เกิดอะไรขึ้นระหว่างฉันกดปุ่ม Enter และรหัสเครื่องที่สร้างจากรหัสไพ ธ อนของฉันที่ถูกเรียกใช้งานบน CPU ของฉัน

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

คอมไพเลอร์เริ่มต้นด้วยparserซึ่งเป็นรูทีนที่อ่านซอร์สโค้ดของคุณและใช้กฎไวยากรณ์ของภาษาเพื่อคำนวณว่ามันเหมาะสมหรือไม่ที่เป็นรหัส Python (ในกรณีของคุณ) ถ้าไม่เช่นนั้น parser จะโยนข้อผิดพลาดและคอมไพเลอร์ bails ออก แต่ถ้าเป็นเช่นนั้น parser ส่งออกสิ่งที่เรียกว่าบทคัดย่อต้นไม้ไวยากรณ์หรือ AST สั้น AST เป็นโครงสร้างข้อมูลแบบต้นไม้ซึ่งแต่ละโหนดมีองค์ประกอบของไวยากรณ์ ตัวอย่างเช่นถ้าคุณบอกว่าx = 5คุณอาจจะจบลงด้วยBinaryExpressionโหนดที่มีoperatorคุณค่าของการ=เป็นLeftค่าของReferenceExpression(x)และค่าของRight IntegerLiteralExpression(5)โปรแกรมทั้งหมดของคุณสามารถแสดงต้นไม้ใหญ่แบบนี้

เมื่อตัวแยกวิเคราะห์ที่ผลิต AST เฟสที่สองคือการวิเคราะห์ความหมาย ในภาษาอังกฤษธรรมดานี่หมายถึง "เข้าใจว่า AST นี้หมายถึงอะไร" โดยจะตรวจสอบ AST เพื่อตรวจสอบว่าคุณทำสิ่งใดผิดกฎหมายหรือไม่แม้ว่าจะเป็นการแยกวิเคราะห์ที่ถูกต้อง (ตัวอย่างเช่นพยายามเรียกฟังก์ชัน 1 อาร์กิวเมนต์ที่มี 3 อาร์กิวเมนต์) และทำให้เกิดข้อผิดพลาดหากคุณทำ มิฉะนั้นจะวิเคราะห์ AST และทำการแก้ไขเพื่อให้ง่ายขึ้นสำหรับเครื่องที่จะเข้าใจ

ขั้นตอนที่สามคือการสร้างรหัส เมื่อคุณวิเคราะห์ AST ที่ถูกต้องและเข้าใจง่ายแล้วคุณจะป้อนเข้าสู่เครื่องกำเนิดซึ่งเดินตาม AST และสร้างรหัสในภาษาเอาท์พุท นี่คือผลิตภัณฑ์สำเร็จรูปของคุณ

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

และสิ่งนี้เกี่ยวข้องกับระบบ Python runtime และ / หรือไลบรารี่อย่างไร?

ทั้งหมด แต่ภาษาที่ง่ายที่สุดมาพร้อมกับชุดฟังก์ชั่นที่กำหนดไว้ล่วงหน้าซึ่งมีความสำคัญต่อผู้ใช้จำนวนมากและอาจเป็นเรื่องยากสำหรับผู้ใช้ในการใช้งานด้วยตนเองด้วยเหตุผลใดก็ตาม รหัสของพวกเขาสามารถเรียกใช้ฟังก์ชั่นเหล่านี้ได้โดยไม่ต้องใช้ห้องสมุดบุคคลที่สาม (ตัวอย่างเช่นใน Python คุณมีprintซึ่งส่งออกไปstdoutโชคดีที่นำไปใช้ด้วยตัวคุณเอง!) ชุดฟังก์ชั่นนี้โดยทั่วไปจะถูกรวบรวมในไลบรารีที่ใช้ร่วมกันซึ่งโค้ดสามารถเรียกใช้ในเวลาทำงานซึ่งเป็นสาเหตุที่รู้จักกันดี เป็นไลบรารีรันไทม์ภาษาหรือเพียงแค่ "รันไทม์" สั้น ๆ


ดังนั้นรหัสของฉันจะถูกป้อนไปยังโปรแกรมอื่น (ระบบ Python runtime) ที่ทำทั้งหมดและเสร็จสิ้นเมื่อรหัสของฉันจบลง (และหลังจากการล้างข้อมูลของหลักสูตร)?
hgiesel

@hgiesel ฉันเชื่อว่าในกรณีของ Python ล่ามเป็นส่วนหนึ่งของ runtime นี่ไม่ใช่กรณีสำหรับทุกภาษา แน่นอน แต่มันค่อนข้างทั่วไปในหมู่ภาษาที่ตีความ
Mason Wheeler

5

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

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

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