ภาษาโปรแกรม

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

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

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

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

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

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

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

คำจำกัดความ

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

ฟังก์ชั่นและเป้าหมาย
ภาษาการเขียนโปรแกรมคอมพิวเตอร์เป็นภาษาที่ใช้ในการเขียนโปรแกรมคอมพิวเตอร์ที่เกี่ยวข้องกับคอมพิวเตอร์ที่มีประสิทธิภาพชนิดของการคำนวณบาง[4]หรืออัลกอริทึมและอาจควบคุมอุปกรณ์ภายนอกเช่นเครื่องพิมพ์ , ดิสก์ไดรฟ์ , หุ่นยนต์ , [5]และอื่น ๆ ตัวอย่างเช่นPostScriptโปรแกรมอื่นมักสร้างขึ้นโดยโปรแกรมอื่นเพื่อควบคุมเครื่องพิมพ์หรือจอแสดงผลของคอมพิวเตอร์ โดยทั่วไป ภาษาโปรแกรมอาจอธิบายการคำนวณบนเครื่องบางเครื่อง อาจเป็นนามธรรม เป็นที่ยอมรับกันโดยทั่วไปว่าข้อกำหนดที่สมบูรณ์สำหรับภาษาการเขียนโปรแกรมรวมถึงคำอธิบาย ที่มีความเป็นไปได้สูงที่จะเป็นอุดมคติ ของเครื่องหรือตัวประมวลผลสำหรับภาษานั้น [6]ในบริบทที่ใช้งานได้จริง ภาษาโปรแกรมเกี่ยวข้องกับคอมพิวเตอร์ ดังนั้นภาษาโปรแกรมมักจะถูกกำหนดและศึกษาด้วยวิธีนี้ [7]ภาษาโปรแกรมแตกต่างจากภาษาธรรมชาติโดยที่ภาษาธรรมชาติใช้สำหรับปฏิสัมพันธ์ระหว่างผู้คนเท่านั้น ในขณะที่ภาษาโปรแกรมยังอนุญาตให้มนุษย์สื่อสารคำสั่งไปยังเครื่องได้
นามธรรม
การเขียนโปรแกรมภาษามักจะมีแนวคิดในการกำหนดและจัดการโครงสร้างข้อมูลหรือการควบคุมการไหลของการดำเนินการ ความจำเป็นในทางปฏิบัติว่าการเขียนโปรแกรมภาษาที่สนับสนุนแนวคิดที่เพียงพอจะแสดงโดยหลักการที่เป็นนามธรรม [8]บางครั้งหลักการนี้ถูกกำหนดขึ้นเพื่อเป็นคำแนะนำแก่โปรแกรมเมอร์เพื่อใช้สิ่งที่เป็นนามธรรมอย่างเหมาะสม [9]
พลังแห่งการแสดงออก
ทฤษฎีการคำนวณ classifies ภาษาโดยการคำนวณที่พวกเขามีความสามารถในการแสดง ทั้งหมดทัวริงสมบูรณ์ภาษาสามารถใช้ชุดเดียวกันของอัลกอริทึม ANSI/ISO SQL-92และCharityเป็นตัวอย่างของภาษาที่ทัวริงไม่สมบูรณ์ แต่มักถูกเรียกว่าภาษาโปรแกรม[10] [11]

ภาษามาร์กอัปเช่นXML , HTMLหรือtroffซึ่งกำหนดข้อมูลที่มีโครงสร้างมักไม่ถือว่าเป็นภาษาโปรแกรม[12] [13] [14]อย่างไรก็ตาม ภาษาโปรแกรมอาจใช้ไวยากรณ์ร่วมกับภาษามาร์กอัป หากมีการกำหนดความหมายเชิงคำนวณตัวอย่างเช่นXSLTเป็นภาษาทัวริงที่สมบูรณ์โดยใช้ไวยากรณ์ XML [15] [16] [17]นอกจากนี้LaTeXซึ่งส่วนใหญ่ใช้สำหรับการจัดโครงสร้างเอกสาร ยังมีชุดย่อยทัวริงที่สมบูรณ์[18] [19]

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

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

ประวัติ

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

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

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

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

ครั้งแรกที่สูงระดับการเขียนโปรแกรมภาษาหรือภาษาโปรแกรมรุ่นที่สาม (3GL) ถูกเขียนขึ้นในปี 1950 ภาษาโปรแกรมระดับสูงในยุคแรกๆ ที่ออกแบบมาสำหรับคอมพิวเตอร์คือPlankalkülซึ่งพัฒนาขึ้นสำหรับZ3 ของเยอรมันโดยKonrad Zuseระหว่างปี 1943 ถึง 1945 อย่างไรก็ตาม ยังไม่มีการใช้งานจนกระทั่งปี 1998 และ 2000 [25]

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

ที่มหาวิทยาลัยแมนเชสเตอร์ , อาลิคเกล็นนี่พัฒนาAutocodeในช่วงต้นทศวรรษ 1950 ในฐานะที่เป็นภาษาโปรแกรมมันใช้คอมไพเลอร์เพื่อแปลงภาษาเป็นรหัสเครื่องโดยอัตโนมัติ โค้ดและคอมไพเลอร์ตัวแรกได้รับการพัฒนาในปี 1952 สำหรับคอมพิวเตอร์Mark 1ที่มหาวิทยาลัยแมนเชสเตอร์ และถือเป็นภาษาโปรแกรมระดับสูงที่คอมไพล์เป็นภาษาแรก[27] [28]

