[0]zero-index clytie0x/zero-index

0.1 คอมพิวเตอร์อ่านโค้ดเรายังไง

คอมพิวเตอร์ไม่รู้จักภาษา C

ข้างในคอมพิวเตอร์มีแค่สัญญาณไฟฟ้าเปิดกับปิด เขียนแทนด้วย 1 กับ 0 คำสั่งที่ CPU ทำได้จริงจึงเป็นตัวเลขฐานสองยาวๆ เรียกว่า ภาษาเครื่อง (machine code)

01010101 01001000 10001001 11100101 ...

คนเขียนแบบนี้ไม่ไหว เราเลยเขียนเป็นภาษาที่คนอ่านออก เช่นภาษา C

printf("Hello, World!\n");

แล้วให้โปรแกรมอีกตัวช่วย แปล เป็นภาษาเครื่อง ตัวแปลมีสองแบบใหญ่ๆ

ตัวแปลแบบที่ 1 compiler

compiler อ่านโค้ด ทั้งไฟล์ แปลเป็นภาษาเครื่องให้เสร็จก่อน ได้ออกมาเป็นไฟล์โปรแกรม (บน Windows คือไฟล์ .exe) จากนั้นค่อยรันไฟล์นั้น

เหมือนจ้างคนแปลหนังสือทั้งเล่มจนเสร็จ แล้วเราค่อยอ่านฉบับแปล อ่านซ้ำกี่รอบก็ไม่ต้องแปลใหม่

ภาษาที่ใช้ compiler เช่น C และ C++

ตัวแปลแบบที่ 2 interpreter

interpreter แปลไปทำไป ทุกครั้งที่สั่งรัน ไม่มีไฟล์ .exe เกิดขึ้น Python ตรวจไวยากรณ์ทั้งไฟล์ก่อนเริ่ม แล้วทำตามคำสั่งทีละบรรทัด

เหมือนมีล่ามยืนข้างๆ คอยแปลให้ฟังทีละประโยค เริ่มได้ทันที แต่ทุกครั้งที่ฟังใหม่ ล่ามต้องแปลใหม่ทุกประโยค

ภาษาที่ใช้ interpreter เช่น Python

ต่างกันยังไง

compiler (C, C++)interpreter (Python)
เริ่มรันต้องแปลทั้งไฟล์ก่อนรันได้ทันที
ความเร็วตอนรันเร็วมากช้ากว่าหลายสิบเท่า
ถ้าพิมพ์ผิดบอก error ก่อนรัน ยังไม่ได้รันสักบรรทัดผิดไวยากรณ์ เช่นลืมวงเล็บ ก็บอก error ก่อนรัน เพราะ Python อ่านทั้งไฟล์ก่อนเริ่ม แต่ผิดแบบอื่น เช่นใช้ชื่อตัวแปรที่ไม่มี จะรันไปจนถึงบรรทัดนั้นแล้วค่อยหยุด
สิ่งที่ได้ไฟล์ .exe เอาไปรันบนเครื่อง Windows เครื่องอื่นได้ โดยไม่ต้องมี compilerต้องมี Python ในเครื่องที่จะรัน

เร็วกว่ากันแค่ไหน

ลองให้ทั้งสองภาษาวนลูป 100 ล้านรอบแบบเดียวกัน รอบละหนึ่งคำสั่งคือ s += i % 7 (บวกเศษจากการหาร i ด้วย 7 เข้าไปใน s) บนโน้ตบุ๊กที่ใช้เขียนเอกสารนี้ ภาษา C คอมไพล์แบบ -O2 ที่ระบบตรวจมักใช้ (อธิบายในหน้า 4.5) Python รุ่น 3.13 จับเวลาเฉพาะช่วงลูป รันอย่างละ 5 ครั้งแล้วเอาค่ากลาง

ภาษาเวลา
Cประมาณ 0.05 วินาที
Pythonประมาณ 5.4 วินาที

C เร็วกว่าราว 100 เท่า ตัวเลขบนเครื่องน้องจะไม่เท่านี้ แต่ห่างกันระดับนี้เหมือนกัน หน้า 4.5 จะวัดลูปแบบอื่นอีก ลูปที่มีแค่การบวกเร็วกว่านี้ ลูปที่หารด้วยตัวแปรช้ากว่านี้

ทำไมค่ายนี้ใช้ภาษา C

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

Python ไม่ได้แย่

Python เขียนสั้น อ่านง่าย เหมาะกับงานวิเคราะห์ข้อมูล AI และงานอัตโนมัติ แต่ละภาษาเหมาะกับงานคนละแบบ สำหรับการแข่งที่วัดความเร็ว C และ C++ ตอบโจทย์กว่า

C กับ C++ ใช้ตัวแปลตัวไหน

ทั้งสองภาษาใช้ชุด compiler เดียวกันชื่อ GCC ซึ่งมากับ Code::Blocks ที่จะติดตั้งในหน้าถัดไป

ภาษานามสกุลไฟล์ตัวแปล
C.cgcc
C++.cppg++

Code::Blocks ดูนามสกุลไฟล์แล้วเลือกตัวแปลให้เอง น้องมีหน้าที่อย่างเดียวคือ ตั้งชื่อไฟล์ให้ลงท้ายถูก ช่วงนี้เราเขียน C ไฟล์ทุกไฟล์ต้องลงท้ายด้วย .c

สรุป

  • CPU เข้าใจแค่ภาษาเครื่อง โค้ดภาษา C ต้องถูกแปลก่อน
  • compiler แปลทั้งไฟล์ได้ .exe แล้วค่อยรัน interpreter แปลไปทำไป
  • ภาษา C รันเร็วกว่า Python ราวร้อยเท่าในลูปที่วัด จึงเหมาะกับโจทย์ที่จำกัดเวลา
  • C ใช้ gcc C++ ใช้ g++ ไฟล์ภาษา C ต้องลงท้ายด้วย .c