รู้จักกับภาษาคอมพิวเตอร์
ก่อนที่จะเขียนโปรแกรมภาษา C ขึ้นมานั้น สิ่งแรกที่ควรทำความเข้าใจก็คือ รายละเอียดทั้งหมดของภาษา C เพื่อเข้าใจถึงที่มา ความสามารถ รวมถึงลักษณะการทำงานโดยรวมของภาษา เมื่อศึกษาถึงเรื่องใดก็ตาม การทำความเข้าใจถึงรากฐานของเรื่องนั้นย่อมจะทำให้เรามีพื้นฐานพร้อมที่จะเรียนรู้เนื้อหาในรายละเอียดต่อไปได้เป็นอย่างดี
ภาษา C เป็นภาษาที่เก่าแก่ถือกำเนิดมายาวนาน โดยแต่เดิมนั้นภาษา C ถูกพัฒนาขึ้นเพื่อให้เป็นภาษาสำหรับการสร้างระบบปฏิบัติการยูนิกซ์ (Unix) เนื่องจากในขณะนั้นระบบปฏิบัติการยูนิกซ์เขียนด้วยภาษาแอสเซมบลิ (Assembly) ซึ่งเป็นภาษาที่ยึดติดกับฮาร์ดแวร์ของเครื่อง ดังนั้น การที่จะย้ายระบบปฏิบัติการไปใช้กับเครื่องอื่นจึงเป็นเรื่องที่ลำบากมาก ซึ่งนับเป็นข้อเสียที่สำคัญของภาษาแอสเซมบลิ
ดังนั้น ภาษา C ซึ่งเป็นภาษาที่ไม่ยึดติดกับฮาร์ดแวร์จึงถูกพัฒนาขึ้นมา ในปัจจุบัน C ไม่ได้จำกัดอยู่เพียงแค่งานสร้างระบบปฏิบัติการเท่านั้น แต่สามารถนำไปใช้สร้างโปรแกรามเพื่องานในทุกประเภทยกตัวอย่างเช่น งานเกี่ยวกับการคำนวณ ควบคุมการทำงานของอุปกรณ์ฮาร์ดแวร์ชนิดต่าง ๆ การจัดการฐานข้อมูล หรือสร้างโปรแกรมต่าง ๆ เป็นต้น
ประวัติของภาษา C
ภาษา C คิดค้นขึ้นมาเป็นครั้งแรกโดย เดนนิส ริทชี่ (Dennis Ritchie) ที่ห้องแล็บเบล (Bell Labs) ในปี ค.ศ. 1972 โดยได้แนวคิดมาจากภาษา BCPL ซึ่งพัฒนาขึ้นโดย มาร์ติน ริชาร์ด (Martin Richards) และภาษา B ที่เขียนขึ้นโดย เคน ทอมพ์สัน (Ken Thompson) เพื่อนำมาพัฒนาต่อจนได้ภาษาใหม่ที่มีประสิทธิภาพการทำงานสูง หลังจากนั้นในปี ค.ศ. 1978 ภาษา C จึงได้รับการเผยแพร่อย่างเป็นทางการโดยเคอร์นิกแฮน (Kernighan) และเดนนิส ริทชี่
จุดเด่นของภาษา C
ภาษา C ได้รับการยอมรับและใช้งานกันอย่างกว้างขวาง สาเหตุน่าจะมาจากเหตุผลดังต่อไปนี้
· ถูกกำหนดเป็นมาตรฐานสำหรับเครื่องคอมพิวเตอร์ทุกรุ่น (IBM, PC, Macintosh และเครื่องประกอบเอง) และระบบปฏิบัติการทุกชนิด (Windows, Unix, Linux, …) ทำให้โครงสร้างทางภาษา ฟังก์ชัน และไลบรารีต่าง ๆ สามารถนำไปใช้งานระหว่างเครื่องแต่ละรุ่นและระบบปฏิบัติการแต่ละชนิดได้
· ในปัจจุบันมีการพัฒนาตัวแปลภาษา C ขึ้นมาใช้กับเครื่องทุกรุ่นและระบบปฏิบัติการทุกชนิด ดังนั้นไม่ว่าเราจะใช้เครื่องรุ่นใด และใช้แบบปฏิบัติการชนิดใดก็ตาม สามารถเขียนโปรแกรมภาษา C ได้แน่นอน
· ภาษา C มีโครงสร้างทางภาษาที่ดี และเครื่องหมายสำหรับดำเนินการ ไม่ว่าจะเป็นการคำนวณทางคณิตศาสตร์ ตรรกศาสตร์ หรือการเปรียบเทียบ ล้วนมีประสิทธิภาพการทำงานสูง
· โดดเด่นเรื่องการติดต่อและควบคุมการทำงานของฮาร์ดแวร์ ถือเป็นจุดเด่นของภาษา C ที่ทำได้ดีเหนือกว่าภาษาอื่น ๆ มาก เพราะสามารถเขียนคำสั่งได้ง่าย กลายเป็นโปรแกรมที่มีขนาดเล็กกะทัดรัด ทำให้วิศวกรเลือกใช้ภาษานี้มากที่สุด
· มีฟังก์ชันสำเร็จสำหรับงานประเภทต่าง ๆ ให้เลือกใช้มากมาย ซึ่งช่วยประหยัดเวลาในการเขียนคำสั่ง นอกจากนี้ถ้าฟังก์ชันที่ภาษา C เตรียมไว้ให้ใช้งานได้ไม่ตรงตามต้องการทั้งหมด เราสามารถเขียนคำสั่งเพิ่มเติมลงไปได้ด้วย
การสั่งงานคอมพิวเตอร์ด้วยภาษาโปรแกรม
การที่จะสื่อสารหรือบอกความต้องการของเรากับใครสักคน แน่นอนที่สุดภาษาที่ทั้งสองฝ่ายเข้าใจตรงกันจะถูกนำมาใช้เป็นสื่อกลาง การสื่อสารหรือสั่งงานกับคอมพิวเตอร์ก็เช่นเดียวกัน ภาษาที่จะนำมาใช้เป็นสื่อกลางก็คือ ภาษาที่เครื่องคอมพิวเตอร์เข้าใจ ซึ่งเรียกกันว่า ภาษาเครื่อง (Machine Language)
ภาษาเครื่องจะอยู่ในรูปแบบของรหัสเลขฐานสอง (Binary Code) ซึ่งประกอบด้วยตัวเลขอยู่เพียงแค่ 2 ตัวนั่นคือ 0 และ 1 อธิบายได้ว่าเป็นภาษาที่ประกอบด้วยตัวเลข 0 และ 1 เรียงลำดับและต่อกันเป็นความหมายที่เครื่องคอมพิวเตอร์เข้าใจ เมื่อลองนึกภาพตามจะพบว่าเป็นเรื่องยากที่มนุษย์จะสามารถเข้าใจในภาษานั้นได้
ต่อมาจึงมีการพัฒนาภาษาสำหรับสื่อสารกับคอมพิวเตอร์ที่มนุษย์เข้าใจ โดยใช้ตัวอักษรภาษาอังกฤษมากำหนดเป็นรูปแบบคำสั่งซึ่งส่วนใหญ่เป็นคำที่มีความหมายในภาษาอังกฤษ แต่การที่จะทำให้คอมพิวเตอร์เข้าใจภาษาที่พัฒนาขึ้นมาได้นั้น ต้องมีตัวกลางเพื่อทำหน้าที่แปลจากภาษานั้นเป็นภาษาเครื่องอีกที ดังแสดงในรูปจำลองต่อไปนี้
ภาษาทั้งหมดที่มนุษย์พัฒนากันขึ้นมา สามารถแบ่งระดับตามลักษณะและการทำงานของแต่ละภาษาได้เป็น 3 ระดับ ดังแสดงต่อไปนี้
ภาษาระดับต่ำ (Low Level Language)
เป็นภาษาที่ใกล้เคียงกับภาษาเครื่องมากที่สุด สามารถขียนคำสั่งเพื่อติดต่อสั่งงานกับอุปกรณ์ฮาร์ดแวร์ได้โดยตรง โปรแกรมที่เขียนด้วยภาษาระดับต่ำจะทำงานได้รวดเร็ว แต่ปัญหาของภาษาระดับต่ำก็คือยึดติดกับชนิดและอุปกรณ์ของเครื่องคอมพิวเตอร์ นั่นหมายถึง ถ้าเราเขียนโปรแกรมด้วยภาษาระดับต่ำสำหรับเครื่องคอมพิวเตอร์แบบหนึ่ง โปรแกรมนั้นจะไม่สามารถนำไปใช้กับคอมพิวเตอร์อีกแบบหนึ่งได้ ตัวอย่างของภาษาระดับต่ำ ได้แก่ ภาษาแอสเซมบลิ (Assembly)
ภาษาระดับสูง (High level language)
เป็นภาษาที่ใกล้เคียงกับภาษาที่ใช้สื่อสารกันตามปกติ คำสั่งต่าง ๆ มักเป็นคำที่มีความหมายในภาษาอังกฤษ ทำให้จดจำและเขียนได้ง่าย แต่ข้อเสียของภาษาระดับสูงก็คือ มักไม่มีคำสั่งในการติดต่อกับอุปกรณ์ฮาร์ดแวร์โดยตรง และทำงานช้ากว่าภาษาระดับต่ำ ตัวอย่างของภาษาระดับสูง ได้แก่ Pascal, Cobol, Fortran, Visual Basic, PHP เป็นต้น
เนื่องจากภาษาระดับต่ำและสูงต่างก็มีข้อดีและข้อเสียที่แตกต่างกัน ดังนั้น ภาษา C จึงพัฒนาขึ้นมาโดยปรับปรุงข้อเสียและนำเอาข้อดีของภาษาทั้ง 2 ระดับมาใช้ โดยคำสั่งภาษา C เป็นคำสั่งที่มีความหมายในภาษาอังกฤษ สามารถจดจำและเขียนได้ง่ายเหมือนภาษาระดับสูง แต่ภาษา C ทำงานได้อย่างรวดเร็ว และมีคำสั่งที่ให้ผู้เขียนโปรแกรมเรียกใช้ เพื่อติดต่อสั่งงานกับอุปกรณ์ฮาร์ดแวร์โดยตรงได้เหมือนภาษาระดับต่ำ ดังนั้นภาษา C จึงถูกจัดให้เป็นภาษาระดับกลาง
สิ่งสำคัญที่ทำให้คอมพิวเตอร์เข้าใจและทำงานได้ตามคำสั่งที่เราเขียนก็คือ ตัวกลางซึ่งทำหน้าที่แปลจากภาษาที่เราเขียนให้เป็นภาษาเครื่อง ดังนั้น จึงกล่าวได้ว่าทุกภาษาที่พัฒนาขึ้นมาต้องมีตัวกลาง โดยตัวกลางจะเรียกว่า ตัวแปลภาษา ซึ่งหลักการที่ตัวแปลภาษาใช้ในการแปลความหมายโปรแกรมให้เป็นภาษาเครื่องมีอยู่ 2 แบบด้วยกัน โดยขึ้นอยู่กับว่าแต่ละภาษาที่พัฒนาขึ้นมาจะเลือกใช้หลักการใดไปสร้างเป็นตัวแปลภาษา
Interpreter : แปลทีละคำสั่ง
ตัวแปลภาษาชนิดอินเตอร์พรีเตอร์ (Interpreter) นั้นจะแปลภาษาโปรแกรมไปสู่ภาษาเครื่องแบบเป็นคำสั่งต่อคำสั่งนั่นคือ อ่านคำสั่งจากโปรแกรมมาหนึ่งคำสั่งแล้วก็ทำงานตามสั่งนั้นทันที จากนั้นจึงอ่านคำสั่งต่อไปเพื่อมาทำงานอีกเป็นอย่างนี้จนจบโปรแกรม
ตัวอย่างของภาษาที่ใช้ตัวแปลภาษาแบบอินเตอร์พรีเตอร์ ส่วนใหญ่จะเป็นภาษาสคริปที่นิยมใช้ในการเขียนเว็บ อย่างเช่น Perl, PHP, ASP, VBScript หรือ Jscript เป็นต้น
ตัวแปลภาษาชนิดคอมไพเลอร์ (Compiler) นั้น จะเริ่มทำงานด้วยการตรวจสอบคำสั่งทั้งหมดในโปรแกรม เพื่อดูว่ามีส่วนใดผิดจากหลักการของภาษานั้นหรือไม่ ถ้าไม่พบข้อผิดพลาด คอมไพเลอร์จะแปลคำสั่งทั้งหมดให้เป็นภาษาเครื่องแล้วจึงทำงานนั่นก็คือ แปลตั้งแต่ต้นจนจบแล้วทำงานครั้งเดียว
ภาษาที่ใช้ตัวแปลภาษาแบบคอมไพเลอร์ส่วนใหญ่แล้วจะเป็นภาษาระดับสูง อย่างเช่น Pascal, Pascal, Cobol, Visual Basic, Java และภาษาระดับต่ำอย่างแอสเซมบลิ
สำหรับข้อดีของตัวแปลภาษาแบบคิมไพเลอร์ก็คือ หลังจากคอมไพล์โปรแกรมจนได้ไฟล์ .exe ออกมาแล้ว จากนั้นจะเป็นขั้นตอนของการทำงานเพียงอย่างเดียวตั้งแต่ต้นตนจบ ทำให้โปรแกรมทำงานได้อย่างรวดเร็ว ในขณะที่ตัวแปลภาษาแบบอินเตอร์พรีเตอร์จะอ่านคำสั่งไปทำงานไปพร้อมกัน ซึ่งจะทำงานได้ช้ากว่า
แต่ข้อเสียของตัวแปลภาษาแบบคอมไพเลอร์ก็คือ ในกรณีที่เราแก้โปรแกรมก็ต้องคอมไพล์โปรแกรมใหม่ทั้งหมด ในขณะที่อินเตอร์พรีเตอร์ไม่ต้องเสียเวลาคอมไพล์ใหม่ โดยสามารถทำงานต่อไปได้ทันที
ขั้นตอนการทำงานของคอมไพเลอร์ภาษา C
เริ่มจากเขียนโปรแกรมด้วยคำสั่งในภาษา C ให้ถูกต้องตามหลักการที่ภาษา C กำหนดไว้ โดยเวลาบันทึก (Save) ไฟล์ ต้องตั้งชื่อไฟล์ให้มีนามสกุล .c อย่างเช่น cal.c, ex3.c หรือ temp.c เป็นต้น
ขั้นตอนต่อไปนี้จะเรียกว่า การคอมไพล์ซึ่งก็คือ การเรียกให้ตัวแปลภาษา C (C compiler) ทำงานโดยตรวจสอบความถูกต้องของโปรแกรม ถ้าไม่พบข้อผิดพลาด ตัวแปลภาษา C จะแปลโปรแกรมให้เป็นไฟล์นามสกุล .obj หรือ Object file
ถ้าภาพในโปรแกรมมีการเรียกใช้ฟังก์ชันมาตรฐานซึ่งเก็บอยู่ในไลบรารีของภาษา C ฟังก์ชันเหล่านี้จะถูกนำมารวม (Link) กับไฟล์ .obj โดยโปรแกรมประเภท Linker ก่อนที่จะแปลจากไฟล์ .obj ให้เป็นไฟล์นามสกุล .exe (Binary file) ซึ่งเป็นไฟล์ที่ใช้สั่งคอมพิวเตอร์ทำงาน
มาตรฐาน ANSI C
จากการที่มีผู้ผลิตตัวแปลภาษา C ออกมาหลายราย โดยผู้ผลิตแต่ละรายก็พยายามที่จะแข่งขันด้วยการทำให้ผลิตภัณฑ์มีความน่าสนใจและมีประสิทธิภาพมากกว่าคู่แข่งรายอื่น ดังนั้น จึงมักจะมีการเพิ่มคุณสมบัติและคำสั่งใหม่ ๆ ที่สร้างขึ้นมาเฉพาะสำหรับตัวแปลภาษานั้นลงไปด้วย
เมื่อเกิดเหตุการณ์เช่นนี้จึงมีการการประชุมเพื่อจัดตั้งมาตรฐานสำหรับภาษา C ขึ้นมา โดยใช้ชื่อมาตรฐานว่า ANSI C (American National Standard Institute C) เพื่อใช้เป็นแหล่งอ้างอิงถึงข้อกำหนดและหลักการของภาษา C ผู้ผลิตรายใดก็ตามที่ต้องการสร้างตัวแปลภาษา C ออกจำหน่ายจะต้องยึดตามมาตรฐานนี้แต่อาจจะมีการเพิ่มเติมคุณสมบัติอื่น ๆ ลงไปได้
ดังนั้น ถ้าต้องการให้ตัวแปลภาษา C ที่เราเขียนสามารถนำไปใช้ได้กับทุกตัวแปลภาษาก็ควรจะยึดตามมาตรฐาน ANSI C โดยคำสั่งและฟังก์ชันต่าง ๆ ที่ใช้งานในหนังสือเล่มนี้อ้างอิงตามมาตรฐาน ANSI C
ถึงแม้ว่าเริ่มแรกของการพัฒนาภาษา C จะถูกใช้งานในงานเกี่ยวกับการสร้างระบบปฏิบัติ การเป็นหลักแต่เนื่องจากมีข้อดีหลายประการและความง่ายของภาษา ทำให้ภาษา C ได้รับความนิยมอย่างแพร่หลาย โดยมีการเขียนโปรแกรมด้วยภาษา C เพื่อใช้ในงานประเภทต่าง ๆ หลายด้วยกัน สรุปเป็นหัวข้อดังต่อไปนี้
1. สร้างระบบปฏิบัติการ ภาษา C จะถูกนำไปใช้เขียนโปรแกรมเพื่อสร้างระบบปฏิบัติการ (Operating System) อย่างเช่น ยูนิกซ์ ซึ่งเป็นวัตถุประสงค์แรกที่ทำให้มีการคิดค้นภาษา C ขึ้นมา หรือแม้กระทั่งระบบปฏิบัติการรุ่นใหม่ ๆ อาทิ Linux, Windows 95/98 ก็มีการนำภาษา C ไปใช้พัฒนาด้วยทั้งในส่วนที่เป็น Kernel ของระบบปฏิบัติการ และ Driver ที่ติดต่อกับฮาร์ดแวร์ชนิดต่าง ๆ
2. งานด้านควบคุมอุปกรณ์ฮาร์ดแวร์ เนื่องจากภาษา C เป็นภาษาระดับกลาง ทำความเข้าใจได้ง่ายและสามารถเขียนคำสั่งเพื่อติดต่อกับอุปกรณ์ฮาร์ดแวร์ได้สะดวก ดังนั้น ภาษา C จึงถูกนำมาใช้เพื่อควบคุมการทำงานของเครื่องจักรกล อุปกรณ์ไอซี หรือสร้างเป็นไดรเวอร์ของอุปกรณ์ฮาร์ดแวร์
3. สร้างโปรแกรมสำหรับจัดพิมพ์เอกสาร (Text editor) และโปรแกรมเกี่ยวกับการป้อนงานและจัดลำดับการพิมพ์งานของเครื่องพิมพ์ (Printer)
4. สร้างตัวแปลภาษาอื่น ภาษา C สามารถนำไปใช้เพื่อสร้างตัวแปลภาษาอื่นขึ้นมาได้ จากที่กล่าวไปแล้วว่าภาษา C เขียนง่ายและติดต่อกับอุปกรณ์ฮาร์ดแวร์สะดวก ดังนั้นภาษาCจึงถูกนำไปใช้สร้างตัวแปลภาษา เพื่อแปลจากภาษาระดับสูงเป็นภาษาเครื่อง
1. สร้างโปรแกรมเพื่อใช้สำหรับงานทั่วไป อย่างเช่น โปรแกรมคำนวณบัญชี โปรแกรมจัดการข้อมูลโปรแกรมจัดการไฟล์ และโปรแกรมอำนวยความสะดวกกับการทำงานทั่วไปตามความต้องการของผู้ใช้
2. ภาษา C เป็นต้นกำเนิดที่สำคัญของภาษาใหม่จำนวนมาก หลังจากที่ภาษา C ถูกคิดค้นขึ้นมา และมีการยอมรับอย่างแพร่หลาย ภาษา C จึงถูกนำไปใช้เป็นต้นแบบของภาษาใหม่ ๆ ที่เกิดขึ้นมาในระยะหลง อย่างเช่น PHP, C++, Java, C# ฯลฯ ดังนั้น ถ้าสามารถเขียนโปรแกรมด้วยภาษา C ได้แล้วจึงเป็นเรื่องง่ายที่เรียนรู้ภาษาอื่น ๆ ต่อไป
ท่อนจบบท
ในบทนี้เป็นการเรียนรู้ประวัติความเป็นมาของภาษา C การนำโปรแกรมภาษา C ไปใช้งาน ขั้นตอนการทำงานของโปรแกรมภาษา C ซึ่งทั้งหมดนี้ก็เพื่อเตรียมความพร้อมก่อนที่จะเข้าสู่การเขียนโปรแกรมด้วยภาษา C ในบทต่อ ๆ ไป