Tag Archives: Class

Class and Struct

เขียน Swift ไปสักพัก ก็น่าจะพอรู้แล้วแหละว่า ในภาษา Swift มันมี  class , enum , struct   ทั้งสามอย่างนี้เพื่อเก็บข้อมูล แต่หลักๆ ที่มันแตกต่างกัน คือ enum และ struct นั้นเป็น value type ส่วน class นั้นเป็น reference type

Continue reading Class and Struct

Objective-C Programming Chapter 16 (Part2)

ARC

 

วิวัฒนาการในการจัดการหน่วยความจำของภาษา Objective-C ได้เริ่มมาตั้งแต่การใช้ reference counting หรือการนับจำนวน release , retain ต่อมาก็มี autorelease pool และ garbage collector (gc) แต่โปรแกรมเมอร์ก็ยังประสบปัญหาในการจัดการหน่วยความจำอยู่ เช่น จำนวนของ release และ retain นั้นไม่เท่ากัน ซึ่งพบได้บ่อยในผู้ที่เริ่มเขียนโปรแกรมด้วยภาษา Objective-C นอกจากปัญหาเหล่านี้แล้ว เมื่อประกาศอ็อบเจ็กยังต้องพิจารณาอีกว่าอ็อบเจ็กควรจะมีการจัดการหน่วยความจำเป็นแบบ autoreleased หรือไม่ เช่น ควรประกาศสตริงด้วย [[NSString alloc] initWith.. ] หรือจะใช้ [NSString stringWith… ] เป็นต้น ตัวเลือกอื่นในการจัดการปัญหาก็คือ garbage collector แต่ผลที่ตามมาก็คือประสิทธิภาพลดลง และ ไม่สามารถใช้กับ iOS ได้ เพื่อแก้ปัญหานี้ Apple ก็ได้ออกเครื่องมือ ช่วยเหลือให้นักพัฒนาได้ใช้ตรวจสอบหน่วยความจำของโปรแกรม เช่น Static Analyzer และ Instrument แต่อย่างไรก็ตามนักพัฒนาโปรแกรมก็ยังต้องจัดการปัญหาหน่วยความจำนี้ ด้วยตัวเองเช่นเดิม แต่ปัญหาเหล่านี้จะหมดไปเพราะ llvm ได้เพิ่มวิธีการจัดการหน่วยความจำแบบใหม่ ที่สะดวกเหมือน garbage collector และยังมีประสิทธิเหมือนการใช้ reference counting นั่นก็คือ Automatic Reference Counting หรือเขียนย่อๆได้ว่า ARC

ARC คือการมอบหมายให้คอมไพลเลอร์เป็นคนจัดการระบบ reference counting แม้ว่าจะเป็นการจัดการแบบอัตโนมัติเช่นเดียวกับ garbage collector แต่การทำงานนั้นแตกต่างกัน เพราะการจัดการหน่วยความจำด้วย garbage collector นั้นจะทำงานในแบบ runtime ทำให้คอมไพลเลอร์ต้องรวมเอา garbage collector เป็นส่วนหนึ่งของโปรแกรม และนั่นเป็นสาเหตุทำให้โปรแกรมทำงานช้า เพราะมี garbage collector ทำงานอยู่อยู่เบื้องหลังตลอดเวลานั่นเอง แต่ในทางกลับกัน การทำงานของอาร์คจะเกิดขึ้นตอน compile time เพราะสิ่งที่อาร์คทำคือวิเคราะห์และจัดการเพิ่มโค้ดส่วนของ retain,release ให้กับอ็อบเจ็กโดยอัตโนมัติ ดังนั้นประสิทธิภาพของโปรแกรมก็ยังเหมือนเดิมเพราะใช้ reference counting เช่นเดิม แต่โปรแกรมเมอร์ทำงานสะดวกมากขึ้นเพราะไม่ต้องกังวลเรื่อง retain , release อีกต่อไป ยกตัวอย่างโค้ดง่ายๆ เช่น เมธอด getNewString ซึ่งจะสร้างอ็อบเจ็กสตริงและส่งกลับมา เมื่อเขียนในแบบ ARC จะได้โค้ดดังนี้ Continue reading Objective-C Programming Chapter 16 (Part2)

Objective-C Programming Chapter 16 (Part1)

Chapter 16

LLVM & ARC

 

