มีความแตกต่างระหว่างสองคนนี้ไหม? ตามหนังสือของ Ullmanคอมไพเลอร์จะแปลงภาษาหนึ่งเป็นภาษาอื่น (โดยปกติอยู่ในระดับต่ำ) และแอสเซมเบลอร์ก็เช่นกัน ทั้งสองแตกต่างกันอย่างไร
มีความแตกต่างระหว่างสองคนนี้ไหม? ตามหนังสือของ Ullmanคอมไพเลอร์จะแปลงภาษาหนึ่งเป็นภาษาอื่น (โดยปกติอยู่ในระดับต่ำ) และแอสเซมเบลอร์ก็เช่นกัน ทั้งสองแตกต่างกันอย่างไร
คำตอบ:
แอสเซมเบลอร์แปลรหัสแอสเซมบลีเป็นรหัสเครื่อง การแปลเป็นแบบกลและสามารถทำได้เพียงวิธีเดียว ในทางกลับกันคอมไพเลอร์มีอิสระมากขึ้นเมื่อคอมไพล์ภาษาการเขียนโปรแกรมที่เกี่ยวข้อง - มันสามารถปรับให้เหมาะสมตัวอย่างเช่นและคอมไพเลอร์ที่ไม่ได้ทำให้เกิดประโยชน์สูงสุดสร้างโค้ดที่แตกต่างกัน นอกจากนี้คอมไพเลอร์สามารถเขียนในลักษณะที่แยก "front-end" (ตรงกับภาษาการเขียนโปรแกรม) และ "back-end" (ตรงกับสถาปัตยกรรมคอมพิวเตอร์) ในขณะที่แอสเซมเบลอร์ทั้งสองจะเหมือนกันเสมอ
บรรทัดล่างคือการเขียนคอมไพเลอร์สนุกกว่าแอสเซมเบลอร์ ภาษาแอสเซมบลีมักจะได้รับการออกแบบให้เกือบจะเป็นเรื่องเล็ก ๆ น้อย ๆ ที่จะแยกวิเคราะห์และตรวจสอบและมีแนวโน้มที่จะเกี่ยวข้องกับเครื่องปั่นไฟ - โต๊ะ ("opcode สำหรับเพิ่มคือ 01110", "สำหรับคำแนะนำในการโหลด ") โดยปกติแล้วส่วนที่น่าสนใจที่สุดของแอสเซมเบลอร์คือส่วนที่แก้ไขป้ายสัญลักษณ์เป็นตัวเลข
อย่างไรก็ตามแอสเซมบลีส่วนใหญ่สามารถทำเลขคณิตจำนวนเล็กน้อย (ตัวอย่างเช่นการรวมเลเบลสัญลักษณ์พร้อมค่าคงที่ขนาดเล็กเข้าด้วยกัน) และแอสเซมเบลอร์ส่วนใหญ่มีหรือรวมเข้ากับระบบประมวลผลแมโคร (ในระบบ Unix ส่วนใหญ่คุณสมบัติของมาโครจะได้รับจากการรัน C pre-processor บนชุดประกอบก่อนส่งผ่านไปยังแอสเซมเบลอร์ที่เหมาะสม)
แอสเซมเบลอร์ MIPS ต้องก้าวไปไกลกว่านั้นและทำการตัดสินใจสร้างโค้ดที่น่าสนใจและทำการเพิ่มประสิทธิภาพเล็กน้อย ภาษาเครื่อง MIPS ต้องลำดับรหัสที่แตกต่างกันในการโหลดคงที่ที่แตกต่างกันเช่นและเพื่อประกอบต้องเลือกลำดับรหัสหลังจากก่อสร้างอย่างต่อเนื่อง นอกจากนี้รหัสเครื่อง MIPS มีความเห็นเกี่ยวกับช่วงหน่วงเวลาแต่มันเป็นความรับผิดชอบของแอสเซมเบลอร์ที่จะสรุปสิ่งเหล่านี้ ดังนั้นแอสเซมเบลอร์ MIPS จำเป็นต้องทำการตั้งเวลาการสอนท้องถิ่น
ความแตกต่างนั้นเบลอมากขึ้นจากงานของนอร์แมนแรมซีย์โดยเฉพาะอย่างยิ่งภาษาแอสเซมบลีแบบพกพาC -ของเขา (บทความที่เกี่ยวข้องคือRamsey และ Peyton Jones "ภาษากลางระดับกลางเดียวที่รองรับการใช้งานหลายอย่างของข้อยกเว้น", Prog. Lang. Impl. และ Dsgn. , (PLDI-21): 285–298, 2000 ) และในที่สุดก็มี เป็นภาษาแอสเซมบลีที่พิมพ์จาก David Walker และ Greg Morrisett ด้วยแอสเซมเบลอร์ที่สามารถรับประกันความปลอดภัยของหน่วยความจำได้
คำตอบที่เรียบง่ายเล็กน้อยที่นี่ความเป็นจริงมีความซับซ้อนมากขึ้น ฉันคาดหวังความแตกต่างระหว่างแอสเซมเบลอร์ (A) และคอมไพเลอร์ (C) เป็นสิ่งอื่น:
เรามักจะเรียกภาษาแอสเซมบลี "ระดับต่ำ" และภาษาต้นฉบับที่คอมไพเลอร์เข้าใจ "ระดับสูง" (นี่คือการทำให้เข้าใจง่าย แต่ก็ยัง)
ในภาษาแอสเซมบลีคุณสามารถดำเนินการเพิ่มได้โดยพูดว่า:
ในภาษาระดับสูงคุณอาจเขียน:
และสิ่งนี้อาจส่งผลให้มีคำสั่งหนึ่งคำสั่งหรือหลายร้อยคำสั่งขึ้นอยู่กับสถานการณ์หลายอย่างหนึ่งคือสิ่งที่ CPU ที่คอมไพเลอร์สร้างคำแนะนำสำหรับ
ดังที่คุณเห็นภาษาแอสเซมบลีบ่อยที่สุด: (A) ซอร์สโค้ดหนึ่งบรรทัดจะให้ซีพียู opcodes หนึ่งบรรทัดและมันขึ้นอยู่กับ CPU ที่คุณกำหนดเป้าหมายเป็นอย่างมาก คอมไพเลอร์ภาษาระดับสูง (C) จัดการรายละเอียดทั้งหมดเหล่านี้ให้คุณ - ซอร์สโค้ดหนึ่งบรรทัดอาจกลายเป็นศูนย์, หนึ่งหรือหลายซีพียู opcodes และคอมไพเลอร์จัดการรายละเอียดของสิ่งที่ CPU สามารถทำได้
คอมไพเลอร์ทุกวันนี้มักประกอบด้วยหลายขั้นตอน พวกเขาอาจมีชื่อ frontend / backend หรือ beeing เรียกว่าสิ่งอื่น ๆ ฉันมักจะเห็นพวกเขาเป็นสี่ขั้นตอน:
การเขียนคอมไพเลอร์ที่ดีเป็นอาชีพที่มีทักษะสูง - การสร้างคอมไพเลอร์ภาษาของเล่นสามารถทำได้ในช่วงบ่ายโดยมือสมัครเล่น (หรือดีขึ้นอีกเล็กน้อย)