หน้าเว็บ

วันอังคารที่ 5 เมษายน พ.ศ. 2554

[C Tutorial] บทนำ: "ภาษา"

เราได้ทราบกันไปแล้วว่าการเขียนโปรแกรม ก็คือการสร้างหรือป้อนชุดคำสั่งให้กับคอมพิวเตอร์ แต่ถามว่าแล้วเราจะป้อนชุดคำสั่งพวกนั้นลงไปได้ยังไงกันล่ะ...

สิ่งที่เราต้องการก็คือ "ภาษา" ครับ

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

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

การแบ่งกลุ่มของภาษา

ภาษาโปรแกรม (Programming language) ถูกแบ่งเป็น 3 กลุ่มครับ คือ ภาษาเครื่อง (Machine language), ภาษาแอสเซมบลี (Assembly language) และ ภาษาระดับสูง (High-level language) ทั้งนี้ขึ้นอยู่กับเกณฑ์ในการแบ่งด้วยนะครับ ตำราบางเล่มอาจแบ่งเป็น ภาษาระดับต่ำ - ภาษาระดับสูง ก็ไม่ผิด หรืออาจจะใช้เกณฑ์ที่แตกต่างไปจากนี้โดยสิ้นเชิง เดี๋ยวเราจะมาทำความเข้าใจกับภาษาเหล่านี้กันครับ

ภาษาเครื่อง (Machine language) หมายถึงภาษาที่ CPU สามารถเข้าใจได้โดยตรงครับ เราอาจจะพอทราบกันอยู่แล้วว่าเครื่องคอมพิวเตอร์ประมวลผลด้วยระบบสัญญาณ 0 / 1 ทำให้ภาษาเครื่องเลยต้องเป็น 0/1 ตามไปด้วยครับนั่นหมายความว่า ไม่ว่าเราจะให้คอมพิวเตอร์ทำงานอะไร เราก็สั่งมันด้วยเลขศูนย์กับเลขหนึ่งเท่านั้น โปรแกรมของเราก็อาจจะออกมาหน้าตาประมาณ

1:  11100001 01101000
2: 00010110 01000001 10001011

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

ภาษาแอสเซมบลี (Assembly language) เป็นภาษาที่พัฒนาขึ้นมาเพื่ออำนวยความสะดวกให้โปรแกรมเมอร์มากขึ้นครับ คำสั่งในภาษานี้จะเริ่มมีความเป็นภาษามนุษย์ขึ้นมาบ้าง เช่น หากคุณต้องการสั่งให้ "เคลื่อนย้ายข้อมูล จากเซลล์เมโมรี่ไปยังรีจิสเตอร์" (ถ้าไม่เข้าใจว่ารีจิสเตอร์กับเซลล์เมโมรี่คืออะไรก็ไม่เป็นไรครับ ไม่ใช่ประเด็น) ด้วยภาษาเครื่องเราอาจจะต้องสั่ง "10110011" แต่ด้วยภาษาแอสเซมบลี เราจะใช้คำสั่ง "MV" แทนเป็นต้น (ประมาณ move หรืออะไรทำนองนั้น) แล้วต่อจากนั้น คอมพิวเตอร์จะใช้ "ตัวแปลภาษาแอสเซมบลี" หรือ Assembler เพื่อแปลงภาษาแอสเซมบลีให้เป็นภาษาเครื่องที่คอมพิวเตอร์เข้าใจ นี่คือตัวอย่างส่วนหนึ่งของโปรแกรมในภาษาแอสเซมบลีครับ
1:  MV, 0,    SUM
2: MV NUM, AC
แต่ถึงกระนั้น ก็ยังดูยากอยู่ดี จริงมั้ยครับ เพราะแม้ว่าโค้ดโปรแกรมจะอ่าน/เขียนง่ายขึ้น แต่ถึงอย่างไรเราก็ต้องไปวุ่นวายกับฮาร์ดแวร์ระดับลึก ๆ อยู่ดี (เรามักเรียกภาษาที่ทำงานใกล้ชิดกับฮาร์ดแวร์มาก ๆ ว่า "ภาษาระดับต่ำ") ถึงทำให้เกิดการพัฒนาภาษากลุ่มที่สามที่เราจะให้ความสนใจมากที่สุดครับ

ภาษาระดับสูง (High-level language) ภาษากลุ่มนี้จะหลีกหนีจากฮาร์ดแวร์มากขึ้น การเขียนคำสั่งต่าง ๆ ก็จะคล้ายกับการสั่งด้วยภาษามนุษย์นี่แหละครับ อยากจะให้รับข้อมูลก็สั่งให้มันรับข้อมูล อยากจะบวกก็สั่งให้มันบวก ไม่ต้องไปนั่งสั่งเคลื่อนย้ายข้อมูลทีละไบต์ ๆ โยนไปโยนมาระหว่าง CPU กับเมโมรี่ บลา ๆ