ที่ผ่านมาได้พูดถึง LLVM (Low Level Virtual Machine) อยู่หลายครั้ง ว่าเป็นส่วนที่สำคัญในการพัฒนาโปรแกรม แต่ยังไม่ได้อธิบายความสำคัญของ LLVM ซึ่งเป็นหัวใจของส่วนขยายความสามารถใหม่ๆในภาษา Objective-C อย่าง Automatic Reference Counting และ Block ถึงแม้ว่าชื่อมันจะบอกว่าเป็น low level virtual machine แต่ LLVM กลับเป็น library และชุดเครื่องมือ (toolschain) ที่ช่วยในการพัฒนาคอมไพลเลอร์ เพื่อที่จะให้เข้าใจที่มาที่ไปของ LLVM มากขึ้นจะขออธิบายการทำงานของคอมไพลเลอร์เบื้องต้นสักนิดหนึ่งก่อน

compiler_arch

 

ในอดีตการออกแบบคอมไพลเลอร์จะประกอบด้วยส่วนสำคัญใหญ่ๆ 3 ส่วนคือ ส่วนที่เกี่ยวข้องกับโครงสร้างของภาษา ที่เรียกว่า front end ในส่วนนี้จะมีกระบวนการปลีกย่อยอีกเช่น Parsing , Scanning , Semantic Analysis หน้าที่หลักๆของส่วนนี้คือทำหน้าที่วิเคราะห์และตรวจสอบว่าโค้ดที่เขียนมานั้นมีความถูกต้องตามข้อบังคับต่างๆของภาษา ซึ่งถ้าหากโค้ดที่เขียนมีความถูกต้องเรียบร้อยแล้ว คอมไพลเลอร์จะสร้าง Intermediet Representation (IR) ซึ่งเป็นชุดคำสั่งระดับล่าง ที่เกือบจะเท่า machine code และส่งต่อไปยัง Optimizer ซึ่งเป็นส่วนที่สอง ในขั้นตอนนี้คอมไพลเลอร์จะปรับปรุงประสิทธิภาพของ IR เช่นการตัดโค้ดที่ไม่จำเป็นออก หรือเปลี่ยนลำดับของคำสั่งเพื่อให้ทำงานได้เร็วขึ้น จากนั้นก็จะส่งต่อไปยังส่วนสุดท้ายคือ back end ซึ่งจะทำหน้าที่แปลง IR ให้กลายเป็น machine code ที่พร้อมจะทำงาน
ข้อจำกัดของการออกแบบคอมไพลเลอร์ลักษณะนี้คือไม่สามารถใช้ได้กับคอมพิวเตอร์ทุกๆสถาปัตยกรรมได้ เช่น คอมพิวเตอร์ในระบบอิเล็กทรอนิกขนาดเล็กอาจจะใช้ ARM ส่วนคอมพิวเตอร์ตั้งโต๊ะมีสถาปัตกรรมแบบ X86 หรือคอมพิวเตอร์สมถรรภาพสูงๆใช้ Itanium เป็นต้น และด้วยสถาปัตกรรมที่แตกต่างกัน ชุดคำสั่งของ CPU ก็ไม่เหมือนกัน หากต้องการจะให้คอมไพลเลอร์ทำงานได้กับสถาปัตยกรรมใด ก็ต้องเขียนคอมไพลเลอร์ขึ้นมาใหม่ ถ้าสมมติหากต้องการจะเขียนคอมไพลเลอร์เพื่อให้รองรับภาษา C , BASIC , Objective-C และสามารถทำงานกับทุกๆสถาปัตยกรรม ARM , X86 นั่นหมายถึงว่าต้องเขียนคอมไพลเลอร์ทั้งหมดเป็นจำนวนถึง 3 x 2 = 6 ตัว เลยทีเดียว หรือถ้ากำหนดให้ n เป็นจำนวนภาษา และ m เป็นจำนวนของสถาปัตยกรรมก็จะเห็นว่าจำนวนคอมไพลเลอร์นั้นมีทั้งสิ้น n x m ซึ่งเป็นจำนวนที่เยอะมากดังที่ได้แสดงในรูปต่อไปนี้

compiler_graph Continue reading Objective-C Programming Chapter 16 (Part1)

Objective-C Programming Chapter 4

