คอมไพเลอร์ตัวแรกทำยังไง?


70

ฉันมักจะสงสัยในสิ่งนี้และบางทีฉันต้องการบทเรียนประวัติศาสตร์ที่ดีเกี่ยวกับภาษาการเขียนโปรแกรม แต่เนื่องจากคอมไพเลอร์ส่วนใหญ่ในปัจจุบันทำใน C คอมไพเลอร์ตัวแรกที่สร้างขึ้น (AKA ก่อนหน้า C) หรือแปลภาษาทั้งหมดแค่ไหน?

เมื่อพูดถึงเรื่องนี้ฉันยังไม่เข้าใจว่าภาษาแอสเซมบลีตัวแรกได้ทำอะไรฉันเข้าใจว่าภาษาแอสเซมบลีนั้นคืออะไร แต่ฉันไม่เห็นว่าพวกเขาใช้ภาษาแอสเซมบลีครั้งแรกได้อย่างไร คำสั่ง (เช่นmov R21) หรือ w / e ตั้งค่าให้เทียบเท่าไบนารี?


9
มีโปรแกรมเมอร์ที่ไม่เก่งเรื่องตลกในทีมของฉันหนึ่งครั้งซึ่งสิ่งที่เขาทำทั้งหมดก็บ่นเกี่ยวกับ C # เราเคยพูดเล่นเกี่ยวกับภาษาสมมติที่เขาประดิษฐ์เรียกว่า Crunk ความจริงที่รู้จักกันเล็กน้อยเกี่ยวกับ Crunk เป็นภาษาแรกที่คอมไพเลอร์เขียนด้วยภาษา Crunk :)
maple_shaft

2
ทำไมบางคนถึงบ่นเกี่ยวกับ C # เขาไม่เคยใช้ smalltalk หรือ Lisp บ้างไหม? lol


4
@maple_shaft: เป็นธรรมที่คอมไพเลอร์ gcc ถูกเขียนใน C ที่จริงแล้วไม่ใช่ปัญหาถ้าคุณมีคอมไพเลอร์ข้ามที่ดีในการคอมไพล์เวอร์ชันแรก แน่นอนว่าคอมไพเลอร์ C ตัวแรกต้องถูกเขียนเป็นภาษาอื่น
Scott Whitlock

คำตอบ:


89

ฉันทำไปแล้ว ซีพียูจำนวนมากมีคำแนะนำง่ายๆขนาดคงที่ที่มีความยาวเพียงไม่กี่ไบต์ สำหรับ CPU ที่ง่ายๆเช่นโมโตโรล่า 6800 สำหรับตัวอย่างเช่นคุณสามารถพอดีทั้งหมดของคำแนะนำบนกระดาษแผ่นเดียว การเรียนการสอนแต่ละคนจะมี opcode สองไบต์ที่เกี่ยวข้องกับมันและข้อโต้แย้ง คุณสามารถรวบรวมโปรแกรมด้วยตนเองโดยค้นหา opcode ของแต่ละคำสั่ง จากนั้นคุณจะเขียนโปรแกรมลงบนกระดาษเขียนคำอธิบายประกอบแต่ละคำสั่งด้วย opcode ที่เกี่ยวข้อง เมื่อคุณเขียนโปรแกรมของคุณแล้วคุณสามารถเขียนแต่ละ opcode ตามลำดับเป็นEPROMซึ่งจะเก็บโปรแกรมของคุณ ต่อ EPROM เข้ากับ CPU ด้วยคำแนะนำที่ถูกต้องที่ที่อยู่ด้านขวาและคุณมีโปรแกรมที่ใช้งานง่าย และเพื่อตอบคำถามต่อไปของคุณใช่ มันเจ็บปวด (เราทำสิ่งนี้ในโรงเรียนมัธยม) แต่ฉันต้องบอกว่าการต่อสายทุกชิปในคอมพิวเตอร์ 8 บิตและการเขียนโปรแกรมด้วยตนเองทำให้ฉันมีความเข้าใจอย่างลึกซึ้งเกี่ยวกับสถาปัตยกรรมคอมพิวเตอร์ซึ่งฉันอาจไม่สามารถทำได้ด้วยวิธีอื่น

