วันจันทร์ที่ 7 ธันวาคม พ.ศ. 2552

แนวคิดการสอนเขียนโปรแกรม

1. แนวคิดการสอนเขียนโปรแกรม
หลายครั้งที่ผมต้องเริ่มสอนเขียนโปรแกรม ให้นักเรียนกลุ่มใหม่ และก็ต้องบอกเล่า ด้วยประโยคเดิมทุกครั้งว่า "การเขียนโปรแกรม ทุกภาษานั้นเหมือนกัน" สิ่งที่แตกต่างกัน ของแต่ละภาษาคือ syntax แต่สิ่งที่เหมือนกันของทุกภาษาคือ การใช้ประสบการณ์จากภาษาหนึ่ง ไปใช้ในอีกภาษาหนึ่งได้ ด้วยการซึมซับ เรื่องของ Structure Programming จนเข้าใจ เพื่อควบคุมในสิ่งที่คล้าย ๆ กันคือ input, process และ output ซึ่งหมายความว่า ถ้าท่านเขียนโปรแกรมอะไร ในภาษาหนึ่งได้แล้ว การเขียนโปรแกรมแบบนั้น ในภาษาอื่นย่อมไม่ใช่เรื่องยากอีกต่อไป เพียงแต่ต้องศึกษาถึง syntax หรือ รูปแบบการเขียนของภาษาใหม่นั้นเพิ่มเติม แล้วนำประสบการณ์ที่เคยเขียน ไปสั่งให้ภาษาใหม่ทำงานตามต้องการ ผมจึงมักสนับสนุนให้นักเรียน ได้ศึกษาภาษาที่ไม่มีตัวช่วยมาก เพื่อให้เข้าใจในหลักการ และขั้นตอนการทำงาน อย่างละเอียดชัดเจน จากการทำงานของตัวแปรภาษาที่มีตัวช่วยน้อย ทำงานบน dos สามารถแปลเป็น exe และ นำไปใช้ได้โดยไม่ยุ่งยาก เช่น c, pascal, basic, fox... หรือ clipper เป็นต้น

2. ความหมายของ Structure Programming
การโปรแกรมแบบมีโครงสร้าง หรือ การโปรแกรมโครงสร้าง คือ การกำหนดขั้นตอนให้เครื่องคอมพิวเตอร์ทำงานโดยมีโครงสร้างการควบคุมพื้นฐาน 3 หลักการ ได้แก่ การทำงานแบบตามลำดับ(Sequence) การเลือกกระทำตามเงื่อนไข(Decision) และ การทำซ้ำ(Loop)
ตำราหลายเล่มจะขยายความออกไปว่า Decision แยกเป็น If และ Case ส่วน Loop แยกเป็น While และ Until ถ้าแยกให้ละเอียดก็อาจได้ถึง 5 หลักการ แต่ในที่นี้ขอนำเสนอไว้เพียง 3 หลักการ ดังนี้
2.1 การทำงานแบบตามลำดับ(Sequence) คือ การเขียนให้ทำงานจากบนลงล่าง เขียนคำสั่งเป็นบรรทัด และทำทีละบรรทัดจากบรรทัดบนสุดลงไปจนถึงบรรทัดล่างสุด สมมติให้มีการทำงาน 3 กระบวนการคือ อ่านข้อมูล คำนวณ และพิมพ์ จะเขียนเป็นผังงาน(Flowchart) ในแบบตามลำดับได้ตามภาพ
2.2 การเลือกกระทำตามเงื่อนไข(Decision) คือ การเขียนโปรแกรมเพื่อนำค่าไปเลือกกระทำ โดยปกติจะมีเหตุการณ์ให้ทำ 2 กระบวนการ คือเงื่อนไขเป็นจริงจะกระทำกระบวนการหนึ่ง และเป็นเท็จจะกระทำอีกกระบวนการหนึ่ง แต่ถ้าซับซ้อนมากขึ้น จะต้องใช้เงื่อนไขหลายชั้น เช่นการตัดเกรดนักศึกษา เป็นต้น ตัวอย่างผังงานนี้ จะแสดงผลการเลือกอย่างง่าย เพื่อกระทำกระบวนการเพียงกระบวนการเดียว
2.3 การทำซ้ำ(Repeation or Loop) คือ การทำกระบวนการหนึ่งหลายครั้ง โดยมีเงื่อนไขในการควบคุม หมายถึงการทำซ้ำเป็นหลักการที่ทำความเข้าใจได้ยากกว่า 2 รูปแบบแรก เพราะการเขียนโปรแกรมแต่ละภาษา จะไม่แสดงภาพอย่างชัดเจนเหมือนการเขียนผังงาน(Flowchart) ผู้เขียนโปรแกรมต้องจินตนาการ ถึงรูปแบบการทำงาน และใช้คำสั่งควบคุมด้วยตนเอง ตัวอย่างผังงานที่นำมาแสดงนี้เป็นการแสดงคำสั่งทำซ้ำ(do while) ซึ่งหมายถึงการทำซ้ำในขณะที่เป็นจริง และเลิกการทำซ้ำเมื่อเงื่อนไขเป็นเท็จ