autocode ที่สองได้รับการพัฒนาสำหรับ Mark 1 โดยRA Brookerในปี 1954 และถูกเรียกว่า "Mark 1 Autocode" Brooker ยังได้พัฒนา autocode สำหรับFerranti Mercuryในปี 1950 ร่วมกับ University of Manchester เวอร์ชันสำหรับEDSAC 2ได้รับการพัฒนาโดยDF Hartleyแห่งUniversity of Cambridge Mathematical Laboratoryในปี 1961 ซึ่งรู้จักกันในชื่อ EDSAC 2 Autocode เป็นการพัฒนาโดยตรงจาก Mercury Autocode ที่ปรับให้เข้ากับสถานการณ์ในท้องถิ่น และได้รับการกล่าวถึงสำหรับการเพิ่มประสิทธิภาพโค้ดวัตถุและภาษาต้นทาง การวินิจฉัยขั้นสูงในสมัยนั้นAtlas Autocodeเป็นหัวข้อการพัฒนาร่วมสมัยแต่แยกจากกันได้รับการพัฒนาสำหรับมหาวิทยาลัยแมนเชสเตอร์Atlas 1เครื่อง

ในปี 1954 FORTRANถูกคิดค้นที่ IBM โดยจอห์นคัส เป็นภาษาเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไประดับสูงภาษาแรกที่มีการใช้งานเชิงฟังก์ชัน ต่างจากการออกแบบบนกระดาษเพียงอย่างเดียว [29] [30]มันก็ยังคงเป็นภาษาที่นิยมสำหรับการที่มีประสิทธิภาพสูงในการคำนวณ[31]และมีการใช้สำหรับโปรแกรมที่มาตรฐานและอันดับของโลกซูเปอร์คอมพิวเตอร์ที่เร็วที่สุด (32)

การเขียนโปรแกรมภาษาอื่น ๆ อีกในช่วงต้นได้รับการคิดค้นโดยเกรซกระโดดในสหรัฐอเมริกาที่เรียกว่ากระแส-MATICได้รับการพัฒนาสำหรับUNIVAC Iที่Remington Randในช่วงปี 1955 ถึง 1959 Hopper พบว่าลูกค้าที่ประมวลผลข้อมูลทางธุรกิจรู้สึกไม่สบายใจกับการใช้สัญลักษณ์ทางคณิตศาสตร์ และในต้นปี 1955 เธอและทีมของเธอได้เขียนข้อกำหนดสำหรับภาษาการเขียนโปรแกรมภาษาอังกฤษและดำเนินการ ต้นแบบ[33]คอมไพเลอร์ FLOW-MATIC เปิดให้สาธารณชนเข้าชมในต้นปี 2501 และเสร็จสมบูรณ์ในปี 2502 [34] FLOW-MATIC เป็นอิทธิพลสำคัญในการออกแบบของCOBOLเนื่องจากมีเพียงตัวมันและAIMACO ซึ่งเป็นทายาทสายตรงเท่านั้นใช้งานจริงในขณะนั้น [35]

การปรับแต่ง

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

ช่วงเวลาตั้งแต่ทศวรรษที่ 1960 ถึงปลายทศวรรษ 1970 ทำให้เกิดการพัฒนากระบวนทัศน์ทางภาษาที่สำคัญในปัจจุบัน:

แต่ละภาษาเหล่านี้เกิดมาจากลูกหลาน และภาษาโปรแกรมสมัยใหม่ส่วนใหญ่นับอย่างน้อยหนึ่งภาษาในบรรพบุรุษของพวกเขา

ทศวรรษที่ 1960 และ 1970 ยังเห็นการถกเถียงกันอย่างมากเกี่ยวกับข้อดีของการเขียนโปรแกรมแบบมีโครงสร้างและว่าภาษาโปรแกรมควรได้รับการออกแบบเพื่อรองรับหรือไม่ [38] Edsger Dijkstraในจดหมายที่มีชื่อเสียงปี 1968 ที่ตีพิมพ์ในCommunications of the ACMแย้งว่าข้อความGotoควรถูกกำจัดออกจากภาษาโปรแกรม "ระดับสูง" ทั้งหมด [39]

การรวมตัวและการเติบโต

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

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

แนวโน้มสำคัญประการหนึ่งในการออกแบบภาษาสำหรับการเขียนโปรแกรมระบบขนาดใหญ่ในช่วงทศวรรษ 1980 คือการมุ่งเน้นที่การใช้โมดูลหรือหน่วยโค้ดขององค์กรขนาดใหญ่Modula-2 , Ada และ ML ทั้งหมดได้พัฒนาระบบโมดูลที่โดดเด่นในช่วงทศวรรษ 1980 ซึ่งมักถูกนำมารวมกับโครงสร้างการเขียนโปรแกรมทั่วไป[41]

การเติบโตอย่างรวดเร็วของอินเทอร์เน็ตในช่วงกลางทศวรรษ 1990 ได้สร้างโอกาสสำหรับภาษาใหม่ๆPerlแต่เดิมเป็นเครื่องมือการเขียนสคริปต์ Unix เปิดตัวครั้งแรกในปี 1987 กลายเป็นเรื่องธรรมดาในแบบไดนามิกเว็บไซต์ Javaถูกนำมาใช้สำหรับการเขียนโปรแกรมฝั่งเซิร์ฟเวอร์ และเครื่องเสมือน bytecode กลับมาได้รับความนิยมอีกครั้งในการตั้งค่าเชิงพาณิชย์ด้วยคำมั่นสัญญาที่ว่า " เขียนครั้งเดียว ทำงานได้ทุกที่ " ( UCSD Pascalได้รับความนิยมในช่วงเวลาหนึ่งในช่วงต้นทศวรรษ 1980) การพัฒนาเหล่านี้ไม่ใช่พื้นฐานที่แปลกใหม่ ค่อนข้างจะปรับแต่งภาษาและกระบวนทัศน์ที่มีอยู่มากมาย (แม้ว่าไวยากรณ์ของพวกเขามักจะขึ้นอยู่กับตระกูล C ของภาษาโปรแกรม)

