กลับไปหน้าบทความ

อ่าน 19 นาที

ภาษาโปรแกรม

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

ภาษาโปรแกรม

ตรวจสอบแล้ว
หน้านี้ได้รับการป้องกันเนื่องจากมีการเปลี่ยนแปลงที่รอดำเนินการ

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

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

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

การออกแบบภาษาโปรแกรมได้รับอิทธิพลอย่างมากจากสถาปัตยกรรมคอมพิวเตอร์โดยภาษาเชิงคำสั่งส่วน ใหญ่ได้รับการออกแบบโดย อิง ตาม สถาปัตยกรรม von Neumann ที่แพร่หลาย [ 3 ]ในขณะที่ภาษาโปรแกรมยุคแรกมีความเชื่อมโยงอย่างใกล้ชิดกับฮาร์ดแวร์ภาษาโปรแกรมสมัยใหม่มักจะซ่อนรายละเอียดของฮาร์ดแวร์ผ่านนามธรรมเพื่อพยายามทำให้ซอฟต์แวร์ดีขึ้นโดยใช้ความพยายามน้อยลง ภาษาเหล่านี้เรียกว่าภาษาโปรแกรมระดับสูง[ 4 ]

ความสัมพันธ์กับภาษาธรรมชาติ

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

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

John C. Reynoldsเน้นย้ำว่า ภาษา ข้อกำหนดอย่างเป็นทางการเป็นภาษาโปรแกรมเช่นเดียวกับภาษาใดๆ ที่มุ่งหมายสำหรับการดำเนินการ เขาโต้แย้งว่ารูปแบบการป้อนข้อมูลที่เป็นข้อความและแม้แต่กราฟิกที่ส่งผลต่อพฤติกรรมของคอมพิวเตอร์เป็นภาษาโปรแกรม แม้ว่าโดยทั่วไปแล้วจะไม่ใช่ภาษา Turing-complete ก็ตาม และตั้งข้อสังเกตว่าการไม่รู้แนวคิดของภาษาโปรแกรมเป็นสาเหตุของข้อบกพร่องมากมายในรูปแบบการป้อนข้อมูล[ 9 ]

ประวัติศาสตร์

พัฒนาการในช่วงแรก

คอมพิวเตอร์ที่สามารถตั้งโปรแกรมได้เครื่องแรกถูกประดิษฐ์ขึ้นในช่วงทศวรรษ 1940 และพร้อมกันนั้นก็มีภาษาโปรแกรมภาษาแรกๆ เกิดขึ้นด้วย[ 10 ] [ 11 ]คอมพิวเตอร์รุ่นแรกๆ ถูกตั้งโปรแกรมด้วยภาษาโปรแกรมรุ่นแรก (1GLs) ซึ่งเป็นภาษาเครื่อง (คำสั่งง่ายๆ ที่โปรเซสเซอร์สามารถประมวลผลได้โดยตรง) โค้ดนี้ยากต่อการแก้ไขข้อผิดพลาดและไม่สามารถพกพาได้ระหว่างระบบคอมพิวเตอร์ต่างๆ[ 12 ]เพื่อปรับปรุงความสะดวกในการเขียนโปรแกรม จึง มีการประดิษฐ์ ภาษาแอสเซมบลี (หรือภาษาโปรแกรมรุ่นที่สอง —2GLs) ขึ้นมา โดยแยกออกมาจากภาษาเครื่องเพื่อให้โปรแกรมเข้าใจง่ายขึ้นสำหรับมนุษย์ แม้ว่าจะไม่ได้เพิ่มความสามารถในการพกพา[ 13 ]

ในตอนแรก ทรัพยากรฮาร์ดแวร์มีจำกัดและมีราคาแพง ในขณะที่ทรัพยากรมนุษย์มีราคาถูกกว่า ดังนั้น ภาษาที่ยุ่งยากและใช้เวลานานในการใช้งาน แต่มีความใกล้เคียงกับฮาร์ดแวร์เพื่อประสิทธิภาพที่สูงขึ้นจึงเป็นที่นิยม[ 14 ]การนำภาษาโปรแกรมระดับสูง ( ภาษาโปรแกรมรุ่นที่สาม —3GLs) มาใช้ ได้ปฏิวัติการเขียนโปรแกรม ภาษาเหล่านี้ได้แยกรายละเอียดของฮาร์ดแวร์ออกไป โดยออกแบบมาเพื่อแสดงอัลกอริทึมที่มนุษย์สามารถเข้าใจได้ง่ายขึ้น ตัวอย่างเช่น นิพจน์ทางคณิตศาสตร์สามารถเขียนในรูปแบบสัญลักษณ์และแปลเป็นรหัสเครื่องที่ฮาร์ดแวร์สามารถประมวลผลได้ในภายหลัง[ 13 ]ในปี 1957 Fortran (FORmula TRANslation) ได้ถูกคิดค้นขึ้น ซึ่งมักถูกพิจารณาว่าเป็น ภาษาโปรแกรมระดับสูงที่คอมไพล์เป็นภาษาแรก[ 13 ] [ 15 ] Fortran ยังคงถูกใช้งานมาจนถึงศตวรรษที่ 21 [ 16 ]

ทศวรรษ 1960 และ 1970

สองคนกำลังใช้เมนเฟรมIBM 704 ซึ่งเป็นฮาร์ดแวร์เครื่องแรกที่รองรับการคำนวณเลขทศนิยมในปี พ.ศ. 2490 ภาษา Fortranได้รับการออกแบบมาสำหรับเครื่องนี้[ 17 ] [ 16 ]