3. การเริ่มต้นเขียนโปรแกรม
เริ่มต้นเขียนโปรแกรม เริ่มต้นตรงไหน : สำหรับผม เมื่อได้มาทำหน้าที่สอนหนังสือ โดยเฉพาะการเขียนโปรแกรมทุกภาษา ผมจะสอนให้นักศึกษาเขียนโปรแกรมควบคุมตัวเลข เช่นการพิมพ์ 1 ถึง 10 หรือ สูตรคูณ หรือปิรามิดของตัวเลข ที่ต้องฝึกใช้ Structure Programming ให้ชำนาญ และปัญหาก็เกิดขึ้นทุกครั้ง คือ "นักเรียนบ่นว่าไม่ชอบเขียน ไม่มีประโยชน์" หรือ "เขียนไม่ได้ ถึงเขียนได้ ก็ไม่รู้จะเขียนไปทำไม" แล้วผมก็ต้องกลับไปอธิบายอีกครั้งว่า การเริ่มต้นแบบนี้ "จะทำให้รู้จักควบคุมโปรแกรม ตามหลักการของโปรแกรมแบบมีโครงสร้างได้ชำนาญขึ้น รู้จักเรียนรู้ และแก้ปัญหาด้วยตนเอง รวมทั้งรู้จักแก้ไข Syntax พื้นฐานไม่ให้ผิดพลาด เมื่อสามารถเขียนโปรแกรมในระดับต่อ ๆ ไปได้"
    เริ่มต้นเขียนโปรแกรมทำอย่างไร (จากหนังสือ พื้นฐานเว็บมาสเตอร์บทที่ 17)
  1. เลือกภาษา สำหรับนักเรียน นักศึกษานั้นง่ายที่จะเลือก เพราะอาจารย์คอยชี้แนะ
  2. หาแหล่งข้อมูลอ้างอิงจากห้องสมุด ถ้าท่านไม่มีอะไรอยู่ในมือเลย คงนึกโครงสร้างภาษาไม่ออกเป็นแน่
  3. หาตัวแปลภาษา ทุกภาษาต้องมีตัวแปลภาษา มีหลายภาษาที่ถูกสร้างเป็น Free compiler ต้องหาดู
  4. เขียนโปรแกรมตัวแรกที่ง่าย เช่น พิมพ์เลข 5 เป็นต้น
  5. ศึกษาการทำซ้ำ และการเลือกตามเงื่อนไข เช่นพิมพ์สูตรคูณ หรือพิมพ์ 1 ถึง 10 เป็นต้น
  6. ติดต่อแฟ้มข้อมูล เพื่ออ่านมาแสดงผล หรือปรับปรุงข้อมูลได้
  7. เขียนเมนู เพื่อเลือกกระทำโปรแกรมตามตัวเลือก
  8. ทำรายงานจากการเชื่อมแฟ้มหลายแฟ้ม โดยกำหนดได้หลายตัวเลือก
  9. เขียนโปรแกรมเพิ่มข้อมูล เช่น ซื้อ ขาย ยืม คืน หรือโปรแกรมลงทะเบียนนักศึกษาแต่ละภาคเรียนเป็นต้น
  10. สร้างโปรแกรมขึ้นมาระบบหนึ่งให้สมบูรณ์ (ความสมบูรณ์
    4. การบ้านคือ บันไดสู่ประสบการณ์
    การบ้าน (Project) : การสั่งงานให้นักเรียนได้ทำ เป็นสิ่งที่สำคัญมาก ผมได้เรียนแบบอาจารย์ที่เคยสอนผมเสมอ คือ สั่งงานเกือบทุกชั่วโมงเรียน ยกเว้นเทศกาล หรือวันหยุดราชการ ที่เว้นให้นักเรียนได้พักบ้าง สำหรับ project จะต้องใช้หลักการที่สำคัญทั้งหมดที่ได้เรียนมา หรือที่ศึกษาค้นคว้าเพิ่มเติม ด้วยตนเอง และต้องใหญ่พอที่จะใช้เวลาทำทั้งสัปดาห์ไม่เสร็จ แต่จะต้องใช้เวลาทำอย่างต่อเนื่อง ตลอดทั้งภาคเรียน การยอมรับคำวิงวอนให้ลดงานของนักเรียนนั้น อาจทำได้ตามความเหมาะสม กับบทเรียนที่ได้สอนไป แต่ขนาดงานก็ไม่ควรน้อยกว่า การทำให้นักศึกษา ได้ฝึกฝน และใช้เวลาศึกษาด้วยตนเอง (Self learning) อย่างน้อย 1 สัปดาห์ เพื่อทำให้โครงงานสำเร็จลุล่วง และในบางวิชาของการเขียนโปรแกรม ควรมีโครงงานทั้งก่อนสอบกลางภาค และปลายภาค คือมี Project 2 ชิ้น ในวิชานั้น และที่สำคัญที่สำคัญที่สุดสำหรับหลักการสั่งงานของผมคือ งานชิ้นใหญ่จะต้องเป็นงานเดี่ยว เพื่อให้ทุกคนได้มีโอกาสทำด้วยตนเอง มีความภูมิใจในความสำเร็จ และเป็นผู้รับผิดชอบขั้นตอนทั้งหมดด้วยตนเอง ผมจะไม่มอบ project ชิ้นใหญ่เป็นงานกลุ่ม เพราะไม่ต้องการให้นักเรียนคนใดเลย พลาดขบวนการเรียนรู้ แม้แต่ขั้นตอนเดียว และอาจารย์จะต้องมีเวลาที่จะตอบข้อซักถามเสมอ เพราะบ่อยครั้งที่อาจจะสอนผิด สั่งงานผิด นักเรียนนั่งหลับ นักเรียนจดผิด หนังสืออ้างอิงเขียนผิด หรือแม้แต่การตรวจงานผิดของอาจารย์ ก็เป็นได้
    กรกฎาคม 2545 หลังจากผมสอนมาสิบปี พบว่าการมอบหมายงานให้นักศึกษาไปทำงานในคอมพิวเตอร์ที่บ้าน โดยให้ฝึกปฏิบัติด้วยตนเอง ประสบความล้มเหลวมาโดยตลอด เพราะมีนักศึกษาส่วนหนึ่ง ไม่มีคอมพิวเตอร์ ไม่สนใจที่จะเขียนโปรแกรม ไม่ต้องการที่จะคิด และยอมแพ้ ทุกครั้งที่ให้เขียนโปรแกรมง่าย ๆ ทั้ง ๆ ที่มีโปรแกรมยาก ๆ รออยู่อีกมากมาย แต่นักศึกษาทำไม่ได้ จึงนึกการให้งานแบบล่าสุดออกคือ การให้ลอกโปรแกรมด้วยมือ เช่น มีโปรแกรมง่าย ๆ หรือควรรู้อยู่ 15 โปรแกรม จึงมอบหมายให้ลอกลงกระดาษ 4 รอบ และให้เสร็จใน 1 สัปดาห์ ผลที่ได้คือนักศึกษาได้อ่านหนังสือ จดจำรูปแบบภาษาได้มากขึ้น งานที่ให้ลอกไม่ได้หยุดที่ 60 โปรแกรม แต่มากขึ้น หรือน้อยลงขึ้นกับความเข้าใจ และเนื้อหาที่สอน การทำให้นักศึกษา คิดเป็น และแก้ปัญหาโจทย์ได้ เป็นอีกปัญหาหนึ่งที่ต้องสอนในห้องปฏิบัติการ ส่วนการจำรูปแบบคำสั่งไม่ได้ แก้ไขได้ด้วยการสั่งให้ลอกโปรแกรมเท่านั้น ความคาดหวังของผู้สอนว่านักศึกษาจะตั้งใจเรียน แล้วกลับไปทำคอมพิวเตอร์ที่บ้าน โดยไม่ลอกเพื่อนเพียงอย่างเดียว ผมทำมา 10 ปี แต่ไม่ได้ผลเลย
    ก็คือการสนองทุกความต้องการของผู้ใช้)

