Язык программирования высокого уровня
В информатике язык программирования высокого уровня — это язык программирования с сильной абстракцией от деталей компьютера . В отличие от языков программирования низкого уровня , он может использовать естественного языка элементы , быть проще в использовании или может автоматизировать (или даже полностью скрывать) значительные области вычислительных систем (например, управление памятью ), делая процесс разработки программы более простым и удобным. более понятен, чем при использовании языка более низкого уровня. Объем предоставляемой абстракции определяет, насколько «высокоуровневым» является язык программирования. [1]
В 1960-х годах язык программирования высокого уровня, использующий компилятор, обычно назывался автокодом . [2] Примерами автокодов являются COBOL и Fortran . [3]
Первым языком программирования высокого уровня, предназначенным для компьютеров, был Plankalkül , созданный Конрадом Цузе . [4] Однако он не был реализован в его время, и его первоначальный вклад был в значительной степени изолирован от других разработок из-за Второй мировой войны , за исключением влияния языка на язык «Суперплана» Хайнца Рутисхаузера , а также, в некоторой степени, на АЛГОЛ . Первым широко распространенным языком высокого уровня был Fortran , машинно-независимая разработка более ранних систем IBM Autocode . Семейство АЛГОЛ , включающее АЛГОЛ 58, определенный в 1958 году, и АЛГОЛ 60, определенный в 1960 году комитетами европейских и американских ученых-компьютерщиков, представило рекурсию, а также вложенные функции в лексической области видимости . АЛГОЛ 60 также был первым языком с четким различием между параметрами- значениями и именами и соответствующей им семантикой . [5] АЛГОЛ также представил несколько концепций структурированного программирования , таких как while-do
и if-then-else
конструкции и ее синтаксис впервые были описаны в формальной нотации – форме Бэкуса–Наура (БНФ). Примерно в тот же период COBOL представил записи (также называемые структурами), а Lisp представил полностью общую лямбда-абстракцию впервые в языке программирования.
Функции
[ редактировать ]«Язык высокого уровня» относится к более высокому уровню абстракции от машинного языка . Вместо того, чтобы иметь дело с регистрами, адресами памяти и стеками вызовов, языки высокого уровня имеют дело с переменными, массивами, объектами , сложными арифметическими или логическими выражениями, подпрограммами и функциями, циклами, потоками , блокировками и другими абстрактными концепциями информатики. сосредоточьтесь на удобстве использования, а не на оптимальной эффективности программы. низкого уровня В отличие от языков ассемблера машины , языки высокого уровня практически не содержат языковых элементов, которые преобразуются непосредственно в собственные коды операций . Также могут присутствовать другие функции, такие как процедуры обработки строк, функции объектно-ориентированного языка и файловый ввод/вывод. Что касается языков программирования высокого уровня, следует отметить то, что эти языки позволяют программисту быть отстраненным и отделенным от машины. То есть, в отличие от языков низкого уровня, таких как ассемблер или машинный язык, программирование высокого уровня может расширять инструкции программиста и запускать множество перемещений данных в фоновом режиме без его ведома. Ответственность и право выполнения инструкций были переданы машине от программиста.
Штраф за абстракцию
[ редактировать ]Языки высокого уровня призваны предоставлять функции, которые стандартизируют общие задачи, обеспечивают расширенную отладку и поддерживают архитектурный агностицизм; в то время как языки низкого уровня часто создают более эффективный код за счет оптимизации для конкретной системной архитектуры . Штраф за абстракцию — это цена, которую платят методы программирования высокого уровня за невозможность оптимизировать производительность или использовать определенное оборудование, поскольку они не используют преимущества определенных архитектурных ресурсов низкого уровня. Программирование высокого уровня демонстрирует такие функции, как более общие структуры данных и операции, интерпретация во время выполнения и файлы промежуточного кода; что часто приводит к выполнению гораздо большего количества операций, чем необходимо, более высокому потреблению памяти и увеличению размера двоичной программы. [6] [7] [8] По этой причине код, который должен выполняться особенно быстро и эффективно, может потребовать использования языка более низкого уровня, даже если язык более высокого уровня облегчит кодирование. Во многих случаях критические части программы, в основном написанные на языке высокого уровня, могут быть вручную закодированы на языке ассемблера , что приводит к созданию гораздо более быстрой, эффективной или просто надежно функционирующей оптимизированной программы .
Однако с ростом сложности современных микропроцессорных архитектур хорошо спроектированные компиляторы для языков высокого уровня часто создают код, сравнимый по эффективности с тем, что большинство программистов низкого уровня могут создавать вручную, а более высокая абстракция может позволить использовать более мощные методы, обеспечивающие лучшее общие результаты, чем их аналоги низкого уровня в конкретных условиях. [9] Языки высокого уровня разрабатываются независимо от конкретной архитектуры вычислительной системы . Это облегчает выполнение программы, написанной на таком языке, на любой вычислительной системе с совместимой поддержкой интерпретируемой или JIT- программы. Языки высокого уровня можно улучшать по мере того, как их разработчики разрабатывают улучшения. В других случаях новые языки высокого уровня развиваются из одного или нескольких других с целью объединения наиболее популярных конструкций с новыми или улучшенными функциями. Примером этого является Scala , которая поддерживает обратную совместимость с Java , а это означает, что программы и библиотеки, написанные на Java, будут продолжать использоваться, даже если магазин программирования перейдет на Scala; это упрощает переход и делает неопределенным срок службы такого высокоуровневого кодирования. Напротив, программы низкого уровня редко выживают за пределами системной архитектуры , для которой они были написаны, без серьезной доработки. Это инженерный «компромисс» для «штрафа за абстракцию».
Относительное значение
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( Октябрь 2018 г. ) |
Примеры языков программирования высокого уровня, активно используемых сегодня, включают Python , JavaScript , Visual Basic , Delphi , Perl , PHP , ECMAScript , Ruby , C# , Java и многие другие.
Термины «высокий уровень» и «низкий уровень» по своей сути относительны. Несколько десятилетий назад, [ временные рамки? ] Язык C и подобные языки чаще всего считались «высокоуровневыми», поскольку он поддерживал такие концепции, как оценка выражений, параметризованные рекурсивные функции, а также типы и структуры данных, в то время как язык ассемблера считался «низкоуровневым». Сегодня многие программисты могут называть C низкоуровневым, поскольку в нем отсутствует большая система времени выполнения (нет сборки мусора и т. д.), он в основном поддерживает только скалярные операции и обеспечивает прямую адресацию памяти; поэтому он легко сочетается с языком ассемблера и машинным уровнем процессоров и микроконтроллеров . Кроме того, во вводной главе книги Брайана Кернигана и Денниса Ритчи «Язык программирования C » (второе издание) C описывается как язык «не очень высокого уровня». [10]
более высокого уровня (но часто все же однозначное, если используется без макросов Язык ассемблера сам по себе может рассматриваться как представление машинного кода ) , поскольку он поддерживает такие понятия, как константы и (ограниченные) выражения, иногда даже переменные, процедуры и данные. структуры . Машинный код , в свою очередь, по своей сути находится на несколько более высоком уровне, чем микрокод или микрооперации, используемые внутри многих процессоров. [11]
Режимы выполнения
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( октябрь 2018 г. ) |
Для современных языков высокого уровня существует три основных режима выполнения:
- Интерпретировано
- Когда код, написанный на языке, интерпретируется , его синтаксис считывается, а затем выполняется напрямую, без этапа компиляции. Программа, называемая интерпретатором, считывает каждый оператор программы, следуя ее ходу, затем решает, что делать, и выполняет это. Гибрид интерпретатора и компилятора скомпилирует оператор в машинный код и выполнит его; затем машинный код отбрасывается и интерпретируется заново, если строка выполняется снова. Интерпретаторы обычно представляют собой простейшую реализацию поведения языка по сравнению с двумя другими вариантами, перечисленными здесь.
- Скомпилировано
- Когда код, написанный на языке , компилируется , его синтаксис перед запуском преобразуется в исполняемую форму. Существует два типа компиляции:
- Генерация машинного кода
- Некоторые компиляторы компилируют исходный код непосредственно в машинный код . Это исходный способ компиляции, и языки, которые таким образом напрямую и полностью преобразуются в машинный код, можно назвать истинно компилируемыми языками. См. язык ассемблера .
- Промежуточные представления
- Когда код, написанный на языке, компилируется в промежуточное представление , это представление можно оптимизировать или сохранить для последующего выполнения без необходимости перечитывания исходного файла. Когда промежуточное представление сохраняется, оно может быть в такой форме, как байт-код . Затем промежуточное представление необходимо интерпретировать или дополнительно скомпилировать для его выполнения. Виртуальные машины , которые напрямую выполняют байт-код или преобразуют его в машинный код, стерли некогда четкое различие между промежуточными представлениями и по-настоящему скомпилированными языками.
- Переведено или транскомпилировано из исходного кода в исходный код
- Код, написанный на языке, может быть переведен на язык более низкого уровня, для которого уже распространены компиляторы собственного кода. JavaScript и язык C являются общими объектами для таких переводчиков. См CoffeeScript , Chicken Scheme и Eiffel . примеры . В частности, сгенерированный код C и C++ можно увидеть (сгенерированный на языке Eiffel при использовании EiffelStudio IDE) в каталоге EIFGENs любого скомпилированного проекта Eiffel. В языке Eiffel преобразованный процесс называется транскомпиляцией или транскомпиляцией, а компилятор Eiffel — транскомпилятором или компилятором из источника в исходный код .
Обратите внимание, что языки не являются строго интерпретируемыми или компилируемыми языками. Скорее, реализации языкового поведения используют интерпретацию или компиляцию. Например, АЛГОЛ 60 и Фортран были интерпретированы (хотя они чаще компилировались). Аналогичным образом, Java демонстрирует сложность применения этих меток к языкам, а не к реализациям; Java компилируется в байт-код, который затем выполняется путем интерпретации (на виртуальной машине Java (JVM)) или компиляции (обычно с помощью JIT-компилятора, такого как HotSpot , опять же в JVM). Более того, компиляция, транскомпиляция и интерпретация не ограничиваются строго только описанием артефакта компилятора (двоичного исполняемого файла или сборки IL).
Языковая компьютерная архитектура высокого уровня
[ редактировать ]Альтернативно, язык высокого уровня может быть напрямую реализован на компьютере — компьютер напрямую выполняет код HLL. Это известно как компьютерная архитектура языка высокого уровня — сама компьютерная архитектура спроектирована так, чтобы быть ориентированной на определенный язык высокого уровня. были большие системы Берроуза целевыми машинами для Алгола 60 . Например, [12]
См. также
[ редактировать ]- Список поколений языков программирования
- Категориальный список языков программирования
- Языки программирования очень высокого уровня
- Языки программирования низкого уровня
- Ассемблер высокого уровня
- Абстракция (информатика)
Ссылки
[ редактировать ]- ^ «HThreads — Глоссарий RD» . Архивировано из оригинала 26 августа 2007 года.
- ^ Лондон, Кейт (1968). «4. Программирование». Введение в компьютеры . Рассел-сквер, 24, Лондон, WC1: Faber and Faber Limited. п. 184. ИСБН 0571085938 .
Языки программирования «высокого» уровня часто называют автокодами, а процессорную программу — компилятором.
{{cite book}}
: CS1 maint: местоположение ( ссылка ) - ^ Лондон, Кейт (1968). «4. Программирование». Введение в компьютеры . Рассел-сквер, 24, Лондон, WC1: Faber and Faber Limited. п. 186. ИСБН 0571085938 .
Два языка программирования высокого уровня, которые можно использовать здесь в качестве примеров для иллюстрации структуры и назначения автокодов, — это COBOL (общий бизнес-ориентированный язык) и FORTRAN (формальный перевод).
{{cite book}}
: CS1 maint: местоположение ( ссылка ) - ^ Гилой, Вольфганг, К. (1997). «Plankalkül Конрада Цузе: первый язык программирования высокого уровня, не являющийся фон Нейманом». IEEE Annals of the History of Computing, vol. 19, нет. 2, стр. 17–24, апрель – июнь 1997 г. (аннотация)
- ^ Хотя в нем отсутствовало понятие ссылочных параметров , что могло стать проблемой в некоторых ситуациях. Несколько преемников, включая ALGOL W , ALGOL 68 , Simula , Pascal , Modula и Ada , таким образом, включали ссылочные параметры (родственное семейство языков C вместо этого допускало адреса как
value
-параметры). - ^ Сурана П. (2006). «Метакомпиляция языковых абстракций» (PDF) . Архивировано (PDF) из оригинала 17 февраля 2015 года . Проверено 17 марта 2008 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Кукетаев. «Бенчмарк штрафа за абстракцию данных (DAP) для небольших объектов в Java» . Архивировано из оригинала 11 января 2009 года . Проверено 17 марта 2008 г.
- ^ Хацигеоргиу; Стефанидес (2002). «Оценка производительности и возможностей объектно-ориентированных и процедурных языков программирования». В Блибергере; Штромайер (ред.). Материалы - 7-я Международная конференция по надежным программным технологиям - Ada-Europe'2002 . Спрингер. п. 367.
- ^ Мануэль Карро; Хосе Ф. Моралес; Хенк Л. Мюллер; Г. Пуэбла; М. Эрменегильдо (2006). «Языки высокого уровня для небольших устройств: практический пример» (PDF) . Материалы Международной конференции 2006 г. по компиляторам, архитектуре и синтезу для встраиваемых систем . АКМ.
- ^ Керниган, Брайан В.; Ричи, Деннис М. (1988). Язык программирования Си: 2-е издание . Прентис Холл. ISBN 9780131103627 . Архивировано из оригинала 25 октября 2022 года . Проверено 25 октября 2022 г.
{{cite book}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка ) - ^ Хайд, Рэндалл. (2010). Искусство ассемблера (2-е изд.). Сан-Франциско: Пресса без крахмала. ISBN 9781593273019 . OCLC 635507601 .
- ^ Чу, Яохан (1975), «Концепции языковой компьютерной архитектуры высокого уровня», Языковая компьютерная архитектура высокого уровня , Elsevier, стр. 1–14, doi : 10.1016/b978-0-12-174150-1.50007-0 , ISBN 9780121741501
Внешние ссылки
[ редактировать ]- http://c2.com/cgi/wiki?HighLevelLanguage — статья WikiWikiWeb о языках программирования высокого уровня.