การเดินทางการเขียนคอมไพเลอร์
ในพื้นที่เก็บข้อมูล Github นี้ ฉันกำลังบันทึกการเดินทางของฉันในการเขียนคอมไพเลอร์ที่คอมไพล์ด้วยตนเองสำหรับชุดย่อยของภาษา C ฉันยังเขียนรายละเอียดไว้ด้วย เพื่อว่าถ้าคุณต้องการติดตาม จะมีคำอธิบายว่าฉันทำอะไร ทำไม และมีการอ้างอิงถึงทฤษฎีของคอมไพเลอร์
แต่อย่าให้ทฤษฎีมากเกินไป ฉันอยากให้นี่เป็นการเดินทางเชิงปฏิบัติ
ต่อไปนี้เป็นขั้นตอนที่ฉันได้ดำเนินการไปแล้ว:
- ตอนที่ 0: บทนำสู่การเดินทาง
- ส่วนที่ 1: ความรู้เบื้องต้นเกี่ยวกับการสแกนคำศัพท์
- ส่วนที่ 2: รู้เบื้องต้นเกี่ยวกับการแยกวิเคราะห์
- ส่วนที่ 3: ลำดับความสำคัญของตัวดำเนินการ
- ส่วนที่ 4: คอมไพเลอร์จริง
- ส่วนที่ 5: คำชี้แจง
- ส่วนที่ 6: ตัวแปร
- ส่วนที่ 7: ตัวดำเนินการเปรียบเทียบ
- ส่วนที่ 8: หากงบ
- ตอนที่ 9: ในขณะที่วนซ้ำ
- ตอนที่ 10: สำหรับลูป
- ส่วนที่ 11: ฟังก์ชั่นส่วนที่ 1
- ตอนที่ 12: ประเภท ตอนที่ 1
- ส่วนที่ 13: ฟังก์ชั่นส่วนที่ 2
- ส่วนที่ 14: การสร้างรหัสแอสเซมบลี ARM
- ตอนที่ 15: ตัวชี้ ตอนที่ 1
- ส่วนที่ 16: การประกาศตัวแปรทั่วโลกอย่างถูกต้อง
- ตอนที่ 17: การตรวจสอบประเภทที่ดีขึ้นและการชดเชยตัวชี้
- ส่วนที่ 18: ทบทวนค่า L และ R
- ส่วนที่ 19: อาร์เรย์ส่วนที่ 1
- ส่วนที่ 20: ตัวอักษรและสตริงตัวอักษร
- ตอนที่ 21: ผู้ประกอบการเพิ่มเติม
- ส่วนที่ 22: แนวคิดการออกแบบสำหรับตัวแปรท้องถิ่นและการเรียกใช้ฟังก์ชัน
- ส่วนที่ 23: ตัวแปรท้องถิ่น
- ส่วนที่ 24: พารามิเตอร์ฟังก์ชัน
- ส่วนที่ 25: การเรียกใช้ฟังก์ชันและการโต้แย้ง
- ส่วนที่ 26: ต้นแบบฟังก์ชัน
- ตอนที่ 27: การทดสอบการถดถอยและความประหลาดใจที่ดี
- ตอนที่ 28: การเพิ่มแฟล็กรันไทม์เพิ่มเติม
- ตอนที่ 29: การรีแฟคเตอร์เล็กน้อย
- ส่วนที่ 30: การออกแบบโครงสร้าง สหภาพแรงงาน และ Enums
- ส่วนที่ 31: การนำโครงสร้างไปใช้ส่วนที่ 1
- ส่วนที่ 32: การเข้าถึงสมาชิกในโครงสร้าง
- ส่วนที่ 33: การดำเนินการสหภาพแรงงานและการเข้าถึงของสมาชิก
- ส่วนที่ 34: Enums และ Typedefs
- ตอนที่ 35: C Pre-Processor
- ตอนที่ 36 :
break
แล้ว continue
- ส่วนที่ 37: สลับคำสั่ง
- ตอนที่ 38: ห้อยต่องแต่งและอื่น ๆ
- ตอนที่ 39: การเริ่มต้นตัวแปร ตอนที่ 1
- ตอนที่ 40: การเริ่มต้นตัวแปรส่วนกลาง
- ส่วนที่ 41: การเริ่มต้นตัวแปรท้องถิ่น
- ตอนที่ 42: พิมพ์ Casting และ NULL
- ตอนที่ 43: แก้ไขข้อผิดพลาดและตัวดำเนินการเพิ่มเติม
- ตอนที่ 44: การพับอย่างต่อเนื่อง
- ตอนที่ 45: การประกาศตัวแปรทั่วโลก กลับมาอีกครั้ง
- ส่วนที่ 46: พารามิเตอร์ฟังก์ชันโมฆะและการเปลี่ยนแปลงการสแกน
- ตอนที่ 47: ชุดย่อยของ
sizeof
- ส่วนที่ 48: ชุดย่อย
static
- ตอนที่ 49: ผู้ดำเนินการแบบไตรภาค
- ตอนที่ 50: การถูพื้น ตอนที่ 1
- ส่วนที่ 51: อาร์เรย์ส่วนที่ 2
- ตอนที่ 52: ตัวชี้ ตอนที่ 2
- ตอนที่ 53: การถูพื้น ตอนที่ 2
- ส่วนที่ 54: การลงทะเบียนการรั่วไหล
- ตอนที่ 55: การประเมินแบบขี้เกียจ
- ส่วนที่ 56: อาร์เรย์ภายในเครื่อง
- ตอนที่ 57: การถูพื้น ตอนที่ 3
- ตอนที่ 58: การแก้ไขการเพิ่ม/ลดตัวชี้
- ตอนที่ 59: ทำไมมันไม่ทำงาน ตอนที่ 1
- ตอนที่ 60: ผ่านการทดสอบสามครั้ง
- ตอนที่ 61: อะไรต่อไป?
- ส่วนที่ 62: การล้างโค้ด
- ตอนที่ 63: แบ็กเอนด์ใหม่โดยใช้ QBE
- ตอนที่ 64: แบ็กเอนด์สำหรับ CPU 6809
ยังไม่มีกำหนดการหรือไทม์ไลน์สำหรับส่วนต่อๆ ไป ดังนั้นโปรดกลับมาตรวจสอบที่นี่เพื่อดูว่าฉันได้เขียนอะไรเพิ่มเติมหรือไม่
ลิขสิทธิ์
ฉันได้ยืมโค้ดบางส่วนและแนวคิดมากมายจากคอมไพเลอร์ SubC ที่เขียนโดย Nils M Holm รหัสของเขาเป็นสาธารณสมบัติ ฉันคิดว่ารหัสของฉันแตกต่างอย่างมากจนฉันสามารถใช้ใบอนุญาตอื่นกับรหัสของฉันได้
เว้นแต่จะระบุไว้เป็นอย่างอื่น
- ซอร์สโค้ดและสคริปต์ทั้งหมดคือ (c) Warren Toomey ภายใต้ใบอนุญาต GPL3
- เอกสารที่ไม่ใช่ซอร์สโค้ดทั้งหมด (เช่น เอกสารภาษาอังกฤษ ไฟล์รูปภาพ) เป็น (c) Warren Toomey ภายใต้ใบอนุญาต Creative Commons BY-NC-SA 4.0