ประมาณปี 1960 เมนเฟรมเครื่องแรกซึ่งเป็นคอมพิวเตอร์อเนกประสงค์ ได้รับการพัฒนาขึ้น แม้ว่าจะสามารถใช้งานได้โดยผู้เชี่ยวชาญเท่านั้น และมีราคาสูงมาก ข้อมูลและคำสั่งถูกป้อนโดยใช้บัตรเจาะรูซึ่งหมายความว่าไม่สามารถเพิ่มข้อมูลป้อนเข้าได้ในขณะที่โปรแกรมกำลังทำงาน ดังนั้นภาษาที่พัฒนาขึ้นในเวลานั้นจึงได้รับการออกแบบมาเพื่อการโต้ตอบที่น้อยที่สุด[ 18 ]หลังจากการประดิษฐ์ไมโครโปรเซสเซอร์คอมพิวเตอร์ในช่วงทศวรรษ 1970 ก็มีราคาถูกลงอย่างมาก[ 19 ]คอมพิวเตอร์รุ่นใหม่ยังอนุญาตให้มีการโต้ตอบกับผู้ใช้มากขึ้น ซึ่งได้รับการสนับสนุนจากภาษาการเขียนโปรแกรมรุ่นใหม่[ 20 ]

Lispซึ่งถูกนำมาใช้ในปี 1958 เป็นภาษาการเขียนโปรแกรมเชิงฟังก์ชันภาษาแรก[ 21 ]แตกต่างจาก Fortran ตรงที่มันรองรับการเรียกซ้ำและนิพจน์เงื่อนไข [ 22 ]และยังแนะนำการจัดการหน่วยความจำแบบไดนามิกบนฮีปและการเก็บขยะอัตโนมัติ[ 23 ]ในช่วงหลายทศวรรษต่อมา Lisp ครองแอปพลิเคชันปัญญาประดิษฐ์[ 24 ]ในปี 1978 ภาษาเชิงฟังก์ชันอีกภาษาหนึ่งคือMLได้แนะนำประเภทที่อนุมานและพารามิเตอร์ แบบโพลีมอร์ ฟิก[ 20 ] [ 25 ]

หลังจากที่ALGOL (ALGOrithmic Language) ได้รับการเผยแพร่ในปี 1958 และ 1960 [ 26 ]มันได้กลายเป็นมาตรฐานในวรรณกรรมคอมพิวเตอร์สำหรับการอธิบายอัลกอริทึมแม้ว่าความสำเร็จในเชิงพาณิชย์จะมีจำกัด แต่ภาษาเชิงคำสั่งที่เป็นที่นิยมส่วนใหญ่—รวมถึงC , Pascal , Ada , C++ , JavaและC# —ล้วนสืบทอดมาจาก ALGOL 60 โดยตรงหรือโดยอ้อม[ 27 ] [ 16 ]นวัตกรรมที่ภาษาโปรแกรมรุ่นหลังนำไปใช้ ได้แก่ ความสามารถในการพกพาที่มากขึ้นและการใช้ไวยากรณ์BNF แบบ ไม่ขึ้นกับบริบท เป็นครั้งแรก [ 28 ] Simula ซึ่งเป็น ภาษาแรกที่สนับสนุนการเขียนโปรแกรมเชิงวัตถุ (รวมถึงชนิดย่อยการเรียกใช้แบบไดนามิกและการสืบทอด ) ก็สืบทอดมาจาก ALGOL และประสบความสำเร็จในเชิงพาณิชย์[ 29 ] C ซึ่งเป็นภาษาที่สืบทอดมาจาก ALGOL อีกภาษาหนึ่ง ยังคงได้รับความนิยมมาจนถึงศตวรรษที่ 21 C อนุญาตให้เข้าถึงการดำเนินการระดับเครื่องที่ต่ำกว่าภาษาอื่นๆ ในยุคเดียวกัน พลังและประสิทธิภาพที่สร้างขึ้นบางส่วนด้วย การดำเนินการ ตัวชี้ ที่ยืดหยุ่นนั้น มาพร้อมกับต้นทุนที่ทำให้การเขียนโค้ดที่ถูกต้องทำได้ยากขึ้น[ 20 ]

Prologซึ่งออกแบบในปี 1972 เป็น ภาษา การเขียนโปรแกรมเชิงตรรกะ ภาษาแรก ที่สื่อสารกับคอมพิวเตอร์โดยใช้สัญกรณ์ตรรกะที่เป็นทางการ[ 30 ] [ 31 ]ด้วยการเขียนโปรแกรมเชิงตรรกะ โปรแกรมเมอร์จะระบุผลลัพธ์ที่ต้องการและปล่อยให้ตัวแปลภาษาตัดสินใจว่าจะบรรลุผลนั้นได้อย่างไร[ 32 ] [ 31 ]

ช่วงทศวรรษ 1980 ถึง 2000

ตัวอย่างหนังสือเรียนภาษาโปรแกรมมิ่งจำนวนเล็กน้อย

ในช่วงทศวรรษ 1980 การประดิษฐ์คอมพิวเตอร์ส่วนบุคคลได้เปลี่ยนแปลงบทบาทของภาษาโปรแกรม[ 33 ]ภาษาใหม่ที่เปิดตัวในช่วงทศวรรษ 1980 ได้แก่ C++ ซึ่งเป็นซูเปอร์เซ็ตของ C ที่สามารถคอมไพล์โปรแกรม C ได้ แต่ยังรองรับคลาสและการสืบทอด อีกด้วย [ 34 ] Adaและภาษาใหม่ๆ อื่นๆ ได้นำเสนอการสนับสนุนการทำงานพร้อมกัน [ 35 ] รัฐบาลญี่ปุ่นลงทุนอย่างมากในภาษาที่เรียกว่าภาษาเจเนอเรชั่นที่ห้า ซึ่งเพิ่มการสนับสนุน การทำงานพร้อมกันให้กับโครงสร้างการเขียนโปรแกรมเชิงตรรกะ แต่ภาษาเหล่านี้มีประสิทธิภาพด้อยกว่าภาษาอื่นๆ ที่รองรับการทำงานพร้อมกัน[ 36 ] [ 37 ]