ในช่วงแรกเริ่มของคอมพิวเตอร์ การเขียนโปรแกรมด้วยภาษาเก่าๆ อย่าง C , Fortran , Assembly เป็นลักษณะการเขียนชุดคำสั่ง (function, subroutine) แบบลำดับขั้นตอนเพื่อการแก้ปัญหา โปรแกรมเมอร์มักจะนึกถึงข้อมูลและการกระทำต่อข้อมูลนั้นเป็นอันดับแรก เป็นต้นว่าจะเขียนโปรแกรมหาพื้นที่ของสี่เหลี่ยมและวงกลม สิ่งที่ต้องคิดเมื่ือเริ่มเขียนโปรแกรมก็คือจะแก้ปัญหานี้ยังไงดี ? โดยทั่วๆไปโปรแกรมเมอร์ทำอย่างแรกก็คือคิดวิธีการคำนวนหาพื้นที่ หลังจากนั้นก็เริ่มเขียนส่วนประกอบต่างๆของโปรแกรม ได้แก่ตัวแปรที่ไว้เก็บข้อมูลต่างๆเช่น ด้านกว้าง ด้านยาว พื้นที่ของสี่เหลี่ยม รัศมีของวงกลมและพื้นที่ของวงกลม เมื่อมีตัวแปรต่างๆแล้วก็เขียนคำสั่งในการคำนวนพื้นที่สี่เหลี่ยมและพื้นที่วงกลมก็เสร็จเรียบร้อย ลักษณะการเขียนโปรแกรมด้วยวิธีการคิดแบบนี้จะเรียกว่า Procedural Programming ซึ่งเหมาะสำหรับการแก้ปัญหาเฉพาะอย่างเช่น แก้ปัญหาสมการคณิตศาสตร์ หรือการคำนวนทางวิทยาศาสตร์ โปรแกรมที่เราได้เขียนไปตั้งแต่บทแรกจนถึงบทที่ 3 ก็เป็นแบบ Procedural เช่นเดียวกัน แนวความคิดการเขียนโปรแกรมแบบนี้มีข้อเสียคือเมื่อโปรแกรมมีความซับซ้อนและมีขนาดใหญ่ การจัดการต่างๆของโปรแกรมทำได้ลำบาก จนกระทั่งในปี 1970 Xerox PARC ได้พัฒนาภาษา Small Talk ขึ้นมา ภาษานี้ได้เสนอแนวคิดของการเขียนโปรแกรมเชิงวัตถุหรือที่เราเรียกว่า Object Oriented Programming (OOP) แนวความคิดนี้เป็นเรื่องใหม่ในวงการการคอมพิวเตอร์ในสมัยนั้น และได้ขยายวงกว้างออกไปอย่างรวดเร็ว เมื่อมีภาษาใหม่ๆเกิดขึ้น เช่น C++ , Java , C# และ Objective-C จึงเป็นภาษาแบบ OOP แทบทั้งสิ้น

 

แล้วอะไรคือการเขียนโปรแกรมเชิงวัตถุละ ? ถ้าคิดถึง “วัตถุ” ในชีวิตประจำวันของเราก็คงจะเข้าใจได้ไม่ยาก คอมพิวเตอร์ รถ บ้าน หมา คน หรือแทบจะทุกอย่างที่สัมผัสจับต้องได้ก็เป็นวัตถุทั้งนั้น แต่ในโลกของโปรแกรมมีความพิเศษกว่าโลกจริงเพราะทุกอย่างสามารถเป็นวัตถุได้ทั้งนั้น ไม่จำเป็นต้องเป็นสิ่งที่จับต้องได้ วัตถุในโลกของการเขียนโปรแกรมคืออะไรก็ตามที่สามารถตีกรอบแนวคิดได้ สมมติว่าเขียนโปรแกรมเล่นดีวีดี ปุ่มกดเล่นหนัง, ภาพและคำบรรยายก็เป็นวัตถุได้ หรือแม้แต่รายการเพลงโปรดก็เป็นวัตถุได้ ทุกอย่างสามารถเป็นวัตถุได้ทั้งนั้น ลองมองกลับไปที่โปรแกรมคำนวนหาพื้นที่สี่เหลี่ยมและวงกลม ถ้าใช้แนวคิด Procedural ก็ต้องคิดลำดับขึ้นในการแก้ปัญหาเป็นอันดับแรก แต่เมื่อเขียนโปรแกรม OOP เราสนใจว่าสิ่งใดคือวัตถุก่อนเป็นอันดับแรก พิจารณาจากโปรแกรมเราก็จะเห็นว่าสี่เหลี่ยมเป็นรูปทรงที่ประกอบไปด้วยความกว้าง ความยาว และพื้นที่ และวงกลมก็เป็นรูปทรงที่มีความยาวของรัศมีและมีพื้นที่เหมือนกัน บางคนอาจจะมองสองสิ่งนี้อาจจะเป็นวัตถุเดียวกันคือ “รูปทรง” หรืออาจจะเป็นคนละวัตถุกันคือ “สี่เหลี่ยม” และ “วงกลม” ก็ได้ เพราะแต่ละคนได้ให้นิยามและตีกรอบของวัตถุในโปรแกรมต่างกัน และไม่มีคำตอบที่ถูกต้องที่สุด คงพอจะมองเห็นภาพโดยรวมของการเขียนโปรแกรมเชิงวัตถุมากขึ้น และจากนี้ไปเราจะได้เรียนรู้คอนเซ็ปต่างๆ ได้ออกแบบและลงมือเขียนโปรแกรม

Continue reading Objective-C Programming Chapter 4