วันอาทิตย์ที่ 17 ตุลาคม พ.ศ. 2553

Objective-C โปรแกรมแรก

ผมและเพื่อนใช้เวลาร่วมกันศึกษาภาษา Objective-C โดยแบ่งเวลาออกเป็นหลายช่วง ช่วงแรกนี้คือพื้นฐานของภาษาครับ
- ตำราที่เราใช้คือ "Programming in Objective-C 2.0" (ตัวหลัก ยังมีตำราอื่นๆอีก)
- เครื่องมือแปลภาษา คือ GNUstep (MSYS System, Core, Devel)
- Text Editor เขียนโค้ดคือ jEdit
- ระบบปฏิบัติการ Windows (XP, 7)

สำหรับเพื่อนๆที่อ่านบทความนี้เป็นเรื่องแรกในบล็อกของผม ผมแนะนำให้อ่านบทความอื่นๆก่อนหน้านี้ โดยเฉพาะที่เกี่ยวข้องกับการ Compile ภาษาครับ ได้แก่
- เครื่องมือเขียนโค้ด Objective-C สำหรับ Windows
- Foundation.h อยู่ไหน ?
- ค้นหา NXConstantString ไม่พบ
- การ Compile ไฟล์ Interface, Implementation และ Main รวมกัน

อย่างไรก็ตามสำหรับบางหัวข้อจากตำรา Programming in Objective-C ผมเพียงตั้งตามตำรา (หัวข้อเขาดี) มิได้มีเจตนาเปลี่ยนแปลงเนื้อหาแต่ประการใด เพียงแต่เมื่อศึกษาแล้วได้สรุปเป็นความคิดของตนเอง (โปรดใช้วิจารณญาณ) ท้ายสุดจึงถ่ายทอดออกมาเป็นบทความเหล่านี้ครับ

จากนี้ไปเราจะติดตั้ง
- GNUstep MSYS System, GNUstep Core, GNUstep Devel ไว้ ณ C:\GNUstep
***หมายเหตุ ติดตั้งตาม default (ตามค่าปกติที่โปรแกรมร้องขอมา) ทุกประการ

ภาษา Objective-C ขณะที่เขียนบทความคือเวอร์ชัน 2.0 ทว่าตัวแปลภาษา (Compiler) ที่เราใช้เข้าใจได้เพียงเวอร์ชัน 1.70 เท่านั้น (รูปจากหนึ่งในขั้นตอนติดตั้ง GNUstep Core)

เริ่มต้นโค้ดโปรแกรมแรก
- สร้าง Folder ชื่อ MyObjectiveC ไว้ ณ D:\
- เปิด jEdit แล้วบันทึกไฟล์ชื่อ program2_1.m ไว้ ณ D:\MyObjectiveC
- โค้ดรายละเอียดดังนี้ (ตามไปก่อน)
***หมายเหตุ รูปเล็กไปให้ Click บริเวณภายในรูปเพื่อดูขนาดจริงครับ

กระบวนการแปลภาษาและ Run โปรแกรม
- เปิด Shell จาก Start -> All Programs -> GNUstep -> Shell
- เปลี่ยน Directory ปัจจุบันไปที่ D:\MyObjectiveC โดยพิมพ์ cd D:\MyObjectiveC แล้วกด Enter

- แปลภาษาด้วยการสั่งให้ตัวแปลภาษาสร้างไฟล์ Executable (.exe) ดังนี้

gcc -o program2_1 program2_1.m
-I 'C:\GNUstep\GNUstep\System\Library\Headers'
-L 'C:\GNUstep\GNUstep\System\Library\Libraries'
-lobjc -lgnustep-base
-fconstant-string-class=NSConstantString
-enable-auto-import

***หมายเหตุ ให้พิมพ์ต่อเนื่องกันไป ไม่ต้องขึ้นบรรทัดใหม่จนกว่าจะพิมพ์คำสั่งสุดท้าย
(-enable-auto-import) เสร็จ จึงค่อยกด Enter

- เราจะได้ไฟล์ program2_1.exe เป็นผลลัพธ์ ซึ่งอยู่ใน Directory เดียวกันกับไฟล์ program2_1.m
- Run ไฟล์ .exe ด้วยคำสั่ง program2_1.exe แล้วกด Enter

จากรูปข้างต้น (มุมขวาล่าง) ผลลัพธ์ที่ได้คือ Hello World!