วันจันทร์ที่ 30 พฤศจิกายน พ.ศ. 2552

การเขียนโปรแกรมเชิงวัตถุ

การเขียนโปรแกรมเชิงวัตถุ (Object-oriented programming, OOP) คือหนึ่งในรูปแบบคอมพิวเตอร์ ที่ให้ความสำคัญกับ วัตถุ ซึ่งสามารถนำมาประกอบกันและนำมาทำงานรวมกันได้ โดยการแลกเปลี่ยนข่าวสารเพื่อนำมาประมวลผลและส่งข่าวสารที่ได้ไปให้ วัตถุ อื่นๆที่เกี่ยวข้องเพื่อให้ทำงานต่อไป

แนวคิดการเขียนโปรแกรมแบบดังเดิมวิธีการคิดแบบการเขียนโปรแกรมเชิงกระบวนการ

เมื่อมีการหยอดเหรียญเข้าตู้:

  1. ตรวจสอบจำนวนเหรียญและชนิดของเหรียญ
  2. แสดงผลชนิดของน้ำที่สามารถเลือกซื้อได้
  3. ตรวจสอบจำนวนน้ำกระป๋องที่มีอยู่ในตู้
  4. รับผลการเลือกชนิดน้ำ
  5. ส่งน้ำที่เลือกออกมาจากช่อง
  6. จัดเก็บเงินเข้าระบบ
  7. หากมีเงินทอน ให้ทอนเงินที่เหลือ ที่ช่องรับเงินทอน

วิธีการคิดแบบการเขียนโปรแกรมเชิงวัตถุ

ตู้ขายเครื่องดื่มอัตโนมัติ ประกอบด้วยส่วนประกอบต่างๆได้แก่ หน่วยตรวจสอบและจัดการเรื่องเงิน หน่วยจัดการเครื่องดื่ม หน่วยแสดงผลและรอรับคำสั่ง

  • หน่วยตรวจสอบและจัดการเรื่องเงิน มีข้อมูลเกี่ยวกับเงินที่ได้รับ และเงินที่มีอยู่ในระบบ สามารถรับและตรวจสอบเงินที่หยอดเข้ามาได้ และทอนเงินได้
  • หน่วยจัดการเครื่องดื่ม มีข้อมูลชนิดของเครื่องดื่ม จำนวนเครื่องดื่ม สามารถจัดเตรียมชนิดเครื่องดื่มที่พอกับเงินที่หยอด และสามารถจ่ายเครื่องดื่มออกมาจากตู้ได้
  • หน่วยแสดงผลและรอรับคำสั่ง มีหน้าที่รอรับคำสั่ง และแสดงผลเงินที่หยอดเข้ามา

หมายเหตุ ตัวอย่างนี้เป็นเพียงตัวอย่างโดยสังเขป