วิวัฒนาการของภาษาโปรแกรมยังคงดำเนินต่อไปทั้งในอุตสาหกรรมและการวิจัย ทิศทางในปัจจุบัน ได้แก่ การรักษาความปลอดภัยและการตรวจสอบความน่าเชื่อถือชนิดใหม่ของต้นแบบ ( mixins , ผู้แทน , ด้าน ) และบูรณาการฐานข้อมูลเช่น Microsoft ของLINQ

ภาษาโปรแกรมรุ่นที่สี่ (4GL) เป็นภาษาโปรแกรมคอมพิวเตอร์ที่มีจุดมุ่งหมายเพื่อให้รายละเอียดฮาร์ดแวร์คอมพิวเตอร์ภายในที่เป็นนามธรรมในระดับที่สูงกว่า 3GL ภาษาโปรแกรมรุ่นที่ห้า (5GL) เป็นภาษาโปรแกรมโดยอิงจากการแก้ปัญหาโดยใช้ข้อจำกัดที่มอบให้กับโปรแกรม แทนที่จะใช้อัลกอริธึมที่เขียนโดยโปรแกรมเมอร์

องค์ประกอบ

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

ไวยากรณ์

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

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

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

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

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

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

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

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

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

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

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

ซับซ้อน * p  =  NULL ; 
ซับซ้อน abs_p  =  sqrt ( * p  >>  4  +  p -> im );

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

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

ความหมาย

คำว่าsemanticsหมายถึง ความหมายของภาษา ซึ่งตรงข้ามกับรูปแบบ ( ไวยากรณ์ )

ความหมายคงที่

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

ความหมายแบบไดนามิก

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

ระบบพิมพ์

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

ภาษาที่พิมพ์กับไม่ได้พิมพ์

ภาษาจะถูกพิมพ์หากข้อกำหนดของทุกการดำเนินการกำหนดประเภทของข้อมูลที่เกี่ยวข้องกับการดำเนินการ[46]ตัวอย่างเช่น ข้อมูลที่แสดงโดย"this text between the quotes"is a stringและในภาษาโปรแกรมหลายภาษาที่หารตัวเลขด้วยสตริงนั้นไม่มีความหมายและจะไม่ถูกดำเนินการ การดำเนินการที่ไม่ถูกต้องอาจถูกตรวจพบเมื่อคอมไพล์โปรแกรม (การตรวจสอบประเภท "คงที่") และคอมไพเลอร์จะปฏิเสธพร้อมข้อความแสดงข้อผิดพลาดในการคอมไพล์ หรืออาจถูกตรวจพบในขณะที่โปรแกรมกำลังทำงาน (การตรวจสอบประเภท "ไดนามิก") ส่งผลให้ ในระยะเวลายกเว้นหลายภาษาอนุญาตให้ฟังก์ชันที่เรียกว่าตัวจัดการข้อยกเว้นจัดการกับข้อยกเว้นนี้ ตัวอย่างเช่น ส่งคืน "-1" เป็นผลลัพธ์เสมอ

เป็นกรณีพิเศษของการพิมพ์ภาษาเป็นเดี่ยวพิมพ์ภาษา สิ่งเหล่านี้มักเป็นภาษาสคริปต์หรือภาษามาร์กอัป เช่นREXXหรือSGMLและมีประเภทข้อมูลเพียงประเภทเดียว[ ที่น่าสงสัย ] ซึ่งส่วนใหญ่เป็นสตริงอักขระที่ใช้สำหรับทั้งข้อมูลเชิงสัญลักษณ์และตัวเลข

ในทางตรงกันข้ามภาษาที่ไม่ได้พิมพ์ เช่นภาษาแอสเซมบลีส่วนใหญ่อนุญาตให้ดำเนินการใดๆ กับข้อมูลใดๆ โดยทั่วไปจะเรียงลำดับบิตที่มีความยาวต่างกัน [46]ระดับสูงภาษา untyped ได้แก่BCPL , Tclและบางสายพันธุ์ของForth

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

การพิมพ์แบบสแตติกกับไดนามิก

ในการพิมพ์แบบคงที่นิพจน์ทั้งหมดมีประเภทที่กำหนดไว้ก่อนเวลาที่โปรแกรมดำเนินการ โดยทั่วไปในเวลาคอมไพล์ ตัวอย่างเช่น 1 และ (2+2) เป็นนิพจน์จำนวนเต็ม ไม่สามารถส่งผ่านไปยังฟังก์ชันที่คาดหวังสตริงหรือเก็บไว้ในตัวแปรที่กำหนดไว้เพื่อเก็บวันที่ [46]

ภาษาที่พิมพ์แบบสแตติกสามารถเป็นได้ทั้งแบบพิมพ์ชัดแจ้งหรือแบบอนุมานได้ ในกรณีแรก โปรแกรมเมอร์ต้องเขียนประเภทที่ตำแหน่งข้อความอย่างชัดเจน (เช่น ที่การประกาศตัวแปร) ในกรณีที่สอง คอมไพเลอร์จะสรุปประเภทของนิพจน์และการประกาศตามบริบท ภาษาที่พิมพ์แบบสแตติกกระแสหลักส่วนใหญ่ เช่นC++ , C#และJavaจะถูกพิมพ์อย่างชัดแจ้ง อนุมานชนิดที่สมบูรณ์มีประเพณีที่เกี่ยวข้องกับภาษาหลักน้อยเช่นHaskellและMLอย่างไรก็ตาม ภาษาที่พิมพ์อย่างชัดแจ้งจำนวนมากสนับสนุนการอนุมานประเภทบางส่วน ตัวอย่างเช่น,C++ , JavaและC#อนุมานประเภททั้งหมดในบางกรณี[47]นอกจากนี้ ภาษาโปรแกรมบางภาษายังอนุญาตให้บางประเภทถูกแปลงเป็นประเภทอื่นโดยอัตโนมัติ ตัวอย่างเช่น สามารถใช้ int ในตำแหน่งที่โปรแกรมต้องการ float

