วันพฤหัสบดีที่ 7 มิถุนายน พ.ศ. 2555

Java and C# for MiniCompiler part 3

ตามข้อตกลงจาก part ที่แล้วที่ว่า หนึ่งไฟล์ต่อจากนี้จะบรรจุเพียงหนึ่งคลาสเท่านั้น สำหรับ part นี้เรามาคุยกันสักนิดเกี่ยวกับการสร้างคลาสและนิยามการสร้างคลาสครับ (ก่อนที่จะมึนไปมากกว่านี้)

สร้างคลาสทำไม ? ภาษาซีไม่เห็นต้องสร้างเลย ?

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

ซี
#include <stdio.h>

void main() {
       printf("Hello World!");
}

โปรแกรมนี้ทำงานโดยนำเข้า (include) ไฟล์ไลบรารี่ที่ชื่อ stdio.h ซึ่งย่ามาจาก Standard Input Output ส่วน .h ย่อมากจาก header ซึ่งแปลว่า 'หัว'

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

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

อีกครั้งนะครับ โปรแกรมภาษาซีข้างต้นทำงานจากบนลงล่าง ดังนั้นพบ include ต่อไปก็พบฟังก์ชัน main หลังจากนั้นก็จะทำคำสั่งในฟังก์ชัน main คำสั่ง printf จะแสดงผลลัพธ์ออกทางจอดำ เป็นประโยคว่า "Hello World!" ก่อนจะจบฟังก์ชันและทำลายตัวเองทิ้ง (คืนหน่วยความจำ)

ตัวอย่างต่อไป

ซี
#include <stdio.h>

float summation(float x, float y) {
       return x + y;
}

void main() {
       printf("10 + 20 = %f", summation(10, 20));
}

ถามว่าโค้ดข้างต้นทำงานอะไรเอ่ย ? คำตอบคือแสดงผลลัพธ์ของการบวกกันของตัวเลขสองจำนวน นั่นคือ 10 และ 20 ผลลัพธ์ที่ได้ก็คือ "10 + 20 = 30" ออกทางจอดำนั่นเอง เอ๋ เหตุใดจึงเป็นเช่นนั้น ?

float summation(float x, float y) ก็คือฟังก์ชันครับ (โปรแกรมนี้มีสองฟังก์ชันแล้วนะ คือ summation กับ main) ฟังก์ชัน summation ทำงานโดยรับค่าตัวเลขจำนวนจริงใดๆเข้ามาสองค่า ค่าแรกเก็บไว้ในตัวแปร x และค่าที่สองเก็บไว้ในตัวแปร y จากนั้นนำ x และ y มาบวกกัน ส่งผลลัพธ์ที่ได้ด้วยคำสั่ง return กลับไปยังจุดที่ฟังก์ชันนี้ถูกเรียกใช้งาน

ฟังก์ชัน summation นี้ถูกเขียนไว้ก่อนฟังก์ชัน main ไม่ได้หมายความว่าทำงานก่อน main นะครับ เพียงแต่เขียนเพื่อบอกเจ้าคอมไพล์เลอร์ว่ามี summation ที่ทำงานอย่างนี้อยู่ หากเรียกใช้ก็จะทำงานอย่างนี้ๆ ฉะนั้นที่บรรทัดที่เรียก summation ให้ทำงานอย่าง
printf("10 + 20 = %f", summation(10, 20));
เจ้าคอมไพล์เลอร์จึง อ๋อ ฉันรู้จักนะ ฉันรู้จัก summation นะ ใช่ๆ ก่อนที่จะพบฟังก์ชัน main ฉันเห็นและจดจำเขาไว้แล้ว ประโยคที่เขียนว่า summation(10, 20) ซึ่งอยู่ท้ายฟังก์ชัน printf จึงนำค่า 10 และ 20 ที่ระบุกำหนดให้กับตัวแปร x และ y ตามลำดับ จากนั้นบวกค่าของ x และ y แล้วส่งออกมาด้วยคำสั่ง return การกระทำเช่นนี้แหละครับเพื่อนๆที่เรียกว่า 'คืนค่า' มายังจุดที่ถูกเรียก ค่าที่ได้คือ 30 จึงถูกส่งออกมาแล้วนำไปวางไว้ตรงตำแหน่ง %f สุดท้ายได้ผลลัพธ์เป็น
10 + 20 = 30

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

กลับเข้าเรื่องดีกว่านะครับ ตัวอย่างภาษาซีข้างต้นไม่เห็นมีคำว่า class เลยจริงไหม แล้วภาษาจาวากับซีชาร์ปมี class ไว้เพื่ออะไรล่ะ ?

เหตุที่ต้องมี class ก็เพื่อจัดกลุ่มตัวแปร, ฟังก์ชัน และอะไรก็ตามเข้าไว้ด้วยกัน เพราะมันทำงานสัมพันธ์กันในทำนองว่าเป็นงานเดียวกัน หมวดหมู่เดียวกันประมาณนั้น

ตัวอย่างไฟล์ header หรือ 'หัว' ที่เรารู้จักชื่อ stdio.h ก็รวบรวมฟังก์ชันหรือค่าคงที่ที่เกี่ยวข้องกับการทำงานรับค่า (input) หรือแสดงค่า (output) เข้าไว้ด้วยกัน คำสั่ง printf จะไม่มีทางเรียกให้ทำงานได้หากปราศจากการนำเขาไฟล์ stdio.h ฉะนั้นภาษาใหม่ๆจึงพยายามรวบรวมเอาแนวทางการทำงานที่สอดคล้องกันหรืองานจำเพาะเข้าไว้ด้วยกัน ภายหลังเมื่อต้องการเรียกมาใช้งานก็จะง่ายขึ้น โดยการระบุชื่อหลังคำว่า class แล้วหุ้มด้วยเครื่องหมาย { } เพื่อบอกขอบเขตเริ่มต้นและสิ้นสุดของตัวมันเอง ลองดูนี่สิครับ

จาวา, ซีชาร์ป
class Calculator { }

ตามข้อตกลงใส่ 'public' ข้างหน้าคำว่า class จึงได้

จาวา, ซีชาร์ป
public class Calculator { }

ทีนี้เราก็ได้คลาสชื่อ Calculator หรือเครื่องคำนวณมาแล้ว อิอิ ง่ายชิมิ จากนั้นยกฟังก์ชัน summation ในภาษาซีใส่เข้าไป

จาวา, ซีชาร์ป
public class Calculator {
       float summation(float x, float y) {
              return x + y;
       }
}

ที่สุดเราก็ได้คลาสที่มีความสามารถในการคำนวณมาแล้ว พอประมาณก่อนครับ ไว้ต่อ part หน้านะเพื่อนๆที่รัก

ไม่มีความคิดเห็น:

แสดงความคิดเห็น