ทุกคนเคยสงสัยกันไหมว่า ภาษาเขียนโปรแกรม (Programming language) ที่ทำให้คอมพิวเตอร์ของเราทำงานได้อย่างรวดเร็ว และมีประสิทธิภาพสูงนั้นคือภาษาอะไร ? เจ้า "ภาษาแอสเซมบลี (Assembly Language)" คือหนึ่งในคำตอบนั้น แม้ว่าในปัจจุบันพวกเราจะคุ้นเคยกับภาษาโปรแกรมระดับสูงอย่างเช่น ภาษาไพทอน (Python) หรือ ภาษาจาวาสคริปต์ (JavaScript) แต่ภาษา Assemly ที่ถูกสร้างขึ้นมาอย่างยาวนานนั้น กลับมีความสำคัญอย่างมากในโลกคอมพิวเตอร์
ภาษา Assembly ช่วยให้โปรแกรมเมอร์สามารถสั่งงาน ฮาร์ดแวร์คอมพิวเตอร์ (Computer Hardware) ได้อย่างตรงไปตรงมา และมีประสิทธิภาพสูงสุด นอกจากนี้ยังเป็นกุญแจสำคัญในการเข้าใจการทำงานของคอมพิวเตอร์ในระดับที่ลึกซึ้งมากขึ้น ในบทความนี้จะพาทุกคนเปิดโลกของภาษาที่อยู่เบื้องหลังการทำงานของคอมพิวเตอร์ และเรียนรู้ว่าทำไมภาษาโบราณนี้ยังคงถูกใช้อยู่จนถึงปัจจุบันมาเริ่มกันเลย ...
ภาษาแอสเซมบลี (Assembly) เป็นภาษาการเขียนโปรแกรมระดับต่ำ (Low-Level Programming Language) ที่ถูกออกแบบมาเพื่อสื่อสารโดยตรงกับฮาร์ดแวร์ของคอมพิวเตอร์ แตกต่างจากภาษาเครื่อง (Machine Language) ที่จะประกอบด้วยอักขระไบนารี่ และเลขฐานสิบหก เป็นต้น
ซึ่งตัวภาษาแอสเซมบลีนั้นถูกออกแบบมาให้อ่าน และเข้าใจได้ง่ายสำหรับมนุษย์ ซึ่งภาษาแอสเซมบลีทำหน้าที่เป็นสะพานเชื่อมระหว่างฮาร์ดแวร์ของคอมพิวเตอร์ กับ ภาษาการเขียนโปรแกรมระดับสูง (High-Level programming) เช่น Python หรือ JavaScript ซึ่งใช้ในการพัฒนาโปรแกรม และซอฟต์แวร์ในปัจจุบัน
ภาพจาก : https://www.investopedia.com/terms/a/assembly-language.asp
ในช่วงแรกๆ ของคอมพิวเตอร์ที่เก็บโปรแกรมไว้ในหน่วยความจำยังไม่มีการใช้ภาษาแอสเซมบลี โปรแกรมถูกเขียนด้วยรหัสเครื่อง (Machine Code) โดยตรง และถูกโหลดเข้าสู่คอมพิวเตอร์ด้วยกระดาษเจาะรู หรือป้อนเข้าสู่หน่วยความจำด้วยสวิตช์คอนโซล ทำให้การออกแบบโปรแกรมนั้นซับซ้อนมาก ๆ ต่อมา Kathleen Booth ได้รับการยกย่องว่าเป็นผู้คิดค้นภาษาแอสเซมบลีในปี ค.ศ. 1947 (พ.ศ. 2490) ขณะที่ทำงานที่มหาวิทยาลัยลอนดอน ถือเป็นจุดกำเนิดของภาษาแอสเซมบลี
ภาพจาก : https://en.wikipedia.org/wiki/EDSAC#/media/File:EDSAC_(12).jpg
ในปี ค.ศ. 1948 (พ.ศ. 2491) คอมพิวเตอร์ EDSAC ได้นำแอสเซมเบลอร์ที่เรียกว่า "Initial Orders" เข้ามารวมในโปรแกรมเริ่มต้น ซึ่งใช้ One-Letter Mnemonics ที่พัฒนาโดย David Wheeler ผู้ที่ได้รับการยกย่องว่าเป็นผู้สร้างแอสเซมเบลอร์ตัวแรกของโลก ต่อมาในปี ค.ศ. 1955 (พ.ศ. 2498) ภาษาที่ชื่อ SOAP (Symbolic Optimal Assembly Program) ก็ถูกเขียนขึ้นสำหรับใช้ในคอมพิวเตอร์ IBM 650
ภาษาแอสเซมบลีช่วยลดความซับซ้อน และความผิดพลาดจากการเขียนโปรแกรมจากรหัสเครื่องแบบดั้งเดิม ทำให้โปรแกรมเมอร์ไม่ต้องจดจำรหัสตัวเลข และคำนวณค่าที่อยู่ของหน่วยความจำเอง ภาษาแอสเซมบลีเคยถูกใช้กันอย่างแพร่หลายในการพัฒนาโปรแกรม แต่ถูกแทนที่ด้วยภาษาเชิงสูงตั้งแต่ปลายทศวรรษ 1950 (พ.ศ. 2493) แม้ปัจจุบันจะถูกใช้ในงานเฉพาะทาง เช่น การควบคุมฮาร์ดแวร์โดยตรง และการพัฒนาระบบฝังตัว
ซอฟต์แวร์สำคัญบน IBM PC เช่น MS-DOS, Turbo Pascal และ Lotus 1-2-3 ก็ถูกเขียนด้วยภาษาแอสเซมบลี แต่เมื่อความเร็วของคอมพิวเตอร์เพิ่มขึ้น ภาษาแอสเซมบลีก็ถูกนำมาใช้เพื่อเพิ่มประสิทธิภาพเฉพาะส่วนของโปรแกรมแทน เช่น การเรนเดอร์ของเกม Doom ในช่วงทศวรรษ 1990 (พ.ศ. 2533) ภาษาแอสเซมบลีถูกใช้ในการพัฒนาระบบ เช่น Sega Saturn และฮาร์ดแวร์อาร์เคดที่ใช้ชิป TMS34010 อย่าง Mortal Kombat และ NBA Jam
ภาพจาก : https://34010.endlessskye.com/
โดยพื้นฐานแล้ว คำสั่งที่ง่ายที่สุดที่คอมพิวเตอร์สามารถดำเนินการได้คือโค้ดไบนารี่ ซึ่งประกอบด้วยเลข 1 และ 0 โดยโค้ดเหล่านี้ถูกแปลงตรงไปเป็นสถานะ “เปิด” และ “ปิด” ของกระแสไฟฟ้าที่ไหลผ่านวงจรไฟฟ้าภายในคอมพิวเตอร์ โค้ดเหล่านี้คือพื้นฐานของ "ภาษาเครื่อง (Machine Language)" ซึ่งเป็นภาษาการเขียนโปรแกรมขั้นพื้นฐานที่สุด
ภาพจาก : https://www.spiceworks.com/tech/tech-general/articles/machine-vs-assembly-language/
และเป็นที่แน่นอนว่ามนุษย์ไม่สามารถพัฒนาโปรแกรมซอฟต์แวร์สมัยใหม่ได้โดยการเขียนโค้ดด้วยเลข 1 และ 0 โดยตรง ดังนั้นโปรแกรมเมอร์จึงต้องใช้ระดับการย่อส่วน (Abstraction) ต่าง ๆ เพื่อให้สามารถสื่อสารคำสั่งในรูปแบบที่มนุษย์เข้าใจได้ง่ายขึ้น
โปรแกรมเมอร์ในปัจจุบันจะเขียนคำสั่งด้วยสิ่งที่เรียกว่า "ภาษาเชิงสูง" (High-Level Languages) ซึ่งใช้ไวยากรณ์ที่เข้าใจได้ง่าย เช่น คำศัพท์ในภาษาอังกฤษทั้งคำและประโยค รวมถึงตัวดำเนินการเชิงตรรกะ (Logical Operators) อย่าง “and,” “or,” และ “else” ซึ่งพบได้บ่อยในการใช้งานทั่วไป
แต่คำสั่งเหล่านี้จำเป็นต้องถูกแปลงไปเป็นภาษาเครื่องในท้ายที่สุด แทนที่จะทำการแปลงด้วยตนเอง โปรแกรมเมอร์จะใช้ภาษาแอสเซมบลี ซึ่งมีหน้าที่ในการแปลงระหว่างภาษาระดับสูง และภาษาระดับต่ำโดยอัตโนมัติ แม้ว่าโปรแกรมเมอร์ และตัวประมวลผลภาษาธรรมชาติสมัยใหม่จะไม่ค่อยได้ยุ่งเกี่ยวกับภาษาแอสเซมบลีมากนัก แต่ภาษานี้ก็ยังคงมีความสำคัญต่อการทำงานโดยรวมของคอมพิวเตอร์อยู่
ภาพจาก : https://www.mikroe.com/ebooks/architecture-and-programming-of-8051-mcus/elements-of-assembly-language
ในการเขียนโค้ดด้วยภาษาโปรแกรมใด ๆ จะมีกฎเฉพาะที่ต้องปฏิบัติตามเพื่อให้คอมไพเลอร์สามารถประมวลผลโค้ดได้โดยไม่มีข้อผิดพลาด กฎเหล่านี้เรียกว่าไวยากรณ์ (Syntax) รวมถึงเกณฑ์ต่าง ๆ เช่น จำนวนตัวอักษรสูงสุดที่อนุญาต, ตัวอักษรที่บรรทัดโค้ดต้องเริ่มต้น หรือความหมายของสัญลักษณ์บางอย่าง เช่น เครื่องหมายอัฒภาค (;)
Label เป็นสัญลักษณ์ที่แทนที่อยู่ของคำสั่งหรือข้อมูลที่ถูกจัดเก็บ จุดประสงค์ของ Label คือการทำหน้าที่เป็นจุดอ้างอิงปลายทางเมื่อถูกเรียกใช้ในคำสั่ง สามารถใช้ Label ได้ทุกที่ ที่สามารถใช้ที่อยู่ได้ในภาษาแอสเซมบลี Label ที่เป็นตัวอักษรจะประกอบด้วยตัวระบุ (Identifier) ตามด้วยเครื่องหมายโคลอน (:) ส่วน Label ที่เป็นตัวเลขจะประกอบด้วยตัวเลขหลักเดียวตามด้วยเครื่องหมายโคลอน
Operators คือสัญลักษณ์ที่เป็นนิพจน์เชิงตรรกะซึ่งอยู่ถัดจาก Label และต้องมีช่องว่างอย่างน้อยหนึ่งช่องก่อนหน้า Operators สามารถเป็นได้ทั้งออปโค้ด (Opcode) หรือไดเรกทีฟ (Directive) โดยออปโค้ดจะตรงกับคำสั่งในภาษาเครื่อง และรวมถึงชื่อรีจิสเตอร์ที่เกี่ยวข้องกับคำสั่งนั้น ส่วนไดเรกทีฟเป็นคำสั่งที่รู้จักในแอสเซมเบลอร์
ไดเรกทีฟคือคำสั่งที่บอกแอสเซมเบลอร์ว่าต้องทำอะไรบ้างในระหว่างขั้นตอนการแอสเซมบลี ไดเรกทีฟมีความสำคัญในการประกาศ หรือจองหน่วยความจำสำหรับตัวแปร ซึ่งสามารถเรียกใช้ในกระบวนการภายหลังเพื่อดำเนินการที่มีความยืดหยุ่นมากขึ้น นอกจากนี้ยังใช้ไดเรกทีฟในการแบ่งโปรแกรมออกเป็นส่วนต่าง ๆ
มาโครในภาษาแอสเซมบลีคือรูปแบบเทมเพลตที่นำเสนอลำดับหรือรูปแบบของคำสั่งที่ใช้บ่อยในหลาย ๆ โปรแกรม โดยฟังก์ชันของแมโครคือการตีความคำจำกัดความของแมโคร และแทรกคำเรียกใช้แมโคร (Macro Call) ลงในโค้ดต้นฉบับในตำแหน่งที่ควรจะมีคำสั่งปกติของภาษาแอสเซมบลีแทนที่จะเป็นชุดของคำสั่งแมโคร
Mnemonic คือคำย่อที่ใช้แทนคำสั่งการดำเนินการในโค้ด ซึ่งจะถูกป้อนเข้าในออปโค้ดของคำสั่งโปรแกรมแอสเซมบลีแต่ละคำสั่ง เพื่อระบุออปโค้ดย่อที่แทนกลุ่มคำสั่งที่ใหญ่กว่า
ภาษาแอสเซมบลีต้องถูกแปลงเป็นภาษาเครื่องโดยใช้แอสเซมเบลอร์ ซึ่งแบ่งออกเป็นสองประเภทหลัก ๆ ดังนี้
แอสเซมเบลอร์ประเภทนี้จะสแกนโปรแกรมเพียงหนึ่งครั้ง และสร้างโปรแกรมเลขฐานสอง (Binary) ที่เทียบเท่ากัน แอสเซมเบลอร์แบบครั้งเดียวจะตรวจสอบโค้ดภาษาแอสเซมบลีโดยการค้นหาจากตารางรหัส Mnemonic Code Table แอสเซมเบลอร์ประเภทนี้ทำงานได้เร็วกว่าแอสเซมเบลอร์แบบหลายครั้ง และไม่จำเป็นต้องสร้างโค้ดกลาง (Intermediate Code)
ภาพจาก : https://byjus.com/gate/introduction-to-compiler-design-notes/
แอสเซมเบลอร์ประเภทนี้จะทำการสแกนโปรแกรมมากกว่าหนึ่งครั้ง สร้างตารางที่ประกอบด้วยสัญลักษณ์ทุกตัว และค่าของมันในครั้งแรก จากนั้นใช้ตารางนี้ในการสแกนครั้งต่อ ๆ ไป เพื่อสร้างโค้ดใหม่ แต่ละการสแกนจะทำหน้าที่แตกต่างกันออกไป แม้ว่ามักจะทำงานช้ากว่า แต่แอสเซมเบลอร์แบบหลายครั้งมีโครงสร้างแบบโมดูลาร์ (Modular Structure) ซึ่งสามารถนำไปใช้ซ้ำกับเครื่องที่แตกต่างกันได้
ภาพจาก : https://byjus.com/gate/introduction-to-compiler-design-notes/
ด้านล่างคือตัวอย่างโค้ดภาษาแอสเซมบลีที่ใช้ Netwide Assembler (NASM)
ภาพจาก : https://www.investopedia.com/terms/a/assembly-language.asp
ในตัวอย่างนี้ คำสั่ง SYSCALL ที่ปรากฏตอนท้ายของโค้ดจะเรียกส่วนของหน่วยความจำที่เก็บบริการของระบบปฏิบัติการไว้ จากนั้นโค้ด RAX ถูกใช้เพื่อเรียกการเขียนโค้ด และ RDI เพื่อออกจากโปรแกรม ฟังก์ชัน SYSCALL ถูกเรียกใช้สองครั้ง ครั้งแรกเพื่อเรียกระบบปฏิบัติการ และครั้งที่สองเพื่อบอกให้ระบบทราบว่าโค้ดเสร็จสิ้นและถึงเวลาที่ต้องออกจากโปรแกรมแล้ว
แม้ว่าภาษาแอสเซมบลีจะถือว่าเป็นภาษาระดับต่ำเมื่อเทียบกับภาษาโปรแกรมสมัยใหม่ที่ง่าย และยืดหยุ่นกว่า แต่มันก็ยังคงมีบทบาทสำคัญในบางงานที่ต้องการการควบคุมฮาร์ดแวร์โดยตรง และต้องการความเร็วในการประมวลผลสูง ปัจจุบันภาษาแอสเซมบลีถูกใช้งานในด้านต่าง ๆ ดังนี้
ภาษาแอสเซมบลีถูกใช้ในอุปกรณ์อิเล็กทรอนิกส์ที่มีข้อจำกัดด้านทรัพยากร เช่น ไมโครคอนโทรลเลอร์ในอุปกรณ์ Internet of Things (IoT) เครื่องใช้ไฟฟ้า และระบบอัตโนมัติ เพราะมันสามารถสั่งงานฮาร์ดแวร์ได้อย่างมีประสิทธิภาพ และช่วยประหยัดทรัพยากรบนอุปกรณ์ได้
ภาพจาก : https://en.wikipedia.org/wiki/Embedded_system
การพัฒนาไดรเวอร์สำหรับอุปกรณ์ฮาร์ดแวร์ และระบบปฏิบัติการบางส่วนยังคงใช้ภาษาแอสเซมบลี เพราะต้องการการเข้าถึงฮาร์ดแวร์ในระดับต่ำ และต้องการความแม่นยำในการทำงานสูง
ในงานที่ต้องการการประมวลผลความเร็วสูง เช่น การประมวลผลกราฟิก, เกมคอนโซล และการคำนวณที่ซับซ้อน โปรแกรมเมอร์ยังใช้ภาษาแอสเซมบลีในการเขียนส่วนที่ต้องการประสิทธิภาพสูงเพื่อให้โปรแกรมทำงานได้เร็วขึ้น
ในอุตสาหกรรมการเงินบางแห่ง เช่น การซื้อขายความถี่สูง (HFT) ต้องการการทำธุรกรรมในระดับมิลลิวินาที (mSec) ภาษาแอสเซมบลีถูกใช้ในการพัฒนาซอฟต์แวร์เพื่อให้คำสั่งซื้อขายถูกดำเนินการด้วยความเร็วที่สูงที่สุด
ภาษาแอสเซมบลียังถูกสอนในหลักสูตรวิทยาการคอมพิวเตอร์ เพื่อให้นักศึกษามีความเข้าใจเชิงลึกเกี่ยวกับการทำงานของคอมพิวเตอร์ และการแปลงคำสั่งของโปรแกรมให้เป็นภาษาเครื่อง (Machine Code)
ถึงแม้ภาษาแอสเซมบลีจะไม่ใช่ตัวเลือกหลักในการพัฒนาโปรแกรมสมัยใหม่ แต่ในบางสถานการณ์ที่ต้องการความเร็ว และการควบคุมฮาร์ดแวร์อย่างละเอียด ภาษาแอสเซมบลีก็ยังคงเป็นเครื่องมือที่ทรงพลัง และขาดไม่ได้
ภาษาแอสเซมบลีเป็นภาษาการเขียนโปรแกรมที่มีประโยชน์มาก โดยช่วยให้โปรแกรมเมอร์ควบคุมฮาร์ดแวร์ได้อย่างละเอียดและสามารถพัฒนาโปรแกรมที่ทำงานได้อย่างรวดเร็ว แต่ภาษาแอสเซมบลีเป็นภาษาที่มีความซับซ้อน ยากต่อการเรียนรู้เมื่อเทียบกับภาษาเชิงสูงอื่น ๆ และไม่สามารถใช้งานข้ามกับเครื่องคอมพิวเตอร์ต่างชนิดกันได้
ปัจจุบันภาษาแอสเซมบลียังคงถูกใช้อยู่ในงานที่ต้องการการควบคุมฮาร์ดแวร์โดยตรง เช่น การพัฒนาระบบฝังตัว (Embedded Systems) และงานที่ต้องการประสิทธิภาพสูง แม้ว่าเทคโนโลยีคอมพิวเตอร์จะพัฒนาไปไกลแล้ว แต่ภาษาแอสเซมบลียังคงมีความสำคัญ และถูกนำมาใช้ในสถานการณ์เฉพาะที่ภาษาอื่นไม่สามารถตอบโจทย์ได้นั่นเอง
|