แนวคิดที่สำคัญของการเขียนโปรแกรมเชิงวัตถุ

  • คลาส (Class) - ประเภทของวัตถุ เป็นการกำหนดว่า วัตถุ จะประกอบไปด้วย ข้อมูล(data) หรือคุณสมบัติ(property) และ พฤติกรรม(behavior)หรือการกระทำ() อะไรบ้าง ซึ่ง คลาส (เช่น มนุษย์) เป็นโครงสร้างพื้นฐานของการเขียนโปรแกรมเชิงวัตถุ
  • วัตถุ (Object) - โดยมากจะเรียกว่า อ็อบเจกต์ คือ ตัวตน(instance) ของ คลาส(เช่น นายทักษิณ, นายสนธิ) ซึ่งจะเกิดขึ้นระหว่าง run-time โดยแต่ละ อ็อบเจกต์ จะมีข้อมูลเฉพาะของตัวเอง ทำให้ อ็อบเจกต์ แต่ละ อ็อบเจกต์ ของ คลาส ซึ่งใช้ source code เดียวกันมีคุณลักษณะและคุณสมบัติที่แตกต่างกัน
  • Encapsulation - การปิดบังข้อมูล เป็นวิธีการกำหนดสิทธิในการเข้าถึงข้อมูล หรือการกระทำกับ อ็อบเจกต์ ของ คลาสนั้นๆ ทำให้แน่ใจได้ว่าข้อมูลของอ็อบเจกต์นั้นจะถูกเปลี่ยนแปลงแก้ไขผ่านทาง methods หรือ properties ที่อนุญาตเท่านั้น (เช่น การกำหนดตำแหน่งทางการเมือง เป็น public method ที่ผู้อื่นสามารกระทำได้ ส่วนการลาออกจากตำแหน่ง เป็น private method ที่มีแต่ อ็อบเจกต์ ของ คลาส เท่านั้นที่จะสามารถทำได้ แต่การกดดันและการขับไล่สามารถสร้าง data ที่อาจจะส่งผลเกิดการลาออกได้เช่นกัน)
  • Inheritance - การสืบทอดคุณสมบัติ เป็นวิธีการสร้าง คลาสย่อย ที่เรียกว่าซับคลาส (subclass) ซึ่งจะเป็นกำหนดประเภทของวัตถุให้จำเพาะเจาะจงขึ้น ซึ่ง ซับคลาส จะได้รับถ่ายทอดคุณสมบัติต่างๆมาจากคลาสหลักด้วย (เช่น คลาส มนุษย์ สืบทอดมาจาก คลาส สิ่งมีชีวิต)
  • Abstraction - นามธรรม เป็นการแสดงถึงคุณลักษณะและพฤติกรรมของ object เท่าที่จำเป็นต้องรับรู้และใช้งาน โดยซ่อนส่วนที่เหลือเอาไว้เพื่อไม่ให้เกิดความสับสน เช่น ตามปกติแล้ว นายทักษิณ จัดเป็นตัวตนของ คลาส มนุษย์ ซึ่งจะมีพฤติกรรม การกระทำทุกอย่างที่ตามที่กำหนดไว้ตามโครงสร้างของ คลาส มนุษย์ แต่ในบางกรณีที่นำไปใช้งาน เราไม่ต้องการให้เกิดการสับสนต่อการใช้งานหรือการจัดประเภทมากเราสามารถจัดการหรือใช้งาน อ็อบเจกต์ นายทักษิณ ให้อยู่ในรูปของสิ่งมีชิวิต ก็ได้
  • Polymorphism - ภาวะที่มีหลายรูปแบบ เป็นวิธีการกำหนดรูปแบบการกระทำที่เหมือนกันแต่ได้ผลที่แตกต่างกัน เช่น การเปล่งเสียง เป็น method หลักของ คลาส สิ่งมีชีวิต ซึ่งมีคลาส มนุษย์ และคลาสสุนัข เป็น ซับคลาส แต่ผลของการเปล่งเสียงของอ็อบเจกต์จากคลาสทั้งสองจะออกมาไม่เหมือนกันมักนิยมใช้ การเขียนโปรแกรมเชิงกระบวนการ (Procedural Programming) ซึ่งให้ความสำคัญกับขั้นตอนกระบวนการที่ทำ โดยแบ่งโปรแกรมออกเป็นส่วนๆตามลำดับขั้นตอนการทำงาน แต่แนวคิดการเขียนโปรแกรมเชิงวัตถุนั้นให้ความสำคัญกับ ข้อมูล(data) และ พฤติกรรม(behavior) ของวัตถุ และความสัมพันธ์กันระหว่างวัตถุกันมากกว่า

วันพฤหัสบดีที่ 19 พฤศจิกายน พ.ศ. 2552

จุดเริ่มต้นของภาษาซี

จุดเริ่มต้นของภาษาซี

