ภาษาไหนดี? (Programming Language)

เรายังรู้ไม่ถึง เศษหนึ่งส่วนล้าน ในหนึ่งเปอร์เซนต์ ของสิ่งที่มีอยู่ในโลกนี้
( Thomas Edison – นักประดิษฐ์คิดค้น ชาวอเมริกัน 1847 – 1931 )

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

สำหรับมือใหม่ที่อยากจะเขียนโปรแกรมหรือสร้างชิ้นงานอะไรของตัวเองนั้น การเลือกภาษา Programming Language นั้นเป็นปัญหาแน่นอน

แค่เดินไปที่ชั้นขายหนังสือก็ต้องตกใจกับชื่อภาษาอะไรก็ไม่รู้มากมายเต็มไปหมดเช่นสายภาษาตระกูล C พอเดินไปอีกหน่อยก็เจอ C++ ตามด้วย C# แถมยังไม่พอ เจอ VC# พวก .NET ตามมาอีก แถมถ้าอยากจะเขียนเว็บ ก็เจอ php asp javascript เอ๊ะ แล้วมันตัวเดียวกับหนังสือ Java ที่วางไว้ข้างๆ รึเปล่านะ?
ยิ่งสมัยนี้ ยุค Mobile App. เฟื่อฟู ทั้ง Android iOS WindowsPhone ฯลฯ ซึ่งแต่ละค่ายก็ใช้ภาษาต่างกันไป

แล้วสำหรับมือใหม่จะรู้มั้ยเนี่ยว่าภาษาอะไรเป็นยังไง

แล้วทำไมต้องมีหลายๆ ภาษา?

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

แล้วอย่างนี้ ภาษาไหนดีสุด?

ภาษาที่เราชอบนั่นแหละดีที่สุด (ไม่ได้กวนนะครับ) ใครชอบภาษาไหนก็จะบอกว่าภาษาอื่นๆ ที่ตัวเองไม่ถนัดเนี่ยใช้ยาก ไม่ดี มีปัญหาเยอะ

มันก็คล้ายๆ ก็มีความเป็นสาวกอยู่นิดหน่อยนั่นแหละ

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

มีภาษาใหม่ๆ เกิดขึ้นตลอด...

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

ดังนั้นจะขอแนะนำว่าภาษาไหนเป็นยังไงบ้าง แต่จะขอบอกไว้ก่อนว่าคนเขียนก็ไม่ได้เกิดทันพวกภาษาโบราณๆ สักเท่าไหร่ (ฮา)

Assembly

นิยามสั้นๆ: อ่านไม่ค่อยรู้เรื่อง เขียนยาก แต่ทำให้เข้าใจหลักคอมพิวเตอร์
ขอสามคำ: ซับ-ซ้อน-เกิ๊น!
ระดับความชอบ:  ★

00000030 B9FFFFFFFF      mov  ecx, -1
                     .loop:
00000035 41              inc  ecx    
00000036 803C0800        cmp  byte [eax + ecx], 0
0000003A 75F9            jne  .loop
                     .done:
0000003C C3              ret

ถือว่าเป็นต้นตระกูลของภาษาคอมทั้งหมดเลยก็ว่าได้ ภาษานี้ถือว่าเป็นภาษาระดับต่ำ นั่นแปลว่ามันแทบจะเป็น ภาษาเครื่อง หรือ machine code อยู่แล้ว (อาจจะเคยได้ยินที่บอกว่าคอมพิวเตอร์เข้าใจแค่ 1 กับ 0 เท่านั้น )
แอสเซมบลีก็คล้ายๆ กับการแหลงรหัส 1010101001 ให้เป็นตัวย่อภาษาอังกฤษที่คนอ่านพอรู้เรื่องได้ขึ้นมาหน่อย เช่น จะย้ายค่า 10 เข้ารีจิสเตอร์ก็สั่งว่า mov AX,10 หรือพูดง่ายๆ มันแต่ทำให้โปรแกรมเมอร์ทำงานง่ายขึ้นแทนที่จะต้องไปอ่านโค้ดแบบ DF C4 00 A6 อะไรแบบนี้

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

ตามทฤษฎีมันก็ถูกแหละนะ มันเป็นเรื่องจริงแต่ตกบางที่สำคัญอย่างไป...นั่นคือ

