บทความอื่นๆ ในชุดของ Intro to Programming & Algorithm
- บทนำฉบับรวบรัด! ความรู้พื้นฐานก่อนเริ่มเขียนโปรแกรม
- รู้จักกับตัวแปลภาษา Compiler และ Interpreter
- Algorithm (1) – ขั้นตอนวิธี หัวใจสำคัญของการเขียนโปรแกรม
- Algorithm (2) – อัลกอริทึมในมุมมองของคอมพิวเตอร์
- Algorithm (3) – Decision การสร้างทางเลือกให้โปรแกรม
- Algorithm (4) – loop สั่งให้โปรแกรมทำงานซ้ำๆ
- ตัวอย่างการสร้าง Algorithm
คนที่กำลังเริ่มศึกษาการเขียนโปรแกรม เวลาหาหนังสือมาอ่านหรือเรียนในห้อง อาจจะมีปัญหาอย่างหนึ่งคือเนื้อหาในบทเรียนมักจะเริ่มด้วยการพูดถึง "การเขียนโค้ด" กันเลย ทำให้คนที่พื้นฐานความรู้ด้านคอมพิวเตอร์ไม่แน่นอาจจะพากันงงได้!
ดังนั้นเราจะใช้บทความชุด Intro นี้ ในการปูพื้นฐานความรู้ที่นักเขียนโปรแกรมมือใหม่ (ตั้งแต่ระดับเริ่มต้นที่ไม่รู้อะไรเกี่ยวกับการเขียนโปรแกรมมาเลย) ควรจะรู้ก่อน
อันดับแรกเรามาทำความเข้าใจและแนวคิดของเครื่องจักรที่เรียกว่า "คอมพิวเตอร์" กันก่อน
Computer คืออะไร?
คิดว่าคนที่เขียนมาอ่านบทความชุดนี้ อย่างน้อยน่าจะเคยใช้งานคอมพิวเตอร์มาก่อนแล้ว ไม่ว่าจะใช้เครื่องโน๊ตบุ๊คพิมพ์รายงาน ใช้แอพในมือถือสมาร์ทโฟนหาข้อมูลในอินเทอร์เน็ต
แต่คอมพิวเตอร์ในวิชาการเขียนโปรแกรมพื้นฐาน (เน้นคำว่า 'พื้นฐาน' นะ) ที่เรากำลังจะพูดถึงจะโฟกัสคอมพิวเตอร์ในฐานะเครื่องจักรสำหรับการคำนวณ ซึ่งเป็นแนวคิดดั้งเดิมในยุคที่มันถูกคิดขึ้นมา
แนวคิดของคอมพิวเตอร์เกิดขึ้นมาตั้งแต่สมัยสงครามโลกครั้งที่ 2
จุดประสงค์แรกเลย คือเขาสร้างมันเพื่อคำนวณค่าทางคณิตศาสตร์จำนวนมากๆ ในเวลาอันรวดเร็ว เช่นคำนวณองศาของปากกระบอกปืนใหญ่ อาจจะต้องคิดเลขทั้งหมด 5 สูตร กว่าจะคิดเสร็จ ศัตรูก็เคลื่อนที่ไปตำแหน่งอื่นแล้ว หรือทำการถอดรหัสลับของศัตรู ต้องใช้การคำนวณมหาศาลชนิดที่ให้มนุษย์ค่อยๆ กดเครื่องคิดเลขที่ละตัวอาจจะต้องใช้เวลาเป็นร้อยปีกว่าจะคิดเสร็จ แบบในหนังเรื่อง The Imitation Game (2014)
ดีไซน์แรกของคอมพิวเตอร์จึงเกิดมาเป็นเครื่องมือที่ใส่ค่าเข้าไป (Input) แล้วมันจะเอาไปประมวลผล หรือคิดคำนวณค่าต่างๆ มากมายจนได้คำตอบออกมา (Process) แล้วแสดงให้ผู้ใช้งานเห็นในเวลาอันรวดเร็ว (Output)
ดังนั้นจำไว้เลยว่าคอมพิวเตอร์ทำงานด้วยหลักการ
Input → Process → Output
แล้วหลังจากสงครามจบลง...
ผู้คนจึงมีเวลาเอาเจ้าเครื่องคำนวณนี่มาพัฒนาต่อยอด และเนื่องจากผู้ที่สร้างคอมพิวเตอร์เป็นนักคณิตศาสตร์/วิทยาศาสตร์ เครื่องคอมพิวเตอร์เลยถูกสร้างขึ้นมาเพื่อตอบโจทย์งานในด้านนี้ ซึ่งก็คือการแก้สมการหรือโจทย์ปัญหาที่ต้องใช้ตัวเลข
จนมาถึงยุคหลังๆ ที่คอมพิวเตอร์ถูกเอามาขายในเชิงพาณิชย์ คอมพิวเตอร์เลยถูกปรับปรุงครั้งใหญ่อีกรอบหนึ่งเพื่อให้ทำงานได้หลายหลายแบบยิ่งขึ้นเช่น งานเอกสาร งานด้าน Graphic / Multimedia, Gaming หรืองานด้าน Entertainment ต่างๆ ที่ไม่เกี่ยวกับการช่วยคำนวณแล้ว (แต่เบื้องหลัง ก็ยังเป็นการคำนวณอยู่ดีนะ)
ยังไงก็ตามนะ แนวคิดพื้นฐานของคอมพิวเตอร์แทบจะไม่เปลี่ยนเลยตลอดหลายสิบปีที่ผ่านมาคือส่วนประกอบที่เรียกว่า Hardware ซึ่งเป็นอุปกรณ์ตัวเครื่อง และสามารถสั่งการมันได้โดยการสร้าง Software ใส่เข้าไปควบคุม Hardware อีกที
Component: Hardware
คืออุปกรณ์ส่วนที่จับต้องได้ของคอมพิวเตอร์ เช่น CPU, Memory, Hard-Disk, ตัวเครื่อง (Body), เมาส์, คีย์บอร์ด, จอภาพ, ลำโพง ประมาณนี้
แต่ในสรุปชุดนี้เราจะโฟกัสกับอุปกรณ์แค่ 3 อย่างเท่านั้นนั่นคือ
- CPU (Central Processing Unit) – หน่วยประมวลผลกลาง เทียบได้กับสมองของคอมพิวเตอร์ เก่งในเรื่องการคำนวณ บวก ลบ คูณ หาร พวกนี้สบายมาก เป็นอุปกรณ์ที่ทำงานเร็วส์!!ที่สุดคอมพิวเตอร์แล้ว แต่ก็มีข้อเสียคือความจำน้อย ไม่ใช่ความจำสั้นแบบปลาทอง แต่คือเก็บข้อมูลได้น้อย ทำไรนิดหน่อยความจำก็เต็มแล้ว ... เลยต้องมีอุปกรณ์อีกอย่างมาช่วยงานมัน นั่นคือ
- Memory (Main Memory: RAM) – หน่วยความจำหลักหรือที่เรียกกันติดปากว่า “แรม” ทำงานด้วยตัวเองไม่ได้ ต้องรอคำสั่งจาก CPU โดยหน้าที่ของมันเหมือนกับกระดาษทด ในเมื่อ CPU จำอะไรไม่ค่อยได้เลย คนสร้างคอมพิวเตอร์เลยออกแบบให้ CPU สามารถส่งข้อมูลมาฝากเก็บไว้ในแรมได้ แล้วขอเรียกกลับไปใช้ได้ทุกเมื่อ
- I/O (input/output) – จริงๆ มีแค่ CPU กับ Memory คอมพิวเตอร์ก็ทำงานได้แล้วแหละนะ ปัญหาคือมนุษย์เราไม่สามารถเอานิ้วจิ้ม hardware แล้วอ่านค่าที่อยู่ในรูปกระแสไฟฟ้าได้ล่ะ เลยต้องมีอุปกรณ์ที่ทำหน้าที่รับค่าเข้าจากผู้ใช้งาน แล้วอุปกรณ์ที่เอาไว้แสดงผลคำตอบที่คอมพิวเตอร์คิดได้ให้ผู้ใช้เห็น ซึ่งเราเรียกอุปกรณ์พวกนี้ย่อๆ ว่า "I/O" (อ่านว่า "ไอ/โอ" ตรงๆ เลย)
Component: Software
สำหรับ hardware แล้วมันสามารถคำนวณผลลัพธ์ออกมาได้โดยประสานการทำงานกันระหว่าง 2 คู่หู คือ CPU – Memory แต่ปัญหาคือ CPU จะรู้ได้ยังไงว่าปัญหาที่ต้องแก้เนี่ยมีขั้นตอนการคิดยังไงบ้าง?
ตอบเลยว่า มันไม่รู้หรอกนะ!
หน้าที่นี้เลยตกเป็นของส่วนที่ไร้ตัวต้นที่เรียกว่า Software หรือ Program นั่นเอง (แม้ว่าในยุคโมบายเช่นนี้เราจะนิยมเรียกมันว่า App หรือ Application ก็เถอะนะ มันคือตัวเดียวกัน)
เจ้า Software เนี่ยมันไม่มีหน้าตาที่เห็นได้ ตัวต้นที่แท้จริงๆ ของมันคือข้อมูลในรูปแบบไฟฟ้า (เป็น Binary Number หรือเลขฐาน2 ที่หน้าตาประมาณ 001101010101111100 นี้นะ) การออกแบบดังนี้ทำให้เราสามารถสร้างหรือใช้ Hardware ตัวเดียวคำนวณปัญหาได้เป็นพันๆ โจทย์เพียงแค่สร้าง software แก้ปัญหาแบบใหม่ใส่ลงไปเท่านั้นเอง ถ้าเทียบง่ายๆ คือเราซื้อ smartphone มาเครื่องหนึ่ง แต่สามารถเลือกลงแอพได้เยอะมากมาย
ดังนั้น สำหรับคนที่เตรียมตัวจะเป็นโปรแกรมเมอร์มือใหม่ทุกคน จงรู้ตัวไว้ว่าคำว่า Programmer (สำหรับสมัยใหม่มักจะเรียกว่า Developer หรือผู้พัฒนาโปรแกรมแทน) หน้าที่ของพวกเขาคือ
“สร้าง / ปรับปรุง / พัฒนา
Software ที่เอาไว้สั่งงานคอมพิวเตอร์
ให้แก้ปัญหาอะไรบางอย่างนั่นเอง”
ทีนี้ถ้าใครมาถามคุณว่าวันๆ ของโปรแกรมเมอร์คุณทำอะไร เอาเป็นว่าคุณตอบได้แล้วนะ?
ส่วนเนื้อหาในเรื่อง Hardware ทำงานยังไง แล้วมันรับขั้นตอนการแก้ปัญหาที่เขียนเอาไว้ใน Software ไปประมวลผลได้ยังไง ไม่อยู่ในสโคปของวิชานี้นะ แต่สามารถหาอ่านได้ในวิชา Digital System, Computer Architecture ซึ่งไว้จะทยอยเขียนสรุป 2nd Edition ต่อไปในอนาคต (สำหรับสรุปฉบับเขียนครั้งแรกหาอ่านได้ที่ www.tamemo.com/post/8 )
Programming Language
ในหัวข้อต่อมาเราจะพูดกันต่อในเรื่องของ ภาษาโปรแกรม หรือ Programming Language
ตัวอย่างของภาษาโปรแกรมยอดนิยมที่ใช้กันอยู่ก็เช่น C, C++, C#, Java, Python, PHP, JavaScript
ภาษาโปรแกรมมีไว้ทำไม?
เนื่อจากว่าการเขียนโปรแกรมด้วยคำสั่งแบบ Binary Number นั้นทำได้ยากมาก แถมโอกาสเขียนผิดก็มีสูง เพราะแบบนั้น จึงมีคนเสนอแนวคิดของการสร้าง Programming Language ขึ้นมา
ซึ่งภาษาพวกนี้ไม่เหมือนกับภาษาที่คนใช้คุยกันเช่น ภาษาไทย ภาษาอังกฤษนะ แต่มันคือชุดคำสั่งที่แปลงมาจากคำสั่งแบบ Binary Number แต่เขียนง่ายกว่าเยอะมากๆ
แต่ยังไงคอมพิวเตอร์ก็ไม่สามารถอ่านภาษาพวกนี้ได้รู้เรื่อง เลยต้องมีเครื่องมืออีกตัวหนึ่งที่ชื่อว่า Compiler มาแปลภาษาโปรแกรมให้กลายเป็นคำสั่ง Binary อีกครั้ง
ส่วนเหตุผลว่าทำไมโลกนี้ถึงต้องมีภาษาโปรแกรมหลายภาษา ทั้งที่ผลสุดท้ายก็ต้องแปลงภาษาพวกนี้ให้อยู่ในรู้ Binary Number อยู่ดีนั่นก็เพราะภาษาโปรแกรมแต่ละภาษาออกแบบมาให้ทำงานเก่งกันคนละด้าน เช่น ถ้าจะทำงานกับ Hardware ภาษา C ก็เป็นตัวเลือกที่เหมาะ หรือเราจะเขียนเว็บก็จะมีภาษาเช่น PHP, JavaScript ที่ใช้สร้างเว็บได้อย่างง่าย
ซึ่งในบทต่อไปเราจะมาเจาะลึกถึงการทำงานของ Compiler ที่เป็นเครื่องสำหรับแปลงภาษาโปรแกรมระดับสูงกว่าพวกนี้ให้เป็น Binary กัน