ภาษาระดับนี้มีหลายสิบหลายร้อยภาษาเลยครับ เช่น C/C++ (ที่เราจะเรียนกัน) Pascal, C#, Java, PHP, Python, Ruby, Perl, BASIC..... ซึ่งเมื่อเราเขียนโปรแกรมด้วยภาษาเหล่านี้แล้ว เราจะต้องมีโปรแกรมที่ทำหน้าที่แปลภาษาเหล่านี้ ให้กลายเป็นภาษาแอสเซมบลี (ซึ่งก็จะแปลไปเป็นภาษาเครื่องต่ออีกที) เพื่อให้คอมพิวเตอร์สามารถเข้าใจได้ครับ

ตัวอย่างโปรแกรมบวกเลขง่าย ๆ เขียนด้วยภาษาที่ชื่อ "Python" ครับ
1:  num1 = int(input())
2: num2 = int(input())
3: result = num1 + num2
4: print(result)
จะเห็นว่าการสั่งงานจะเข้าใจไม่ยากนักครับ รับข้อมูลก็สั่งให้มัน input จะบวกก็สั่งให้มันบวก จะแสดงผลก็สั่ง print มันออกมา (print ไม่ได้หมายถึง print ใส่กระดาษออกมานะครับ เป็นคำสั่งให้แสดงผลบนหน้าจอเฉย ๆ) ถ้าตอนนี้ยังไม่เข้าใจก็ไม่เป็นไรครับ เดี๋ยวเริ่มเรียนเขียนโปรแกรมจริง ๆ กันสักพัก ก็จะเข้าใจมากขึ้น

พูดมาซะยาว สรุปเราจะเรียนอะไรกันล่ะเนี่ย

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

ถึงตรงนี้คิดว่าน่าจะเข้าใจเรื่องของภาษาโปรแกรมกันมากขึ้น บทต่อไปจะพูดถึงการเรียนภาษาซีให้ได้ผล และการนำไปต่อยอดกันนะครับ







วันเสาร์ที่ 2 เมษายน พ.ศ. 2554

[C Tutorial] บทนำ: การเขียนโปรแกรมคืออะไร???

ขณะนี้กำลังทยอยย้ายบทความจาก mistertun.exteen.com มาไว้ที่นี่นะครับ คาดว่าจะเสร็จสมบูรณ์ภายในเร็วๆนี้ : )

บทความในหมวด [C Tutorial] เป็นบทความที่ผมได้พยายามเขียนขึนเพื่อให้เป็นแนวทางในการศึกษาการเขียนโปรแกรมสำหรับมือใหม่ เดิมทีเขียนไว้ที่ mistertun.exteen.com ครับ แต่ด้วยเหตุผลส่วนตัวบางอย่าง จึงได้ทยอยย้ายมาไว้ที่ digitalhumus.blogspot.com แห่งนี้

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

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

การเขียนโปรแกรม....มันคืออะไรกัน !?!

เท้าความกันสักนิด...

ท่านผู้อ่านที่เคารพครับ (ดูเป็นทางการอย่างยิ่ง) นับตั้งแต่เมื่อคอมพิวเตอร์ครั้งแรกถูกสร้างขึ้น เมื่อราวๆ ปี ค.ศ. 1930-1940 (มั้ง) การพัฒนาระบบคอมพิวเตอร์ก็ดำเนินมาอย่างต่อเนื่อง เราอาจจะเห็นภาพเครื่องคอมพิวเตอร์ที่ค่อยๆ มีขนาดเล็กลง พร้อมๆ กับประสิทธิภาพที่สูงขึ้นในสารคดีหรือรายการทางวิทยาศาสตร์กันอยู่บ่อยๆ แต่เครื่องคอมพิวเตอร์ที่แสนจะทรงประสิทธิภาพนั้นจะทำงานได้อย่างไร หากปราศจากสิ่งที่เรียกกันว่า "ซอฟต์แวร์"

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

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

เข้าเรื่องแล้วก็ได้...

สรุปว่าการเขียนโปรแกรม ก็คือการสร้าง "ชุดคำสั่ง" ขึ้นมาเพื่อสั่งงานคอมพิวเตอร์ ให้ทำงานอย่างที่เราต้องการนั่นเองครับ โปรแกรมโปรแกรมหนึ่งก็จะประกอบไปด้วยคำสั่งหลาย ๆ คำสั่งที่ทำงานไปตามโครงสร้างที่เราวางไว้ เช่นหากผมอยากจะสร้างโปรแกรมบวกเลข ผมก็ต้องมีคำสั่งในการรับเลขเข้าไปสองตัว คำสั่งในการเอามันมาบวกกัน แล้วก็คำสั่งในการแสดงผลลัพธ์ออกมา เพราะฉะนั้นสิ่งที่ผมต้องทำก็คือหาทางเขียนคำสั่งเหล่านั้น แล้วโยนให้คอมพิวเตอร์ทำตาม...นี่ล่ะครับ คือการเขียนโปรแกรม

บทนี้พอแค่นี้ก่อน บทต่อไปจะพูดถึงสิ่งที่เรียกว่า "ภาษา" กันครับ