Assembly เป็นภาษาที่มี Productivity ต่ำติดดิน

Productivity อืม...ถ้าอธิบายตรงๆ เลยมันก็คือความเร็วในการ เขียนงานให้เสร็จ นั้นแหละ

ทำงานเสร็จคืออะไร?

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

ก็ดูดีนี่นา?

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

ข้อเสียที่ร้ายแรงอีกอย่างของ Assembly คือ CPU หน่วยประมวลผลหลักของคอมของเรานี่แหละ
คือ เรื่องมันมีอยู่ว่า CPU แต่ละยี่ห้อหรือแม้แต่ยี่ห้อเดียวกับแต่คนละรุ่นจะมีรีจิสเตอร์หรือ Architectureไม่เหมือนกันซึ่งมันทำให้คุณต้องเขียนใหม่ทุกครั้งที่จะเอา โปรแกรมของคุณย้ายไปทำงานเครื่องอื่น

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

FORTRAN

นิยามสั้นๆ: ไม่เคยเขียน
ระดับความชอบ:  ---

      READ INPUT TAPE 5, 501, IA, IB, IC
  501 FORMAT (3I5)
      IF (IA) 777, 777, 701
  701 IF (IB) 777, 777, 702
  702 IF (IC) 777, 777, 703
  703 IF (IA+IB-IC) 777,777,704
  704 IF (IA+IC-IB) 777,777,705
  705 IF (IB+IC-IA) 777,777,799
  777 STOP 1
  799 S = FLOATF (IA + IB + IC) / 2.0
      AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
     +     (S - FLOATF(IC)))
      WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA
  601 FORMAT (4H A= ,I5,5H  B= ,I5,5H  C= ,I5,8H  AREA= ,F10.2,
     +        13H SQUARE UNITS)
      STOP
      END

ภาษาเก่าแก่ตัวนึงในโลกโปรแกรมมิ่ง (ตัวนี้เราไม่เคยเขียนนะ เกิดไม่ทัน) ถือว่าเป็นภาษาระดับสูงตัวแรกๆ เลยทีเดียว เกิดขึ้นมาตั้งแต่ช่วงปี 1950 โน้น...ชื่อภาษาเป็นการรวมคำระหว่างคำว่า FORmular กับ TRANslator มันทำงานบนเครื่องเมนเฟรมแต่หลังๆ มานี่ก็มีคอมไพเลอร์ออกมาใหม่ๆ มากขึ้นทำให้มันมาทำงานบน PC ธรรมดาสามัญได้แล้ว ส่วนมากใช้เขียนโปรแกรมประยุคต์ทางคณิตศาสตร์เพราะมันมีประสิทธิภาพในการคำนวณสูงมาก (เขาว่ากันมางั้นนะ)

BASIC / Pascal

นิยามสั้นๆ: เข้าใจง่ายมาก แต่ทำไรไม่ค่อยได้ เอาไว้เพื่อการศึกษา
ระดับความชอบ:  ★

if a > b then
    WriteLn('true')
else
    WriteLn('false');

for i := 1 to 10 do
    WriteLn('for loop: ', i);
while a <> b do
    WriteLn('while loop');
repeat
  a := a + 1
until a = 100;

case i of
    1 : Write('one');
    2 : Write('two');
    3,4,5: Write('more')
end;

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

โดยส่วนตัวไม่เคยเขียน แต่โค้ดในภาษาพวกนี้ก็สามาระอ่านเข้าใจได้ว่ามันทำอะไรตรงไหน

C/C++

นิยามสั้นๆ: พวกรอยต่อระหว่างวัย ภาษาระดับสูงที่ทำตัวแบบระดับต่ำ ทำได้แทบจะทุกอย่าง แต่กว่าจะได้แต่ล่ะอย่างก็ยากไปนะ
ขอสามคำ: เหมือน-จะ-ดี
ระดับความชอบ:  ★★
void main(){    if( a > b ){
        printf("true");
    }

    else{
        printf("false");
    }

   for(i = 0; i < 10; i++){
        printf("for loop %d", i);
    }
    while(a != b){
        scanf("%d", &a);    }
    return 0;
}

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