ชิปขั้นสูงเพิ่มเติม (เช่น x86) นั้นยากกว่าการเขียนด้วยมือเพราะพวกเขามักจะมีคำแนะนำความยาวผันแปร ตัวประมวลผล VLIW / EPIC อย่างItaniumใกล้เคียงกับโค้ดที่เป็นไปไม่ได้อย่างมีประสิทธิภาพเพราะพวกมันจัดการกับชุดคำสั่งที่ปรับให้เหมาะสมและประกอบโดยคอมไพเลอร์ขั้นสูง สำหรับสถาปัตยกรรมใหม่โปรแกรมมักจะเขียนและประกอบบนคอมพิวเตอร์เครื่องอื่นก่อนเสมอจากนั้นโหลดลงในสถาปัตยกรรมใหม่ ในความเป็นจริงสำหรับ บริษัท ต่างๆเช่น Intel ที่สร้าง CPU จริง ๆ พวกเขาสามารถเรียกใช้โปรแกรมจริงบนสถาปัตยกรรมที่ยังไม่มีโดยเรียกใช้พวกมันบนเครื่องจำลอง แต่ฉันเชือนแช ...

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

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


27
. . . และไม่เป็นเช่นนั้น "... ฉันแนะนำให้คุณJMPเป็นประวัติ ... "
Binary Worrier

2
ฉันเสียใจมาก แต่ฉันต้อง ฉันแค่ ... มี เป็น ...
Dave Markle

9
@Dave: คุณรู้หรือไม่ว่าVelociraptor ถึงแก่ความตาย ?
ไบนารี Worrier

7
พวกเขา "รู้" เพราะพวกเขามีสายแข็งอย่างแท้จริงในการดำเนินการดังกล่าวเมื่อพวกเขาเห็นสัญญาณ 101010100 สำหรับคำสั่งที่กำหนด จริงๆแล้วพวกเขามีหน่วยบนชิปที่รับผิดชอบคำแนะนำในการถอดรหัสคำแนะนำ: en.wikipedia.org/wiki/Decoder
Dave Markle

7
มูลค่าที่เพิ่ม: คอมไพเลอร์สำหรับภาษาใหม่เมื่อเขียนในภาษาใหม่เดียวกันนั้นบางครั้งก็ถูกคอมไพล์ด้วย "proto-compiler" ที่เขียนในภาษาอื่นที่สร้างโค้ดที่ถูกต้อง แต่ไม่มีประสิทธิภาพอย่างน่ากลัว เมื่อรวบรวมแล้วมันจะทำงานเพื่อสร้างคอมไพเลอร์ที่เร็วพอสมควร เปรียบเทียบ Von Neumann Machine : D
BMDan

54

นั่นคือสิ่งที่คอมไพเลอร์ bootstrappingเป็นเรื่องเกี่ยวกับ (เนื่องจากไม่มีใครพูดถึงวิธีการที่เรียกว่า =)

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

คอมไพเลอร์จำนวนมากสำหรับภาษาการเขียนโปรแกรมส่วนใหญ่จะถูก bootstrapped รวมถึงคอมไพเลอร์สำหรับภาษาพื้นฐาน ALGOL, C, Pascal, PL / I, ปัจจัย, Haskell, Modula-2, Oberon, OCaml, Common Lisp, Scheme, Python, Scala และอื่น ๆ .. .