เนื่องจากการเติบโตอย่างรวดเร็วของอินเทอร์เน็ตและเวิลด์ไวด์เว็บในช่วงทศวรรษ 1990 จึงมีการนำภาษาโปรแกรมใหม่ ๆ มาใช้เพื่อรองรับเว็บเพจและเครือข่าย[ 38 ] Javaซึ่งใช้ C++ เป็นพื้นฐานและออกแบบมาเพื่อเพิ่มความสามารถในการพกพาข้ามระบบและความปลอดภัย ได้รับความนิยมอย่างมากเนื่องจากคุณสมบัติเหล่านี้เป็นสิ่งจำเป็นสำหรับแอปพลิเคชันอินเทอร์เน็ตจำนวนมาก[ 39 ] [ 40 ]การพัฒนาอีกอย่างหนึ่งคือภาษาสคริปต์แบบไดนามิก เช่นPython , JavaScript , PHPและRuby ซึ่งออกแบบมาเพื่อสร้างโปรแกรมขนาดเล็กที่ประสานงานกับ แอปพลิ เคชัน ที่มีอยู่ได้อย่างรวดเร็วเนื่องจากมีการบูรณาการกับHTMLจึงมีการใช้ภาษาเหล่านี้ในการสร้างเว็บเพจที่โฮสต์บนเซิร์ฟเวอร์ด้วย[ 41 ] [ 42 ]

ตั้งแต่ปี 2000 จนถึงปัจจุบัน

ในช่วงทศวรรษ 2000 การพัฒนาภาษาโปรแกรมใหม่ที่ได้รับความนิยมอย่างแพร่หลายเริ่มชะลอตัวลง[ 43 ]นวัตกรรมหนึ่งคือการเขียนโปรแกรมเชิงบริการ (service-oriented programming ) ซึ่งออกแบบมาเพื่อใช้ประโยชน์จาก ระบบ คอมพิวเตอร์แบบกระจายที่มีส่วนประกอบเชื่อมต่อกันด้วยเครือข่าย บริการมีความคล้ายคลึงกับวัตถุในการเขียนโปรแกรมเชิงวัตถุ แต่ทำงานบนกระบวนการที่แยกต่างหาก[ 44 ] C#และF#ได้ผสมผสานแนวคิดระหว่างการเขียนโปรแกรมเชิงคำสั่งและการเขียนโปรแกรมเชิงฟังก์ชัน[ 45 ]หลังจากปี 2010 ภาษาใหม่หลายภาษา เช่นRust , Go , Swift , ZigและCarbonได้แข่งขันกันเพื่อแย่งชิงซอฟต์แวร์ที่ต้องการประสิทธิภาพสูง ซึ่งในอดีตเคยใช้ C มาก่อน[ 46 ]ภาษาโปรแกรมใหม่ส่วนใหญ่ใช้การกำหนดประเภทแบบคงที่ (static typing)ในขณะที่ภาษาใหม่จำนวนหนึ่งใช้การกำหนดประเภทแบบไดนามิก (dynamic typing ) เช่นJulia [ 47 ]

ภาษาโปรแกรมใหม่บางภาษาถูกจัดประเภทเป็นภาษาโปรแกรมแบบภาพเช่นScratchและLabVIEWนอกจากนี้ บางภาษายังผสมผสานการใช้งานการเขียนโปรแกรมแบบข้อความและแบบภาพเข้าด้วยกัน เช่นBallerina [ 48 ] [ 49 ] [ 50 ] แนวโน้มนี้ยังนำไปสู่การพัฒนาโครงการที่ช่วยในการพัฒนาภาษาแบบภาพใหม่ๆ เช่นBlocklyโดยGoogle [ 51 ] เอ็นจิ้นเกมหลายตัว เช่นUnrealและ Unity รองรับการเขียนสคริปต์แบบภาพ[ 52 ] [ 53 ]

คำนิยาม

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

ไวยากรณ์

โครงสร้างต้นไม้การวิเคราะห์โค้ด Pythonพร้อมการแบ่งคำแบบแทรก
การเน้นไวยากรณ์มักใช้เพื่อช่วยให้โปรแกรมเมอร์จดจำองค์ประกอบต่างๆ ในโค้ดต้นฉบับได้ ภาษาข้างต้นคือPython

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

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

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

นิพจน์::=อะตอม | รายการ อะตอม ::=ตัวเลข | สัญลักษณ์ หมายเลข ::= [+-]?['0'-'9']+ สัญลักษณ์ ::= ['A'-'Z''a'-'z'].* รายการ ::= '(' expression* ')' 

ไวยากรณ์นี้ระบุสิ่งต่อไปนี้:

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

ต่อไปนี้เป็นตัวอย่างของลำดับโทเค็นที่ถูกต้องตามหลักไวยากรณ์นี้: 12345, ()และ(a b c232 (1)).

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

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

  • ประโยค " Colorless green ideas sleep furiously " นั้นถูกต้องตาม หลักไวยากรณ์ แต่ไม่มีความหมายที่เป็นที่ยอมรับโดยทั่วไป
  • ประโยค "John is a married bachelor" นั้นถูกต้องตามหลักไวยากรณ์ แต่สื่อความหมายที่ไม่เป็นความจริง

ส่วนของโค้ด ภาษาซีต่อไปนี้ถูกต้องตามหลักไวยากรณ์ แต่ดำเนินการที่ไม่มีความหมาย (การดำเนินการนี้*p >> 4ไม่มีความหมายสำหรับค่าที่มีชนิดข้อมูลซับซ้อน และp->imไม่ได้ถูกกำหนดไว้เนื่องจากค่าของมันpคือพอยเตอร์ว่าง ):

