ภาษาโปรแกรม

**ภาษาโปรแกรม** คือภาษาประดิษฐ์ชนิดหนึ่งที่ออกแบบขึ้นมาเพื่อสื่อสารชุดคำสั่งแก่เครื่องจักร โดยเฉพาะอย่างยิ่งคอมพิวเตอร์ ภาษาโปรแกรมสามารถใช้สร้างโปรแกรมที่ควบคุมพฤติกรรมของเครื่องจักร และ/หรือ แสดงออกด้วยขั้นตอนวิธี (algorithm) อย่างตรงไปตรงมา ผู้เขียนโปรแกรมซึ่งหมายถึงผู้ที่ใช้ภาษาโปรแกรมเรียกว่า โปรแกรมเมอร์ (programmer)

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

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

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

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

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

## ลักษณะของภาษาโปรแกรม
ภาษาโปรแกรมแต่ละภาษาสามารถพิจารณาว่าเป็นเซตของข้อกำหนดอย่างเป็นทางการของวากยสัมพันธ์ ศัพท์ และความหมาย

ข้อกำหนดเหล่านี้มักรวมถึง:
* ข้อมูล และโครงสร้างข้อมูล
* คำสั่ง และลำดับการทำงาน
* ปรัชญาในการออกแบบ
* สถาปัตยกรรมของภาษา

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

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

ระบบที่ข้อมูลถูกจัดการภายในโปรแกรมเรียกว่าชนิดข้อมูลของภาษาโปรแกรม การออกแบบและศึกษาเกี่ยวกับชนิดข้อมูลเรียกว่าทฤษฎีชนิด ภาษาโปรแกรมสามารถจัดออกได้เป็นกลุ่มภาษาที่มี *การจัดชนิดแบบสถิตย์* และภาษาที่มี *[[การจัดชนิดแบบพลวัต]]*

### โครงสร้างข้อมูล

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

## ภาษาโปรแกรมที่นิยม
* ภาษาเครื่อง (Machine Languages)
* ภาษาแอสเซมบลี (Assembly)
* ภาษาระดับสูง (High-level Languages)
** ภาษาซี (C)
** ภาษาซีพลัสพลัส (C++)
** ภาษาซีชาร์ป (C#)
** ภาษาโคบอล (COBOL)
** ภาษาปาสกาล (Pascal)
** ภาษาเบสิก (BASIC)
** ภาษาฟอร์แทรน (FORTRAN)
** ภาษาจาวา (Java)
** ภาษาจาวาสคริปต์ (JavaScript)
** ภาษาเพิร์ล (Perl)
** ภาษาพีเอชพี (PHP)
** ภาษาไพทอน (Python)
** ภาษาโปรล็อก (Prolog)
** ภาษาอ็อบเจกทีฟ-ซี (Objective-C)
** ภาษารูบี (Ruby)

## อ้างอิง


หมวดหมู่:สัญกรณ์