ปัญหาไก่และไข่

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

  • การใช้ล่ามหรือคอมไพเลอร์สำหรับภาษา X ในภาษา Y. Niklaus Wirth รายงานว่าเขาเขียนคอมไพเลอร์ Pascal ตัวแรกใน Fortran
  • ล่ามหรือผู้แปลอื่นสำหรับ X ได้ถูกเขียนเป็นภาษาอื่นแล้ว Y; นี่คือวิธีที่ Scheme ทำการ bootstrapped
  • เวอร์ชันก่อนหน้าของคอมไพเลอร์ถูกเขียนในเซตย่อยของ X ซึ่งมีคอมไพเลอร์อื่นอยู่; นี่คือวิธีที่ supersets ของ Java, Haskell และคอมไพเลอร์ Free Pascal เริ่มต้นถูก bootstrapped
  • คอมไพเลอร์สำหรับ X ถูกคอมไพล์ข้ามจากสถาปัตยกรรมอื่นที่มีคอมไพเลอร์สำหรับ X; นี่คือวิธีที่คอมไพเลอร์สำหรับ C มักจะพอร์ตไปยังแพลตฟอร์มอื่น ๆ นอกจากนี้ยังเป็นวิธีการที่ใช้สำหรับ Free Pascal หลังจาก bootstrap เริ่มต้น
  • การเขียนคอมไพเลอร์ใน X; จากนั้นรวบรวมมือจากแหล่งที่มา (ส่วนใหญ่ในวิธีที่ไม่เหมาะสม) และเรียกใช้บนรหัสเพื่อรับคอมไพเลอร์ที่ดีที่สุด Donald Knuth ใช้สิ่งนี้กับระบบการเขียนโปรแกรม WEB Literate ของเขา ...

ดีลิงค์ที่จะพาคุณไปen.wikipedia.org/wiki/History_of_compiler_writing โดยทั่วไปฉันคิดว่าคอมไพเลอร์ดั้งเดิมเขียนด้วยภาษาแอสเซมบลี ( en.wikipedia.org/wiki/Assembly_language ) แนวคิดในการบูตสแตรปหรือโฮสติ้งด้วยตนเองเกิดขึ้นในภายหลัง
Michael Levy

1
+1 ในที่สุด! แปลกที่นี่เป็นเพียงคำตอบที่ได้รับคะแนนสูงสุดอันดับสาม ใช่การบูตสแตรป นั่นคือคำตอบ
Adam Rackis

15

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

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


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

4
... และก่อนที่คุณจะต้องrewire มัน Funfunfun!
Michael K

ใช่ แต่เมื่อคุณต้องทำอย่างนั้นมันไม่ใช่สิ่งที่เราคิดว่าเป็นคอมพิวเตอร์สมัยใหม่เนื่องจากสถาปัตยกรรม Von Neumann ยังไม่ได้ถูกคิดค้น
Dave Markle

7

googling เล็กน้อยเปลี่ยนคำสั่งซื้อเริ่มต้นของ EDSACจากช่วงปลายยุค 40 เนื่องจากมันเป็นแอสเซมเบลอร์แรกมันอาจเป็นรหัสในภาษาเครื่อง

ต่อมาก็มีแอสเซมเบลอร์สำหรับเครื่องอื่น ๆ เช่นSOAP I และ IIสำหรับ IBM 650 SOAP I อาจเป็นรหัสในภาษาเครื่องแม้ว่าฉันจะไม่พบคำสั่งที่ชัดเจน

เล็ก ๆ น้อย ๆ ต่อมา Fortran (สูตรแปล) สำหรับ IBM 704 สันนิษฐานว่ามันถูกเขียนในประกอบสำหรับ 704 ประกอบต้นสำหรับ 701 เป็นเครดิตไปยังนาธานโรเชสเตอร์

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


อึศักดิ์สิทธิ์คอมพิวเตอร์แฮร์รี่พอร์เตอร์ (เกือบจะพูดว่าแฮร์รี่พอตเตอร์ฮ่า ๆ ) น่ากลัว ฉันหวังว่าฉันจะเข้าใจว่ามีการสร้างสิ่งเหล่านี้อย่างไร :(.

1
@ เซารอน: แฮร์รี่พอร์เตอร์อยากจะบอกอะไรกับคุณมากกว่านี้ ปิดหน้านั้นเขามีจุดไฟที่ออกแบบมาอย่างสวยงามเพื่ออธิบายทุกอย่าง มันถือว่ามีความรู้พื้นฐานเกี่ยวกับวงจร แต่ไม่ยากเกินกว่าที่จะรับได้
Mike Dunlavey

ฉันรู้ว่าฉันเพิ่งจะยุ่งเหยิง ^ _ ^ ไม่ว่าจะเป็นเครื่องที่น่าประทับใจมากและฉันก็มั่นใจว่ามีตัวช่วยสร้างมากมายที่ใส่ลงไป :)