แรกๆ มันก็เป็นแค่ภาษา C ที่ถูกตั้งชื่อตามภาษาก่อนหน้ามันคือ ภาษา B แต่ปรากฏว่ามันใช้ได้ดี คนชอบเป็นที่นิยม เลยเอามาปรับปรุงเป็น C++ ซึ่งก็คือๆ กันนั้นแหละเหมือน C ที่เพิ่มพลังแล้ว
สร้างขึ้นมาเพื่อสร้างระบบปฏิบัติการหรือ OS กับพวก UNIX โดยเขาต้องการให้มันย้ายไปทำงานข้าม OS ได้ไม่เหมือนกับ Assembly ซึ่งวิธีก็คือจะให้งานกับระบบไหนก็สร้าง compiler หรือตัวแปลงโค้ดภาษาคอมพิวเตอร์ให้กลายเป็น machine code ที่คอมพิวเตอร์เข้าใจได้ ของ OS ตัวนั้นๆๆ ขึ้นมา...ประมาณว่าใช้ภาษาซีนี่แหละเป็นภาษากลาง
รูปแบบของภาษาซีนั้นค่อนข้างสั้นและกะทัดรัดทำให้เขียนโค้ดได้เร็วมาก เช่นเรื่องที่เปลี่ยน คีย์เวิร์ดที่เป็นภาษาอังกฤษ มาเป็นสัญลักษณ์
แบบ BEGIN-END ก็เปลี่ยนมาใช้ { } ปีกกาคร่อมโค้ดเอาแทน
สัญลักษณ์ส่วนใหญ่ที่ภาษาอื่นไม่ถือว่าเป็น reserved word นั้น ซีเล่นเอามาใช้เกือบหมดเลย
จุดเด่นนี้ก็ทำให้โปรแกรมมันเขียนเร็วจริง แทนที่จะมาพิมพ์คีย์เวิร์ดทั้งทำแบบภาษาอื่นๆ แต่จุดนี้ก็มีคนไม่ชอบเหมือนกันเพราะมันทำให้โปรแกรมอ่านยากแบบเวลาคุณเจอ {{{…}}} หลายๆ ตัวซ้อนกันคุณก็ตาลายได้นะ ต่างกับภาษาฝั่ง VB หรือ Visual Basic (พื้นฐานราวๆ BASIC นั่นแหละ)  ที่มีคำบอกชัดเจนว่าตรงนี้คืออะไร
อีกเรื่องคือมันเป็น Case Sensitive คือภาษาซีมองว่าตัว A กับ a เป็นตัวอักษรคนละตัวกัน ซึ่งด้านนึงมันทำให้เข้าโปรแกรมได้คล่องตัวมาขึ้น แต่อีกด้านก็ทำให้ผู้ใช้ต้องมานั่งจำว่าคำสั่งนี้ต้องเขียนด้วยตัวใหญ่หรือตัวเล็ก แต่นั่นก็ไม่ใช่ปัญหาเท่าไหร่หรอกนะถ้าคุณจะเขียนมันจริงๆ เพราะภาษาใหม่ๆ เดี๋ยวนี้ก็เป็นแบบนี้เยอะแล้ว
เรื่องเด่นสุดๆ ของซีซึ่งภาษาระดับสูงอื่นๆ มันทำไม่ได้ก็คือ pointer นั่นเอง...
การที่ซีมี pointer ทำให้การจัดระดับภาษาของหนังสือบางเล่มจัดว่า ภาษาซีเป็นภาษาระดับกลาง (ปกติเขาแยกกันแค่ระดับต่ำกับสูงเท่านั้นครับ) เพราะมันเทียบความสามารถกับ Assembly ได้เลยในเรื่องนี้ (ถึงจะไม่คล่องตัวเท่าก็เถอะ) ในขณะที่มันมีรูปแบบการเขียนเหมือนภาษาระดับสูง
pointer คือการที่โปรแกรมยอมให้คุณเข้าไปยุ่งกับหน่วยความจำหลักหรือ RAM ของคุณได้
เปรียบเทียบง่ายๆ เช่นให้นึกว่าคุณเป็นร้านขายของ
ภาษาอื่นพอลูกค้ามาหน้าร้านก็จะถามว่าจะเอาอะไรแล้วไปหยิบของนั้นมาให้ แต่การที่มี pointer คือการยอมให้ลูกค้าเข้าร้านไปหยิบของเองซึ่งเป็นการประหยัดเวลาแล้วเพิ่มความคล่องตัวในการเขียนโปรแกรมมากมาย
แต่นี้ก็เป็นจุดด้อยข้อหนึ่งคือ การที่เราเข้าไปยุ่งกับ pointer อาจจะพลาดไปโดนไฟล์ระบบได้ซึ่งทำให้โปรแกรมของคุณงานเข้าแน่นอน
ข้อเสียอีกอย่าง (ยังมีอีกเรอะ?) มันมีปัญหา memory leak หรือที่เรียกกันว่าหน่วยความจำรั่ว คือมันกินหน่วยความจำ...กินในที่นี้หมายถึงว่า
โปรแกรมจากภาษาซีไม่มีระบบการคือทรัพยากรเครื่องแบบอัตโนมัติ
คุณต้องสั่งเองทั้งหมดทำให้คอมพิวเตอร์จะทำงานเร็วในการรันโปรแกรมครั้งแรกๆ แต่ถ้าผ่านไป (ยิ่งถ้าเป็นโปรแกรมใหญ่จะเห็นผลเร็ว) การรันโปรแกรมครั้งหลังๆ มันจะอืดมากจนคุณต้อง reboot โปรแกรมใหม่กันเลย หรือไม่ถ้าหนักๆ หน่อยก็โปรแกรมค้างไปเลย
แต่เอาตรงๆ ภาษามันไม่ได้ผิดหรอก โปรแกรมเมอร์ตั้งหากที่เขียนไม่ดี สั่งงานไม่ครบ
เรื่องนี้คนเขียนเคยเจอมาแล้วตอนทำโปรเจค ตอนนั้นเครื่องใส่แรมไว้ 8 GB ซึ่งถือว่าเยอะมาก แต่เนื่องจากโปรเจคนั้นใหญ่มาก เขียนให้โปรแกรมจองหน่วยความจำแล้วมีบางจุดที่ลืมสั่งให้คืนหน่วยความจำ
ผลก็คือกราฟของการใช้หน่วยความจำพุ่งขึ้นจาก 3 GB ไปถึงเกือบ 7 CG แล้วโปรแกรมก็ค้างไปเลย
ในปัจจุบัน ภาษาซีเสื่อมความนิยมลงไปแล้วตั้งแต่คอมพิวเตอร์เปลี่ยนยุค command line ที่เราต้องมานั่งพิมพ์คำสั่ง (นึกถึงจอ DOS สีดำนั่นแหละ) มาเป็น windows GUI ซึ่งซีสู้ภาษาใหม่ๆ ที่ออกแบบมาสำหรับโปรแกรมพวกที่หน้าจอเป็นวินโดว์แล้วไม่ค่อยได้ ถ้าจะมีที่รับมือได้ก็คือ C++ ที่มีการเสริม library สำหรับทำกราฟิกแล้วเท่านั้น