การพิมพ์แบบไดนามิกเรียกอีกอย่างว่าการพิมพ์แฝงกำหนดประเภทของความปลอดภัยในการดำเนินการ ณ รันไทม์ ในคำอื่น ๆ ประเภทที่เกี่ยวข้องกับค่าเวลาทำงานมากกว่าการแสดงออกเกี่ยวกับใจ [46]เช่นเดียวกับภาษาที่สรุปประเภท ภาษาที่พิมพ์แบบไดนามิกไม่จำเป็นต้องให้โปรแกรมเมอร์เขียนคำอธิบายประกอบประเภทที่ชัดเจนบนนิพจน์ เหนือสิ่งอื่นใด สิ่งนี้อาจอนุญาตให้ตัวแปรตัวเดียวอ้างถึงค่าของประเภทต่าง ๆ ที่จุดต่าง ๆ ในการทำงานของโปรแกรม อย่างไรก็ตามข้อผิดพลาดของประเภทไม่สามารถตรวจพบได้โดยอัตโนมัติจนกว่าจะมีการดำเนินการโค้ดจริง ซึ่งอาจทำให้การดีบักทำได้ยากขึ้นเสียงกระเพื่อม ,สมอลทอล์ค, Perl , Python , JavaScriptและRubyเป็นตัวอย่างของภาษาที่พิมพ์แบบไดนามิก

การพิมพ์ที่อ่อนแอและแข็งแกร่ง

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

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

คำจำกัดความทางเลือกสำหรับ "พิมพ์น้อย" หมายถึงภาษา เช่นPerlและJavaScriptซึ่งอนุญาตให้มีการแปลงประเภทโดยนัยจำนวนมาก ตัวอย่างเช่น ใน JavaScript นิพจน์2 * xจะแปลงxเป็นตัวเลขโดยปริยายและการแปลงนี้จะสำเร็จแม้ว่าxจะเป็นnull, undefined, หนึ่งArrayหรือสตริงของตัวอักษรก็ตาม การแปลงโดยนัยดังกล่าวมักมีประโยชน์ แต่สามารถปกปิดข้อผิดพลาดในการเขียนโปรแกรมได้ โดยทั่วไปแล้วความแข็งแกร่งและคงที่ถือเป็นแนวคิดแบบมุมฉาก แต่การใช้งานในวรรณคดีแตกต่างกัน บางคนใช้คำว่าพิมพ์ดีเพื่อหมายถึงอย่างยิ่ง พิมพ์สถิตหรือแม้แต่ทำให้สับสนมากขึ้นเพื่อหมายถึงง่ายๆพิมพ์แบบคงที่ ดังนั้นCจึงถูกเรียกว่าทั้งแบบแรงและแบบอ่อน, แบบสแตติก [48] [49]

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

ไลบรารีมาตรฐานและระบบรันไทม์

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

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

การออกแบบและการใช้งาน

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

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

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

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

การเขียนโปรแกรมภาษาธรรมชาติได้รับการเสนอเป็นวิธีการขจัดความจำเป็นในการใช้ภาษาเฉพาะสำหรับการเขียนโปรแกรม อย่างไรก็ตาม เป้าหมายนี้ยังห่างไกลและประโยชน์ของมันเปิดให้อภิปรายEdsger W. Dijkstraเข้ารับตำแหน่งว่าการใช้ภาษาที่เป็นทางการมีความสำคัญต่อการป้องกันการนำโครงสร้างที่ไร้ความหมายมาใช้ และมองว่าการเขียนโปรแกรมภาษาธรรมชาตินั้น "โง่เขลา" [55] อลัน เปอร์ลิสไม่เห็นด้วยกับแนวคิดนี้เช่นเดียวกัน[56]วิธีไฮบริดได้รับการดำเนินการในโครงสร้างภาษาอังกฤษและSQL

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

ข้อมูลจำเพาะ

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

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

การนำไปใช้

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

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

โปรแกรมที่ทำงานโดยตรงบนฮาร์ดแวร์มักจะทำงานได้เร็วกว่าโปรแกรมที่แปลในซอฟต์แวร์ [60] [ ต้องการแหล่งที่ดีกว่า ]

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

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

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

ภาษาโปรแกรมบางภาษามีขอบเขตระหว่างกรรมสิทธิ์และเปิด ตัวอย่างเช่นบริษัท ออราเคิลคอร์ปอเรชั่นอ้างกรรมสิทธิ์บางแง่มุมของการเขียนโปรแกรมภาษา Java , [61]และไมโครซอฟท์ 's C #ภาษาการเขียนโปรแกรมซึ่งมีการใช้งานที่เปิดกว้างของพื้นที่ส่วนใหญ่ของระบบนอกจากนี้ยังมีการรันไทม์ภาษาทั่วไป (CLR) เป็นปิด สิ่งแวดล้อม. [62]

ภาษาที่เป็นกรรมสิทธิ์หลายภาษามีการใช้กันอย่างแพร่หลาย แม้จะมีลักษณะเฉพาะของตนก็ตาม ตัวอย่าง ได้แก่MATLAB , VBScriptและวุลแฟรมภาษา บางภาษาอาจเปลี่ยนจากปิดเป็นเปิด ตัวอย่างเช่นErlangเดิมเป็นภาษาโปรแกรมภายในของ Ericsson [63]

ใช้

มีการสร้างภาษาโปรแกรมต่างๆ นับพันภาษา ส่วนใหญ่อยู่ในสาขาคอมพิวเตอร์ [64] โครงการซอฟต์แวร์ส่วนบุคคลมักใช้ภาษาการเขียนโปรแกรมห้าภาษาขึ้นไป [65]

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

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

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

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

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

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

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

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

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

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