6

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

คอมพิวเตอร์เครื่องแรกนั้นถูกตั้งโปรแกรมโดยตรงในระบบเลขฐานสองโดยการสลับสวิตช์ทางกายภาพ มันเป็นการปรับปรุงการผลิตที่ยอดเยี่ยมเมื่อฮาร์ดแวร์พัฒนาขึ้นเพื่อให้โปรแกรมเมอร์ (หรือผู้ช่วยการป้อนข้อมูล) ป้อนรหัสเป็นตัวเลขฐานสิบหกผ่านทางปุ่มกด!

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

เมื่อคุณมีแอสเซมเบลอร์คุณสามารถเขียนคอมไพเลอร์สำหรับภาษาระดับที่สูงขึ้นในแอสเซมเบลอร์

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

วันนี้คอมไพเลอร์ตัวแรกสำหรับภาษาใหม่มักจะเขียนด้วยภาษา C แต่เมื่อภาษานั้นครบอายุที่กำหนดก็มักจะเขียนใหม่ "ในตัวเอง" คอมไพเลอร์ Java ตัวแรกเขียนด้วยภาษา C แต่เขียนใหม่ในภายหลังใน Java คอมไพเลอร์ C # ตัวแรกเขียนด้วยภาษา C ++ แต่ล่าสุดได้มีการเขียนใหม่ในภาษา C # คอมไพเลอร์ Python / ล่ามเขียนใน C แต่โครงการ PyPy เป็นความพยายามที่จะเขียนมันซ้ำใน Python

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

แต่คุณไม่จำเป็นต้องใช้ C เป็น "ภาษาเริ่มต้น" สำหรับคอมไพเลอร์ คอมไพเลอร์ F # ตัวแรกเขียนด้วย OCaml ซึ่งเป็นภาษาอื่นที่เกี่ยวข้องกับ F # มากที่สุด เมื่อคอมไพเลอร์เสร็จสมบูรณ์มันจะถูกเขียนใหม่ใน F # คอมไพเลอร์ตัวแรกสำหรับ Perl 6 ถูกเขียนใน Haskell (ภาษาที่ใช้งานได้จริงแตกต่างจาก Perl มาก) แต่ตอนนี้มีคอมไพเลอร์ที่เขียนเป็น C

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


3

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

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


2

มันไม่ยากอย่างที่คิด ในวัยเด็ก;) ฉันได้ทำการถอดแยกชิ้นส่วน x86 ในใจ

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

นั่นคือบางครั้งคุณกำลังย้ายข้อมูลจากภาษาไปเป็นรหัสโดยไม่แปลกใจ


1

คอมไพเลอร์แรกถูกนำไปใช้โดยใช้ภาษาแอสเซมบลี และแอสเซมบลีแรกถูกนำมาใช้โดยโปรแกรมการเข้ารหัสในแบบไบนารี ...


เมื่อไม่นานมานี้การเขียนโปรแกรมในระบบไบนารี่ยังคงเป็นทักษะที่ผู้คนใช้

เมื่อฉันเป็นนักศึกษาระดับปริญญาตรีฉันจำได้ว่าทำแบบฝึกหัดการเขียนโปรแกรมที่เกี่ยวข้องกับการเขียนโปรแกรมขนาดเล็กในรหัสเครื่อง PDP-8 (ฉันคิดว่า) เข้าสู่มันผ่านสวิตช์ด้านหน้าและเรียกใช้ ฉันสองสามปีต่อมาฉันซื้อชุดพัฒนาระบบ 6502 ตัวที่มีปุ่มกดแบบหกเหลี่ยมสำหรับเข้าสู่โปรแกรม ... และ RAM ขนาด 4k ไบต์


-3

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

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