บทสรุปที่ฉันให้ไว้ด้านล่างใช้ "คอมไพเลอร์หลักการเทคนิคและเครื่องมือ", Aho, Lam, Sethi, Ullman, (Pearson International Edition, 2007), หน้า 1, 2 ด้วยการเพิ่มแนวคิดบางอย่างของฉันเอง
ทั้งสองกลไกพื้นฐานสำหรับการประมวลผลโปรแกรมที่มีการรวบรวมและการตีความ
การคอมไพล์ใช้เป็นอินพุตโปรแกรมต้นฉบับในภาษาที่กำหนดและส่งเอาต์พุตโปรแกรมเป้าหมายในภาษาเป้าหมาย
source program --> | compiler | --> target program
หากภาษาเป้าหมายเป็นรหัสเครื่องสามารถเรียกใช้งานได้กับโปรเซสเซอร์บางตัวโดยตรง:
input --> | target program | --> output
การรวบรวมเกี่ยวข้องกับการสแกนและแปลโปรแกรมอินพุตทั้งหมด (หรือโมดูล) และไม่เกี่ยวข้องกับการดำเนินการ
การตีความใช้เป็นอินพุตโปรแกรมต้นทางและอินพุตและสร้างเอาต์พุตของโปรแกรมต้นฉบับ
source program, input --> | interpreter | --> output
การตีความมักเกี่ยวข้องกับการประมวลผล (การวิเคราะห์และการดำเนินการ) โปรแกรมหนึ่งคำสั่งพร้อมกัน
ในทางปฏิบัติตัวประมวลผลภาษาจำนวนมากใช้การผสมผสานของสองวิธี เช่นโปรแกรม Java ถูกแปลเป็นครั้งแรก (เรียบเรียง) เป็นโปรแกรมระดับกลาง (รหัสไบต์):
source program --> | translator | --> intermediate program
ผลลัพธ์ของขั้นตอนนี้จะถูกดำเนินการ (ตีความ) โดยเครื่องเสมือน:
intermediate program + input --> | virtual machine | --> output
เพื่อทำให้สิ่งต่าง ๆ ซับซ้อนยิ่งขึ้น JVM สามารถทำการคอมไพล์แบบทันเวลาที่รันไทม์เพื่อแปลงรหัสไบต์เป็นรูปแบบอื่นซึ่งจะถูกเรียกใช้งาน
นอกจากนี้แม้ว่าคุณจะคอมไพล์เป็นภาษาเครื่องก็ยังมีล่ามที่ใช้งานไฟล์ไบนารี่ซึ่งประมวลผลโดยโปรเซสเซอร์พื้นฐาน ดังนั้นแม้ในกรณีนี้คุณกำลังใช้ไฮบริดของการรวบรวม + การตีความ
ดังนั้นระบบที่แท้จริงจึงใช้ทั้งสองอย่างร่วมกันดังนั้นจึงเป็นการยากที่จะพูดว่าตัวประมวลผลภาษาที่ให้มานั้นเป็นตัวแปลภาษาหรือตัวแปลเพราะมันอาจจะใช้กลไกทั้งสองในขั้นตอนต่าง ๆ ของการประมวลผล ในกรณีนี้มันอาจจะเหมาะสมกว่าที่จะใช้คำอื่นที่เป็นกลางมากกว่า
อย่างไรก็ตามการรวบรวมและตีความเป็นกระบวนการที่แตกต่างกันสองประเภทดังที่อธิบายไว้ในแผนภาพด้านบน
เพื่อตอบคำถามเบื้องต้น
คอมไพเลอร์จะสร้างภาษาเครื่องที่ทำงานบนฮาร์ดแวร์ทางกายภาพโดยตรง
คอมไพเลอร์แปลโปรแกรมที่เขียนขึ้นสำหรับเครื่อง M1 ไปเป็นโปรแกรมเทียบเท่าที่เขียนขึ้นสำหรับเครื่อง M2 เครื่องเป้าหมายสามารถใช้งานได้ในฮาร์ดแวร์หรือเป็นเครื่องเสมือน แนวคิดไม่มีความแตกต่าง จุดสำคัญคือคอมไพเลอร์จะดูรหัสและแปลเป็นภาษาอื่นโดยไม่ต้องดำเนินการ
ดังนั้นล่ามจึงไม่สร้างภาษาเครื่อง แต่คอมไพเลอร์ใช้สำหรับการป้อนข้อมูลหรือไม่
หากการสร้างคุณอ้างถึงเอาต์พุตแล้วคอมไพเลอร์จะสร้างโปรแกรมเป้าหมายซึ่งอาจเป็นภาษาเครื่องแปลภาษาไม่ได้