ภาษาซีเกิดขึ้นในปี ค.ศ.1972 โดย Dennis Ritchie แห่ง Bell Labs โดยภาษาซีนั้นพัฒนามาจาก ภาษา B และจากภาษา BCPL ซึ่งในช่วงแรกนั้นภาษาซีถูกออกแบบให้ใช้เป็นภาษาการเขียนโปรแกรมในระบบ UNIX และเริ่มมีคนสนใจมากขึ้นในปี ค.ศ.1978 เมื่อ Brain Kernighan ร่วมกับ Dennis Ritchie พัฒนามาตรฐานของภาษาซีขึ้นมา คือ K&R (Kernighan & Ritchie) และทั้งสองยังได้แต่งหนังสือชื่อว่า "The C Programming Language" โดยภาษาซีนั้นสามารถจะปรับใช้กับเครื่องคอมพิวเตอร์รูปแบบต่างๆได้ ต่อมาในช่วง ปี ค.ศ.1988 Ritchie และ Kernighan ได้ร่วมกับ ANSI (American National Standards Institute) สร้างเป็นมาตรฐานของภาษาซีขึ้นมาใหม่มีชื่อว่า "ANSI C"Dennis Ritchieภาษาซีนั้นจัดเป็นภาษาที่ใช้ในการเขียนโปรแกรมที่นิยมใช้งาน ซึ่งภาษาซีจัดเป็นภาษาระดับกลาง (Middle-Level Language) เหมาะกับการเขียนโปรแกรมแบบโครงสร้าง (Structured Programming) โดยมีคุณสมบัติโดดเด่นอย่างหนึ่งคือ มีความยืดหยุ่นมาก กล่าวคือ สามารถทำงานกับเครื่องมือต่างๆ สามารถปรับเปลี่ยนการเขียนโปรแกรมในรูปแบบต่างๆได้ เช่น สามารถเขียนโปรแกรมที่มีความยาวหลายบรรทัดให้เหลือความยาว 2-3 บรรทัดได้ โดยมีการผลการทำงานที่เหมือนเดิมครับเหตุผลที่ควรเรียนภาษาซีก็เนื่องจากภาษาซีเป็นภาษาแบบโครงสร้างที่สามารถศึกษาและทำความเข้าใจได้ไม่ยาก อีกทั้งยังสามารถเป็นพื้นฐานในการเขียนโปรแกรมภาษาอื่นๆ ได้อีก เช่น C++, Perl, JAVA เป็นต้นจาก C สู่ C++ถูกพัฒนาโดย Bjarne Stroustrup แห่ง Bell Labs โดยได้นำเอาภาษา C มาพัฒนาและใส่แนวคิดการเขียนโปรแกรมเชิงวัตถุ หรือ OOP (Object Oriented Programming) เข้าไปด้วย ซึ่งเป็นที่มาของ C++ ก็คือ นำภาษา C มาพัฒนาปรับปรุงให้มีประสิทธิภาพมากขึ้นBjarne Stroustrupจำเป็นไหม? ที่ต้องเรียนภาษา C ก่อน เรียน C++ เลยไม่ได้เหรอ? คำตอบก็คือ คุณจะเรียน C++ เลยก็ได้ครับ โดยไม่ต้องศึกษาภาษา C มาก่อน แต่ถ้าคุณเข้าใจหลักการทำงาน และการเขียนโปรแกรมภาษา C แล้วจะสามารถต่อยอด C++ ได้เร็วกว่า อีกทั้งยังสามารถเข้าใจแนวคิดการเขียนโปรแกรมภาษาอื่นๆ ได้อีก ซึ่งในบทความในช่วงแรกผมจะนำเสนอหลักและแนวคิดในการเขียนโปรแกรมภาษา C ก่อนนะครับ เพื่อให้ผู้อ่านได้เข้าใจในพื้นฐานก่อนนะครับต่อไปจะขอเกริ่นถึงการเขียนโปรแกรมแบบโครงสร้างสักเล็กน้อยก่อนนะครับ แล้วก็จะเริ่มเข้ากระบวนการการเขียนโปรแกรมกันลักษณะโปรแกรมแบบโครงสร้างการเขียนโปรแกรมแบบโครงสร้าง (Structured Programming) ก็คือ การนำโครงสร้างของคำสั่งหลายๆ รูปแบบ นำมาใช้ในโปรแกรม โดยจะมีการใช้คำสั่งลักษณะ goto ให้น้อยที่สุด ตัวอย่างการเขียนโปรแกรมแบบโครงสร้าง ก็มี ภาษา C, Pascal และ Cobol เป็นต้นครับ ผมจะยกตัวอย่างในภาษา C ในรูปแบบการเขียนโปรแกรมแบบโครงสร้างให้ดูดังด้านล่างนะครับภาพ: โปรแกรมที่เขียนด้วยภาษาซีแบบง่ายๆ แสดงถึงโครงสร้างจากโปรแกรมข้างต้นนะครับ สามารถแบ่งโครงสร้างตามลักษณะหน้าที่การทำงานได้ 3 ส่วนหลักๆ นะครับ ก็คือส่วนที่ 1 ประกาศค่าตัวแปร และ การกำหนดค่าให้กับตัวแปร (Declare)ส่วนที่ 2 เพิ่มค่า และเก็บค่าไว้ในตัวแปร (Calculation)ส่วนที่ 3 แสดงผลทางจอภาพ (Display)

• ข้อดีของภาษา C •