Java

นิยามสั้นๆ: อ๊อบเจ๊~ค อ๊อบเจ็ค (object) ภาษานี้เน้นการเขียนโปรแกรมแบบ OOP เป็นหลัก งานเล็กแค่ไหนก็ต้องสร้างคลาส แต่ก็ถือว่าเป็นภาษา OOP ตัวอย่างเลยล่ะ
ขอสามคำ: คลาส-อ๊อบเจ็ค
ระดับความชอบ:  ★★★
import java.io.*;

class MyClass{
    public static void main (String[] args) throws java.lang.Exception{
        BufferedReader r = new BufferedReader (new InputStreamReader (System.in));
        String s;
        while (!(s=r.readLine()).startsWith("42")) {
            System.out.println(s);
        }
    }
}

กำลังเขียนใหม่อยู่ รอแป๊ปนะ

3514 Total Views 3 Views Today
Ta

Ta

สิ่งมีชีวิตตัวอ้วนๆ กลมๆ เคลื่อนที่ไปไหนโดยการกลิ้ง .. ถนัดการดำรงชีวิตโดยไม่โดนแสงแดด
ปัจจุบันเป็น Senior Software Engineer อยู่ที่ Centrillion Technology
งานอดิเรกคือ เขียนโปรแกรม อ่านหนังสือ เขียนบทความ วาดรูป และ เล่นแบดมินตัน

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *