ฉันได้ยินเกี่ยวกับไก่และไข่และรองเท้าบู๊ต ฉันมีคำถามสองสามข้อ
อะไรเขียนคอมไพเลอร์แรกที่แปลงบางสิ่งเป็นคำสั่งเลขฐานสอง
แอสเซมบลีที่รวบรวมหรือแปลเป็นคำแนะนำแบบไบนารีหรือไม่
... ฉันคิดว่ามันยากที่จะเชื่อว่าพวกเขาเขียนคอมไพเลอร์เป็นเลขฐานสอง
ฉันได้ยินเกี่ยวกับไก่และไข่และรองเท้าบู๊ต ฉันมีคำถามสองสามข้อ
อะไรเขียนคอมไพเลอร์แรกที่แปลงบางสิ่งเป็นคำสั่งเลขฐานสอง
แอสเซมบลีที่รวบรวมหรือแปลเป็นคำแนะนำแบบไบนารีหรือไม่
... ฉันคิดว่ามันยากที่จะเชื่อว่าพวกเขาเขียนคอมไพเลอร์เป็นเลขฐานสอง
คำตอบ:
คำแนะนำในการประกอบเป็น (โดยทั่วไป) การทำแผนที่โดยตรงไปยัง opcodes ซึ่งเป็น (หลายค่า) ไบต์ของรหัสเครื่องที่สามารถตีความได้โดยตรงโดยโปรเซสเซอร์ มันค่อนข้างเป็นไปได้ที่จะเขียนโปรแกรมใน opcodes โดยตรงโดยค้นหาจากตาราง (เช่นอันนี้สำหรับไมโครโปรเซสเซอร์ 6039เป็นต้น) ซึ่งแสดงรายการพวกเขาด้วยคำสั่งแอสเซมบลีที่เข้าคู่กัน เหมือนการกระโดด
โปรแกรมแรกได้ทำในลักษณะนี้ - opcodes ที่เขียนด้วยมือ
อย่างไรก็ตามส่วนใหญ่มันง่ายกว่าที่จะใช้แอสเซมเบลอร์เพื่อ "คอมไพล์" แอสเซมบลีโค้ดซึ่งทำการค้นหา opcode เหล่านี้โดยอัตโนมัติรวมทั้งมีประโยชน์ในการคำนวณที่อยู่ / ออฟเซ็ต
แอสเซมบลีแรกถูกเขียนด้วยมือ แอสเซมบลีเหล่านั้นสามารถใช้ในการประกอบแอสเซมบลีที่ซับซ้อนมากขึ้นซึ่งสามารถใช้ในการรวบรวมคอมไพเลอร์ที่เขียนขึ้นสำหรับภาษาระดับสูงและอื่น ๆ กระบวนการนี้ซ้ำเขียนเครื่องมือในการลดความซับซ้อนของการสร้างชุดต่อไปของเครื่องมือที่เรียกว่า (ดังกล่าวโดยเดวิด Rabinowitz ในคำตอบของเขา) ความร่วมมือ
โปรดอ่านเกี่ยวกับคอมไพเลอร์ bootstrappingและประวัติความเป็นมาของการเขียนคอมไพเลอร์
แนวคิดคือการเขียนคอมไพเลอร์อย่างง่าย ๆ โดยตรงในโค้ดเครื่องใช้เพื่อเขียนคอมไพเลอร์ที่ซับซ้อนมากขึ้นใช้อันที่สองเพื่อสร้างคอมไพเลอร์ตัวที่สามและต่อ ๆ ไปจนกว่าคุณจะมีคอมไพเลอร์แบบเต็ม
ไข่ที่นำหน้าไก่มานาน คำตอบของปัญหา "ไก่กับไข่" ส่วนใหญ่เหมือนกัน: วิวัฒนาการ บางคนมีปัญหาในการเชื่อในวิวัฒนาการทางชีววิทยาเช่นกัน แต่การไม่เชื่อก็ไม่ได้โต้แย้ง (google argumentum ad ignorantiam)
เพื่อตอบคำถามของคุณโดยตรง: คอมไพเลอร์ตัวแรกเขียนโดยคนในภาษาแอสเซมบลีโปรแกรมที่เรียกว่าแอสเซมเบลอร์จะแปลภาษาแอสเซมบลีเป็นภาษาไบนารี่ นี่เป็นกระบวนการที่ง่ายกว่าการรวบรวมเพราะภาษาแอสเซมบลีเป็นเพียงรูปแบบสัญลักษณ์ของภาษาเครื่องที่ใช้ชื่อ opcode แทนตัวเลขแสดงที่อยู่ที่มีสัญลักษณ์และอื่น ๆ คอมไพเลอร์ที่ตามมาจำนวนมากถูกเขียนในภาษาแอสเซมบลีเช่นกัน แต่ก่อนคอมไพเลอร์ C เป็นคอมไพเลอร์ B แก้ไขซึ่งเขียนในB คอมไพเลอร์ B ครั้งแรกที่ถูกเขียนในTMG คอมไพเลอร์ TMG ใช้เพื่อรวบรวมว่าคอมไพเลอร์ B ถูกเขียนในภาษาแอสเซมบลี PDP-7
Woz กล่าวในการพูดคุยในที่สาธารณะครั้งหนึ่งว่าเมื่อเขาเริ่มเขาไม่สามารถจ่ายคอมไพเลอร์ได้ดังนั้นเขาจึงรวบรวมเป็นเลขฐานสองด้วยมือบนกระดาษ หากคุณต้องการเห็นอะไรที่ดุร้ายกว่านี้ลองอ่านเงื่อนไขที่Bill Gates และ Paul Allen เขียนพื้นฐานสำหรับ Altair 8800
เกี่ยวกับ "การเขียนคอมพิวเตอร์เป็นไบนารี่" - ถอยห่างจากการเป็นโปรแกรมเมอร์และคิดเกี่ยวกับสิ่งที่คอมพิวเตอร์ยุคแรกเป็น ยังไม่มีสิ่งระดับสูง - คุณคิดถึงทุกสิ่งในระดับต่ำเพราะนั่นคือทั้งหมด คุณมีฮาร์ดแวร์ที่สามารถใช้ตรรกะและเลขคณิตพื้นฐานที่คุณจัดการผ่านรหัสเครื่อง (ซึ่งเป็นเพียงชุดประกอบ - แอมเบอร์อธิบายว่าทำไมส่วนนี้จึงไม่ยากที่จะทำด้วยมือ) และคุณต้องการให้ฮาร์ดแวร์นี้ทำงานทางคณิตศาสตร์บางอย่าง คุณไม่ต้องกังวลเกี่ยวกับระบบปฏิบัติการที่ไม่มีอยู่คุณเพิ่งบอกฮาร์ดแวร์ (ในแอสเซมบลี) วิธีจัดการตัวเลขที่คุณป้อน มันเป็นเครื่องคิดเลขขนาดใหญ่ คอมพิวเตอร์ของวันนี้ถูกสร้างขึ้นหนึ่งสิ่งที่เป็นนามธรรมในเวลา
หากคุณต้องการที่จะทำลายลงอุปสรรคที่ช่วยให้คอมพิวเตอร์รู้สึกเหมือนมายากล, ผมขอแนะนำให้อ่านรหัสโดย Charles Petzoldและ / หรือองค์ประกอบของระบบคอมพิวเตอร์ ด้วยความรู้พื้นฐานของการเขียนโปรแกรมหนังสือที่เข้าถึงได้อย่างน่าอัศจรรย์เหล่านี้จะทำให้คุณเข้าใจคอมพิวเตอร์จากบนลงล่าง เห็นได้ชัดว่าไม่มีใครสามารถคอมพ์ได้ วิทย์ หรือปริญญา EE หลังจากหนังสือเพียง 2 เล่ม แต่ฉันสามารถพูดได้ว่าเป็นโปรแกรมเมอร์ที่เรียนรู้ด้วยตนเองที่พลาดการฝึกอบรมอย่างเป็นทางการ: หนังสือเหล่านี้ทำให้โลกของฉันสั่นสะเทือน!
อะไรเขียนคอมไพเลอร์แรกที่แปลงบางสิ่งเป็นคำสั่งเลขฐานสอง
มนุษย์ทำ อ่านเกี่ยวกับระบบA-0 :
ในปี 1952, Grace Hopper ได้ทำคอมไพเลอร์ตัวแรกให้กับ Sperry ซึ่งรู้จักกันในชื่อ A-0 ระบบ A-0 เป็นชุดคำสั่งที่สามารถแปลรหัสทางคณิตศาสตร์สัญลักษณ์เป็นภาษาเครื่อง ในการผลิต A-0 เธอใช้รูทีนย่อยทั้งหมดที่เธอรวบรวมมานานหลายปีแล้วใส่ลงในเทป แต่ละรูทีนได้รับหมายเลขการโทรเพื่อให้เครื่องสามารถค้นหาได้บนเทป "สิ่งที่ฉันต้องทำก็คือจดชุดหมายเลขโทรศัพท์ให้คอมพิวเตอร์ค้นหามันบนเทปนำมันมาและทำสิ่งต่อไปนี้เป็นคอมไพเลอร์ตัวแรก" ตามที่เกรซอธิบาย
โปรแกรมแรกเขียนด้วยรหัสเครื่อง (ไม่ใช่ภาษาแอสเซมบลี) - เสียบหมายเลขจริงลงในหน่วยความจำคอมพิวเตอร์โดยใช้สวิตช์ เรามาไกล ...
บางครั้งสิ่งนี้ยังคงเกิดขึ้นในระดับเล็กน้อย - เพื่อแก้ไขโค้ดขนาดเล็กหรือสร้าง thunks ฉันจำได้ว่าการต่อยตัวเลขเป็นสตริงพื้นฐานที่ถูกเรียกใช้เป็นรูทีนย่อยขนาดเล็กและเร็วในไมโครสโคปรุ่นแรก ฉันยังจำการสลับสวิตช์บนแผงด้านหน้าของ PDP-11 เพื่อเข้าสู่โปรแกรม bootloader ในหน่วยความจำสำหรับหลักสูตรมหาวิทยาลัย
บางครั้งโปรแกรมเหล่านี้จะถูกใช้เพื่อประมวลผลไฟล์ข้อความเพื่อสร้างโปรแกรมอื่น ๆ และภาษาการเขียนโปรแกรม voila ถูกสร้างขึ้น