complex * p = NULL ; complex abs_p = sqrt ( * p >> 4 + p -> im );

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

ไวยากรณ์ที่จำเป็นในการระบุภาษาโปรแกรมสามารถจำแนกได้ตามตำแหน่งในลำดับชั้นของ Chomskyไวยากรณ์ของภาษาโปรแกรมส่วนใหญ่สามารถระบุได้โดยใช้ไวยากรณ์ประเภทที่ 2 กล่าวคือ เป็นไวยากรณ์แบบไร้บริบท[ 54 ] บางภาษา รวมถึง Perl และ Lisp มีโครงสร้างที่อนุญาตให้ดำเนินการในระหว่างขั้นตอนการวิเคราะห์ไวยากรณ์ ภาษาที่มีโครงสร้างที่อนุญาตให้โปรแกรมเมอร์เปลี่ยนแปลงพฤติกรรมของตัววิเคราะห์ไวยากรณ์ทำให้การวิเคราะห์ไวยากรณ์เป็นปัญหาที่ไม่สามารถตัดสินได้และโดยทั่วไปจะทำให้ความแตกต่างระหว่างการวิเคราะห์ไวยากรณ์และการดำเนินการไม่ชัดเจน[ 55 ]ในทางตรงกันข้ามกับระบบมาโครของ Lispและบล็อกของ Perl BEGINซึ่งอาจมีการคำนวณทั่วไปมาโคร ของ C เป็นเพียงการแทนที่สตริงและไม่ต้องการการดำเนินการโค้ด[ 56 ]

ความหมาย

อรรถศาสตร์หมายถึง ความหมายของเนื้อหาที่สอดคล้องกับไวยากรณ์ของภาษา

ความหมายเชิงสถิต

ความหมายเชิงสถิตกำหนดข้อจำกัดเกี่ยวกับโครงสร้างของข้อความที่ถูกต้องซึ่งยากหรือเป็นไปไม่ได้ที่จะแสดงในรูปแบบไวยากรณ์มาตรฐาน[ 57 ]สำหรับภาษาคอมไพล์ ความหมายเชิงสถิตโดยพื้นฐานแล้วจะรวมถึงกฎความหมายที่สามารถตรวจสอบได้ในเวลาคอมไพล์ ตัวอย่างเช่น การตรวจสอบว่าตัวระบุ ทุกตัว ได้รับการประกาศก่อนที่จะใช้งาน (ในภาษาที่ต้องการการประกาศดังกล่าว) หรือว่าป้ายกำกับบนแขนของคำสั่ง caseนั้นแตกต่างกัน[ 58 ]ข้อจำกัดที่สำคัญหลายอย่างในประเภทนี้ เช่น การตรวจสอบว่าตัวระบุถูกใช้ในบริบทที่เหมาะสม (เช่น ไม่เพิ่มจำนวนเต็มลงในชื่อฟังก์ชัน) หรือ การเรียก ใช้ซับรูทีนมีจำนวนและประเภทของอาร์กิวเมนต์ที่เหมาะสม สามารถบังคับใช้ได้โดยการกำหนดเป็นกฎในตรรกะที่เรียกว่าระบบประเภท รูปแบบอื่น ๆ ของการวิเคราะห์เชิงสถิตเช่นการวิเคราะห์การไหลของข้อมูลอาจเป็นส่วนหนึ่งของความหมายเชิงสถิต ภาษาโปรแกรมเช่นJavaและC#มีการวิเคราะห์การกำหนดค่าที่แน่นอนซึ่งเป็นรูปแบบหนึ่งของการวิเคราะห์การไหลของข้อมูล เป็นส่วนหนึ่งของความหมายเชิงสถิตของแต่ละ ภาษา [ 59 ]

ความหมายเชิงพลวัต

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

คุณสมบัติ

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

ระบบประเภท

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

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

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

ประเภทที่รองรับโดยทั่วไป

ภาษาโปรแกรมยุคแรกมักรองรับเฉพาะชนิดข้อมูลตัวเลขในตัว เช่นจำนวนเต็ม (มีเครื่องหมายและไม่มีเครื่องหมาย) และจำนวนทศนิยม (เพื่อรองรับการดำเนินการกับจำนวนจริงที่ไม่ใช่จำนวนเต็ม) ภาษาโปรแกรมส่วนใหญ่รองรับจำนวนทศนิยมหลายขนาด (มักเรียกว่าfloatและdouble ) และจำนวนเต็ม ขึ้นอยู่กับขนาดและความแม่นยำที่โปรแกรมเมอร์ต้องการ การจัดเก็บจำนวนเต็มในชนิดข้อมูลที่เล็กเกินไปที่จะแสดงผลจะทำให้เกิดการล้นของจำนวนเต็มวิธีที่พบบ่อยที่สุดในการแสดงจำนวนลบด้วยชนิดข้อมูลที่มีเครื่องหมายคือtwos complementแม้ว่าจะมีการใช้ones complement ด้วยเช่นกัน [ 65 ]ชนิดข้อมูลทั่วไปอื่นๆ ได้แก่บูลีนซึ่งเป็นจริงหรือเท็จ และอักขระซึ่งโดยทั่วไปมีขนาดหนึ่งไบต์ เพียงพอที่จะแสดง อักขระASCIIทั้งหมด[ 66 ]

