67 lines
16 KiB
Typst
67 lines
16 KiB
Typst
#import "../PageTemplate.typ": *
|
|
|
|
= ภาษาซี (C Programming Language) <cprogramming>
|
|
|
|
#i ภาษาซีเป็นภาษาโปรแกรมสำหรับวัตถุประสงค์ทั่วไปสร้างขึ้นในช่วงทศวรรษ 1970 โดยเดนนิสริตชีและยังคงได้รับความนิยมและใช้งานอย่างกว้างขวางด้วยการออกแบบภาษาซีทำให้โปรแกรมเมอร์สามารถเข้าถึงคุณลักษณะต่างๆของสถาปัตยกรรมซีพียูทั่วไปได้โดยตรง ซึ่งปรับแต่งให้เหมาะกับชุดคำสั่ง เป้าหมาย ภาษาซี ถูกนำมาใช้และยังคงนำมาใช้ในการพัฒนาระบบปฏิบัติการไดรเวอร์อุปกรณ์และสแต็กโปรโตคอลแต่การใช้งานในซอฟต์แวร์แอปพลิเคชั่นกำลังลดลงภาษาซีถูกนำมาใช้ในคอมพิวเตอร์ตั้งแต่ซูเปอร์คอมพิวเตอร์ขนาดใหญ่ที่สุดไปจนถึงไมโครคอนโทรลเลอร์ขนาดเล็กที่สุดและระบบฝังตัว
|
|
|
|
#i
|
|
ภาษาซีเป็นภาษาเชิงกระบวนการที่จำเป็นรองรับการเขียนโปรแกรมแบบมีโครงสร้างขอบเขตตัวแปรเชิงศัพท์และการเรียกซ้ำด้วยระบบชนิดข้อมูลแบบคงที่ภาษาซีถูกออกแบบมาเพื่อการคอมไพล์เพื่อให้สามารถเข้าถึงหน่วยความจำ และโครงสร้างภาษา ในระดับต่ำซึ่งแมปกับคำสั่งเครื่องได้อย่างมีประสิทธิภาพ โดยทั้งหมดนี้รองรับรันไทม์ขั้นต่ำ แม้จะมีความสามารถในระดับต่ำ แต่ภาษาซีก็ถูกออกแบบมาเพื่อสนับสนุนการเขียนโปรแกรมข้ามแพลตฟอร์ม โปรแกรมซี ที่สอดคล้องกับมาตรฐานที่เขียนขึ้นโดยคำนึงถึงความสามารถในการพกพาสามารถคอมไพล์สำหรับแพลตฟอร์มคอมพิวเตอร์และระบบปฏิบัติการที่หลากหลาย โดยมีการเปลี่ยนแปลงซอร์สโคดเพียงเล็กน้อย
|
|
|
|
#i แม้ว่าทั้งภาษาซีและไลบรารีมาตรฐานของภาษา ซีจะไม่ได้มีคุณสมบัติยอดนิยมบางอย่างที่พบในภาษาอื่น แต่ก็มีความยืดหยุ่นเพียงพอที่จะรองรับคุณสมบัติเหล่านั้นได้ ตัวอย่างเช่นการวางแนววัตถุและการเก็บขยะนั้นจัดทำโดยไลบรารีภายนอก GLib Object System และ Boehm garbage collector ตามลำดับ
|
|
|
|
#i ตั้งแต่ปี 2000 เป็นต้นมาภาษาซี ได้รับการจัดอันดับอย่างต่อเนื่องให้อยู่ในอันดับสี่ภาษาสูงสุดในดัชนี TIOBEซึ่งเป็นการวัดความนิยมของภาษาการเขียนโปรแกรม
|
|
|
|
== ตัวอย่าง "Hello, world"
|
|
|
|
#i
|
|
ตัวอย่างโปรแกรม "Hello, World!" ที่ปรากฏใน K&R ฉบับพิมพ์ครั้งแรกได้กลายเป็นต้นแบบของโปรแกรมเบื้องต้นในตำราเรียนการเขียนโปรแกรมส่วนใหญ่ โปรแกรมจะพิมพ์ "hello, world" ออกทางเอาต์พุตมาตรฐาน
|
|
|
|
เวอร์ชันดั้งเดิมคือ
|
|
|
|
```c
|
|
main()
|
|
{
|
|
printf("hello, world\n");
|
|
}
|
|
```
|
|
|
|
|
|
เวอร์ชันที่ทันสมัยกว่าคือ
|
|
|
|
```c
|
|
#include <stdio.h>
|
|
|
|
int main(void)
|
|
{
|
|
printf("hello, world\n");
|
|
}
|
|
```
|
|
|
|
#i บรรทัดแรกเป็นคำสั่งพรีโพรเซสเซอร์ ซึ่งระบุด้วย `#include` ซึ่งทำให้พรีโพรเซสเซอร์แทนที่บรรทัดโคดนั้นด้วยข้อความของไฟล์ส่วนหัว `stdio.h` ซึ่งประกอบด้วยการประกาศสำหรับฟังก์ชันอินพุตและเอาต์พุต รวมถึง `printf` โดยวงเล็บเหลี่ยมที่อยู่รอบ ๆ `stdio.h` ระบุว่าสามารถค้นหาไฟล์ส่วนหัวได้โดยใช้กลยุทธ์การค้นหาที่เลือกไฟล์ส่วนหัวที่มาพร้อมกับคอมไพเลอร์ แทนที่จะเป็นไฟล์ที่มีชื่อเดียวกันซึ่งอาจพบได้ในไดเรกทอรีเฉพาะโครงการ
|
|
|
|
#i บรรทัดโคดถัดไปประกาศฟังก์ชันจุดเข้าสภาพแวดล้อมรันไทม์ `main` เรียกใช้ฟังก์ชันนี้เพื่อเริ่มการทำงานของโปรแกรม ตัวระบุชนิด `int` ระบุว่าฟังก์ชันส่งคืนค่าจำนวนเต็ม รายการพารามิเตอร์ `void` ระบุว่าฟังก์ชันไม่ได้ใช้อาร์กิวเมนต์ใด ๆ สภาพแวดล้อมรันไทม์ส่งอาร์กิวเมนต์สองรายการ (`int` และ `char*[]`) แต่การใช้งานนี้จะละเว้นอาร์กิวเมนต์เหล่านี้ มาตรฐาน ISO C (หัวข้อ 5.1.2.2.1) กำหนดให้ใช้ไวยากรณ์ที่เป็นโมฆะหรืออาร์กิวเมนต์สองรายการนี้ ซึ่งเป็นการปฏิบัติพิเศษที่ฟังก์ชันอื่น ๆ ไม่ได้ให้
|
|
|
|
#i วงเล็บปีกกาเปิดระบุจุดเริ่มต้นของโคดที่กำหนดฟังก์ชัน
|
|
|
|
#i บรรทัดถัดไปของโคดจะเรียกใช้ (เปลี่ยนเส้นทางการทำงานไปยัง) ฟังก์ชันไลบรารีมาตรฐานของ C `printf` พร้อมระบุตำแหน่งอักขระตัวแรกของสตริงที่สิ้นสุดด้วยค่า `null` ที่ระบุเป็นสตริงลิเทอรัลข้อความนี้ `\n` เป็นลำดับ escape ที่แสดง อักขระขึ้นบรรทัด ใหม่ซึ่งเมื่อส่งออกในเทอร์มินัลจะส่งผลให้เคอร์เซอร์เลื่อนไปที่จุดเริ่มต้นของบรรทัดถัดไป แม้ว่า `printf` จะคืนค่า `int` แต่ค่านั้นจะถูกละทิ้งไปอย่างเงียบๆ เครื่องหมายเซมิโคลอน `;` จะสิ้นสุดคำสั่งเรียก
|
|
|
|
#i วงเล็บปีกกาปิดหมายถึงจุดสิ้นสุดของฟังก์ชัน `main` โดยก่อน C99 จำเป็นต้องมีคำสั่ง `return 0;` ที่ชัดเจนเมื่อสิ้นสุดฟังก์ชัน `main` แต่ตั้งแต่ C99 ฟังก์ชัน `main` (ซึ่งเป็นการเรียกใช้ฟังก์ชันเริ่มต้น) จะคืนค่าโดยปริยาย 0 เมื่อถึงวงเล็บปีกกาปิดสุดท้าย
|
|
|
|
== คอนเซปต์พื้นฐาน
|
|
|
|
#i โปรแกรมภาษา C เป็นลำดับไฟล์ข้อความ (โดยทั่วไปคือไฟล์ header และไฟล์ source) ที่มีการประกาศต่าง ๆ และไฟล์เหล่านั้นถูกแปลงเป็นโปรแกรมที่ถูกเรียกใช้งานได้ ซึ่งโปรแกรมจะถูกใช้งานเมื่อระบบปฏิบัติการเรียกใช้ฟังก์ชันหลักของโปรแกรม (ยกเว้นหากว่าตัวมันเองคือระบบปฏิบัติการหรือโปรแกรมอิสระ)
|
|
|
|
#i บางคำศัพท์ในโปรแกรมภาษา C นั้นมีความหมายพิเศษ โดยคำเหล่านั้นคือ#strong[คีย์เวิร์ด] และคำอื่น ๆ สามารถใช้เป็นชื่อ (identifiers) ได้ ซึ่งอาจถูกใช้เป็นชื่อของวัตถุ, ฟังก์ชัน, โครงสร้าง (struct), ยูเนียน, หรือแท็ก enumerations, สมาชิกของมัน, ชื่อ typedef, ฉลาก, หรือมาโคร
|
|
|
|
#i ชื่อของสิ่งต่าง ๆ (ยกเว้นมาโคร) นั้นสามารถใช้ได้แค่ในเพียงในสโคป (scope) ของมัน หมายความว่า หากประกาศตัวแปลไว้ภายในฟังก์ชัน ตัวแปรนั้นจะไม่สามารถใช้นอกสโคปนั้นได้ ซึ่งในกรณีนี้สโคปคือฟังก์ชัน และชื่อบางชื่ออาจมีการลิงก์กันเพื่อให้สโคปอื่น ๆ สามารถลิงก์มาหาชื่อนั้น ๆ ได้
|
|
|
|
== ชุดแปลโปรแกรมของกนู (GNU Compiler Collection; GCC)
|
|
|
|
#i ในกระบวนการการพัฒนาโครงงานนี้ ชุดแปลโปรแกรมของกนูนั้นถูกใช้เป็นหลักเนื่องจากเป็นชุดแปลโปรแกรม (คอมไพเลอร์; Compiler) ที่ใช้เป็นหลักในการพัฒนาโคดที่สร้างบนพื้นฐาน Arduino และบอร์ดต่าง ๆ รวมถึงบอร์ด ESP32
|
|
|
|
#i ชุดคอมไพเลอร์ GNU (GNU Compiler Collection; GCC) (เดิมชื่อ GNU C Compiler) คือชุดคอมไพเลอร์จากโครงการ GNU ที่รองรับภาษาโปรแกรม สถาปัตยกรรมฮาร์ดแวร์ และระบบปฏิบัติการต่าง ๆ มูลนิธิซอฟต์แวร์เสรี (FSF) เผยแพร่ GCC ในฐานะซอฟต์แวร์เสรีภายใต้สัญญาอนุญาตสถูกเรียกาธารณะทั่วไปของ GNU (GNU GPL) GCC เป็นองค์ประกอบสำคัญของชุดเครื่องมือ GNU ซึ่งใช้สำหรับโครงการส่วนใหญ่ที่เกี่ยวข้องกับ GNU และเคอร์เนล Linux ด้วยโคดประมาณ 15 ล้านบรรทัดในปี 2019 GCC จึงเป็นหนึ่งในโปรแกรมฟรีที่ใหญ่ที่สุดเท่าที่เคยมีมา GCC มีบทบาทสำคัญในการเติบโตของซอฟต์แวร์เสรี ทั้งในฐานะเครื่องมือและตัวอย่าง
|
|
|
|
#i นอกจากจะเป็นคอมไพเลอร์อย่างเป็นทางการของระบบปฏิบัติการ GNU แล้ว GCC ยังได้รับการยอมรับให้เป็นคอมไพเลอร์มาตรฐานโดยระบบปฏิบัติการคอมพิวเตอร์สมัยใหม่ที่คล้ายกับ Unix อื่นๆ อีกมากมาย รวมถึงระบบปฏิบัติการ Linux ส่วนใหญ่ ระบบปฏิบัติการตระกูล BSD ส่วนใหญ่ก็เปลี่ยนมาใช้ GCC ไม่นานหลังจากเปิดตัว แม้ว่าหลังจากนั้น FreeBSD และ Apple macOS ได้เปลี่ยนมาใช้คอมไพเลอร์ Clang ส่วนใหญ่เป็นเพราะเหตุผลด้านลิขสิทธิ์ GCC ยังสามารถคอมไพเลอร์โคดสำหรับระบบปฏิบัติการ Windows, Android, iOS, Solaris, HP-UX, AIX และ MS-DOS ได้อีกด้วย
|
|
|
|
#i GCC ได้รับการพอร์ตไปยังแพลตฟอร์มและสถาปัตยกรรมชุดคำสั่งต่าง ๆ มากกว่าคอมไพเลอร์อื่น ๆ และถูกนำไปใช้งานอย่างกว้างขวางในฐานะเครื่องมือในการพัฒนาซอฟต์แวร์ทั้งแบบฟรีและแบบที่เป็นกรรมสิทธิ์ นอกจากนี้ GCC ยังพร้อมใช้งานสำหรับระบบฝังตัวมากมาย รวมถึงชิปที่ใช้ ARM และ Power ISA
|