Модель выполнения

редактировать

Язык программирования состоит из грамматики / синтаксиса плюс модель выполнения . Модель выполнения определяет поведение элементов языка. Применяя модель выполнения, можно получить поведение программы, написанной на этом языке программирования. Например, когда программист «читает» код в уме, он проходит через то, что делает каждая строка кода. По сути, они имитируют поведение внутри своего разума. Программист применяет модель выполнения к коду, что приводит к поведению кода.

Каждый язык программирования имеет модель выполнения, которая определяет способ, которым единицы работы (обозначенные синтаксисом программы ) запланированы для исполнение. Подробные примеры спецификации моделей выполнения для нескольких популярных языков включают модели Python, модель выполнения языка программирования Unified Parallel C (UPC), обсуждение различных классов моделей выполнения, таких как императивные и функциональные языки, и статья, в которой обсуждаются модели выполнения для встроенных языков реального времени.

Содержание
  • 1 Подробная информация о модели выполнения
  • 2 Модель выполнения на языке ассемблера в сравнении с реализацией микроархитектурой
  • 3 Модели параллельного выполнения
  • 4 См. также
  • 5 Ссылки
Подробная информация о модели выполнения

Операционная семантика - это один из методов определения модели выполнения языка. Наблюдаемое поведение выполняющейся программы должно соответствовать поведению, производному от операционной семантики (которая определяет модель выполнения языка).

Модель выполнения охватывает такие вещи, как то, что является неделимой единицей работы, и каковы ограничения на порядок, в котором эти единицы работы могут выполняться. Например, операция сложения - это неделимая единица работы во многих языках, а в последовательных языках такие единицы работы должны выполняться одна за другой.

Чтобы проиллюстрировать это, рассмотрим язык программирования C, как описано в книге Кернигана и Ричи. В C есть понятие, называемое оператором. Спецификация языка определяет оператор как фрагмент синтаксиса, заканчивающийся знаком «;». Затем в спецификации языка говорится, что «выполнение программы выполняется последовательно одно за другим». Эти слова: «выполнение программы выполняется один оператор за другим, последовательно» - это одна из частей модели выполнения C! Эти слова говорят нам, что операторы являются неделимыми единицами работы и что они выполняются в том же порядке, что и их синтаксическое появление в коде (кроме случаев, когда оператор управления, такой как IF или FOR, изменяет порядок). Заявив, что «выполнение программы выполняется последовательно один за другим», модель программирования установила ограничения на порядок выполнения единиц работы.

Язык C фактически имеет дополнительный уровень к своей модели выполнения, который является порядком приоритета. Порядок приоритета устанавливает правила для порядка операций внутри одного оператора. Порядок приоритета можно рассматривать как указание ограничений на выполнение единиц работы, которые находятся в пределах одного оператора. Так, ";" а «IF» и «WHILE» охватывают ограничения на порядок операторов, а порядок приоритета охватывает ограничения на работу внутри оператора. Следовательно, эти части спецификации языка C также являются частью модели выполнения языка C.

Модели выполнения также могут существовать независимо от языков программирования, примерами которых могут быть библиотека POSIX Threads и модель программирования Hadoop Map-Reduce . Реализация модели выполнения может осуществляться через компилятор или интерпретатор и часто включает систему времени выполнения.

. Реализация модели выполнения управляет порядком, в котором работают происходит во время исполнения. Этот порядок может быть выбран заранее, в некоторых ситуациях, или он может быть определен динамически по мере выполнения. Большинство моделей исполнения допускают то и другое в разной степени. Например, язык C фиксирует порядок работы внутри оператора и порядок всех операторов, кроме тех, которые включают оператор IF или форму оператора цикла. Следовательно, большая часть порядка выполнения может быть выбрана статически до начала выполнения, но небольшая часть должна выбираться динамически по мере продолжения выполнения.

Статические варианты чаще всего реализуются внутри компилятора, и в этом случае порядок работы представлен порядком, в котором инструкции помещаются в исполняемый двоичный файл. Затем динамический выбор будет реализован внутри системы времени выполнения языка. Система времени выполнения может быть библиотекой, которая вызывается инструкциями, вставленными компилятором , или система времени выполнения может быть встроена в исполняемый файл напрямую, например, путем вставки инструкций ветвления, которые динамически выбирайте, какую работу выполнять следующей.

Однако интерпретатор также может быть сконструирован для любого языка, и в этом случае все решения о порядке выполнения являются динамическими. Интерпретатор можно рассматривать как транслятор части и реализацию модели выполнения части.