อาร์เรย์เป็นชนิดข้อมูลที่ในหลายภาษาจะต้องประกอบด้วยชนิดเดียวที่มีความยาวคงที่ ภาษาอื่นๆ กำหนดอาร์เรย์เป็นการอ้างอิงถึงข้อมูลที่จัดเก็บไว้ที่อื่นและรองรับองค์ประกอบที่มีชนิดข้อมูลที่หลากหลาย[ 67 ]ขึ้นอยู่กับภาษาการเขียนโปรแกรม ลำดับของอักขระหลายตัวที่เรียกว่าสตริง อาจได้รับการสนับสนุนเป็นอาร์เรย์ของอักขระหรือ ชนิดข้อมูลพื้นฐานของมันเอง[ 68 ]สตริงอาจมีความยาวคงที่หรือแปรผันได้ ซึ่งช่วยให้มีความยืดหยุ่นมากขึ้นโดยแลกกับพื้นที่จัดเก็บที่เพิ่มขึ้นและความซับซ้อนที่มากขึ้น[ 69 ]ชนิดข้อมูลอื่นๆ ที่อาจได้รับการสนับสนุน ได้แก่รายการ [ 70 ]อาร์เรย์แบบเชื่อมโยง (ไม่เรียงลำดับ)ที่เข้าถึงผ่านคีย์[ 71 ]เรคอร์ดซึ่งข้อมูลถูกแมปกับชื่อในโครงสร้างที่มีลำดับ[ 72 ] และทูเปิลซึ่งคล้ายกับเรคอร์ดแต่ไม่มีชื่อสำหรับฟิลด์ข้อมูล[ 73 ]พอยเตอร์จะเก็บที่อยู่หน่วยความจำ โดยทั่วไปจะอ้างอิงถึงตำแหน่งบนฮีปที่เก็บข้อมูลอื่นๆ ไว้[ 74 ]

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

การพิมพ์แบบคงที่และแบบไดนามิก

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

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

ความพร้อมกัน

ในการคำนวณ คำสั่งหลายคำสั่งสามารถดำเนินการพร้อมกันได้ ภาษาโปรแกรมหลายภาษาสนับสนุนการทำงานพร้อมกันในระดับคำสั่งและระดับโปรแกรมย่อย[ 82 ]ในศตวรรษที่ 21 พลังการประมวลผลเพิ่มเติมในคอมพิวเตอร์มาจากการใช้โปรเซสเซอร์เพิ่มเติมมากขึ้นเรื่อยๆ ซึ่งต้องการให้นักโปรแกรมออกแบบซอฟต์แวร์ที่ใช้โปรเซสเซอร์หลายตัวพร้อมกันเพื่อให้ได้ประสิทธิภาพที่ดีขึ้น[ 83 ]ภาษาที่ใช้การตีความเช่นPythonและRubyไม่รองรับการใช้งานโปรเซสเซอร์หลายตัวพร้อมกัน[ 84 ]ภาษาโปรแกรมอื่นๆ รองรับการจัดการข้อมูลที่ใช้ร่วมกันระหว่างเธรดต่างๆ โดยการควบคุมลำดับการดำเนินการของคำสั่งหลักผ่านการใช้เซมาฟอร์การควบคุมการเข้าถึงข้อมูลที่ใช้ร่วมกันผ่านมอนิเตอร์หรือการเปิดใช้งานการส่งข้อความระหว่างเธรด[ 85 ]

การจัดการข้อยกเว้น

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

  • การยุติการทำงาน: การปิดระบบและส่งมอบการควบคุมให้กับระบบปฏิบัติการตัวเลือกนี้ถือว่าเป็นวิธีที่ง่ายที่สุด
  • การดำเนินการต่อ: การดำเนินการต่อโปรแกรมใกล้กับจุดที่เกิดข้อผิดพลาด ซึ่งอาจทำให้เกิดข้อผิดพลาดซ้ำอีก เว้นแต่ว่าตัวจัดการข้อผิดพลาดจะสามารถแก้ไขค่าต่างๆ เพื่อป้องกันไม่ให้ข้อผิดพลาดเกิดขึ้นซ้ำอีก

ภาษาโปรแกรมบางภาษาสนับสนุนการจัดสรรบล็อกโค้ดให้ทำงานโดยไม่คำนึงถึงว่าจะมีข้อยกเว้นเกิดขึ้นก่อนที่โค้ดจะถึงหรือไม่ ซึ่งเรียกว่าการทำให้เสร็จสิ้น[ 87 ]

มีการแลกเปลี่ยนระหว่างความสามารถในการจัดการข้อยกเว้นที่เพิ่มขึ้นกับประสิทธิภาพที่ลดลง[ 88 ]ตัวอย่างเช่น แม้ว่าข้อผิดพลาดดัชนีอาร์เรย์จะเป็นเรื่องปกติ[ 89 ] C ก็ไม่ได้ตรวจสอบข้อผิดพลาดเหล่านั้นด้วยเหตุผลด้านประสิทธิภาพ[ 88 ]แม้ว่าโปรแกรมเมอร์จะสามารถเขียนโค้ดเพื่อดักจับข้อยกเว้นที่ผู้ใช้กำหนดได้ แต่อาจทำให้โปรแกรมรกได้ ไลบรารีมาตรฐานในบางภาษา เช่น C ใช้ค่าส่งคืนเพื่อระบุข้อยกเว้น[ 90 ]บางภาษาและคอมไพเลอร์มีตัวเลือกในการเปิดและปิดความสามารถในการจัดการข้อผิดพลาด ไม่ว่าจะชั่วคราวหรือถาวร[ 91 ]

การออกแบบและการดำเนินการ