การระเบิดของภาษาถิ่นออกนำไปสู่การพูดว่า "ถ้าคุณเคยเห็นมาหนึ่ง ... คุณเคยเห็นอย่างใดอย่างหนึ่งออกมา."

อนุกรมวิธาน

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

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

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

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

ดูเพิ่มเติม

อ้างอิง

  1. ^ Ettinger เจมส์ (2004) Jacquard เว็บ , Oxford University Press
  2. ^ a b c Aaby, แอนโธนี่ (2004). ความรู้เบื้องต้นเกี่ยวกับภาษาโปรแกรมมิ่ง . เก็บถาวรจากต้นฉบับเมื่อ 8 พฤศจิกายน 2555 . สืบค้นเมื่อ29 กันยายน 2555 .
  3. ในทางคณิตศาสตร์ นี่หมายความว่าภาษาการเขียนโปรแกรมคือทัวริงสมบูรณ์ MacLennan, Bruce J. (1987) หลักการเขียนโปรแกรมภาษา . สำนักพิมพ์มหาวิทยาลัยอ็อกซ์ฟอร์ด. NS. 1. ISBN 978-0-19-511306-8.
  4. ^ ACM SIGPLAN (2003). "ข้อบังคับกลุ่มผลประโยชน์พิเศษด้านภาษาโปรแกรมของสมาคมเครื่องจักรคอมพิวเตอร์" . เก็บจากต้นฉบับเมื่อ 22 มิถุนายน 2549, "ขอบเขตของ SIGPLAN คือทฤษฎี การออกแบบ การนำไปใช้ คำอธิบาย และการประยุกต์ใช้ภาษาโปรแกรมคอมพิวเตอร์ ซึ่งเป็นภาษาที่อนุญาตให้กำหนดข้อกำหนดของการคำนวณต่างๆ ที่หลากหลาย ซึ่งจะทำให้ผู้ใช้มีการควบคุมที่สำคัญ (ในทันทีหรือล่าช้า) เหนือคอมพิวเตอร์ การดำเนินการ."
  5. ดีน, ทอม (2002). "การเขียนโปรแกรมหุ่นยนต์" . การสร้างหุ่นยนต์อัจฉริยะ มหาวิทยาลัยบราวน์ ภาควิชาวิทยาการคอมพิวเตอร์. เก็บจากต้นฉบับเมื่อ 29 ตุลาคม 2549
  6. ^ R. Narasimahan, Programming Languages ​​and Computers: A Unified Metatheory, pp. 189—247 in Franz Alt, Morris Rubinoff (eds.) Advances in computers, Volume 8, Academic Press, 1994, ISBN 0-12-012108-5 , p.193 : "ข้อกำหนดที่สมบูรณ์ของภาษาการเขียนโปรแกรมต้องรวมถึงข้อกำหนดของโปรเซสเซอร์ - ในอุดมคติถ้าคุณต้องการ - สำหรับภาษานั้นตามคำจำกัดความ" [แหล่งอ้างอิงอ้างอิงจำนวนมากเพื่อสนับสนุนข้อความนี้] 
  7. ^ เบ็น อารีย์, หมอเดชัย (1996). การทำความเข้าใจภาษาโปรแกรมมิง . จอห์น ไวลีย์ แอนด์ ซันส์. โปรแกรมและภาษาสามารถกำหนดเป็นวัตถุทางคณิตศาสตร์ที่เป็นทางการได้ อย่างไรก็ตาม มีผู้คนสนใจโปรแกรมมากกว่าวัตถุทางคณิตศาสตร์อื่นๆ เช่น กลุ่ม เนื่องจากเป็นไปได้ที่จะใช้โปรแกรม—ลำดับของสัญลักษณ์—เพื่อควบคุมการทำงานของคอมพิวเตอร์ แม้ว่าเราจะแนะนำอย่างยิ่งให้ศึกษาทฤษฎีการเขียนโปรแกรม แต่ข้อความนี้โดยทั่วไปจะจำกัดตัวเองให้อยู่ที่การศึกษาโปรแกรมขณะที่ดำเนินการบนคอมพิวเตอร์
  8. David A. Schmidt, The structure of typed programming languages , MIT Press, 1994, ISBN 0-262-19349-3 , p. 32 
  9. เพียร์ซ, เบนจามิน (2002). ประเภทและการเขียนโปรแกรมภาษา สำนักพิมพ์เอ็มไอที NS. 339 . ISBN 978-0-262-16209-8.
  10. ^ บริษัทอุปกรณ์ดิจิตอล. "เทคโนโลยีสารสนเทศ - ฐานข้อมูลภาษา SQL (เสนอแก้ไขข้อความของ DIS 9075)" มาตรฐาน ISO / IEC 9075: 1992, ฐานข้อมูลภาษา SQL เก็บถาวรจากต้นฉบับเมื่อ 21 มิถุนายน 2549 . สืบค้นเมื่อ29 มิถุนายน 2549 .
  11. ^ The Charity Development Group (ธันวาคม 2539). "โฮมเพจการกุศล" . เก็บจากต้นฉบับเมื่อ 18 กรกฎาคม 2549, "การกุศลเป็นภาษาโปรแกรมที่จัดหมวดหมู่...", "การคำนวณเพื่อการกุศลทั้งหมดจะสิ้นสุดลง"
  12. ^ XML ใน 10 คะแนน เก็บถาวร 6 กันยายน 2552 ที่ Wayback Machine W3C , 1999, "XML ไม่ใช่ภาษาโปรแกรม"
  13. ^ พาวเวลล์, โธมัส (2003). HTML และ XHTML: อ้างอิงสมบูรณ์ แมคกรอว์-ฮิลล์. NS. 25. ISBN 978-0-07-222942-4. HTML ไม่ใช่ภาษาโปรแกรม
  14. ^ เลสเบี้ยน, ลูซินด้า; ทิทเทล, เอ็ด (2005). XML สำหรับ Dummies (ฉบับที่ 4) ไวลีย์. NS. 20 . ISBN 978-0-7645-8845-7. ...มันคือภาษามาร์กอัป ไม่ใช่ภาษาโปรแกรม
  15. ^ "ภาษา XSLT คืออะไร" . ไอบีเอ็ม.คอม 20 เมษายน 2548 เก็บถาวรจากต้นฉบับเมื่อ 11 พฤษภาคม 2554
  16. ^ "XSLT เป็นภาษาโปรแกรม" . Msdn.microsoft.com. เก็บถาวรจากต้นฉบับเมื่อ 3 กุมภาพันธ์ 2011 . สืบค้นเมื่อ3 ธันวาคม 2010 .
  17. ^ สกอตต์ ไมเคิล (2006). การเขียนโปรแกรมภาษาศาสตร์ . มอร์แกน คอฟมันน์ . NS. 802 . ISBN 978-0-12-633951-2. XSLT แม้ว่าจะเชี่ยวชาญอย่างมากในการแปลง XML เป็นภาษาโปรแกรมทัวริงที่สมบูรณ์
  18. ^ Oetiker โทเบียส; พาร์ต, ฮิวเบิร์ต; ไฮน่า ไอรีน; Schlegl, Elisabeth (20 มิถุนายน 2559). "The Not So Short Introduction to LATEX 2ε" (เวอร์ชัน 5.06) . tobi.oetiker.ch . หน้า 1–157. เก็บถาวร(PDF)จากต้นฉบับเมื่อ 14 มีนาคม 2017
  19. ^ Syropoulos, Apostolos; แอนโทนิส Tsolomitis; นิค โซโฟรนิอู (2003). พิมพ์ดิจิตอลโดยใช้น้ำยาง สปริงเกอร์-แวร์แล็ก. NS. 213 . ISBN 978-0-387-95217-8. TeX ไม่ได้เป็นเพียงเอ็นจิ้นการเรียงพิมพ์ที่ยอดเยี่ยมเท่านั้น แต่ยังเป็นภาษาการเขียนโปรแกรมจริงอีกด้วย
  20. Robert A. Edmunds, The Prentice-Hall standard glossary of computer terminology, Prentice-Hall, 1985, p. 91
  21. ^ Pascal Lando, Anne Lapujade, Gilles Kassel และ Frédéric Fürst, Towards a General Ontology of Computer Programs Archived 7 July 2015 at the Wayback Machine , ICSOFT 2007 Archived 27 April 2010 at the Wayback Machine , pp. 163–170
  22. ^ SK Bajpai, Introduction To Computers And C Programming , New Age International, 2007, ISBN 81-224-1379-X , หน้า. 346 
  23. ^ R. Narasimahan, Programming Languages ​​and Computers: A Unified Metatheory, pp. 189—247 in Franz Alt, Morris Rubinoff (eds.) Advances in computers, Volume 8, Academic Press, 1994, ISBN 0-12-012108-5 , p.215: "[...] แบบจำลอง [...] สำหรับภาษาคอมพิวเตอร์แตกต่างจาก [...] สำหรับภาษาโปรแกรมเพียงสองประการ ในภาษาคอมพิวเตอร์มีชื่อเรียกได้ไม่มากนัก—หรือ registers—ซึ่งสามารถสันนิษฐานได้เพียงหลายค่า—หรือหลายสถานะ—และสถานะเหล่านี้จะไม่ถูกแยกแยะในแง่ของคุณลักษณะอื่น ๆ อีกต่อไป [เชิงอรรถของผู้เขียน:] นี้อาจฟังดูเหมือนความจริงแต่ความหมายที่กว้างไกล ตัวอย่างเช่น มันจะ บอกเป็นนัยว่าแบบจำลองใดๆ สำหรับภาษาโปรแกรม โดยการแก้ไขพารามิเตอร์หรือคุณลักษณะบางอย่างควรลดลงในลักษณะที่เป็นธรรมชาติสำหรับแบบจำลองสำหรับภาษาคอมพิวเตอร์"
  24. John C. Reynolds, "Some thought on teaching programming and programming languages", SIGPLAN Notices , Volume 43, Issue 11, November 2008, p.109.
  25. ^ โรจาส ราอูล และคณะ (2000). "Plankalkül: ภาษาการเขียนโปรแกรมระดับสูงครั้งแรกและการนำไปใช้". Institut für Informatik, Freie Universität Berlin, รายงานทางเทคนิค B-3/2000 (ข้อความเต็ม) เก็บเมื่อ 18 ตุลาคม 2014 ที่ Wayback Machine
  26. ^ Sebesta, WS แนวคิดของภาษาการเขียนโปรแกรม 2006;M6 14:18 น.44 ไอเอสบีเอ็น0-321-33025-0 
  27. ^ ค นุธ โดนัลด์ อี.; ปาร์โด, หลุยส์ ทรับบ์. "การพัฒนาภาษาโปรแกรมเบื้องต้น". สารานุกรมวิทยาการคอมพิวเตอร์และเทคโนโลยี . 7 : 419–493.
  28. ^ ปีเตอร์ เจ. เบนท์ลีย์ (2012). ดิจิทัล: วิทยาศาสตร์คอมพิวเตอร์และวิธีการที่จะรูปร่างโลกของเรา สำนักพิมพ์มหาวิทยาลัยอ็อกซ์ฟอร์ด. NS. 87. ISBN 9780199693795. เก็บถาวรจากต้นฉบับเมื่อ 29 สิงหาคม 2016
  29. ^ "ผู้สร้าง Fortran John Backus เสียชีวิต - เทคโนโลยีและแกดเจ็ต" . ข่าวเอ็นบีซี. 20 มีนาคม 2550 . สืบค้นเมื่อ25 เมษายน 2010 .
  30. ^ "CSC-302 99S : Class 02: A Brief History of Programming Languages" . Math.grin.edu. เก็บถาวรจากต้นฉบับเมื่อ 15 กรกฎาคม 2553 . สืบค้นเมื่อ25 เมษายน 2010 .
  31. ยูจีน โลห์ (18 มิถุนายน 2010). "ภาษาการเขียนโปรแกรม HPC ในอุดมคติ" . คิว 8 (6). เก็บจากต้นฉบับเมื่อ 4 มีนาคม 2559
  32. ^ "HPL - การใช้งานแบบพกพาของเกณฑ์มาตรฐานประสิทธิภาพสูง Linpack สำหรับแจกจ่ายหน่วยความจำคอมพิวเตอร์" เก็บข้อมูลจากต้นฉบับเมื่อ 15 กุมภาพันธ์ 2558 . สืบค้นเมื่อ21 กุมภาพันธ์ 2558 .
  33. ^ กระโดด (1978) น. 16.
  34. ^ สมเมต (1969) น. 316
  35. ^ สมเมต (1978) น. 204.
  36. ^ ริชาร์ดแอล Wexelblat:ประวัติความเป็นมาของการเขียนโปรแกรมภาษาวิชาการปี 1981 ที่สิบสี่บท
  37. ^ François Labelle "การเขียนโปรแกรมภาษาการใข้กราฟ" ที่มาฟอร์จ เก็บถาวรจากต้นฉบับเมื่อ 17 มิถุนายน 2549 . สืบค้นเมื่อ21 มิถุนายน 2549 .. การเปรียบเทียบนี้วิเคราะห์แนวโน้มในจำนวนโปรเจ็กต์ที่โฮสต์โดยที่เก็บการเขียนโปรแกรมชุมชนยอดนิยม ในช่วงหลายปีที่ผ่านมาของการเปรียบเทียบ C นำไปสู่ส่วนต่างมาก ในปี 2549 Java แซงหน้า C แต่การผสมผสานของ C/C++ ยังคงเป็นผู้นำอยู่มาก
  38. เฮย์ส, ไบรอัน (2006). "สงครามเซมิโคลอน". นักวิทยาศาสตร์อเมริกัน . 94 (4): 299–303. ดอย : 10.1511/2006.60.299 .
  39. ^ Dijkstra, Edsger ดับบลิว (มีนาคม 1968) "ไปที่คำชี้แจงที่ถือว่าเป็นอันตราย" (PDF) . การติดต่อสื่อสารของพลอากาศเอก 11 (3): 147–148. ดอย : 10.1145/362929.362947 . S2CID 17469809 . เก็บถาวร(PDF)จากต้นฉบับเมื่อ 13 พฤษภาคม 2014  
  40. ^ Tetsuro Fujise, Takashi Chikayama, Kazuaki Rokusawa, Akihiko Nakase (ธันวาคม 1994) "KLIC: การดำเนินการแบบพกพาของ KL1" Proc. ของ FGCS 94 Icotโตเกียวธันวาคมปี 1994 "ที่จัดเก็บคัดลอก" เก็บถาวรจากต้นฉบับเมื่อ 25 กันยายน 2549 . สืบค้นเมื่อ9 ตุลาคม 2549 .CS1 maint: archived copy as title (link)KLIC เป็นการนำภาษาการเขียนโปรแกรมลอจิกไปใช้งานพร้อมกันKL1ไปใช้แบบพกพา
  41. จิม เบนเดอร์ (15 มีนาคม พ.ศ. 2547) "บรรณานุกรมฉบับย่อเกี่ยวกับโมดูลสำหรับภาษาการเขียนโปรแกรมเชิงหน้าที่" . ReadScheme.org เก็บจากต้นฉบับเมื่อ 24 กันยายน 2549
  42. ^ ไมเคิลซิปเซอร์ (1996) ทฤษฎีการคำนวณเบื้องต้น. สำนักพิมพ์ PWS ISBN 978-0-534-94728-6. ส่วนที่ 2.2: Pushdown Automata, pp.101–114.
  43. ^ เจฟฟรีย์โบว์ลิ่ง " Perl และ Undecidability ที่จัดเก็บ 17 สิงหาคม 2009 ที่เครื่อง Wayback " Perl รีวิว กระดาษที่ 2 และ 3 พิสูจน์โดยใช้ทฤษฎีบทของ Riceและการลดปัญหาการหยุดชะงักโดยตรงตามลำดับว่าการแยกวิเคราะห์โปรแกรม Perl โดยทั่วไปไม่สามารถตัดสินใจได้
  44. ^ Marty Hall, 1995, Lecture Notes: Macros Archived 6 August 2013 at the Wayback Machine, PostScript version Archived 17 August 2000 at the Wayback Machine
  45. ^ Michael Lee Scott, Programming language pragmatics, Edition 2, Morgan Kaufmann, 2006, ISBN 0-12-633951-1, p. 18–19
  46. ^ a b c d e f g Andrew Cooke. "Introduction To Computer Languages". Archived from the original on 15 August 2012. Retrieved 13 July 2012.
  47. ^ Specifically, instantiations of generic types are inferred for certain expression forms. Type inference in Generic Java—the research language that provided the basis for Java 1.5's bounded parametric polymorphism extensions—is discussed in two informal manuscripts from the Types mailing list: Generic Java type inference is unsound Archived 29 January 2007 at the Wayback Machine (Alan Jeffrey, 17 December 2001) and Sound Generic Java type inference Archived 29 January 2007 at the Wayback Machine (Martin Odersky, 15 January 2002). C#'s type system is similar to Java's, and uses a similar partial type inference scheme.
  48. ^ "Revised Report on the Algorithmic Language Scheme". 20 February 1998. Archived from the original on 14 July 2006.
  49. ^ Luca Cardelli and Peter Wegner. "On Understanding Types, Data Abstraction, and Polymorphism". Manuscript (1985). Archived from the original on 19 June 2006.
  50. ^ Steven R. Fischer, A history of language, Reaktion Books, 2003, ISBN 1-86189-080-X, p. 205
  51. ^ Éric Lévénez (2011). "Computer Languages History". Archived from the original on 7 January 2006.
  52. ^ Jing Huang. "Artificial Language vs. Natural Language". Archived from the original on 3 September 2009.
  53. ^ IBM in first publishing PL/I, for example, rather ambitiously titled its manual The universal programming language PL/I (IBM Library; 1966). The title reflected IBM's goals for unlimited subsetting capability: "PL/I is designed in such a way that one can isolate subsets from it satisfying the requirements of particular applications." ("PL/I". Encyclopedia of Mathematics. Archived from the original on 26 April 2012. Retrieved 29 June 2006.). Ada and UNCOL had similar early goals.
  54. ^ Frederick P. Brooks, Jr.: The Mythical Man-Month, Addison-Wesley, 1982, pp. 93–94
  55. ^ Dijkstra, Edsger W. On the foolishness of "natural language programming." Archived 20 January 2008 at the Wayback Machine EWD667.
  56. ^ Perlis, Alan (September 1982). "Epigrams on Programming". SIGPLAN Notices Vol. 17, No. 9. pp. 7–13. Archived from the original on 17 January 1999.
  57. ^ Milner, R.; M. Tofte; R. Harper; D. MacQueen (1997). The Definition of Standard ML (Revised). MIT Press. ISBN 978-0-262-63181-5.
  58. ^ Kelsey, Richard; William Clinger; Jonathan Rees (February 1998). "Section 7.2 Formal semantics". Revised5 Report on the Algorithmic Language Scheme. Archived from the original on 6 July 2006.
  59. ^ ANSI – Programming Language Rexx, X3-274.1996
  60. ^ Steve, McConnell (2004). Code complete (Second ed.). Redmond, Washington. pp. 590, 600. ISBN 0735619670. OCLC 54974573.
  61. ^ See: Oracle America, Inc. v. Google, Inc.
  62. ^ "Guide to Programming Languages | ComputerScience.org". ComputerScience.org. Retrieved 13 May 2018.
  63. ^ "The basics". ibm.com. 10 May 2011. Retrieved 13 May 2018.
  64. ^ "HOPL: an interactive Roster of Programming Languages". Australia: Murdoch University. Archived from the original on 20 February 2011. Retrieved 1 June 2009. This site lists 8512 languages.
  65. ^ Mayer, Philip; Bauer, Alexander (2015). An empirical analysis of the utilization of multiple programming languages in open source projects. Proceedings of the 19th International Conference on Evaluation and Assessment in Software Engineering – EASE '15. New York, NY, USA: ACM. pp. 4:1–4:10. doi:10.1145/2745802.2745805. ISBN 978-1-4503-3350-4. Results: We found (a) a mean number of 5 languages per project with a clearly dominant main general-purpose language and 5 often-used DSL types, (b) a significant influence of the size, number of commits, and the main language on the number of languages as well as no significant influence of age and number of contributors, and (c) three language ecosystems grouped around XML, Shell/Make, and HTML/CSS. Conclusions: Multi-language programming seems to be common in open-source projects and is a factor which must be dealt with in tooling and when assessing development and maintenance of such software systems.
  66. ^ Abelson, Sussman, and Sussman. "Structure and Interpretation of Computer Programs". Archived from the original on 26 February 2009. Retrieved 3 March 2009.CS1 maint: multiple names: authors list (link)
  67. ^ Brown Vicki (1999). "Scripting Languages". mactech.com. Archived from the original on 2 December 2017.
  68. ^ Georgina Swan (21 September 2009). "COBOL turns 50". computerworld.com.au. Archived from the original on 19 October 2013. Retrieved 19 October 2013.
  69. ^ Ed Airey (3 May 2012). "7 Myths of COBOL Debunked". developer.com. Archived from the original on 19 October 2013. Retrieved 19 October 2013.
  70. ^ Nicholas Enticknap. "SSL/Computer Weekly IT salary survey: finance boom drives IT job growth". Computer Weekly. Archived from the original on 26 October 2011. Retrieved 14 June 2013.
  71. ^ "Counting programming languages by book sales". Radar.oreilly.com. 2 August 2006. Archived from the original on 17 May 2008.
  72. ^ Bieman, J.M.; Murdock, V., Finding code on the World Wide Web: a preliminary investigation, Proceedings First IEEE International Workshop on Source Code Analysis and Manipulation, 2001
  73. ^ "Most Popular and Influential Programming Languages of 2018". stackify.com. 18 December 2017. Retrieved 29 August 2018.
  74. ^ Carl A. Gunter, Semantics of Programming Languages: Structures and Techniques, MIT Press, 1992, ISBN 0-262-57095-5, p. 1
  75. ^ "TUNES: Programming Languages". Archived from the original on 20 October 2007.
  76. ^ Wirth, Niklaus (1993). "Recollections about the development of Pascal". The second ACM SIGPLAN conference on History of programming languages - HOPL-II. Proc. 2nd ACM SIGPLAN Conference on History of Programming Languages. 28. pp. 333–342. CiteSeerX 10.1.1.475.6989. doi:10.1145/154766.155378. ISBN 978-0-89791-570-0. S2CID 9783524.

Further reading

External links