· เป็นภาษาที่มีลักษณะเป็นโครงสร้างจึงเขียนโปรแกรมง่าย โปรแกรมที่ เขียนขึ้นจะทำงานได้อย่างมีประสิทธิภาพสูง สั่งงานคอมพิวเตอร์ได้ รวดเร็วกว่าภาษาระดับสูงอื่น ๆ· สั่งงานอุปกรณ์ในระบบคอมพิวเตอร์ได้เกือบทุกส่วนของฮาร์ดแวร์ ซึ่งภาษาระดับสูงภาษาอื่นทำงานดังกล่าวได้น้อยกว่า· คอมไพเลอร์ภาษาซีทุกโปรแกรมในท้องตลาดจะทำงานอ้างอิง มาตรฐาน(ANSI= American National Standards Institute) เกือบ ทั้งหมด จึงทำให้โปรแกรมที่เขียนขึ้นด้วยภาษาซีสามารถนำไปใช้ กับคอมพิวเตอร์ได้ทุกรุ่นที่มาตรฐาน ANSI รับรอง· โปรแกรมที่เขียนขึ้นด้วยภาษาซีสามารถนำไปใช้กับเครื่องคอมพิวเตอร์ ที่ใช้ซีพียูต่างเบอร์กันได้ หรือกล่าวได้ว่าโปรแกรมมีความยืดหยุ่น (portabiliy) สูง
· สามารถนำภาษาซีไปใช้ในการเขียนโปรแกรมประยุกต์ได้หลายระดับ เช่น เขียนโปรแกรมจัดระบบงาน (OS) คอมไพเลอร์ของภาษาอื่น โปรแกรมสื่อสารข้อมูลโปรแกรมจัดฐานข้อมูล โปรแกรมปัญญาประดิษฐ์ (AI = Artificial Inteeligent) รวมทั้งโปรแกรมคำนวณงานทางด้าน วิทยาศาสตร์และวิศวกรรมศาสตร์ เป็นต้น· มีโปรแกรมช่วย (tool box) ที่ช่วยในการเขียนโปรแกรมมาก และ ราคาไม่แพงหาซื้อได้ง่าย เช่น vitanin c หรืออื่น ๆ· สามารถประกาศข้อมูลได้หลายชนิดและหลายรูปแบบ ทำให้สะดวก รวดเร็วต่อการพัฒนาโปรแกรมตามวัตถุประสงค์ของผู้ใช้· ประยุกต์ใช้ในงานสื่อสารข้อมูล และงานควบคุมที่ต้องการความแม่นยำ ในเรื่องเวลา (real time application) ได้ดีกว่าภาษาระดับสูงอื่น ๆ หลาย ๆ ภาษา

• ข้อเสียของภาษา C •
ภาษา C ไม่มีตัวจัดการจองหน่วยความจำในตัวเอง เมื่อเวลาเราต้องการจองหน่วยความจำแบบ Dynamic ภาษา C ทำ wrapper เพื่อติดต่อกับ OS เพื่อขอจองหน่วยความจำโดยตรง ปัญหาก็คือ การติดต่อกันระหว่างโปรแกรมของเรากับ OS เป็นไปอย่างหลวมๆ ถ้าโปรแกรมลืมบอก OS ว่าเลิกจองหน่วยความจำดังกล่าว หน่วยความจำนั้นก็จะถูกจองไปเรื่อยๆ เราจะเห็นเครื่องคอมพิวเตอร์ทำงานได้เร็วในตอนเช้า แต่พอตกบ่ายก็ช้าลงจนทำงานไม่ไหว จนสุดท้ายต้อง boot ใหม่ สาเหตุหลักของปัญหานี้คือ สิ่งที่เรียกว่าหน่วยความจำรั่ว หรือ Memory Leak

วันจันทร์ที่ 13 กรกฎาคม พ.ศ. 2552

ความเป็นมาของภาษา assembly

ความเป็นมาของภาษา assembly
เป็นธรรมดาที่คอมพิวเตอร์แบบดิจิตอลจะรับรู้คำสั่งจากมนุษย์ แต่คำสั่งที่คอมพิวเตอร์รู้จักจะอยู่ในรูปของสถานะไฟฟ้าแบบดิจิตอลหรือเป็นรหัสไบนารีเท่านั้น มนุษย์จึงต้องสร้างรหัสไบนารีขึ้นมาแทนการ สั่งการให้คอมพิวเตอร์ทำงาน โดยมีรหัสดิจิตอลโดยเฉพาะที่แตกต่างกันสำหรับการทำงานหนึ่ง ๆ ในหน่ายพื้นฐานของคอมพิวเตอร์คือไมโครโปรเซสเซอร์ การทำงานที่กล่าวถึงนี้เป็นการทำงานพื้นฐานง่าย ๆ เช่น การเคลื่อนย้ายข้อมูล การบวกเลขสองจำนวน การย้ายข้อมูล หรือการลงค่าที่เก็บไว้ด้วยหนึ่ง เป็นต้น

ตารางแสดงรหัสดิจิตอลและความหมาย
รหัส
ความหมาย
0 1 0 0 0 0 1 1
1 0 0 0 0 0 0 1
ย้ายข้อมูล 81H ไปเก็บที่รีจิสเตอร์ชื่อ A1

1 0 0 1 0 1 1 0
ลบข้อมูลที่เก็บในรีจิสเตอร์ A1 ด้วยหนึ่ง
0 1 1 1 0 0 1 1
0 0 0 1 0 0 0 0
0 0 1 1 0 1 0 0
นำข้อมูล 3412H ไปเก็บที่รีจิสเตอร์ HL
1 1 0 0 1 1 1 1
ลบข้อมูลที่อยู่ในรีจีสเตอร์ A1 ด้วยรีจิสเตอร์ A2

รหัสเครื่อง (Machine Code) ที่มีความหมายสั่งการคอมพิวเตอร์ แต่ละคำสั่งอาจเปรียบได้เหมือนกับประโยคหนึ่ง ๆ ในภาษาของมนุษย์ ถ้านำคำสั่งหลายคำสั่งมาเรียบเรียงต่อกัน ก็จะสามารถอธิบายความต้องการหรือการทำงานที่ซับซ้อนได้ กระบวนการเหล่านี้คือการเขียบโปรแกรมนั่นเอง โปรแกรมทีประกอบด้วยรหัสดิจิตอลเช่นนี้เรียกว่า โปรแกรมภาษาเครื่อง (Machine Language Program)