สถาปัตยกรรมคอมพิวเตอร์เป็นหนึ่งในปัจจัยสำคัญที่สุดที่มีอิทธิพลต่อการออกแบบภาษาโปรแกรมภาษาเชิงคำสั่ง ซึ่งเป็นประเภทที่ใช้กันมากที่สุด ถูกออกแบบมาให้ทำงานได้ดีบนสถาปัตยกรรม von Neumannซึ่งเป็นสถาปัตยกรรมคอมพิวเตอร์ดิจิทัลที่พบได้บ่อยที่สุด[ 92 ]ในสถาปัตยกรรม von Neumann หน่วยความจำจะจัดเก็บทั้งข้อมูลและคำสั่ง ในขณะที่CPUที่ทำหน้าที่ประมวลผลคำสั่งบนข้อมูลจะแยกออกไป และข้อมูลจะต้องถูกส่งผ่านไปยัง CPU องค์ประกอบหลักในภาษาเหล่านี้คือตัวแปร การกำหนดค่าและการวนซ้ำซึ่งมีประสิทธิภาพมากกว่าการเรียกซ้ำบนเครื่องเหล่านี้[ 93 ]

ภาษาโปรแกรมหลายภาษาได้รับการออกแบบขึ้นใหม่ทั้งหมด ปรับเปลี่ยนเพื่อให้ตรงกับความต้องการใหม่ๆ และผสมผสานกับภาษาอื่นๆ หลายภาษาในที่สุดก็เลิกใช้ไปการกำเนิดของภาษาโปรแกรมในช่วงทศวรรษ 1950 ได้รับแรงกระตุ้นจากความปรารถนาที่จะสร้างภาษาโปรแกรมสากลที่เหมาะสมสำหรับเครื่องจักรและการใช้งานทั้งหมด หลีกเลี่ยงความจำเป็นในการเขียนโค้ดสำหรับคอมพิวเตอร์ที่แตกต่างกัน[ 94 ]ในช่วงต้นทศวรรษ 1960 แนวคิดเรื่องภาษาสากลถูกปฏิเสธเนื่องจากข้อกำหนดที่แตกต่างกันของวัตถุประสงค์ที่หลากหลายในการเขียนโค้ด[ 95 ]

ข้อแลกเปลี่ยน

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

  • แม้ว่าภาษาโปรแกรมในยุคแรกๆ มักจะให้ความสำคัญกับประสิทธิภาพมากกว่าความอ่านง่าย แต่ความอ่านง่ายก็มีความสำคัญมากขึ้นตั้งแต่ทศวรรษ 1970 การมีโอเปอเรชันหลายอย่างเพื่อให้ได้ผลลัพธ์เดียวกันอาจเป็นอันตรายต่อความอ่านง่าย เช่นเดียวกับการโอเวอร์โหลดโอเปอเรชัน ซึ่งทำให้โอเปอเรชันเดียวกันสามารถมีความหมายได้หลายอย่าง[ 98 ]คุณลักษณะอีกประการหนึ่งที่สำคัญต่อความอ่านง่ายคือความเป็นตั้งฉากซึ่งจำกัดจำนวนโครงสร้างที่โปรแกรมเมอร์ต้องเรียนรู้[ 99 ]โครงสร้างไวยากรณ์ที่เข้าใจง่ายและคำศัพท์เฉพาะที่ชัดเจนในทันทีก็ช่วยสนับสนุนความอ่านง่ายเช่นกัน[ 100 ]
  • ความสามารถในการเขียนโค้ดหมายถึงความง่ายในการเขียนโค้ดเพื่อแก้ปัญหาที่ต้องการ นอกจากคุณสมบัติที่จำเป็นสำหรับการอ่านง่ายแล้ว[ 101 ]การนามธรรม —อินเท อร์เฟซที่ช่วยให้ซ่อนรายละเอียดจากไคลเอนต์—และการแสดงออก —ที่ช่วยให้โปรแกรมกระชับยิ่งขึ้น—ยังช่วยให้โปรแกรมเมอร์เขียนโค้ดได้ ง่ายขึ้น [ 102 ]ภาษาโปรแกรมในยุคแรกๆ นั้นเชื่อมโยงอย่างใกล้ชิดกับฮาร์ดแวร์พื้นฐานของคอมพิวเตอร์ แต่เมื่อเวลาผ่านไป การสนับสนุนการนามธรรมก็เพิ่มขึ้น ทำให้โปรแกรมเมอร์สามารถแสดงความคิดที่อยู่ห่างไกลจากการแปลเป็นคำสั่งฮาร์ดแวร์พื้นฐานได้มากขึ้น เนื่องจากโปรแกรมเมอร์ไม่ได้ผูกติดกับความซับซ้อนของคอมพิวเตอร์มากนัก โปรแกรมของพวกเขาจึงสามารถประมวลผลได้มากขึ้นโดยใช้ความพยายามจากโปรแกรมเมอร์น้อยลง[ 103 ]ภาษาโปรแกรมส่วนใหญ่มาพร้อมกับไลบรารีมาตรฐานของฟังก์ชันที่ใช้กันทั่วไป[ 104 ]
  • ความน่าเชื่อถือหมายความว่าโปรแกรมทำงานตามที่ระบุไว้ในสถานการณ์ที่หลากหลาย[ 105 ]การตรวจสอบประเภทการจัดการข้อยกเว้นและการจำกัดการใช้ชื่อตัวแปร ( การใช้ชื่อตัวแปรหลายชื่อในการเข้าถึงพื้นที่หน่วยความจำเดียวกัน) ล้วนสามารถปรับปรุงความน่าเชื่อถือของโปรแกรมได้[ 106 ]

การออกแบบภาษาโปรแกรมมักเกี่ยวข้องกับการแลกเปลี่ยน[ 107 ]ตัวอย่างเช่น คุณสมบัติที่ช่วยเพิ่มความน่าเชื่อถือมักต้องแลกมาด้วยประสิทธิภาพที่ลดลง[ 108 ]การแสดงออกที่เพิ่มขึ้นเนื่องจากตัวดำเนินการจำนวนมากทำให้การเขียนโค้ดง่ายขึ้น แต่ก็ต้องแลกมาด้วยความสามารถในการอ่านที่ลดลง[ 108 ]

