В информатике язык программирования высокого уровня — это язык программирования с сильной абстракцией от деталей компьютера . В отличие от языков программирования низкого уровня , он может использовать элементы естественного языка , быть проще в использовании или может автоматизировать (или даже полностью скрывать) значительные области вычислительных систем (например, управление памятью ), делая процесс разработки программы более простым и удобным. более понятен, чем при использовании языка более низкого уровня. Объем предоставляемой абстракции определяет, насколько «высокоуровневым» является язык программирования. [1]
В 1960-х годах язык программирования высокого уровня, использующий компилятор , обычно назывался автокодом . [2] Примерами автокодов являются COBOL и Fortran . [3]
Первым языком программирования высокого уровня, предназначенным для компьютеров, был Plankalkül , созданный Конрадом Цузе . [4] Однако он не был реализован в его время, и его первоначальный вклад был в значительной степени изолирован от других разработок из-за Второй мировой войны , за исключением влияния языка на язык «Суперплана» Хайнца Рутисхаузера , а также в некоторой степени на АЛГОЛ . Первым широко распространенным языком высокого уровня был Fortran , машинно-независимая разработка более ранних систем IBM Autocode . Семейство АЛГОЛ , включающее АЛГОЛ 58 , определенный в 1958 году, и АЛГОЛ 60, определенный в 1960 году комитетами европейских и американских ученых-компьютерщиков, представило рекурсию , а также вложенные функции в лексической области видимости . АЛГОЛ 60 также был первым языком с четким различием между параметрами- значениями и именами и соответствующей им семантикой . [5] АЛГОЛ также представил несколько концепций структурного программирования , таких как конструкции while-do
и if-then-else
, и его синтаксис был первым, который был описан в формальной нотации – форме Бэкуса-Наура (BNF). Примерно в тот же период COBOL представил записи (также называемые структурами), а Lisp впервые представил полностью общую лямбда-абстракцию в языке программирования.
«Язык высокого уровня» относится к более высокому уровню абстракции от машинного языка . Вместо того, чтобы иметь дело с регистрами, адресами памяти и стеками вызовов, языки высокого уровня имеют дело с переменными, массивами, объектами , сложными арифметическими или логическими выражениями, подпрограммами и функциями, циклами, потоками , блокировками и другими абстрактными концепциями информатики. сосредоточьтесь на удобстве использования , а не на оптимальной эффективности программы. В отличие от языков ассемблера низкого уровня , языки высокого уровня практически не содержат языковых элементов, которые преобразуются непосредственно в собственные коды операций машины . Также могут присутствовать другие функции, такие как процедуры обработки строк, функции объектно-ориентированного языка и файловый ввод/вывод. Что касается языков программирования высокого уровня, следует отметить то, что эти языки позволяют программисту быть отстраненным и отделенным от машины. То есть, в отличие от языков низкого уровня, таких как ассемблер или машинный язык, программирование высокого уровня может расширять инструкции программиста и запускать множество перемещений данных в фоновом режиме без его ведома. Ответственность и право выполнения инструкций были переданы машине от программиста.
Языки высокого уровня призваны предоставлять функции, которые стандартизируют общие задачи, позволяют выполнять расширенную отладку и поддерживать архитектурный агностицизм; в то время как языки низкого уровня часто создают более эффективный код за счет оптимизации для конкретной системной архитектуры . Штраф за абстракцию — это цена, которую платят методы программирования высокого уровня за невозможность оптимизировать производительность или использовать определенное оборудование, поскольку они не используют преимущества определенных архитектурных ресурсов низкого уровня. Программирование высокого уровня демонстрирует такие функции, как более общие структуры данных и операции, интерпретация во время выполнения и файлы промежуточного кода; что часто приводит к выполнению гораздо большего количества операций, чем необходимо, более высокому потреблению памяти и увеличению размера двоичной программы. [6] [7] [8] По этой причине код, который должен выполняться особенно быстро и эффективно, может потребовать использования языка более низкого уровня, даже если язык более высокого уровня облегчит кодирование. Во многих случаях критические части программы, в основном написанные на языке высокого уровня, могут быть вручную закодированы на языке ассемблера , что приводит к созданию гораздо более быстрой, эффективной или просто надежно функционирующей оптимизированной программы .
Однако с ростом сложности современных микропроцессорных архитектур хорошо спроектированные компиляторы для языков высокого уровня часто создают код, сравнимый по эффективности с тем, что большинство программистов низкого уровня могут создавать вручную, а более высокая абстракция может позволить использовать более мощные методы, обеспечивающие лучшее общие результаты, чем их аналоги низкого уровня в конкретных условиях. [9] Языки высокого уровня разрабатываются независимо от конкретной архитектуры вычислительной системы . Это облегчает выполнение программы, написанной на таком языке, в любой вычислительной системе с совместимой поддержкой интерпретируемой или JIT- программы. Языки высокого уровня можно улучшать по мере того, как их разработчики разрабатывают улучшения. В других случаях новые языки высокого уровня развиваются из одного или нескольких других с целью объединения наиболее популярных конструкций с новыми или улучшенными функциями. Примером этого является Scala , которая поддерживает обратную совместимость с Java , а это означает, что программы и библиотеки, написанные на Java, будут продолжать использоваться, даже если магазин программирования перейдет на Scala; это упрощает переход и делает неопределенным срок службы такого высокоуровневого кодирования. Напротив, программы низкого уровня редко выживают за пределами системной архитектуры , для которой они были написаны, без серьезной доработки. Это инженерный «компромисс» для «штрафа за абстракцию».
Примеры языков программирования высокого уровня, активно используемых сегодня, включают Python , JavaScript , Visual Basic , Delphi , Perl , PHP , ECMAScript , Ruby , C# , Java и многие другие.
Термины «высокий уровень» и «низкий уровень» по своей сути относительны. Несколько десятилетий назад [ временные рамки? ] Язык C и подобные языки чаще всего считались «высокоуровневыми», поскольку он поддерживал такие концепции, как оценка выражений, параметризованные рекурсивные функции, а также типы и структуры данных, в то время как язык ассемблера считался «низкоуровневым». Сегодня многие программисты могут называть C низкоуровневым, поскольку в нем отсутствует большая система выполнения (нет сборки мусора и т. д.), он в основном поддерживает только скалярные операции и обеспечивает прямую адресацию памяти; поэтому он легко сочетается с языком ассемблера и машинным уровнем процессоров и микроконтроллеров . Кроме того, во вводной главе книги K&R «Язык программирования C» (второе издание) C рассматривается как язык относительно «низкого уровня». [10]
Язык ассемблера сам по себе может рассматриваться как представление машинного кода более высокого уровня (но часто все же однозначное, если используется без макросов ) , поскольку он поддерживает такие понятия, как константы и (ограниченные) выражения, иногда даже переменные, процедуры и данные. структуры . Машинный код , в свою очередь, по своей сути находится на несколько более высоком уровне, чем микрокод или микрооперации, используемые внутри многих процессоров. [11]
Для современных языков высокого уровня существует три основных режима выполнения:
Обратите внимание, что языки не являются строго интерпретируемыми или компилируемыми языками. Скорее, реализации языкового поведения используют интерпретацию или компиляцию. Например, АЛГОЛ 60 и Фортран были интерпретированы (хотя они чаще компилировались). Аналогичным образом, Java демонстрирует сложность применения этих меток к языкам, а не к реализациям; Java компилируется в байт-код, который затем выполняется путем интерпретации (на виртуальной машине Java (JVM)) или компиляции (обычно с помощью JIT-компилятора, такого как HotSpot , опять же в JVM). Более того, компиляция, транскомпиляция и интерпретация не ограничиваются строго только описанием артефакта компилятора (двоичного исполняемого файла или сборки IL).
В качестве альтернативы язык высокого уровня может быть напрямую реализован на компьютере — компьютер напрямую выполняет код HLL. Это известно как компьютерная архитектура языка высокого уровня — сама компьютерная архитектура спроектирована для использования определенного языка высокого уровня. Например, большие системы Берроуза были целевыми машинами для Алгола 60 . [12]
Языки программирования «высокого» уровня часто называют автокодами, а процессорную программу — компилятором.
{{cite book}}
: CS1 maint: местоположение ( ссылка )Два языка программирования высокого уровня, которые можно использовать здесь в качестве примеров для иллюстрации структуры и назначения автокодов, — это COBOL (общий бизнес-ориентированный язык) и FORTRAN (формальный перевод).
{{cite book}}
: CS1 maint: местоположение ( ссылка )value
-параметров).{{cite journal}}
: Требуется цитировать журнал |journal=
( помощь )