ตารางแสดงโปรแกรมภาษาเครื่องในรูปแบบไบนารี
0 1 0 0 0 0 1 1
1 0 0 0 0 0 0 1
1 0 0 1 0 1 1 0
1 0 1 1 0 0 0 0
0 1 1 1 0 0 0 0
0 0 0 1 1 1 0 0
1 1 0 0 0 0 0 1

การใช้ภาษาเครื่องมีปัญหาในทางปฎิบัติ เพราะต้องจำว่ารหัสอะไรมีความหมายอย่างไร ยากต่อการตรวจสอบแก้ไขโปรแกรมที่ป้อนเข้าไปแล้วว่ามีที่ผิดตรงไหนบ้างหรือไม่ รวมทั้งการอ่านและเขียนก็มีโอกาสผิดพลาดได้มากในระยะต่อมาได้มีแนวคิดจะทำให้การอ่านรหัสเหล่านี้ง่ายขึ้น โดยการแทนรหัสไบนารีเหล่านี้ด้วยรหัสฐานสิบหก โดยพิจารณาทีละ 4 บิต จะเห็นได้ว่ารหัสฐานสิบหกตัวเดียวสามารถแทนรหัสไบนารีได้ 4 ตัวได้ดังตารางต่อไปนี้

ตารางแสดงการแทนรหัสไบนารีด้วยรหัสฐานสิบหก
รหัสฐานสอง
รหัสฐานสิบหก
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
0
123456789ABCDEF
ดังนั้นโปรแกรมเลขฐานสอง จึงสามารถเขียนในรูปเลขฐานสิบหกได้ดังนี้

ตารางโปรแกรมภาษาเครื่องในรูปแบบเลขฐานสิบหก
รหัสฐานสอง
รหัสฐานสิบหก
0 1 0 0 0 0 1 1
1 0 0 0 0 0 0 1
1 0 0 1 0 1 1 0
1 0 1 1 0 0 0 0
0 1 1 1 0 0 0 0
0 0 0 1 1 1 0 0
1 1 0 0 0 0 0 1
43H
81H
96H
BOH
70H
1CH
C1H

การแทนด้วยรหัสฐานสิบหกทำให้อ่านโปรแกรมได้ง่าย และเป็นรูปแบบที่กะทัดรัดขึ้น แต่รหัสฐานสิบหกไม่สื่อความหมายกับการทำงานอะไรเลย ต้องใช้ความจำอย่างเดียวว่ารหัสอะไรทำงานอะไร แต่เนื่องจากคอมพิวเตอร์มักจะมีชิดคำสั่งเป็นร้อยคำสั่งขึ้นไป วิธีการนี้จึงยังไม่สะดวกในการทำงาน จึงมีการคิดคำย่อสั้น ๆ จากความหมายของคำสั่งนั้น โดยเรียกว่า เป็นรหัสมีโนมิค (Mnemonic) ซึ่งพอจะเดาความหมายออกได้บ้าง และรูปแบบการเขียนก็ไม่เยินเย้อเกินไป

ตารางแสดงรหัสมีโมนิคและความหมาย
รหัสนีโมนิค
ความหมาย
INC A1
MOV A1, A2
DIV A2, A3
CPA
INCrease register A1 with 1
MOVe data form register A1 to A2
DIVide register A2 with A3
ComPlement register A

ภาษาที่ใช้รหัสนีโมนิคในการเขียน เรียกว่า ภาษาแอสเซมบลี(AssemblyLanguage) ซึ่งผู้ผลิตไมโครโปรเซสเซอร์แต่ละเบอร์มักใช้คำศัพท์ที่แตกต่างกันออกไป เนื่องจากต้องการให้ผลิตภัณฑ์ของตนมีความแตกต่างกับผู้อื่น ดังนั้นเมื่อต้องการเขียนโปรแกรมสำหรับไมโครโปรเซสเซอร์ใหม่ จึงควรต้องศึกษาคู่มือการอธิบายคำสั่งของผู้ผลิตทุกครั้ง
อย่างไรก็ตามภาษาแอสเซมบลีเป็นภาษที่ยากต่อการทำความเข้าใจ เนื่องจากใช้คำสั่งที่ต่างจากคำศัพท์ที่มนุษย์ทั่วไปใช้กัน โปรแกรมที่เขียนด้วยภาษาแอสเซมบลีต้องใช้ผู้เขียนที่มีความรู้ระดับทราบถึงรายละเอียดการทำงานของเครื่องคอมพิวเตอร์ ซึ่งต้องใช้เวลาในการเขียนนาน นากจากนี้ถ้ามีโปรแกรมที่เขียนด้วยภาษาแอสเซมบลีสำหรับเครื่องคอมพิวเตอร์ระบบหนึ่งอยู่แล้ว จะนำโปรแกรมเดิมนั้นไปทำงานบนเครื่องคอมพิวเตอร์แบบอื่นนั้นแทบเป็นไปไม่ได้เลย แม้จะใช้ไมโครโปรเซสเซอร์เดียวกันก็ตาม เว้นแต่ระบบคอมพิวเตอร์นั้นจะออกแบบให้มีความคล้ายกัน (Compatible) อย่างมาก อาจจะกล่าวได้ว่า โปรแกรมที่เขียนด้วยภาษาแอสเซมบลีมีประสิทธิภาพด้านการเคลื่อนย้าย (Transportable) ต่ำ
สิ่งที่ต้องศึกษาเพื่อเขียนภาษาแอสเซมบลี
การเขียนโปรแกรมภาษาแอสเซมบลีได้ ต้องศึกษาสิ่งต่อไปนี้คือ


