ทำไมเราต้องใช้ภาษาแอสเซมบลี
ที่จริงแล้วมีเพียงภาษาเดียวที่เราต้องการซึ่งเรียกว่า "ภาษาเครื่อง" หรือ "รหัสเครื่อง" ดูเหมือนว่านี้:
0010000100100011
นี่เป็นภาษาเดียวที่คอมพิวเตอร์ของคุณสามารถพูดได้โดยตรง มันเป็นภาษาที่ CPU ใช้พูด (และในทางเทคนิคแล้วซีพียูชนิดต่างๆจะพูดรุ่นที่ต่างกัน) นอกจากนี้ยังดูดดูและพยายามเข้าใจ
โชคดีที่แต่ละส่วนของไบนารีสอดคล้องกับความหมายเฉพาะ มันแบ่งออกเป็นหลายส่วน:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
ค่าเหล่านี้สอดคล้องกับ:
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
ดังนั้นการดำเนินการนี้จะเพิ่มตัวเลขใน register 1 และ 2 และใส่ค่านั้นใน register 3 หากคุณใส่ค่าเหล่านี้ลงใน CPU และบอกว่า "go" มันจะเพิ่มตัวเลขสองตัวให้คุณ การดำเนินการ "ลบ" อาจเป็น 0011 หรือบางอย่างแทน 0010 ที่นี่ ค่าอะไรก็ตามที่ทำให้ซีพียูทำการลบ
ดังนั้นโปรแกรมอาจมีลักษณะเช่นนี้ (อย่าพยายามเข้าใจเพราะฉันสร้างรหัสเครื่องรุ่นนี้ขึ้นมาเพื่ออธิบายสิ่งต่าง ๆ ):
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
สิ่งนี้มันน่าอ่านไหม? อย่างแน่นอน. แต่เราจำเป็นต้องใช้สำหรับซีพียู ถ้ารหัสเครื่องทุกตัวตรงกับการกระทำที่เฉพาะเจาะจงให้เพียงแค่การจดชวเลข "ภาษาอังกฤษ" อย่างง่ายจากนั้นเมื่อเราเข้าใจสิ่งที่โปรแกรมกำลังทำอยู่ให้แปลงเป็นรหัสเครื่องไบนารีจริงและมอบให้ CPU ทำงาน
ดังนั้นคำสั่งดั้งเดิมของเราจากด้านบนอาจมีลักษณะ:
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
โปรดทราบว่าเวอร์ชั่นภาษาอังกฤษนี้มีการแมปรหัสเครื่องที่แน่นอน ดังนั้นเมื่อเราเขียนบรรทัดของ "ภาษาอังกฤษ" นี้เราแค่เขียนรหัสเครื่องที่เป็นมิตรและเข้าใจได้ง่ายขึ้น
ดีนี้เป็นภาษาประกอบ นั่นเป็นเหตุผลที่มันมีอยู่และทำไมมันถูกสร้างขึ้นมาตั้งแต่แรก
เพื่อทำความเข้าใจว่าทำไมเราต้องการมันตอนนี้อ่านคำตอบข้างต้น แต่กุญแจสำคัญที่จะเข้าใจคือ: ภาษาระดับสูงไม่มีการเป็นตัวแทนเดียวคือรหัสเครื่อง เช่นใน C หรือ Python หรืออะไรก็ตาม:
z = x + y
ฟังดูคล้ายกับการเพิ่มจากข้างบนสมมติว่าx
อยู่ใน register 1 y
อยู่ใน register 2 และz
ควรลงท้ายด้วย register 3 แต่สายนี้ล่ะ
z = x * 2 + (y / 6) * p + q - r
ลองแสดงบรรทัดนั้นเป็นเลขฐานสอง 16 บิตและบอก CPU "ไป" คุณทำไม่ได้ รหัสเครื่องไม่มีคำสั่งการดำเนินการเดียวเพื่อทำการเพิ่มการลบและสิ่งอื่นใดที่มี 4 หรือ 5 ตัวแปรพร้อมกัน ดังนั้นจะต้องถูกแปลงเป็นลำดับของรหัสเครื่องก่อน นี่คือสิ่งที่คุณทำเมื่อคุณ "รวบรวม" หรือ "ตีความ" ภาษาระดับสูง
เรามีโปรแกรมที่จะทำเช่นนั้นแล้วทำไมเราถึงต้องมีการชุมนุมในตอนนี้? สมมติว่าโปรแกรมของคุณทำงานช้ากว่าที่คุณคาดไว้และคุณต้องการทราบสาเหตุ ดูที่ภาษาเครื่อง "เอาท์พุท" ของบรรทัดนี้มันอาจมีลักษณะ:
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
เพียงเพื่อให้ได้หนึ่งบรรทัดของ Python ที่ทำ ดังนั้นคุณต้องการที่จะแก้ปัญหาที่?!?!?! NO แต่คุณถามคอมไพเลอร์ของคุณกรุณาให้การส่งออกในรูปแบบที่คุณจริงสามารถเข้าใจได้ง่ายซึ่งเป็นรุ่นภาษาประกอบที่สอดคล้องกันว่ารหัสเครื่องที่ จากนั้นคุณสามารถทราบได้ว่าคอมไพเลอร์ของคุณกำลังทำอะไรที่โง่และพยายามแก้ไข
(หมายเหตุเพิ่มเติมเกี่ยวกับคำแนะนำของ @ Raphael: คุณสามารถสร้าง CPU ที่ทำงานกับสิ่งอื่นนอกเหนือจากรหัสไบนารี่เช่นไตรภาค (ฐาน 3) หรือรหัสทศนิยมหรือแม้แต่ ASCII สำหรับการใช้งานจริงเราติดอยู่กับไบนารี)