คอมไพเลอร์ทำงานอย่างไร [ปิด]


17

หมายเหตุ: ฉันประหลาดใจที่สิ่งนี้ไม่ได้ถูกถามมาก่อนและหากฉันไม่พบในการค้นหา

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

หากนี่เป็นคำถามที่ยากและกว้างโปรดบอกฉัน แต่ถ้าไม่ใช่โปรดตอบคำถาม


4
กว้างเกินไปอย่างน้อยก็ส่วน "ทำงานอย่างไร" มีหนังสือทั้งหมดที่เขียนในหัวข้อนั้น
Oded

1
en.wikipedia.org/wiki/Compilerจะเป็นลิงค์ Wikipedia ที่ไม่สำคัญในการค้นหาสิ่งที่คุณสงสัยโดยเฉพาะคืออะไร คำถามนั้นกว้างพอที่ฉันจะถูกล่อลวงให้ตอบสนองอย่างชาญฉลาดว่า "คอมไพเลอร์แปลโค้ดจากภาษาหนึ่งเป็นอีกภาษาหนึ่ง" เนื่องจากเป็นแนวคิดทั่วไปที่มีความแตกต่างมากมายภายในเมื่อเราเริ่มมอง มันเกี่ยวข้องกับอะไรจริงๆ
JB King

1
ใช่และฉันคิดว่ามันได้รับคำตอบค่อนข้างดี
Jeremy

1
คำอธิบายว่าคอมไพเลอร์ทำงานอย่างไรจะกว้างหรือซับซ้อนเกินไป มันเป็นวิชาที่ซับซ้อนและชั้นเรียนคอมไพเลอร์เป็นหลักสูตรที่เกี่ยวข้องกับคอมพิวเตอร์ที่ยากที่สุดที่ฉันเคยเรียน
David Thornley

1
@David แน่นอนว่าคอมไพเลอร์มีความซับซ้อนและคุณไม่สามารถอธิบายรายละเอียดทั้งหมดเกี่ยวกับวิธีการทำงานที่นี่ได้ อย่างไรก็ตามฉันแน่ใจว่าคุณมีความเข้าใจในระดับสูงขั้นพื้นฐานเกี่ยวกับสิ่งที่คอมไพเลอร์หรือมันทำงานอย่างไรก่อนที่คุณจะเข้าหลักสูตรคอมไพเลอร์ของคุณ
Dima

คำตอบ:


24

คอมไพเลอร์เป็นโปรแกรมที่แปลซอร์สโค้ดสำหรับโปรแกรมอื่นจากภาษาการเขียนโปรแกรมเป็นโค้ดที่ทำงานได้

โดยทั่วไปแล้วซอร์สโค้ดจะเป็นภาษาโปรแกรมระดับสูง (เช่น Pascal, C, C ++, Java, Perl, C #, ฯลฯ ) รหัสที่สามารถใช้งานได้นั้นอาจเป็นลำดับของคำสั่งเครื่องที่สามารถดำเนินการโดย CPU โดยตรงหรืออาจเป็นการแสดงสื่อกลางที่ตีความโดยเครื่องเสมือน (เช่นรหัส Java byte)

กล่าวโดยสรุปคอมไพเลอร์แปลงโปรแกรมจากรูปแบบที่มนุษย์สามารถอ่านได้เป็นรูปแบบที่เครื่องอ่านได้

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

  1. Lexing - แยกข้อความของโปรแกรมเป็น "โทเค็น" โทเค็นคือ "คำ" ของภาษาการเขียนโปรแกรมเช่นตัวระบุ (คำหลักชื่อตัวแปรชื่อฟังก์ชัน ฯลฯ ) หรือตัวดำเนินการ (=, *, &, ฯลฯ )
  2. การแยกวิเคราะห์ - แปลงลำดับของโทเค็นลงในทรีการแยกวิเคราะห์ซึ่งเป็นโครงสร้างข้อมูลที่แสดงโครงสร้างภาษาต่างๆ: การประกาศชนิดการประกาศตัวแปรการกำหนดฟังก์ชันนิยามลูปเงื่อนไขการแสดงออก ฯลฯ
  3. การเพิ่มประสิทธิภาพ - ประเมินนิพจน์ค่าคงที่ปรับค่าตัวแปรที่ไม่ได้ใช้หรือโค้ดที่ไม่สามารถเข้าถึงได้ปรับลูปถ้าเป็นไปได้ ฯลฯ
  4. แปลแผนผังการแยกวิเคราะห์เป็นคำสั่งเครื่อง (หรือรหัส JVM ไบต์)

อีกครั้งฉันเน้นว่านี่เป็นคำอธิบายสั้น ๆ คอมไพเลอร์สมัยใหม่นั้นฉลาดมากและก็ซับซ้อนมาก


2
จริงๆแล้วมันเปลี่ยนภาษาเป็นภาษาอื่น คอมไพเลอร์ C ++ รุ่นแรกได้คอมไพล์เป็น C เช่นเดียวกันกับคอมไพเลอร์ Vala คอมไพเลอร์ Java คอมไพล์ลงในไบต์ที่ไม่สามารถเรียกใช้งานได้หากไม่มีคอมไพเลอร์ JIT ของ JVM
deadalnix

1
@deadalnix IMHO ประเด็นคือคุณต้องเปลี่ยนจากรหัสที่ไม่สามารถเรียกใช้งานได้ไปเป็นรหัสที่ปฏิบัติการได้ ฉันจะยืนยันว่า C-front ไม่ใช่คอมไพเลอร์ แต่เป็น front-end ของ C คอมไพเลอร์ หรือขั้นตอนในกระบวนการรวบรวมถ้าคุณจะ เครื่องเสมือนเบลอขอบเขตระหว่าง "executable" และ "non-executable" แน่นอน ที่นี่ฉันจะพิจารณารหัสที่สามารถใช้งานได้เพื่อเป็นอะไรก็ตามที่เข้าไปในเครื่องเสมือนเช่นรหัสไบต์และสรุปสิ่งที่อยู่ภายใน VM เช่น JIT
Dima

1
@Dima ไม่จำเป็นต้องมาจากรหัสที่ไม่สามารถเรียกใช้งานได้จนถึงรหัสที่สามารถเรียกทำงานได้ ตัวอย่างเช่นคุณไม่สามารถเรียกใช้รหัส JVM ไบต์บนเครื่อง Windows ได้โดยตรง

1
@ Thorbjørn Ravn Andersen: แต่โค้ดไบต์สามารถใช้งานได้โดย JVM จุดประสงค์ทั้งหมดของ "เครื่องเสมือน" ที่ดูเหมือนเครื่องจักรจริงกับโปรแกรมเมอร์หรือไม่?
Dima

2
ฉันจะยืนยันว่าตามปกติแล้วคอมไพเลอร์แปลงโปรแกรมจากรูปแบบที่มนุษย์อ่านได้เป็นรูปแบบที่เครื่องอ่านได้เช่นเดียวกับ Dima กล่าว รูปแบบต่าง ๆ เช่น Cfront การแปลง C ++ เป็น C หรือ javac การแปลง Java เป็น bytecode เป็นหัวข้อขั้นสูงที่ควรจะทิ้งไว้จนกว่าจะอธิบายพื้นฐานแนวคิดดั้งเดิมแก่คนที่ไม่คุ้นเคย
Carson63000

5

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

คอมไพเลอร์โปรแกรมซอร์สบริดจ์ในภาษาระดับสูงพร้อมฮาร์ดแวร์พื้นฐาน คอมไพเลอร์ต้องการ:

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