นอกเหนือจากการเรียนรู้การชุมนุมฉันเชื่อว่าการเรียนรู้วิธีการรวบรวมภาษาระดับต่ำเช่น C มีค่าสูง ดังนั้นคำตอบของฉันคือใช่ แต่แล้วอีกครั้งฉันอาจจะลำเอียงเพราะฉันสนุกกับการเขียนโปรแกรมระดับต่ำ
ตัวอย่างเช่นเพียงแค่เข้าใจว่าคอมไพล์คำสั่งง่าย ๆ ฟังก์ชั่นดังต่อไปนี้
int func(int val)
{
int num = val * 5;
return num;
}
... กลายเป็น (บิตที่น่าสนใจอย่างน้อย):
movl %edi, -20(%rbp)
movl -20(%rbp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
รหัสนี้ใช้อาร์กิวเมนต์จากสแต็ค (val, พารามิเตอร์ถึง func) เลื่อนไปทางซ้าย 2 ตำแหน่ง (คูณด้วย 2 ^ 2 หรือ 4) จากนั้นเพิ่มค่าดั้งเดิมลงในผลลัพธ์ ผลลัพธ์ที่ได้คือการคูณด้วย 5 ตัวอย่างเช่นนี้แสดงจำนวนของสิ่งที่ต้องระวังเช่นการเพิ่มประสิทธิภาพของคอมไพเลอร์ แทนที่จะเรียกคำสั่งให้คูณโดยตรง 5 มันเลื่อนตำแหน่งสองแห่งเพื่อคูณด้วย 4 แล้วเพิ่มค่าเดิม ฉันพบตัวอย่างเช่นนี้เพื่อปรับปรุงความเข้าใจในสิ่งต่าง ๆ ในระดับต่ำลงอย่างมาก
สร้างเอาต์พุตแอสเซมเบลอร์จาก gcc ด้วย-S
ตัวเลือก อย่างไรก็ตามโปรดทราบว่าผลลัพธ์จะแตกต่างกันตามคอมไพเลอร์และระดับการเพิ่มประสิทธิภาพ
อย่างไรก็ตามผมไม่คิดว่าการเป็นโปรแกรมเมอร์ภาษาประกอบเป็นเช่นเดียวกับการทำความเข้าใจการชุมนุม อีกครั้งฉันรู้สึกว่าการเขียนโปรแกรมในภาษาเช่น C และรู้วิธีที่จะนำไปใส่ในรหัสเครื่องเป็นการฝึกฝนที่มีค่า