В информатике, язык программирования высокого уровня - это язык программирования с сильной абстракцией от деталей. компьютера . В отличие от языков программирования низкого уровня, он может использовать элементы естественного языка, быть более простым в использовании или может автоматизировать (или даже полностью скрыть) значительные области вычислительных систем (например, управление памятью ), что делает процесс разработки программы более простым и понятным, чем при использовании языка нижнего уровня. Объем предоставленной абстракции определяет, насколько «высокоуровневым» является язык программирования.
В 1960-х годах языки программирования высокого уровня, использующие компилятор, обычно назывались автокоды. Примеры автокодов: COBOL и Fortran.
Первым языком программирования высокого уровня, разработанным для компьютеров, был Plankalkül, созданный Конрадом Цузе. Однако в его время это не было реализовано, и его первоначальный вклад был в значительной степени изолирован от других разработок из-за Второй мировой войны, не считая влияния языка на язык «Суперплан» Хайнца Рутисхаузера и также в некоторой степени Алгол. Первым широко распространенным языком высокого уровня был Fortran, машинно-независимая разработка более ранних систем IBM Autocode. Алгол, определенный в 1958 и 1960 годах комитетами европейских и американских компьютерных ученых, представил рекурсию, а также вложенные функции в лексической области. Это также был первый язык с четким различием между значением и параметрами имени и их соответствующей семантикой . Algol также представил несколько концепций структурного программирования , таких как конструкции while-do и if-then-else, а его синтаксис был сначала описывается в формальных обозначениях - «форма Бакуса – Наура » (БНФ). Примерно в тот же период Cobol представил записи (также называемые структурами), а Lisp представил полностью общую лямбда-абстракцию в языке программирования. в первый раз.
«Язык высокого уровня» относится к более высокому уровню абстракции от машинного языка. Вместо того, чтобы иметь дело с регистрами, адресами памяти и стеками вызовов, языки высокого уровня имеют дело с переменными, массивами, объектами, сложными арифметическими или логическими выражениями, подпрограммами и функциями, циклами, потоками, блокировки и другие абстрактные концепции информатики, с упором на удобство использования, а не оптимальную эффективность программы. В отличие от низкоуровневых языков ассемблера, в языках высокого уровня мало языковых элементов, если они вообще есть, которые переводятся непосредственно в собственные коды операций машины. Также могут присутствовать другие функции, такие как процедуры обработки строк, особенности объектно-ориентированного языка и ввод / вывод файлов. В языках программирования высокого уровня следует отметить то, что эти языки позволяют программисту быть отделенным от машины. То есть, в отличие от языков низкого уровня, таких как ассемблер или машинный язык, высокоуровневое программирование может усиливать инструкции программиста и запускать множество перемещений данных в фоновом режиме без их ведома. Ответственность и полномочия по выполнению инструкций были переданы машине от программиста.
Языки высокого уровня предназначены для предоставления функций, которые стандартизируют общие задачи, допускают расширенную отладку и поддерживают архитектурный агностицизм; в то время как языки низкого уровня часто создают более эффективный код за счет оптимизации для конкретной системной архитектуры. Штраф за абстракцию - это цена, которую платят высокоуровневые методы программирования за невозможность оптимизировать производительность или использовать определенное оборудование, поскольку они не используют преимущества определенных низкоуровневых архитектурных ресурсов. Программирование высокого уровня демонстрирует такие функции, как более общие структуры данных и операции, интерпретация времени выполнения и файлы промежуточного кода; что часто приводит к выполнению гораздо большего количества операций, чем необходимо, более высокому потреблению памяти и большему размеру двоичной программы. По этой причине код, который должен выполняться особенно быстро и эффективно, может потребовать использования языка более низкого уровня, даже если язык более высокого уровня упростит кодирование. Во многих случаях критические части программы, в основном на языке высокого уровня, могут быть вручную написаны на языке ассемблера, что приводит к гораздо более быстрой, более эффективной или просто надежно функционирующей оптимизированной программе.
Однако с ростом сложности современных архитектур микропроцессоров хорошо спроектированные компиляторы для языков высокого уровня часто создают код, сравнимый по эффективности с тем, что большинство программистов низкого уровня может создать вручную, и более высокая степень абстракции могут позволить использовать более мощные методы, обеспечивающие лучшие общие результаты, чем их низкоуровневые аналоги в определенных условиях. Языки высокого уровня разрабатываются независимо от архитектуры конкретной вычислительной системы. Это облегчает выполнение программы, написанной на таком языке, в любой вычислительной системе с совместимой поддержкой программы Interpreted или JIT. Языки высокого уровня можно улучшать по мере разработки улучшений их разработчиками. В других случаях новые языки высокого уровня развиваются из одного или нескольких других с целью объединения наиболее популярных конструкций с новыми или улучшенными функциями. Примером этого является Scala, который поддерживает обратную совместимость с Java, что означает, что программы и библиотеки, написанные на Java, будут по-прежнему использоваться, даже если магазин программирования перейдет на Scala; это упрощает переход, а срок жизни такого высокоуровневого кодирования неограничен. Напротив, низкоуровневые программы редко выживают за пределами системной архитектуры, для которой они были написаны, без серьезных изменений. Это инженерный «компромисс» за «штраф за абстракцию».
Примеры языков программирования высокого уровня, активно используемых сегодня, включают Python, Visual Basic, Delphi, Perl, PHP, ECMAScript, Ruby, C#, Java и многие другие.
Термины «высокий уровень» и «низкий уровень» по своей сути относительны. Несколько десятилетий назад язык C и подобные языки чаще всего считались "высокоуровневыми", поскольку он поддерживал такие концепции, как вычисление выражений, параметризованные рекурсивные функции и типы данных. и структуры, а язык ассемблера считался «низкоуровневым». Сегодня многие программисты могут называть C низкоуровневым, поскольку в нем отсутствует большая исполняющая -система (без сборки мусора и т. Д.), В основном поддерживаются только скалярные операции и обеспечивается прямая адресация памяти. Таким образом, он легко сочетается с языком ассемблера, а машинный уровень процессоров и микроконтроллеров.
сам по себе может рассматриваться как более высокий уровень (но часто все же один к одному, если используется без макросов ) представление машинного кода, поскольку оно поддерживает такие концепции, как константы и (ограниченные) выражения, иногда даже переменные, процедуры и структуры данных. Машинный код, в свою очередь, по своей сути находится на несколько более высоком уровне, чем микрокод или микрооперации, используемые внутри многих процессоров.
Существуют три общих режима выполнения для современных языков высокого уровня:
. Обратите внимание, что языки не являются строго интерпретируемыми языками или компилируемыми языками. Скорее, реализации языкового поведения используют интерпретацию или компиляцию. Например, АЛГОЛ 60 и Фортран оба были интерпретированы (хотя обычно они компилировались). Точно так же Java показывает сложность попытки применить эти ярлыки к языкам, а не к реализациям; Java компилируется в байт-код, который затем выполняется либо путем интерпретации (в виртуальной машине Java (JVM)), либо путем компиляции (обычно с помощью оперативного компилятора, такого как HotSpot, снова в JVM). Более того, компиляция, транскомпиляция и интерпретация строго не ограничиваются только описанием артефакта компилятора (двоичный исполняемый файл или сборка IL).
В качестве альтернативы, язык высокого уровня может быть напрямую реализован компьютером - компьютер напрямую выполняет код HLL. Это известно как компьютерная архитектура на языке высокого уровня - сама компьютерная архитектура предназначена для использования с конкретным языком высокого уровня. Большие системы Берроуза были целевыми машинами для АЛГОЛА 60, например.