stringtranslate.com

Модель исполнения

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

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

Подробности модели исполнения

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

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

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

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

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

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

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

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

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

Языки ассемблера также имеют модели выполнения, как и любой другой язык. Такая модель выполнения реализуется микроархитектурой ЦП. Например, и 5-этапный исправный конвейер, и большой вышедший из строя ЦП реализуют одну и ту же модель выполнения на языке ассемблера. Модель выполнения является определением поведения, поэтому все реализации, будь то упорядоченные или внеочередные, интерпретируемые, 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-pre-lock. Затем поток 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-пост-сдача-блокировка и B-пост-блокировка усиления не имеют определенного относительного порядка , что удивляет многих людей. Но поток A мог быть заменен после отказа от владения, поэтому операторы A-post-give-up-lock могут выполняться спустя много времени после завершения многих операторов B-post-gain-lock. Это одна из возможностей, которую необходимо учитывать при проектировании блокировок, и она иллюстрирует, почему многопоточное программирование затруднено.

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

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

Рекомендации

  1. ^ «Документация Python: модель выполнения» .
  2. ^ «Особенности языка UPC» .
  3. ^ Кардосо, JMP; Диниз, ПК (2011). Языки программирования и модели выполнения. Спрингер США. ISBN 9780387096711.
  4. ^ ПЕЛЛИЦЦОНИ, Р.; БЕТТИ, Э.; БАК, С.; ЯО, Г.; КРИСВЕЛЛ, Дж.; КАКАМО М. и КЕГЛИ Р. (2011). «Модель прогнозируемого выполнения для встраиваемых систем на основе COTS» (PDF) . Симпозиум по технологиям реального времени и встраиваемым технологиям и приложениям . IEEE. Архивировано из оригинала (PDF) 12 августа 2017 г. Проверено 20 мая 2015 г.
  5. ^ Керниган, Брайан В .; Деннис М. Ричи (февраль 1978 г.). Язык программирования C (1-е изд.). Энглвуд Клиффс, Нью-Джерси : Прентис Холл . ISBN 0-13-110163-3.