Compile C Family Language using Clang (Front-end for LLVM)

สำหรับคนที่ใช้ Command Line Interface (Terminal, DOS) ในการ Compile code นั้น
ผมเคยเขียนไว้แล้ว Blog หนึ่งคืออันนี้

http://www.macbaszii.com/2012/01/command-line-compiling-cc-java-windows.html

ซึ่งตอนนั้นเราใช้ gcc, g++ (GNU Compiler Collection) ในการ Compile C/C++
วันนี้ผมจะมาแนะนำ Compiler ตัวใหม่ ซึ่งติดมากับ Mac OS X รุ่นใหม่ๆ ถ้าเราลง Xcode นะครับ
เนื่องจากการพัฒนา Mac, iOS ณ ตอนนี้จะใช้ Compiler ตัวนี้เป็น Front-end ให้ LLVM Compiler
LLVM ใช้แนวคิดแบบเวอร์ชวลแมชีนกับการคอมไพล์โปรแกรม โดยมันจะแปลงภาษาโปรแกรมที่เราคุ้นกันดีมาอยู่ในรูป intermediate form หรือ IF (คล้ายกับ Bytecode ของ Java หรือ CIL ของ .NET) จากนั้นค่อยแปลง IF เป็นภาษาเครื่องอีกทีหนึ่ง
แนวทางของ LLVM ช่วยให้การรีดประสิทธิภาพทำได้ง่ายขึ้น เพราะนักพัฒนาของ LLVM สามารถเน้นไปที่การแปลง IF เป็นภาษาเครื่องเพียงขั้นตอนเดียว ส่วนการแปลงภาษาโปรแกรมเป็น IF จะใช้โค้ดอีกส่วนที่เรียกว่า front end ซึ่งรองรับภาษาที่แตกต่างกันไป (front end หลักของ LLVM สำหรับภาษา C/C++/Objective-C มีชื่อว่า Clang)
จุดเด่นของ LLVM อยู่ที่ประสิทธิภาพของการคอมไพล์ ทั้งในแง่เวลาที่ใช้คอมไพล์โปรแกรม และทรัพยากรของเครื่องที่ใช้คอมไพล์โปรแกรม (เช่น ซีพียู แรม ดิสก์) ผลทดสอบในบางกรณีแสดงให้เห็นว่า LLVM/Clang คอมไพล์ได้เร็วกว่า GCC ถึง 3 เท่าตัว อย่างไรก็ตาม LLVM ยังมีจุดอ่อนตรงที่โปรแกรมที่คอมไพล์แล้วยังมีประสิทธิภาพดีไม่เท่ากับโปรแกรมที่คอมไพล์ด้วย GCC (อธิบายง่ายๆ ว่า compile time ชนะแต่ run time ยังแพ้) และยังไม่รองรับซีพียูหลากหลายเท่ากับ GCC -- mk
ชื่อของมันคือ Clang
อ่านรายละเอียดเต็มๆ ได้ที่นี่ครับ --> http://clang.llvm.org
ใครใช้ Linux ลองหาวิธีลงดูนะครับ

สิ่งที่น่าสนใจของ Clang อันหนึ่งก็คือ User-Friendly Error Message
ซึ่งจะบอกเราเลยว่า ลืมอะไรตรงไหนหรือปล่าว ? เขียนอะไรผิดไหม ? ชี้ตำแหน่งด้วย = ='
** สำหรับมนุษย์ที่ไม่เคยใส่ใจ Error Message ใช้ Compiler ตัวไหนก็เหมือนกันนะครับ :P

งั้นเรามาดูวิธีการใช้งานกันดีกว่า ซึ่งนอกจาก C/C++ แล้ว Clang สามารถ compile Objective-C ได้ด้วย
โดยการ Compile C/C++ นั้นก็ใช้คำสั่ง clang, clang++ ตามลำดับครับ
$ clang filename.c -o executeFileName
$ clang++ filename.cpp -o executeFileName
** -o executeFileName เป็น optional ครับ ถ้าไม่ใส่ตัว executeFile จะอยู่ในชื่อ a.out เรียกโดยใช้ ./a.out
Example Program
คราวนี้ถ้าเราใช้ Feature ใหม่ๆ ของ C++11 เราก็สามารถใส่ option ลงไปได้แบบนี้
ตัวอย่างคือการใช้ Auto Variable และ Range Based Loop

ต่อไปมา Compile Objective-C กันบ้าง ... เผื่อเราอยากทดสอบ Code อะไรสักอย่าง
ก็ไม่จำเป็นต้องไปสร้าง Command Line Tool Project ให้เลอะเทอะเครื่อง ... เขียนสดซะเลย
$ clang -fobjc-arc -framework Foundation filename.m -o executeFileName
ซึ่งเราต้องใส่ framework option ไปตอน Compile ด้วยครับ :)
ซึ่งตัวอย่างในที่นี้ผมจะเขียนในรูปแบบของ ARC (Automatic Reference Counting) นะครับ
** ใครเขียนแบบปกติ (non-ARC) ก็เอา -fobjc-arc ออก ส่วน -o executeFileName ก็เป็น optional เช่นกัน


แค่นี้แหละครับ ลองนำไปใช้กันดู กันแหล่มมากเลยนะ :) 
ความเร็วอาจจะเร็วกว่าในโปรแกรมใหญ่ๆ ก็ได้นะ 

Comments

Post a Comment

Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

Command Line Compiling C/C++ ,Java [Windows, Mac]

การเขียนโปรแกรมแก้ปัญหา "โจทย์รูปทรงสมมาตร"