คอมไพเลอร์แรกเขียนอย่างไร


166

ฉันได้ยินเกี่ยวกับไก่และไข่และรองเท้าบู๊ต ฉันมีคำถามสองสามข้อ

อะไรเขียนคอมไพเลอร์แรกที่แปลงบางสิ่งเป็นคำสั่งเลขฐานสอง

แอสเซมบลีที่รวบรวมหรือแปลเป็นคำแนะนำแบบไบนารีหรือไม่

... ฉันคิดว่ามันยากที่จะเชื่อว่าพวกเขาเขียนคอมไพเลอร์เป็นเลขฐานสอง



@nawfal มันเป็นความแตกต่างระหว่างภาษาการเขียนโปรแกรมใหม่และคอมไพเลอร์ตัวแรกดังนั้นไม่ใช่ - มันไม่ซ้ำกัน

@ PauliSudarshanTerho ความแตกต่างคืออะไร? จิตวิญญาณของคำถามเหมือนกัน คุณไม่สามารถเขียนภาษาการเขียนโปรแกรมคำถามนั้นกำลังพูดถึงคอมไพเลอร์ตัวแรก
nawfal

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

เรียนรู้จากฉัน - นี่เป็นสิ่งที่ซ้ำกัน: stackoverflow.com/questions/4772768/…

คำตอบ:


133

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

โปรแกรมแรกได้ทำในลักษณะนี้ - opcodes ที่เขียนด้วยมือ

อย่างไรก็ตามส่วนใหญ่มันง่ายกว่าที่จะใช้แอสเซมเบลอร์เพื่อ "คอมไพล์" แอสเซมบลีโค้ดซึ่งทำการค้นหา opcode เหล่านี้โดยอัตโนมัติรวมทั้งมีประโยชน์ในการคำนวณที่อยู่ / ออฟเซ็ต

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


18
คอมพิวเตอร์เครื่องแรกของฉันคือเครื่องที่ใช้ Z80 ซึ่งมีจอมอนิเตอร์ ROM ฉันต้องรวบรวม bootstrap loader เพื่อนำพื้นฐานของระบบปฏิบัติการ (CP / M) ขึ้นมาดังนั้นฉันจึงสามารถรวบรวมระบบปฏิบัติการที่เหลือดังกล่าวเป็นระบบการทำงาน เสร็จสิ้นด้วยตัวโหลดบู๊ตสแตรปโหลดดิสก์ ช่วงเวลาแห่งความสนุก. ดังนั้นคุณสามารถประกอบมือได้ดี มันช้าและเจ็บปวดและเกิดข้อผิดพลาดได้ง่าย (ซึ่งเป็นเหตุผลที่เราทำสิ่งอัตโนมัติ) แต่เป็นไปได้
เพียงความคิดเห็นที่ถูกต้องของฉัน


เขียนด้วยมือ อย่างไร? เดินสายหรือเจาะบัตร? ฉันเดาว่าพวกเขามีแผงเลขฐานสิบหก

44

โปรดอ่านเกี่ยวกับคอมไพเลอร์ bootstrappingและประวัติความเป็นมาของการเขียนคอมไพเลอร์

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


36

ไข่ที่นำหน้าไก่มานาน คำตอบของปัญหา "ไก่กับไข่" ส่วนใหญ่เหมือนกัน: วิวัฒนาการ บางคนมีปัญหาในการเชื่อในวิวัฒนาการทางชีววิทยาเช่นกัน แต่การไม่เชื่อก็ไม่ได้โต้แย้ง (google argumentum ad ignorantiam)

เพื่อตอบคำถามของคุณโดยตรง: คอมไพเลอร์ตัวแรกเขียนโดยคนในภาษาแอสเซมบลีโปรแกรมที่เรียกว่าแอสเซมเบลอร์จะแปลภาษาแอสเซมบลีเป็นภาษาไบนารี่ นี่เป็นกระบวนการที่ง่ายกว่าการรวบรวมเพราะภาษาแอสเซมบลีเป็นเพียงรูปแบบสัญลักษณ์ของภาษาเครื่องที่ใช้ชื่อ opcode แทนตัวเลขแสดงที่อยู่ที่มีสัญลักษณ์และอื่น ๆ คอมไพเลอร์ที่ตามมาจำนวนมากถูกเขียนในภาษาแอสเซมบลีเช่นกัน แต่ก่อนคอมไพเลอร์ C เป็นคอมไพเลอร์ B แก้ไขซึ่งเขียนในB คอมไพเลอร์ B ครั้งแรกที่ถูกเขียนในTMG คอมไพเลอร์ TMG ใช้เพื่อรวบรวมว่าคอมไพเลอร์ B ถูกเขียนในภาษาแอสเซมบลี PDP-7


