วันนี้จะเล่าเรื่อง Compiler ครับ เคยเล่าไปแล้วว่าภาษาที่ใช้เขียนโปรแกรมใน UNIX/Linux ส่วนใหญ่เป็น C/C++ ภาษาอย่าง Java นั้นใช้เขียนโปรแกรมสำหรับใช้งาน หรืออย่าง Python ก็มักนิยมกันในงานด้าน AI
Compiler ที่ใช้กันมาตั้งแต่ยุคเริ่มต้นของ Linux คือ gcc (GNU C Compiler) ของอีตา Richard Stallman ใช้กันมาตั้งแต่เริ่มมี Linux ร่วม 30 ปีแล้ว gcc เก่งมาก สามารถคอมไพล์โปรแกรมได้หลายภาษา (เช่น Java, Ada, FORTRAN etc) ในส่วนของ C ก็ได้ทั้ง C และ C++ และผลของการ compile ก็ได้ทุก distro ของ Linux มีคนใช้เยอะหาความรู้ได้ง่าย โปรแกรส่วนใหญ่ใช้ gcc compile ทั้งนั้น
ตัว gcc เองเขียนด้วย C ล้วนๆ ดังนั้นตอน compile gcc เวลา port ไประบบใหม่ๆ ก็ใช้แค่ cross platform C มาคอมไพล์ ไม่ต้องใช้ C++
ตัวเลือกนอกจาก gcc ในยุคแรกมีไม่มาก ที่มีคือ Elkhound-based C++ Parser และ Portable C Compiler แต่ความนิยมต่างกันมาก
พอมาถึงปี 2008 สิ่งที่ช็อกโลกคือ Apple เปลี่ยนจาก gcc มาใช้ clang ทั่วโลกต้องหันดูครับ พี่จ๊อบส์ทำอะไรต้องมีเหตุผล
clang เป็นส่วนหนึ่งของโครงการ llvm ซึ่งเป็นโครงการของ University of Illinos เป็น virtual machine สำหรับวิเคราะห์การคอมไพล์ แต่ตัวมันสามารถคอมไพล์โปรแกรมได้ ตอนหลังขยายใหญ่ขึ้นไม่ได้เป็น vm แล้ว แต่กลายเป็น toolchain สำหรับคอมไพล์โปรแกรมไป ประกอบด้วย subproject จำนวนมาก หลักการคือมีการกำหนดภาษากลาง LLVM IR (LLVM intermediat representation) ตัว LLVM สามารถ compile IR เป็น object code สำหรับ platform ต่างๆได้
วิธีนี้เหมาะสำหรับการทำ คอมไพล์เลอร์สมัยใหม่เพราะคล่องตัว สามารถมี frontend ที่ transpile ภาษาต่างๆ (เช่น C, C++ ) มาเป็น LLVM IR แล้วให้ LLVM คอมไพล์ต่อ
CLang ก็คือ frontend สำหรับ เปลี่ยนซอร์ซโค๊ด C/C++ ให้เป็น LLVM IR แล้วให้ LLVM คอมไพล์ต่อไป
ตอนที่ Apple เปลี่ยนมาใช้ clang ในปี 2008 ทีม opensource ของ Apple เล่าเหตุผลไว้ยาวเหยียดที่นี่ https://opensource.apple.com/…/clang/www/comparison.html
อีตา Stallman อ่านแล้วคงช้ำใจ แต่ก็ทำอะไรไม่ได้ เพราะ gcc นั้นทั้งใหญ่ และเก่า แก้ไขยาก เรียนรู้ยาก ปรับแต่งยาก ไม่สามารถเอาหลาย target มาร่วมเป็น executable ไฟล์เดียวได้… เช่น compile สำหรับ mips, arm แล้ว pack ลงใน executable เดียว เอาไปรันใน OS ที่มี architecture ที่ต่างกันได้
ตอนคอมไพล์ gcc จะ simplify source code แต่ LLVM ไม่ทำ ดังนั้นการ debug โปรแกรมที่ compile ด้วย gcc มีปัญหา
คำสรรเสริญมีอีกมาก ไปอ่านเองนะครับ โดยสรุปคือโลกก็เลยเปลี่ยนตาม หลังๆ มานี่ clang จะเป็นที่นิยมมากขึ้นเรื่อยๆ gcc ก็ค่อยๆ ลดส่วนแบ่งการใช้งานลงไปเรื่อยๆ
ภาษาใหม่ๆ จะใช้ LLVM เกือบหมด รวมทั้ง WebAssembly ที่คอมไพล์ด้วย.Emscripten ก็อาศัย LLVM IR มาเป็นตัวตั้งต้น
ที่สำคัญ โลโก้ มันโคดเท่