stringtranslate.com

Язык программирования высокого уровня

В информатике язык программирования высокого уровня — это язык программирования с сильной абстракцией от деталей компьютера . В отличие от языков программирования низкого уровня , он может использовать элементы естественного языка , быть более простым в использовании или может автоматизировать (или даже полностью скрывать) значительные области вычислительных систем (например, управление памятью ), делая процесс разработки программы более простым и понятным, чем при использовании языка низкого уровня. Уровень предоставляемой абстракции определяет, насколько «высокоуровневым» является язык программирования. [1]

В 1960-х годах язык программирования высокого уровня, использующий компилятор, обычно назывался автокодом . [2] Примерами автокодов являются COBOL и Fortran . [3]

Первым языком программирования высокого уровня, разработанным для компьютеров, был Plankalkül , созданный Конрадом Цузе . [4] Однако он не был реализован в его время, и его первоначальный вклад был в значительной степени изолирован от других разработок из-за Второй мировой войны , за исключением влияния языка на язык «Superplan» Хайнца Рутисхаузера , а также в некоторой степени ALGOL . Первым значительно распространенным языком высокого уровня был Fortran , машинно-независимая разработка более ранних систем Autocode компании IBM. Семейство ALGOL , с ALGOL 58, определенным в 1958 году, и ALGOL 60, определенным в 1960 году комитетами европейских и американских компьютерных ученых, ввело рекурсию, а также вложенные функции в лексической области видимости . ALGOL 60 был также первым языком с четким различием между параметрами-значениями и именами-параметрами и их соответствующей семантикой . [5] ALGOL также ввел несколько концепций структурного программирования , таких как конструкции 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 к низкоуровневым, поскольку в нем отсутствует большая система выполнения (нет сборки мусора и т. д.), в основном он поддерживает только скалярные операции и обеспечивает прямую адресацию памяти; поэтому он легко сочетается с языком ассемблера и машинным уровнем ЦП и микроконтроллеров . Кроме того, во вводной главе книги «Язык программирования C» (второе издание) Брайана Кернигана и Денниса Ритчи C описывается как язык «не очень высокого уровня». [10]

Сам язык ассемблера можно рассматривать как более высокий уровень (но часто все еще один к одному, если используется без макросов ) представления машинного кода , поскольку он поддерживает такие концепции, как константы и (ограниченные) выражения, иногда даже переменные, процедуры и структуры данных . Машинный код , в свою очередь, по своей сути находится на несколько более высоком уровне, чем микрокод или микрооперации, используемые внутри многих процессоров. [11]

Режимы выполнения

Для современных языков высокого уровня существует три основных режима выполнения:

Интерпретируется
Когда код, написанный на языке, интерпретируется , его синтаксис считывается и затем выполняется напрямую, без этапа компиляции. Программа, называемая интерпретатором, считывает каждый оператор программы, следуя потоку программы, затем решает, что делать, и делает это. Гибрид интерпретатора и компилятора скомпилирует оператор в машинный код и выполнит его; затем машинный код отбрасывается, чтобы быть интерпретированным заново, если строка выполняется снова. Интерпретаторы обычно являются простейшими реализациями поведения языка по сравнению с двумя другими вариантами, перечисленными здесь.
Скомпилировано
Когда код, написанный на языке, компилируется , его синтаксис преобразуется в исполняемую форму перед запуском. Существует два типа компиляции:
Генерация машинного кода
Некоторые компиляторы компилируют исходный код напрямую в машинный код . Это изначальный режим компиляции, и языки, которые напрямую и полностью преобразуются в машинный код таким образом, можно назвать по-настоящему компилируемыми языками. См. язык ассемблера .
Промежуточные представления
Когда код, написанный на языке, компилируется в промежуточное представление , это представление может быть оптимизировано или сохранено для последующего выполнения без необходимости перечитывать исходный файл. Когда промежуточное представление сохраняется, оно может быть в форме, например, байт-кода . Затем промежуточное представление должно быть интерпретировано или дополнительно скомпилировано для его выполнения. Виртуальные машины , которые выполняют байт-код напрямую или преобразуют его далее в машинный код, размыли некогда четкое различие между промежуточными представлениями и действительно скомпилированными языками.
Перевод или транскомпиляция исходного текста
Код, написанный на языке, может быть переведен в термины языка более низкого уровня, для которого уже распространены собственные компиляторы кода. JavaScript и язык C являются обычными целями для таких трансляторов. См. CoffeeScript , Chicken Scheme и Eiffel в качестве примеров. В частности, сгенерированный код C и C++ можно увидеть (как сгенерированный из языка Eiffel при использовании EiffelStudio IDE) в каталоге EIFGENs любого скомпилированного проекта Eiffel. В Eiffel транслируемый процесс называется транскомпиляцией или транскомпилированным, а компилятор Eiffel — транскомпилятором или компилятором исходного кода .