24

Woz กล่าวในการพูดคุยในที่สาธารณะครั้งหนึ่งว่าเมื่อเขาเริ่มเขาไม่สามารถจ่ายคอมไพเลอร์ได้ดังนั้นเขาจึงรวบรวมเป็นเลขฐานสองด้วยมือบนกระดาษ หากคุณต้องการเห็นอะไรที่ดุร้ายกว่านี้ลองอ่านเงื่อนไขที่Bill Gates และ Paul Allen เขียนพื้นฐานสำหรับ Altair 8800

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

หากคุณต้องการที่จะทำลายลงอุปสรรคที่ช่วยให้คอมพิวเตอร์รู้สึกเหมือนมายากล, ผมขอแนะนำให้อ่านรหัสโดย Charles Petzoldและ / หรือองค์ประกอบของระบบคอมพิวเตอร์ ด้วยความรู้พื้นฐานของการเขียนโปรแกรมหนังสือที่เข้าถึงได้อย่างน่าอัศจรรย์เหล่านี้จะทำให้คุณเข้าใจคอมพิวเตอร์จากบนลงล่าง เห็นได้ชัดว่าไม่มีใครสามารถคอมพ์ได้ วิทย์ หรือปริญญา EE หลังจากหนังสือเพียง 2 เล่ม แต่ฉันสามารถพูดได้ว่าเป็นโปรแกรมเมอร์ที่เรียนรู้ด้วยตนเองที่พลาดการฝึกอบรมอย่างเป็นทางการ: หนังสือเหล่านี้ทำให้โลกของฉันสั่นสะเทือน!


2
เขียน Altair BASIC interpreter หลังจากทำ pitch ขายหรือไม่ การเข้ารหัส bootstrapper บนเครื่องบินนั่งไปยังอัลบูเคอร์คี? นั่นฟังดูไร้สาระ และสนุก.
Ehtesh Choudhury

2
@Shurane: ฮ่า! ประเด็นเหล่านั้นก็มีความเกี่ยวข้องเช่นกัน แต่สำหรับฉันแล้วพวกเขาสร้างล่ามขั้นพื้นฐานและกลุ่มที่อัดแน่นเข้าไปในพื้นที่เล็ก ๆ เป็นเรื่องของความงามและความสามารถในการเขียนโปรแกรม / แฮ็กเกอร์ที่น่าประหลาดใจ
ไดน่า

10

อะไรเขียนคอมไพเลอร์แรกที่แปลงบางสิ่งเป็นคำสั่งเลขฐานสอง

มนุษย์ทำ อ่านเกี่ยวกับระบบA-0 :

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


1
ลิงค์น่าจะเป็น 404 ในตอนนี้ไม่ว่าในกรณีใด ๆ "เกรซ" ด้านบนคือเกรซฮ็อปเปอร์
Volker Stolz

2
ฉันได้ยินมาว่าสิ่งที่กระโดดเขียนคอมไพเลอร์แรก แต่คำอธิบายข้างต้นมันทำให้ฟังดูเหมือนลิงเกอร์มากกว่าคอมไพเลอร์ ยังเป็นเรื่องที่ดี เป็นเรื่องที่น่าอัศจรรย์ใจที่มีบางครั้งที่นักวิทยาศาสตร์คอมพิวเตอร์สงสัยเกี่ยวกับความคิดในการรวบรวม ...
Mark E. Haase

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

@ MarkE.Haase Hopper คนที่อ้างถึงในที่นี้คือวิศวกรแอพพลิเคชั่นและนักวิทยาศาสตร์ที่ใช้คอมพิวเตอร์ในการคำนวณเฉพาะงาน พวกเขาไม่ใช่ "นักวิทยาศาสตร์คอมพิวเตอร์" มี cyberneticists จำนวนหนึ่งประมาณปี 2495 แต่ฉันสงสัยว่าเธอพูดกับผู้ใด
Jim Balter

9

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

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

บางครั้งโปรแกรมเหล่านี้จะถูกใช้เพื่อประมวลผลไฟล์ข้อความเพื่อสร้างโปรแกรมอื่น ๆ และภาษาการเขียนโปรแกรม voila ถูกสร้างขึ้น


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