ภาษา Objective-C มีนามสกุล (ส่วนขยาย) คือ .m รูปด้านล่างนี้แสดงนามสกุลโดยทั่วไปของภาษาโปรแกรมที่ควรทราบ (ตัวอย่าง) ส่วนที่ล้อมด้วยกรอบสีเหลืองคือสกุลที่ผมและเพื่อนๆต้องทำความรู้จักอีกพักใหญ่ครับ

อธิบายโค้ด pragram2_1.m
จากโค้ดภาษา Objective-C ถือว่าอักษรพิมพ์เล็ก-ใหญ่แตกต่างกัน เช่น variable, Variable, VARIABLE ถือว่าเป็นชื่อที่แตกต่างกัน (อ้างถึง Address ในหน่วยความจำต่างกัน) ไวยากรณ์คำสั่ง (Syntax) ส่วนใหญ่ของภาษาเหมือนกับภาษา C นอกจากเรื่องที่เกี่ยวข้องกับ OOP ที่เพิ่มเติมเข้ามา

#import <Foundation/Foundation.h>
คือการนำไฟล์ header ชื่อ Foundation.h ซึ่งอยู่ ณ C:\GNUstep\GNUstep\System\Library\Headers\Foundation รวมเข้ากับโปรแกรมเพียงครั้งเดียว ไม่ว่าจะถูก Compile (แปลภาษา) กี่ครั้งก็ตาม ต่างจาก #include ของภาษา C ที่ต้องอาศัยกลไกอื่นช่วยเหลือแทน

***ให้ประเด็น หากเรารวมไฟล์ header ด้วย #include โดยไม่มีกลไกป้องกัน (รวมเข้ากับโปรแกรมทุกครั้งที่ Compile) จะเกิดอะไรขึ้นครับ ? คิดๆ...

int main(int argc, const char* argv[])
คือฟังก์ชันชื่อ main ซึ่งเป็นฟังก์ชันหลักฟังก์ชันแรกที่จะทำงานทันทีเมื่อเพื่อนๆสั่ง Compile โปรแกรม มีรายละเอียดดังนี้
- int (แรกสุด) สำหรับระบุ type ของค่าที่ฟังก์ชัน main ต้องส่งกลับ
- int argc สำหรับระบุจำนวน input ที่รับเข้ามาให้กับฟังก์ชัน
- const char* argv[] สำหรับระบุ path ไฟล์ที่ input จากภายนอกเข้าสู่ฟังก์ชัน (มากเท่าต้องการ เว้นแต่ละ path ด้วยช่องว่าง)
โดยทั่วไปแล้วจำนวนของ path จะถูกกำหนดให้กับ argc

NSAutoreleasePool* pool;
pool = [[NSAutoreleasePool alloc] init];

- NSAutoreleasePool คือชื่อคลาส
- pool คือชื่อออบเจ็กค์สำหรับชี้หน่วยความจำ มีชนิดเป็น NSAutoreleasePool*
- [NSAutoreleasePool alloc] คือรูปแบบการส่งข่าวสาร (Message) ให้กับ NSAutoreleasePool เพื่อค้นหาและเรียก Method ชื่อ alloc เพื่อจองหน่วยความจำ
- init คือ method กำหนดค่าเริ่มต้นหลังจองหน่วยความจำ
***หมายเหตุ บรรทัดลักษณะนี้จะถูกอธิบายเพิ่มเติมในหัวข้อต่อๆไป

NSLog(@"Hello world!");
คือฟังก์ชันชื่อ NSLog (คล้ายกับ printf ของภาษา C) ทำหน้าที่แสดงผลข้อความ "Hello world!" ออกทาง Shell โดยต้องระบุเครื่องหมาย @ ไว้ด้านหน้าข้อความเสมอ

[pool drain];
คืนหน่วยความจำซึ่งถูกชี้โดยออบเจ็กค์ชื่อ pool ด้วย Method ชื่อ drain (ออบเจ็กค์อื่นๆส่วนใหญ่จะใช้ release)
***หมายเหตุ บรรทัดลักษณะนี้จะถูกอธิบายเพิ่มเติมในหัวข้อต่อๆไป

return 0;
คืนค่าเลข 0 เป็นผลลัพธ์การทำงานจากฟังก์ชัน main

ไม่มีความคิดเห็น:

แสดงความคิดเห็น