ในวิทยาการคอมพิวเตอร์เป็นภาษาโปรแกรมระดับสูงเป็นภาษาโปรแกรมที่มีความแข็งแกร่งเป็นนามธรรมจากรายละเอียดของเครื่องคอมพิวเตอร์ ในทางตรงกันข้ามกับภาษาโปรแกรมระดับต่ำอาจใช้องค์ประกอบของภาษาที่เป็นธรรมชาติ ใช้งานง่ายกว่าหรืออาจทำให้ระบบคอมพิวเตอร์ทำงานโดยอัตโนมัติ (หรือแม้แต่ซ่อนทั้งหมด) (เช่นการจัดการหน่วยความจำ ) ทำให้กระบวนการพัฒนาโปรแกรมง่ายขึ้นและ เข้าใจง่ายกว่าเมื่อใช้ภาษาระดับล่าง จำนวนของสิ่งที่เป็นนามธรรมที่ให้ไว้กำหนดว่าภาษาโปรแกรม "ระดับสูง" เป็นอย่างไร [1]
ในปี 1960 ที่ระดับสูงการเขียนโปรแกรมภาษาที่ใช้คอมไพเลอร์ถูกเรียกกันว่าautocodes [2]ตัวอย่างของ autocodes เป็นภาษาโคบอลและFortran [3]
การเขียนโปรแกรมภาษาระดับสูงครั้งแรกที่ออกแบบมาสำหรับคอมพิวเตอร์เป็นPlankalkülที่สร้างขึ้นโดยคอนราดซูส [4]อย่างไรก็ตามมันก็ไม่ได้ดำเนินการในเวลาที่เขาและผลงานเดิมของเขาถูกแยกส่วนใหญ่มาจากการพัฒนาอื่น ๆ อันเนื่องมาจากสงครามโลกครั้งที่สองนอกเหนือจากอิทธิพลของภาษาในภาษา "Superplan" โดยไฮนซ์ Rutishauserและยังมีบางส่วนAlgol ภาษาระดับสูงที่แพร่หลายอย่างมีนัยสำคัญตัวแรกคือFortranซึ่งเป็นการพัฒนาระบบAutocodeรุ่นก่อนหน้าของ IBM โดยไม่ขึ้นกับเครื่อง Algolที่กำหนดไว้ในปี 1958 และ 1960 โดยคณะกรรมการของยุโรปและนักวิทยาศาสตร์คอมพิวเตอร์ชาวอเมริกันแนะนำการเรียกซ้ำเช่นเดียวกับฟังก์ชั่นที่ซ้อนกันอยู่ภายใต้ขอบเขตของคำศัพท์ นอกจากนี้ยังเป็นภาษาแรกที่มีความแตกต่างอย่างชัดเจนระหว่างค่าและชื่อ - พารามิเตอร์และความหมายที่เกี่ยวข้อง [5] Algol ยังนำเสนอแนวคิดการเขียนโปรแกรมแบบมีโครงสร้างหลายอย่างเช่นโครงสร้างwhile-doและif-then-elseและไวยากรณ์ของมันเป็นแบบแรกที่อธิบายในรูปแบบทางการ - " Backus – Naur form " (BNF) ในช่วงเวลาใกล้เคียงกันCobol ได้เปิดตัวบันทึก (หรือที่เรียกว่าโครงสร้าง) และLisp ได้เปิดตัวแลมบ์ดาที่เป็นนามธรรมโดยทั่วไปในภาษาโปรแกรมเป็นครั้งแรก
"ภาษาระดับสูง" หมายถึงระดับที่สูงขึ้นของนามธรรมจากภาษาเครื่อง แทนที่จะจัดการกับรีจิสเตอร์แอดเดรสหน่วยความจำและ call stacks ภาษาระดับสูงจะจัดการกับตัวแปรอาร์เรย์อ็อบเจกต์เลขคณิตที่ซับซ้อนหรือนิพจน์บูลีนรูทีนย่อยและฟังก์ชันลูปเธรดล็อกและแนวคิดทางวิทยาศาสตร์คอมพิวเตอร์นามธรรมอื่น ๆ ด้วย a มุ่งเน้นไปที่การใช้งานมากกว่าประสิทธิภาพของโปรแกรมที่ดีที่สุด ซึ่งแตกต่างจากระดับต่ำภาษาแอสเซมบลี , ภาษาระดับสูงจะมีไม่กี่ถ้ามีองค์ประกอบภาษาที่แปลโดยตรงลงพื้นเมืองของเครื่องopcodes นอกจากนี้ยังอาจมีคุณสมบัติอื่น ๆ เช่นรูทีนการจัดการสตริงคุณลักษณะภาษาเชิงวัตถุและอินพุต / เอาต์พุตไฟล์ สิ่งหนึ่งที่ควรทราบเกี่ยวกับภาษาโปรแกรมระดับสูงคือภาษาเหล่านี้อนุญาตให้ถอดโปรแกรมเมอร์ออกจากเครื่องได้ นั่นคือแตกต่างจากภาษาระดับต่ำเช่นภาษาแอสเซมบลีหรือภาษาเครื่องการเขียนโปรแกรมระดับสูงสามารถขยายคำสั่งของโปรแกรมเมอร์และกระตุ้นการเคลื่อนไหวของข้อมูลจำนวนมากในพื้นหลังโดยที่พวกเขาไม่รู้ตัว ความรับผิดชอบและอำนาจในการดำเนินการตามคำสั่งได้ถูกส่งมอบให้กับเครื่องจากโปรแกรมเมอร์แล้ว
ภาษาระดับสูงตั้งใจที่จะให้คุณลักษณะที่เป็นมาตรฐานของงานทั่วไปอนุญาตให้มีการดีบักที่หลากหลายและรักษาการไม่เชื่อเรื่องพระเจ้าทางสถาปัตยกรรม ในขณะที่ภาษาระดับต่ำมักจะสร้างโค้ดที่มีประสิทธิภาพมากขึ้นผ่านการเพิ่มประสิทธิภาพสำหรับสถาปัตยกรรมระบบเฉพาะ ค่าปรับ Abstractionเป็นค่าใช้จ่ายที่เทคนิคการเขียนโปรแกรมระดับสูงต้องจ่ายสำหรับการไม่สามารถเพิ่มประสิทธิภาพหรือใช้ฮาร์ดแวร์บางอย่างได้เนื่องจากไม่ได้ใช้ประโยชน์จากทรัพยากรทางสถาปัตยกรรมระดับต่ำบางอย่าง การเขียนโปรแกรมระดับสูงจะแสดงคุณสมบัติต่างๆเช่นโครงสร้างข้อมูลและการดำเนินการทั่วไปการตีความรันไทม์และไฟล์โค้ดระดับกลาง ซึ่งมักส่งผลให้มีการดำเนินการมากเกินความจำเป็นการใช้หน่วยความจำที่สูงขึ้นและขนาดโปรแกรมไบนารีที่ใหญ่ขึ้น [6] [7] [8]ด้วยเหตุนี้โค้ดที่ต้องทำงานอย่างรวดเร็วและมีประสิทธิภาพเป็นพิเศษอาจต้องใช้ภาษาระดับต่ำกว่าแม้ว่าภาษาระดับสูงจะทำให้การเข้ารหัสง่ายขึ้น ในหลายกรณีส่วนสำคัญของโปรแกรมส่วนใหญ่ในภาษาระดับสูงสามารถมือเขียนในภาษาประกอบนำไปสู่การได้เร็วขึ้นมากมีประสิทธิภาพมากขึ้นได้อย่างน่าเชื่อถือหรือเพียงแค่ทำงานอย่างโปรแกรมที่ดีที่สุด
อย่างไรก็ตามด้วยความซับซ้อนที่เพิ่มขึ้นของสถาปัตยกรรมไมโครโปรเซสเซอร์สมัยใหม่คอมไพเลอร์ที่ได้รับการออกแบบมาอย่างดีสำหรับภาษาระดับสูงมักจะสร้างโค้ดที่มีประสิทธิภาพเทียบเท่ากับสิ่งที่โปรแกรมเมอร์ระดับต่ำส่วนใหญ่สามารถผลิตด้วยมือได้และนามธรรมที่สูงขึ้นอาจช่วยให้สามารถใช้เทคนิคที่มีประสิทธิภาพมากขึ้นได้ ผลลัพธ์โดยรวมมากกว่าคู่ระดับต่ำในการตั้งค่าเฉพาะ [9]ภาษาระดับสูงได้รับการออกแบบโดยไม่ขึ้นกับสถาปัตยกรรมระบบคอมพิวเตอร์เฉพาะ อำนวยความสะดวกในการดำเนินการนี้โปรแกรมที่เขียนในภาษาดังกล่าวในระบบคอมพิวเตอร์ใด ๆ ที่มีการสนับสนุนที่เข้ากันได้สำหรับการตีความหรือJITโปรแกรม ภาษาระดับสูงสามารถปรับปรุงได้เมื่อนักออกแบบพัฒนาปรับปรุง ในกรณีอื่น ๆ ภาษาระดับสูงใหม่จะพัฒนาขึ้นจากภาษาอื่น ๆ อย่างน้อยหนึ่งภาษาโดยมีเป้าหมายในการรวบรวมโครงสร้างที่ได้รับความนิยมสูงสุดเข้ากับคุณลักษณะใหม่หรือคุณลักษณะที่ได้รับการปรับปรุง ตัวอย่างนี้คือScalaซึ่งรักษาความเข้ากันได้แบบย้อนหลังกับJavaซึ่งหมายความว่าโปรแกรมและไลบรารีที่เขียนด้วย Java จะยังคงใช้งานได้ต่อไปแม้ว่าร้านเขียนโปรแกรมจะเปลี่ยนไปใช้ Scala ก็ตาม ทำให้การเปลี่ยนแปลงง่ายขึ้นและอายุการใช้งานของการเข้ารหัสระดับสูงเช่นนี้ไม่แน่นอน ในทางตรงกันข้ามโปรแกรมระดับต่ำแทบจะไม่สามารถอยู่รอดได้นอกเหนือจากสถาปัตยกรรมระบบที่เขียนขึ้นโดยไม่มีการแก้ไขครั้งใหญ่ นี่คือ 'การแลกเปลี่ยน' ทางวิศวกรรมสำหรับ 'การลงโทษที่เป็นนามธรรม'
ตัวอย่างของภาษาโปรแกรมระดับสูงที่ใช้งานอยู่ในปัจจุบัน ได้แก่Python , Visual Basic , Delphi , Perl , PHP , ECMAScript , Ruby , C # , Javaและอื่น ๆ อีกมากมาย
คำว่าระดับสูงและระดับต่ำนั้นสัมพันธ์กันโดยเนื้อแท้ หลายทศวรรษที่ผ่านมาภาษาซีและภาษาที่คล้ายคลึงกันส่วนใหญ่มักถูกมองว่าเป็น "ระดับสูง" เนื่องจากได้รับการสนับสนุนแนวคิดต่างๆเช่นการประเมินนิพจน์ฟังก์ชันเรียกซ้ำที่กำหนดพารามิเตอร์และประเภทข้อมูลและโครงสร้างในขณะที่ภาษาแอสเซมบลีถือเป็น "ระดับต่ำ ". วันนี้โปรแกรมเมอร์หลายคนอาจอ้างถึง C เป็นระดับต่ำเนื่องจากไม่มีระบบรันไทม์ขนาดใหญ่(ไม่มีการรวบรวมขยะ ฯลฯ ) โดยทั่วไปสนับสนุนเฉพาะการทำงานแบบสเกลาร์และให้การกำหนดแอดเดรสหน่วยความจำโดยตรง ดังนั้นจึงผสมผสานกับภาษาแอสเซมบลีและระดับเครื่องของซีพียูและไมโครคอนโทรลเลอร์ได้อย่างง่ายดาย
ภาษาแอสเซมบลีอาจถือได้ว่าเป็นระดับที่สูงกว่า (แต่มักจะยังคงเป็นหนึ่งต่อหนึ่งหากใช้โดยไม่มีมาโคร ) เป็นตัวแทนของรหัสเครื่องเนื่องจากสนับสนุนแนวคิดเช่นค่าคงที่และนิพจน์ (จำกัด ) บางครั้งแม้แต่ตัวแปรขั้นตอนและข้อมูล โครงสร้าง . ในทางกลับกันรหัสเครื่องจะอยู่ในระดับที่สูงกว่าไมโครโค้ดหรือการดำเนินการขนาดเล็กที่ใช้ภายในโปรเซสเซอร์หลายตัวโดยเนื้อแท้แล้ว [10]
มีโหมดการทำงานทั่วไปสามโหมดสำหรับภาษาระดับสูงสมัยใหม่:
ตีความเมื่อมีการตีความโค้ดที่เขียนด้วยภาษา ไวยากรณ์จะถูกอ่านและดำเนินการโดยตรงโดยไม่มีขั้นตอนการคอมไพล์ โปรแกรมที่เรียกว่า ล่ามอ่านคำสั่งแต่ละโปรแกรมดังต่อไปนี้การไหลของโปรแกรมแล้วตัดสินใจว่าจะทำอย่างไรและไม่ได้ ลูกผสมของล่ามและคอมไพเลอร์จะรวบรวมคำสั่งเป็นรหัสเครื่องและดำเนินการดังกล่าว จากนั้นรหัสเครื่องจะถูกทิ้งเพื่อตีความใหม่หากมีการเรียกใช้บรรทัดอีกครั้ง โดยทั่วไปแล้วล่ามเป็นการนำพฤติกรรมของภาษาไปใช้ที่ง่ายที่สุดเมื่อเทียบกับอีกสองรูปแบบที่ระบุไว้ที่นี่เรียบเรียงเมื่อมีการคอมไพล์โค้ดที่เขียนด้วยภาษา ไวยากรณ์จะถูกแปลงเป็นรูปแบบปฏิบัติการก่อนที่จะรัน การคอมไพล์มีสองประเภท:การสร้างรหัสเครื่องคอมไพเลอร์บางรวบรวมรหัสที่มาโดยตรงใน รหัสเครื่อง นี่คือโหมดดั้งเดิมของการคอมไพล์และภาษาที่เปลี่ยนเป็นรหัสของเครื่องโดยตรงและสมบูรณ์ด้วยวิธีนี้อาจเรียกว่า ภาษาที่คอมไพล์อย่างแท้จริง ดู ภาษาประกอบการแสดงระดับกลางเมื่อโค้ดที่เขียนด้วยภาษาถูกคอมไพล์ไปยังการ แสดงระดับกลางการแทนค่านั้นสามารถปรับให้เหมาะสมหรือบันทึกไว้เพื่อดำเนินการในภายหลังโดยไม่จำเป็นต้องอ่านซอร์สไฟล์ซ้ำ เมื่อการแสดงกลางจะถูกบันทึกไว้ก็อาจจะเป็นในรูปแบบเช่น bytecode จากนั้นการเป็นตัวแทนระดับกลางจะต้องถูกตีความหรือรวบรวมเพิ่มเติมเพื่อดำเนินการ เครื่องเสมือนที่เรียกใช้ bytecode โดยตรงหรือแปลงเพิ่มเติมเป็นรหัสเครื่องทำให้ความแตกต่างที่ชัดเจนครั้งหนึ่งระหว่างการแสดงระดับกลางและภาษาที่คอมไพล์อย่างแท้จริงแปลจากแหล่งที่มาหรือแปลงไฟล์โค้ดที่เขียนด้วยภาษาอาจถูกแปลเป็นภาษาระดับล่างซึ่งคอมไพเลอร์โค้ดเนทีฟนั้นใช้กันทั่วไปอยู่แล้ว JavaScriptและภาษา Cเป็นเป้าหมายทั่วไปสำหรับนักแปลดังกล่าว ดู CoffeeScript , ไก่โครงการและ หอไอเฟลเป็นตัวอย่าง โดยเฉพาะรหัส C และ C ++ ที่สร้างขึ้นสามารถมองเห็นได้ (ซึ่งสร้างจากภาษา Eiffel เมื่อใช้ EiffelStudio IDE) ในไดเรกทอรี EIFGENs ของโครงการ Eiffel ที่คอมไพล์ ในหอไอเฟลที่ แปลกระบวนการจะเรียกว่าเป็น transcompiling หรือ transcompiled และคอมไพเลอร์ไอเฟลเป็น transcompiler หรือ คอมไพเลอร์ที่มาต่อแหล่งที่มาโปรดทราบว่าภาษาไม่ใช่ภาษาที่ตีความอย่างเคร่งครัดหรือภาษาคอมไพล์ แต่การนำพฤติกรรมทางภาษาไปใช้จะใช้การตีความหรือการรวบรวม ตัวอย่างเช่นALGOL 60และFortranได้รับการตีความ (แม้ว่าจะมีการรวบรวมข้อมูลมากกว่าก็ตาม) ในทำนองเดียวกัน Java แสดงให้เห็นถึงความยากลำบากในการพยายามใช้ป้ายกำกับเหล่านี้กับภาษาแทนที่จะนำไปใช้งาน Java ถูกคอมไพล์เป็น bytecode ซึ่งจะถูกเรียกใช้งานโดยการตีความ (ในเครื่องเสมือน Java (JVM)) หรือการคอมไพล์ (โดยทั่วไปจะมีคอมไพเลอร์แบบทันเวลาเช่นHotSpotอีกครั้งใน JVM) ยิ่งไปกว่านั้นการคอมไพล์การแปลงคอมไพล์และการตีความไม่ได้ จำกัด เฉพาะคำอธิบายของสิ่งประดิษฐ์ของคอมไพเลอร์เท่านั้น
สถาปัตยกรรมคอมพิวเตอร์ภาษาระดับสูง
หรืออีกวิธีหนึ่งเป็นไปได้ที่คอมพิวเตอร์จะใช้ภาษาระดับสูงโดยตรง - คอมพิวเตอร์เรียกใช้รหัส HLL โดยตรง นี้เป็นที่รู้จักกันในระดับสูงสถาปัตยกรรมคอมพิวเตอร์ภาษา - The สถาปัตยกรรมคอมพิวเตอร์ตัวเองถูกออกแบบมาเพื่อกำหนดเป้าหมายโดยเฉพาะภาษาสูงระดับ โรห์ระบบขนาดใหญ่เป็นเครื่องเป้าหมายALGOL 60ยกตัวอย่างเช่น [11]