การเขียนโปรแกรมด้วยภาษาธรรมชาติได้รับการเสนอให้เป็นวิธีหนึ่งในการกำจัดความจำเป็นในการใช้ภาษาเฉพาะทางสำหรับการเขียนโปรแกรม อย่างไรก็ตาม เป้าหมายนี้ยังคงอยู่ห่างไกลและประโยชน์ของมันยังเป็นที่ถกเถียงกันอยู่Edsger W. Dijkstraมีจุดยืนว่าการใช้ภาษาที่เป็นทางการเป็นสิ่งจำเป็นเพื่อป้องกันการนำโครงสร้างที่ไม่มีความหมายมาใช้[ 109 ] Alan Perlisก็ไม่เห็นด้วยกับแนวคิดนี้เช่นกัน[ 110 ]

ข้อกำหนด

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

ข้อกำหนดของภาษาโปรแกรมสามารถมีได้หลายรูปแบบ รวมถึงรูปแบบต่อไปนี้:

การดำเนินการ

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

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

ภาษาที่เป็นกรรมสิทธิ์

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

ภาษาโปรแกรมบางภาษาอยู่บนเส้นแบ่งระหว่าง ภาษาที่เป็นกรรมสิทธิ์และภาษาเปิด ตัวอย่างเช่นบริษัท Oracle Corporationอ้างสิทธิ์ในกรรมสิทธิ์ในบางส่วนของภาษาโปรแกรม Java [ 119 ]และ ภาษาโปรแกรม C#ของMicrosoftซึ่งมีการใช้งานแบบเปิดของส่วนใหญ่ของระบบ ก็ยังมีCommon Language Runtime (CLR) เป็นสภาพแวดล้อมแบบปิด[ 120 ]

ภาษาโปรแกรมเฉพาะของบริษัทจำนวนมากถูกใช้งานอย่างแพร่หลาย แม้ว่าจะมีลักษณะเฉพาะของบริษัทก็ตาม ตัวอย่างเช่นMATLAB , VBScriptและWolfram Languageบางภาษาอาจเปลี่ยนจากภาษาปิดเป็นภาษาเปิด ตัวอย่างเช่นErlangเดิมทีเป็นภาษาโปรแกรมภายในของ Ericsson [ 121 ]

ภาษาโปรแกรมโอเพนซอร์สมีประโยชน์อย่างยิ่งสำหรับ แอปพลิเคชัน วิทยาศาสตร์แบบเปิดช่วยเพิ่มศักยภาพในการจำลองและแบ่งปันโค้ด[ 122 ]

ใช้

มีการสร้างภาษาโปรแกรมที่แตกต่างกันหลายพันภาษา โดยส่วนใหญ่อยู่ในสาขาการคำนวณ[ 123 ] โดยทั่วไปแล้วโครงการซอฟต์แวร์แต่ละโครงการจะใช้ภาษาโปรแกรมห้าภาษาขึ้นไป[ 124 ]

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

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

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

การวัดการใช้ภาษา

การกำหนดว่าภาษาโปรแกรมใดใช้กันอย่างแพร่หลายที่สุดนั้นเป็นเรื่องยาก เนื่องจากคำจำกัดความของการใช้งานจะแตกต่างกันไปตามบริบท ภาษาหนึ่งอาจใช้เวลาของโปรแกรมเมอร์มากกว่า ภาษาอื่นอาจมีจำนวนบรรทัดโค้ดมากกว่า และภาษาที่สามอาจใช้เวลา CPU มากที่สุด บางภาษาเป็นที่นิยมมากสำหรับแอปพลิเคชันบางประเภท ตัวอย่างเช่นCOBOLยังคงแข็งแกร่งในศูนย์ข้อมูลขององค์กร มักใช้บนเมนเฟรม ขนาดใหญ่ [ 127 ] [ 128 ] Fortranในแอปพลิเคชันทางวิทยาศาสตร์และวิศวกรรมAdaในแอปพลิเคชันด้านอวกาศ การขนส่ง การทหาร เรียลไทม์ และฝังตัว และC ในแอ พลิเคชันฝังตัวและระบบปฏิบัติการ ภาษาอื่นๆ ถูกใช้เป็นประจำในการเขียนแอปพลิเคชันหลายประเภทที่แตกต่างกัน

มีการเสนอวิธีการวัดความนิยมของภาษาหลายวิธี ซึ่งแต่ละวิธีก็มีอคติที่แตกต่างกันไปในสิ่งที่วัด:

  • นับจำนวนโฆษณาตำแหน่งงานที่กล่าวถึงภาษา[ 129 ]
  • จำนวนหนังสือที่ขายซึ่งสอนหรืออธิบายภาษา[ 130 ]
  • การประมาณจำนวนบรรทัดโค้ดที่มีอยู่ซึ่งเขียนด้วยภาษาดังกล่าวซึ่งอาจประเมินต่ำกว่าความเป็นจริงสำหรับภาษาที่ไม่ค่อยพบในการค้นหาสาธารณะ[ 131 ] 
  • จำนวนการอ้างอิงถึงภาษา (เช่น ชื่อของภาษา) ที่พบโดยใช้เครื่องมือค้นหาบนเว็บ

จากการรวบรวมและหาค่าเฉลี่ยข้อมูลจากเว็บไซต์ต่างๆ stackify.com รายงานภาษาโปรแกรมยอดนิยม 10 อันดับแรก (เรียงลำดับจากความนิยมโดยรวมมากที่สุด) ได้แก่Java , C , C ++ , Python , C# , JavaScript , VB.NET , R , PHPและMATLAB [ 132 ]

ณ เดือนมิถุนายน พ.ศ. 2567 ภาษาโปรแกรมยอดนิยม 5 อันดับแรกตามการวัดดัชนี TIOBEได้แก่Python , C++ , C , JavaและC# TIOBE จัดทำรายการภาษาโปรแกรมยอดนิยม 100 อันดับแรกตามดัชนี และอัปเดตรายการนี้ทุกเดือน[ 133 ]