สถาปัตยกรรมของไมโครโปรเซสเซอร์ (Microprocessor’s Architecture)
ในระบบคอมพิวเตอร์ อุปกรณ์ที่ทำหน้าที่หลักในการควบคุมการทำงานทั้งระบบ การคำนวณหลักและการติดต่อกับหน่วยความจำหลัก (Main Memory) คือ ซีพียู (CPU : Cemtral Processing Unit) ซึ่งถ้าเป็นเครื่องไมโครคอมพิวเตอร์ อุปกรณ์ตัวนี้ก็คือไมโครโปรเซสเซอร์ คำว่า “ ซีพียู ” และ “ ไมโครโปรเซสเซอร์ ” ในเครื่องไมโครคอมพิวเตอร์จึงอาจใช้แทนกันได้ด้วยเหตุผลนี้
การศึกษาสถาปัตยกรรมของซีพียูมีจุดประสงค์ เพื่อให้รู้จัถึงองค์ประกอบภายในซีพียูที่ผู้เขียนโปรแกรมสามารถเขียนคำสั่งไปควบคุมการทำงานได้ ( เรียกรวมว่า Software/Programming Model) เช่น รีจิสเตอร์ (Registers) ต่าง ๆ วิธีการอ้างตำแหน่งหน่วยความจำ (Addressing Modes) และชุดคำสั่ง ( Instructions Set) ตลอดจนการทำงานทั่วไปของซีพียู และรูปแบบข้อมูลที่ไมโครโปรเซสเซอร์นั้นมีคำสั่งไว้ทำงานด้วย

อุปกรณ์ที่ประกอบกันเป็นระบบคอมพิวเตอร์
การทำงานบางอย่างต้องใช้ภาษาแอสเซมบลี เพราะต้องเกี่ยวข้องกับวงจรไฟฟ้าที่ประกอบกันขึ้นมาเป็นระบบคอมพิวเตอร์ การเขียนโปรแกรมเป็นภาษาสูงไม่สามารถทำได้ หรือทำได้แต่ไม่มีประสิทธิภาพวงจรไฟฟ้าหรืออุปกรณืไฟฟ้าที่ประกอบกับซีพียูรวมกันเป็นระบบคอมพิวเตอร์ ได้แก่ หน่วยความจำ หน่วยรับส่งข้อมูล เป็นต้น การเขียนโปรแกรมสำหรับงานบางอย่างต้องการความรู้ละเอียดถึงขนาดต้องรู้หมายเลขของพอร์ต (Port) ที่รับส่งข้อมูล ต้องการรู้ถึงเทคนิคการรับส่งข้อมูลว่าทำแบบใด และต้องรู้ช่วงเวลาที่ใช้ในการทำงานแต่ละขั้นตอนอย่างละเอียด
สำหรับระบบที่ซับซ้อน เช่น เครื่องไมโครคอมพิวเตอร์ไอบีเอ็มพีซี การติดต่อระหว่างอุปกรณ์กับซีพียูจะทำผ่านอุปกรณ์ควบคุมที่โปรแกรมได้ (Programmable Controller) หลายตัว ตัวอย่างเช่น ตัวควบคุมการส่งข้อมูลแบบตรง (DMA Controller) ตัวควบคุมการขออินเทอรัปต์ (Interrupt Controller) นาฬิกา (Timer; ไม่ใช่สัญญาณนาฬิกา CLK) ตัวควบคุมการส่งข้อมูลแบบขนานและอนุกรม ตัวควบคุมการแสดงผลทางจอภาพ ตัวควบคุมการเขียนอ่านดิสก์ไดรฟ์ เป็นต้น ผู้เขียนโปรแกรมต้องศึกษาการทำงานของอุปกรณ์เหล่านี้ด้วย จึงจะสามารถใช้ความสามารถของระบบคอมพิวเตอร์ได้อย่างเต็มที่

ระบบปฏิบัติการ (Operating System)
เครื่องคอมพิวเตอร์ที่ใช้งานทั่วไป มีโปรแกรมที่ช่วยจัดการและอำนวยความสะดวกในการใช้ทรัพยากรของเครื่อง เช่น การจัดการจอแสดงผล การจัดการเก็บข้อมูลกับแผ่นดิสก์ การจัดการส่วนรับข้อมูลให้มีประสิทธิภาพ โปรแกรมชนิดนี้เรียกว่า โปรแกรมระบบปฏิบัติการ โปรแกรมระบบปฏิบัติการเป็นซอฟต์แวร์ที่ประกอบด้วยโปรแกรมย่อยจำนวนมาก สำหรับจัดการงานพื้นฐานในการใช้ทรัพยากรระบบ ผู้เขียนโปรแกรมที่เข้าใจการทำงานของระบบปฏิบัติการ สามารถเรียกใช้บริการจากระบบปฏิบัติการเพื่อทำงานต่าง ๆ โดยไม่จำเป็นต้องรู้รายละเอียดของอุปกรณ์ที่กล่าวมาก็ได้ ดังนั้นการเขียนโปรแกรมภาษาแอสเซมบลีโดยที่ศึกษาระบบปฏิบัติการไปด้วยจะช่วยให้เขียนโปรแกรมได้ง่ายขึ้น