Введение

Язык программирования, который абстрагирует детали вычислительного оборудования.

В информатике язык программирования высокого уровня — это язык программирования с сильной абстракцией от деталей компьютера. В отличие от языков программирования низкого уровня, он может использовать элементы естественного языка, быть более простым в использовании или автоматизировать (или даже полностью скрывать) значительные области вычислительных систем (например, управление памятью), что упрощает и делает более понятным процесс разработки программы по сравнению с использованием языка более низкого уровня. Степень предоставляемой абстракции определяет, насколько «высокоуровневым» является язык программирования. В 1960-х годах язык программирования высокого уровня, использующий компилятор, обычно назывался автокодом. Примерами автокодов являются COBOL и Fortran. Первым языком программирования высокого уровня, разработанным для компьютеров, был Plankalkül, созданный Конрадом Цузе. Однако в его время он не был реализован, и его первоначальные разработки в значительной степени были изолированы от других разработок из-за Второй мировой войны, за исключением влияния языка на язык «Суперплан» Хайнца Рутисхаузера, а также в некоторой степени на ALGOL. Первым широко распространенным языком высокого уровня был Fortran — независимая от аппаратного обеспечения разработка, основанная на более ранних системах Autocode компании IBM. Семейство ALGOL, с ALGOL 58, определенным в 1958 году, и ALGOL 60, определенным в 1960 году комитетами европейских и американских ученых-компьютерщиков, ввело рекурсию, а также вложенные функции с лексической областью видимости. ALGOL 60 также был первым языком, в котором было чёткое различие между параметрами по значению и по имени и их соответствующей семантикой. ALGOL также ввёл несколько концепций структурированного программирования, таких как конструкции while do и if then else, а его синтаксис впервые был описан в формальной нотации — форме Бэкуса — Наура (BNF). Примерно в тот же период COBOL ввёл записи (также называемые структурами), а Lisp впервые ввёл полностью общую лямбда-абстракцию в языке программирования.

Особенности

"Язык высокого уровня" подразумевает более высокую степень абстракции от машинного языка. Вместо работы с регистрами, адресами памяти и стеками вызовов, языки высокого уровня оперируют переменными, массивами, объектами, сложными арифметическими или логическими выражениями, подпрограммами и функциями, циклами, потоками, блокировками и другими абстрактными понятиями информатики, с приоритетом удобства использования над оптимальной эффективностью программы. В отличие от языков ассемблера низкого уровня, языки высокого уровня содержат мало или совсем не содержат элементов, которые напрямую транслируются в машинные коды (опкоды). Также могут присутствовать такие возможности, как процедуры обработки строк, объектно-ориентированные средства и ввод-вывод файлов. Важно отметить, что языки программирования высокого уровня позволяют программисту отстраниться от непосредственного взаимодействия с машиной. То есть, в отличие от языков низкого уровня, таких как ассемблер или машинный код, высокоуровневое программирование способно расширять инструкции программиста и инициировать множество операций с данными в фоновом режиме, не требуя его непосредственного участия. Ответственность и контроль за выполнением инструкций переходят от программиста к машине.

Штраф за абстрагирование

Языки высокого уровня призваны предоставлять средства для стандартизации общих задач, обеспечивать широкие возможности отладки и сохранять независимость от архитектуры; в то время как языки низкого уровня часто генерируют более эффективный код за счет оптимизации под конкретную архитектуру системы. Цена абстракции – это плата, которую высокоуровневые методы программирования платят за невозможность оптимизировать производительность или использовать определенное оборудование, поскольку они не используют специфические низкоуровневые архитектурные ресурсы. Программирование на языках высокого уровня характеризуется более общими структурами данных и операциями, интерпретацией во время выполнения и промежуточными файлами кода, что часто приводит к выполнению большего количества операций, чем необходимо, увеличению потребления памяти и большему размеру бинарной программы. По этой причине код, требующий особенно высокой скорости и эффективности, может потребовать использования языка более низкого уровня, даже если язык высокого уровня упростил бы кодирование. Во многих случаях критически важные части программы, написанной в основном на языке высокого уровня, могут быть вручную закодированы на языке ассемблера, что приводит к значительно более быстрой, эффективной или просто надежно работающей оптимизированной программе. Однако, с ростом сложности современных архитектур микропроцессоров, хорошо разработанные компиляторы для языков высокого уровня часто генерируют код, сопоставимый по эффективности с тем, что большинство программистов низкого уровня могут создать вручную, а более высокая степень абстракции может позволить использовать более мощные методы, обеспечивающие лучшие общие результаты, чем их низкоуровневые аналоги в определенных ситуациях. Языки высокого уровня разрабатываются независимо от конкретной архитектуры вычислительной системы. Это облегчает выполнение программы, написанной на таком языке, на любой вычислительной системе с совместимой поддержкой интерпретируемых или JIT-компилируемых программ. Языки высокого уровня могут быть улучшены по мере разработки новых возможностей их создателями. В других случаях новые языки высокого уровня развиваются на основе одного или нескольких существующих, стремясь объединить наиболее популярные конструкции с новыми или улучшенными функциями. Примером этого является Scala, которая обеспечивает обратную совместимость с Java, что означает, что программы и библиотеки, написанные на Java, останутся работоспособными даже при переходе на Scala; это упрощает переход и делает срок службы такого высокоуровневого кода неопределенным. В отличие от этого, программы низкого уровня редко переживают архитектуру системы, для которой они были написаны, без существенных изменений. Это инженерный компромисс, обусловленный ценой абстракции.

Относительное значение

Примеры языков программирования высокого уровня, активно используемых сегодня, включают Python, JavaScript, Visual Basic, Delphi, Perl, PHP, ECMAScript, Ruby, C#, Java и многие другие. Термины "высокий уровень" и "низкий уровень" по своей сути относительны. Несколько десятилетий назад язык C и подобные ему языки чаще всего считались языками "высокого уровня", поскольку они поддерживали такие концепции, как вычисление выражений, параметризованные рекурсивные функции, типы и структуры данных, в то время как язык ассемблера считался языком "низкого уровня". Сегодня многие программисты могут относить C к языкам низкого уровня, поскольку ему не хватает развитой среды выполнения (отсутствует сборка мусора и т. д.), он в основном поддерживает только скалярные операции и обеспечивает прямой доступ к памяти; поэтому он легко сочетается с языком ассемблера и машинным уровнем процессоров и микроконтроллеров. Кроме того, во введении к книге "Язык программирования C" (второе издание) Брайана Кернигана и Денниса Ричи язык C описывается как "не слишком язык высокого уровня". Язык ассемблера, в свою очередь, может рассматриваться как представление машинного кода более высокого уровня (но часто все еще "один к одному", если используется без макросов), поскольку он поддерживает такие понятия, как константы и (ограниченные) выражения, а иногда даже переменные, процедуры и структуры данных. Машинный код, в свою очередь, по своей сути находится на немного более высоком уровне, чем микрокод или микрооперации, используемые внутри многих процессоров.

Компьютерная архитектура языка высокого уровня

Альтернативно, язык высокого уровня может быть непосредственно выполнен компьютером – компьютер напрямую исполняет код ЯВУ. Это известно как компьютерная архитектура, ориентированная на язык высокого уровня – сама компьютерная архитектура разрабатывается с учетом конкретного языка высокого уровня. Крупные системы Burroughs, например, были целевыми машинами для ALGOL 60.