ตามที่เจ้าหน้าที่ IEEE Spectrum ระบุ ภาษาโปรแกรมยอดนิยมในปัจจุบันอาจยังคงมีบทบาทสำคัญต่อไปเนื่องจากวิธีการทำงานของ AI ส่งผลให้ภาษาใหม่ๆ จะได้รับความนิยมได้ยากขึ้น เนื่องจากผู้เขียนโปรแกรมจะไม่เขียนโปรแกรมจำนวนมากในภาษาเหล่านั้น[ 134 ]

ภาษาถิ่น รสชาติ และวิธีการนำไปใช้

ภาษาถิ่นของภาษาโปรแกรมหรือภาษาแลกเปลี่ยนข้อมูลคือรูปแบบหรือส่วนขยาย (ที่ค่อนข้างเล็ก) ของภาษาที่ไม่เปลี่ยนแปลงลักษณะพื้นฐานของภาษา ในกรณีของภาษาอย่างSchemeและForthมาตรฐานอาจถูกพิจารณาว่าไม่เพียงพอ ไม่เหมาะสม หรือไม่ชอบด้วยกฎหมายโดยผู้พัฒนา ดังนั้นพวกเขาจึงมักจะเบี่ยงเบนจากมาตรฐาน ทำให้เกิดภาษาถิ่น ใหม่ขึ้น ในบางกรณี ภาษาถิ่นถูกสร้างขึ้นเพื่อใช้ในภาษาเฉพาะโดเมนซึ่งมักจะเป็นส่วนย่อย ใน โลกของ Lispภาษาที่ใช้ ไวยากรณ์ S-expression พื้นฐาน และความหมายแบบ Lisp ส่วนใหญ่ถือว่าเป็นภาษาถิ่นของ Lisp แม้ว่าจะมีรูปแบบที่แตกต่างกันอย่างมาก เช่นเดียวกับRacketและClojureเนื่องจากเป็นเรื่องปกติที่ภาษาหนึ่งจะมีหลายภาษาถิ่น จึงอาจเป็นเรื่องยากสำหรับโปรแกรมเมอร์ที่ไม่มีประสบการณ์ในการค้นหาเอกสารที่ถูกต้อง ภาษา BASICก็มีภาษาถิ่นมากมาย เช่นกัน

การจำแนกประเภท

ภาษาโปรแกรมสามารถอธิบายได้ตามการจำแนกประเภทระดับสูงต่อไปนี้ ซึ่งบางครั้งอาจทับซ้อนกัน: [ 135 ]

คำสั่ง

ภาษาการเขียนโปรแกรมเชิงคำสั่งสนับสนุนการนำตรรกะที่เข้ารหัสเป็นลำดับของการดำเนินการตามลำดับมาใช้ ภาษาที่ใช้กันอย่างแพร่หลายส่วนใหญ่จัดอยู่ในประเภทเชิงคำสั่ง[ 136 ]

การทำงาน

ภาษาการเขียนโปรแกรมเชิงฟังก์ชันสนับสนุนการประยุกต์ใช้ฟังก์ชันกับพารามิเตอร์ที่กำหนดอย่างต่อเนื่อง แม้ว่านักวิจัยหลายคนจะชื่นชมในความเรียบง่ายและความสง่างาม แต่ปัญหาเรื่องประสิทธิภาพทำให้ไม่สามารถนำมาใช้กันอย่างแพร่หลาย[ 137 ]

ตรรกะ

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

เชิงวัตถุ

การเขียนโปรแกรมเชิงวัตถุ (OOP) มีลักษณะเด่นคือการนามธรรมของข้อมูลการสืบทอดและการเรียกใช้แบบไดนามิก OOP ได้รับการสนับสนุนจากภาษาเชิงคำสั่งที่เป็นที่นิยมส่วนใหญ่และภาษาเชิงฟังก์ชันบางภาษา[ 136 ]

มาร์กอัป

แม้ว่าภาษามาร์กอัปจะไม่ใช่ภาษาโปรแกรมโดยตรง แต่ก็อาจช่วยสนับสนุนการบูรณาการกับภาษาโปรแกรมได้

พิเศษ

มีภาษาเฉพาะทางที่ไม่สามารถเปรียบเทียบกับภาษาโปรแกรมอื่น ๆ ได้ง่าย[ 139 ]

ดูเพิ่มเติม

อ่านเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Programming_language&oldid=1355574374#Proprietary_languages ​​"

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ภาษาโปรแกรม

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

ความสัมพันธ์กับภาษาธรรมชาติ

ภาษาโปรแกรมมีความคล้ายคลึงกับ ภาษาธรรมชาติ ในแง่ที่ว่าสามารถสื่อสารความคิดระหว่างผู้คนได้ กล่าวคือ โดยทั่วไปแล้วโปรแกรมสามารถอ่านได้โดยมนุษย์และสามารถแสดงความคิดที่ซับซ้อนได้ อย่างไรก็ตาม...

พัฒนาการในช่วงแรก

คอมพิวเตอร์ที่สามารถตั้งโปรแกรมได้เครื่องแรกถูกประดิษฐ์ขึ้นในช่วงทศวรรษ 1940 และพร้อมกันนั้นก็มีภาษาโปรแกรมภาษาแรกๆ เกิดขึ้นด้วย [ 10 ] [ 11 ] คอมพิวเตอร์รุ่นแรกๆ ถูกตั้งโปรแกรมด้วย ภาษาโปรแกรมรุ่นแรก (1GLs) ซึ่ง เป็นภาษาเครื่อง (คำสั่งง่ายๆ...

ทศวรรษ 1960 และ 1970

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