В компьютерном программировании система выполнения или среда выполнения — это подсистема, которая существует в компьютере, где создается программа, а также в компьютерах, где программа должна быть запущена. Название происходит от разделения времени компиляции и времени выполнения из компилируемых языков , которое аналогичным образом различает компьютерные процессы, участвующие в создании программы (компиляция) и ее выполнение на целевой машине (время выполнения). [1]
Большинство языков программирования имеют некоторую форму системы времени выполнения, которая обеспечивает среду, в которой работают программы. Эта среда может решать ряд вопросов, включая управление памятью приложения , как программа получает доступ к переменным , механизмы передачи параметров между процедурами , взаимодействие с операционной системой (ОС) и т. д. Компилятор делает предположения в зависимости от конкретной системы времени выполнения для генерации правильного кода. Обычно система времени выполнения будет нести некоторую ответственность за настройку и управление стеком и кучей и может включать такие функции, как сборка мусора , потоки или другие динамические функции, встроенные в язык. [1]
Каждый язык программирования определяет модель выполнения , и многие реализуют по крайней мере часть этой модели в системе выполнения. Одним из возможных определений поведения системы выполнения, среди прочих, является «любое поведение, не относящееся напрямую к самой программе». Это определение включает в себя помещение параметров в стек перед вызовами функций, параллельное выполнение связанных поведений и дисковый ввод-вывод .
Согласно этому определению, по сути, каждый язык имеет систему времени выполнения, включая компилируемые языки , интерпретируемые языки и встроенные доменно-специфические языки . Даже API -вызываемые автономные модели выполнения, такие как Pthreads ( потоки POSIX ), имеют систему времени выполнения, которая реализует поведение модели выполнения.
Большинство научных работ по системам времени выполнения фокусируются на деталях реализации параллельных систем времени выполнения. Ярким примером параллельной системы времени выполнения является Cilk , популярная модель параллельного программирования. [2] Набор инструментов proto-runtime был создан для упрощения создания параллельных систем времени выполнения. [3]
В дополнение к поведению модели исполнения, система времени выполнения может также выполнять вспомогательные службы, такие как проверка типов , отладка или генерация и оптимизация кода . [4]
Система выполнения также является шлюзом, через который работающая программа взаимодействует со средой выполнения . Среда выполнения включает в себя не только доступные значения состояния, но и активные сущности, с которыми программа может взаимодействовать во время выполнения. Например, переменные среды являются функциями многих операционных систем и являются частью среды выполнения; работающая программа может получить к ним доступ через систему выполнения. Аналогично, аппаратные устройства, такие как диски или DVD-приводы, являются активными сущностями, с которыми программа может взаимодействовать через систему выполнения.
Одним из уникальных применений среды выполнения является ее использование в операционной системе, которая позволяет ей работать только . Другими словами, от загрузки до выключения питания вся ОС предназначена только для приложений, работающих в этой среде выполнения. Любой другой код, который пытается запуститься, или любые сбои в приложении(ях) нарушат среду выполнения. Нарушение среды выполнения в свою очередь нарушает ОС, останавливая всю обработку и требуя перезагрузки. Если загрузка происходит из памяти только для чтения, создается чрезвычайно безопасная, простая система с одной миссией.
Примерами таких напрямую связанных систем выполнения являются:
Система выполнения языка C — это определенный набор инструкций, вставляемых компилятором в исполняемый образ. Среди прочего, эти инструкции управляют стеком процесса, создают пространство для локальных переменных и копируют параметры вызова функции на вершину стека.
Часто нет четких критериев для определения того, какие языковые поведения являются частью самой системы выполнения, а какие могут быть определены любой конкретной исходной программой. Например, в C настройка стека является частью системы выполнения. Она не определяется семантикой отдельной программы, поскольку поведение глобально инвариантно: оно сохраняется для всех исполнений. Это систематическое поведение реализует модель выполнения языка, в отличие от реализации семантики конкретной программы (в которой текст напрямую транслируется в код, который вычисляет результаты).
Это разделение между семантикой конкретной программы и средой выполнения отражается в различных способах компиляции программы: компиляция исходного кода в объектный файл , содержащий все функции, по сравнению с компиляцией всей программы в исполняемый двоичный файл. Объектный файл будет содержать только ассемблерный код, относящийся к включенным функциям, в то время как исполняемый двоичный файл будет содержать дополнительный код, реализующий среду выполнения. С одной стороны, в объектном файле может отсутствовать информация из среды выполнения, что будет устранено путем связывания . С другой стороны, код в объектном файле по-прежнему зависит от предположений в системе выполнения; например, функция может считывать параметры из определенного регистра или расположения стека в зависимости от соглашения о вызовах, используемого средой выполнения.
Другим примером является случай использования интерфейса прикладного программирования (API) для взаимодействия с системой выполнения. Вызовы к этому API выглядят так же, как вызовы к обычной программной библиотеке , однако в какой-то момент во время вызова модель выполнения меняется. Система выполнения реализует модель выполнения, отличную от модели языка, на котором написана библиотека. Человек, читающий код обычной библиотеки, сможет понять поведение библиотеки, просто зная язык, на котором написана библиотека. Однако человек, читающий код API, который вызывает систему выполнения, не сможет понять поведение вызова API, просто зная язык, на котором был написан вызов. В какой-то момент, посредством некоторого механизма, модель выполнения перестает быть моделью языка, на котором написан вызов, и переключается на модель выполнения, реализованную системой выполнения. Например, инструкция trap является одним из методов переключения моделей выполнения. Это различие отличает модель выполнения, вызываемую API, такую как Pthreads, от обычной программной библиотеки. Оба вызова Pthreads и вызовы программной библиотеки вызываются через API, но поведение Pthreads нельзя понять с точки зрения языка вызова. Вместо этого вызовы Pthreads приводят в действие внешнюю модель выполнения, которая реализуется системой выполнения Pthreads (этой системой выполнения часто является ядро ОС).
В качестве крайнего примера, сам физический ЦП можно рассматривать как реализацию системы выполнения определенного языка ассемблера. С этой точки зрения модель выполнения реализуется физическим ЦП и системами памяти. По аналогии, системы выполнения для языков более высокого уровня сами реализуются с использованием некоторых других языков. Это создает иерархию систем выполнения, при этом сам ЦП — или фактически его логика на уровне микрокода или ниже — действует как система выполнения самого низкого уровня.
Некоторые компилируемые или интерпретируемые языки предоставляют интерфейс, который позволяет коду приложения напрямую взаимодействовать с системой выполнения. Примером может служить класс Thread
в языке Java . Класс позволяет коду (который анимируется одним потоком) выполнять такие действия, как запуск и остановка других потоков. Обычно основные аспекты поведения языка, такие как планирование задач и управление ресурсами, недоступны таким образом.
Поведение более высокого уровня, реализуемое системой выполнения, может включать такие задачи, как рисование текста на экране или создание интернет-соединения. Часто бывает так, что операционные системы также предоставляют эти типы поведения, и когда это доступно, система выполнения реализуется как уровень абстракции , который транслирует вызов системы выполнения в вызов операционной системы. Это скрывает сложность или различия в услугах, предлагаемых различными операционными системами. Это также подразумевает, что ядро ОС само по себе может рассматриваться как система выполнения, и что набор вызовов ОС, которые вызывают поведение ОС, может рассматриваться как взаимодействие с системой выполнения.
В пределе система выполнения может предоставлять такие сервисы, как машина P-кода или виртуальная машина , которые скрывают даже набор инструкций процессора . Это подход, которому следуют многие интерпретируемые языки , такие как AWK , и некоторые языки, такие как Java , которые предназначены для компиляции в некоторый машинно-независимый промежуточный код представления (такой как байт-код ). Такое расположение упрощает задачу реализации языка и его адаптации к различным машинам, а также повышает эффективность сложных языковых функций, таких как рефлексивное программирование . Это также позволяет выполнять одну и ту же программу на любой машине без явного шага перекомпиляции, функция, которая стала очень важной с момента распространения Всемирной паутины . Для ускорения выполнения некоторые системы выполнения имеют функцию оперативной компиляции в машинный код.
Современным аспектом систем выполнения является параллельное поведение выполнения, такое как поведение, демонстрируемое конструкциями мьютексов в Pthreads и конструкциями параллельных секций в OpenMP . Система выполнения с таким параллельным поведением выполнения может быть модулирована в соответствии с подходом proto-runtime.
Известными ранними примерами систем времени выполнения являются интерпретаторы для BASIC и Lisp . Эти среды также включали сборщик мусора . Forth — ранний пример языка, разработанного для компиляции в промежуточный код представления; его система времени выполнения была виртуальной машиной, которая интерпретировала этот код. Другим популярным, хотя и теоретическим, примером является компьютер MIX Дональда Кнута .
В языке C и более поздних языках, поддерживающих динамическое распределение памяти, система выполнения также включала библиотеку, которая управляла пулом памяти программы.
В объектно-ориентированных языках программирования система выполнения часто также отвечала за динамическую проверку типов и разрешение ссылок на методы.
Компилятор должен взаимодействовать с операционной системой и другим системным программным обеспечением для поддержки этих абстракций на целевой машине.
[…]
SpeedStart
упрощает использование нашего программного обеспечения. Все программное обеспечение в библиотеке приложений CP/M имеет новую версию SpeedStart операционной системы
CP/M
, встроенную прямо на программный диск. Все, что вам нужно сделать, чтобы использовать эти приложения, — это вставить диск в свой
IBM PC
, включить систему, и вы готовы к работе. Это устраняет необходимость в загрузке отдельной операционной системы, смене дисков и загрузке прикладной программы. Программное обеспечение SpeedStart из библиотеки приложений CP/M также: […] Предоставляет вам бесплатную версию CP/M для выполнения […] Устраняет необходимость установки каждой новой прикладной программы […] Обеспечивает совместимость с
мощной 16-разрядной операционной системой
Digital Research
CP/M-86
и современной многозадачной операционной системой
Concurrent CP/M
. […]
[…]
Dr. Logo
впервые появился на розничном рынке осенью 1983 года для
IBM PC
и поднялся на вершину списка
Softsel Hot List
. Розничный релиз включал
SpeedStart CP/M
, сокращенную версию
CP/M
, которая
загружается автоматически
при включении системы. […][1]
[…] Представляем
SpeedStart
— эксклюзивную систему программного обеспечения load-&-go. Библиотека приложений CP/M предлагает больше, чем просто лучшее фирменное программное обеспечение
для IBM PC
в отрасли. Каждое из наших приложений обеспечивает непревзойденное удобство нашей эксклюзивной однодисковой системы SpeedStart. SpeedStart — это специальная версия мощной операционной системы
CP/M-86
, встроенная в каждый из наших программных дисков. Когда вы будете готовы к работе, просто загрузите диск, включите свой IBM PC и вперед! SpeedStart устраняет трудоемкую задачу загрузки отдельного операционного диска и последующей «установки» программного обеспечения. Фактически, система SpeedStart позволяет вам работать быстрее и проще, чем любое другое программное обеспечение, доступное сегодня. Лучше всего то, что она ваша без дополнительных затрат. Более того, SpeedStart можно обойти, чтобы запускать программное обеспечение под операционной системой IBM PC будущего — замечательной многозадачной
Concurrent CP/M
. […]
[…] Операционная система
Artline 2
была
GEM/4
[…] все изменения в GEM/4 были сделаны в сотрудничестве с Ли Лоренценом и Доном Хайскеллом для сохранения совместимости с
издателем Ventura
. […]
{{cite book}}
: |work=
проигнорировано ( помощь ){{cite book}}
: |work=
проигнорировано ( помощь )