Обратите внимание, что языки не являются строго интерпретируемыми языками или компилируемыми языками. Скорее, реализации поведения языка используют интерпретацию или компиляцию. Например, ALGOL 60 и Fortran оба были интерпретированы (хотя они обычно компилировались). Аналогично, Java демонстрирует сложность попытки применить эти ярлыки к языкам, а не к реализациям; Java компилируется в байт-код, который затем выполняется либо путем интерпретации (в виртуальной машине Java (JVM)), либо путем компиляции (обычно с помощью компилятора just-in-time, такого как HotSpot , снова в JVM). Более того, компиляция, транскомпиляция и интерпретация не ограничиваются строго только описанием артефакта компилятора (двоичного исполняемого файла или сборки IL).

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

В качестве альтернативы, возможно, что высокоуровневый язык может быть напрямую реализован компьютером – компьютер напрямую выполняет код HLL. Это известно как архитектура компьютера на высокоуровневом языке – сама архитектура компьютера разработана для того, чтобы быть нацеленной на определенный высокоуровневый язык. Большие системы Burroughs были целевыми машинами для ALGOL 60 , например. [12]

Смотрите также

Ссылки

  1. ^ "HThreads - RD Glossary". Архивировано из оригинала 26 августа 2007 года.
  2. ^ Лондон, Кит (1968). "4, Программирование". Введение в компьютеры . 24 Russell Square London WC1: Faber and Faber Limited. стр. 184. ISBN 0571085938. Языки программирования «высокого» уровня часто называют автокодами, а программу процессора — компилятором.{{cite book}}: CS1 maint: местоположение ( ссылка )
  3. ^ Лондон, Кит (1968). "4, Программирование". Введение в компьютеры . 24 Russell Square London WC1: Faber and Faber Limited. стр. 186. ISBN 0571085938. Два языка программирования высокого уровня, которые можно использовать здесь в качестве примеров для иллюстрации структуры и назначения автокодов, — это COBOL (общий бизнес-ориентированный язык) и FORTRAN (формульный перевод).{{cite book}}: CS1 maint: местоположение ( ссылка )
  4. ^ Giloi, Wolfgang, K.  [de] (1997). "Plankalkül Конрада Цузе: первый высокоуровневый "не фон Неймановский" язык программирования". IEEE Annals of the History of Computing, т. 19, № 2, стр. 17–24, апрель–июнь 1997 г. (аннотация)
  5. ^ Хотя в нем отсутствовало понятие ссылочных параметров , что могло быть проблемой в некоторых ситуациях. Несколько последователей, включая ALGOL W , ALGOL 68 , Simula , Pascal , Modula и Ada , таким образом, включали ссылочные параметры (родственное семейство языков C вместо этого допускало адреса в качестве value-параметров).
  6. ^ Surana P (2006). "Мета-компиляция языковых абстракций" (PDF) . Архивировано (PDF) из оригинала 17 февраля 2015 г. . Получено 17 марта 2008 г. . {{cite journal}}: Цитировать журнал требует |journal=( помощь )
  7. ^ Кукетаев. "The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java". Архивировано из оригинала 11 января 2009 года . Получено 17 марта 2008 года .
  8. ^ Chatzigeorgiou; Stephanides (2002). "Оценка производительности и мощности объектно-ориентированных и процедурных языков программирования". В Blieberger; Strohmeier (ред.). Труды - 7-я международная конференция по надежным программным технологиям - Ada-Europe'2002 . Springer. стр. 367.
  9. ^ Мануэль Карро; Хосе Ф. Моралес; Хенк Л. Мюллер; Г. Пуэбла; М. Эрменегильдо (2006). "Языки высокого уровня для небольших устройств: пример" (PDF) . Труды Международной конференции 2006 года по компиляторам, архитектуре и синтезу для встраиваемых систем . ACM.
  10. ^ Керниган, Брайан В.; Ритчи, Деннис М. (1988). Язык программирования C: 2-е издание. Prentice Hall. ISBN 9780131103627. Архивировано из оригинала 25 октября 2022 г. . Получено 25 октября 2022 г. .{{cite book}}: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )
  11. ^ Хайд, Рэндалл. (2010). Искусство языка ассемблера (2-е изд.). Сан-Франциско: No Starch Press. ISBN 9781593273019. OCLC  635507601.
  12. ^ Чу, Яохан (1975), «Концепции архитектуры компьютеров на языке высокого уровня», Архитектура компьютеров на языке высокого уровня , Elsevier, стр. 1–14, doi :10.1016/b978-0-12-174150-1.50007-0, ISBN 9780121741501

Внешние ссылки