.

Модель исполнения на языке ассемблера по сравнению с реализацией на микроархитектурах

Языки ассемблера также имеют модели исполнения, такие же, как и любой другой язык. Такая модель исполнения реализуется микроархитектурой ЦП. Например, и пятиступенчатый конвейер по порядку, и большой ЦП, вышедший из строя, реализуют одну и ту же модель выполнения на языке ассемблера. Модель выполнения - это определение поведения, поэтому все реализации, будь то упорядоченные или неупорядоченные, интерпретируемые или JIT и т. Д., Должны давать точно такой же результат, и этот результат определяется моделью выполнения..

Модели параллельного выполнения

В современную эпоху параллельное программирование становится все более важной темой. Модели параллельного выполнения обычно сложны, потому что они включают несколько временных рамок. Модели параллельного выполнения обязательно включают поведение. Конструкция синхронизации имеет эффект установления порядка между действиями на одной временной шкале относительно действий на другой временной шкале.

Например, обычная конструкция синхронизации - это блокировка. Рассмотрим одну временную шкалу. На временной шкале есть точка, в которой выполняется синхронизирующая конструкция «получение владения блокировкой». В потоках Posix это будет pthread_mutex_lock (​​myMutex). В Java это будет lock.lock (). В обоих случаях временная шкала называется потоком. Модели выполнения C и Java являются последовательными, и они заявляют, что на временной шкале есть действия, которые предшествуют вызову, чтобы «получить право владения блокировкой», и действия, которые выполняются после вызова. Аналогичным образом существует операция «отказаться от владения блокировкой». В C это будет pthread_mutex_unlock (​​myMutex). В Java это будет lock.unlock (). Опять же, модели выполнения C и Java определяют, что одна группа операторов выполняется до того, как право владения блокировкой будет отказано, а другая группа операторов выполняется после того, как владение блокировкой будет отказано.

Теперь рассмотрим случай двух временных шкал, также известных как два потока. Один поток, назовите его потоком A, выполняет некоторые операторы, называя их операторами A-pre-gain-lock. Затем поток A выполняет «получение права владения блокировкой», затем поток A выполняет операторы A-post-gain-lock, которые поступают после того, как A получает право владения блокировкой. Наконец, поток A выполняет «отказ от владения блокировкой». Затем поток A выполняет операторы A-post-giveup-lock.

Второй поток, назовите его потоком B, выполняет некоторые операторы, назовите их операторы предварительной блокировки B. Затем поток B выполняет «получение права владения блокировкой», затем поток B выполняет операторы B-post-lock, которые появляются после того, как B получает право владения блокировкой.

Теперь мы можем сказать, что модель параллельного выполнения состоит из конструкции синхронизации «получить право владения блокировкой» и «отказаться от владения блокировкой». Модель выполнения такова:

«В случае, если право собственности на блокировку переходит от потока A к потоку B, операторы A-post-gain-lock предшествуют операторам B-post-gain-lock».

Вот и все.

Кажется, просто, правда? Сложность возникает из-за того, что модель выполнения не имеет никаких средств для выполнения «отказаться от владения блокировкой», чтобы иметь какое-либо влияние на то, какое выполнение «получить право владения блокировкой» в какой-либо другой временной шкале (потоке) следует.. Очень часто только определенные передачи дают достоверные результаты. Таким образом, программист должен продумать все возможные комбинации, когда один поток отказывается от блокировки, а другой поток получает ее следующим, и убедиться, что их код допускает только допустимые комбинации.

Обратите внимание, что единственный эффект заключается в том, что операторы A-post-gain-lock предшествуют операторам B-post-gain-lock. Никакого другого эффекта не происходит, и нельзя полагаться на другой относительный порядок. В частности, для блокировок A-post-give-up-lock и B-post-gain-lock не определен относительный порядок, что многих удивляет. Но поток A мог быть заменен после отказа от владения, поэтому операторы A-post-give-up-lock могут произойти спустя долгое время после завершения многих операторов B-post-gain-lock. Это одна из возможностей, о которой необходимо подумать при разработке блокировок, и она показывает, почему многопоточное программирование сложно.

Обратите внимание, что в современных параллельных языках гораздо проще использовать модели выполнения. Модель потоков была одной из исходных моделей параллельного выполнения, что может объяснить, почему она сохранилась, несмотря на сложность в использовании.

См. Также
Найдите время выполнения в Wiktionary, бесплатном словаре.
Ссылки
Последняя правка сделана 2021-05-19 09:35:28
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте