Денотационная семантика

Изучение языков программирования через математические объекты

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

В широком смысле денотационная семантика занимается поиском математических объектов, называемых доменами , которые представляют то, что делают программы. Например, программы (или программные фразы) могут быть представлены частичными функциями [1] [2] или играми [3] между средой и системой.

Важным принципом денотационной семантики является то, что семантика должна быть композиционной : денотат программной фразы должен быть построен из денотатов ее подфраз .

Историческое развитие

Денотационная семантика возникла в работе Кристофера Стрейчи и Даны Скотт , опубликованной в начале 1970-х годов. [1] [2] Первоначально разработанная Стрейчи и Скоттом, денотационная семантика предоставляла значение компьютерной программы как функции , которая отображала входные данные в выходные данные. [2] Чтобы придать значения рекурсивно определенным программам, Скотт предложил работать с непрерывными функциями между доменами , в частности, с полными частичными порядками . Как описано ниже, работа была продолжена в исследовании соответствующей денотационной семантики для таких аспектов языков программирования, как последовательность, параллелизм, недетерминизм и локальное состояние .

Денотационная семантика была разработана для современных языков программирования, которые используют такие возможности, как параллелизм и исключения , например, Concurrent ML , [4] CSP , [5] и Haskell . [6] Семантика этих языков является композиционной в том смысле, что значение фразы зависит от значений ее подфраз. Например, значение аппликативного выражения f(E1,E2) определяется в терминах семантики ее подфраз f, E1 и E2. В современном языке программирования E1 и E2 могут быть оценены одновременно, и выполнение одного из них может повлиять на другой, взаимодействуя через общие объекты, заставляя их значения определяться в терминах друг друга. Кроме того, E1 или E2 могут выдать исключение, которое может завершить выполнение другого. В разделах ниже описываются особые случаи семантики этих современных языков программирования.

Значения рекурсивных программ

Денотационная семантика приписывается программной фразе как функции от среды (содержащей текущие значения ее свободных переменных) к ее денотации. Например, фраза n*mсоздает денотацию, когда предоставляется среда, которая имеет связывание для ее двух свободных переменных: nи m. Если в среде nимеет значение 3 и mимеет значение 5, то денотация равна 15. [2]

Функцию можно представить как набор упорядоченных пар аргумента и соответствующих значений результата. Например, набор {(0,1), (4,3)} обозначает функцию с результатом 1 для аргумента 0, результатом 3 для аргумента 4 и неопределенным в противном случае.

Рассмотрим, например, функцию факториала , которую можно рекурсивно определить следующим образом:

int factorial ( int n ) { если ( n == 0 ) то вернуть 1 ; иначе вернуть n * factorial ( n -1 ); }                

Чтобы придать смысл этому рекурсивному определению, обозначение строится как предел приближений, где каждое приближение ограничивает количество вызовов factorial. В начале мы начинаем без вызовов — следовательно, ничего не определено. В следующем приближении мы можем добавить упорядоченную пару (0,1), поскольку это не требует повторного вызова factorial. Аналогично мы можем добавить (1,1), (2,2) и т. д., добавляя по одной паре в каждом последующем приближении, поскольку вычисление factorial(n) требует n+1 вызовов. В пределе мы получаем общую функцию от до , определенную всюду в своей области определения. N {\displaystyle \mathbb {N} } N {\displaystyle \mathbb {N} }

Формально мы моделируем каждое приближение как частичную функцию . Затем наше приближение многократно применяет функцию, реализующую «создание более определенной частичной факториальной функции», т. е . начиная с пустой функции (пустого множества). F можно определить в коде следующим образом (используя for ): N N {\displaystyle \mathbb {N} \rightharpoonup \mathbb {N} } F : ( N N ) ( N N ) {\displaystyle F:(\mathbb {N} \rightharpoonup \mathbb {N} )\to (\mathbb {N} \rightharpoonup \mathbb {N} )} Map<int,int> N N {\displaystyle \mathbb {N} \rightharpoonup \mathbb {N} }

int factorial_nonrecursive ( Map < int , int > factorial_less_defined , int n ) { если ( n == 0 ) то вернуть 1 ; иначе если ( fprev = lookup ( factorial_less_defined , n -1 )) то вернуть n * fprev ; иначе вернуть NOT_DEFINED ; }                         Карта < int , int > F ( Карта < int , int > factorial_less_defined ) { Карта < int , int > new_factorial = Карта . empty (); for ( int n in all < int > ()) { if ( f = factorial_nonrecursive ( factorial_less_defined , n ) != NOT_DEFINED ) new_factorial . put ( n , f ); } return new_factorial ; }                         

Тогда мы можем ввести обозначение F n для обозначения F, примененного n раз .

  • F 0 ({}) — полностью неопределенная частичная функция, представленная в виде множества {};
  • F 1 ({}) — частичная функция, представленная в виде набора {(0,1)}: она определена в 0 как 1 и не определена в других местах;
  • F 5 ({}) — частичная функция, представленная в виде набора {(0,1), (1,1), (2,2), (3,6), (4,24)}: она определена для аргументов 0,1,2,3,4.

Этот итеративный процесс строит последовательность частичных функций от до . Частичные функции образуют цепочку-полный частичный порядок, используя ⊆ в качестве упорядочения. Более того, этот итеративный процесс лучших приближений факториальной функции образует экспансивное (также называемое прогрессивным) отображение, поскольку каждое использует ⊆ в качестве упорядочения. Таким образом, по теореме о неподвижной точке (в частности , теореме Бурбаки–Витта ) существует неподвижная точка для этого итерационного процесса. N {\displaystyle \mathbb {N} } N {\displaystyle \mathbb {N} } F i F i + 1 {\displaystyle F^{i}\leq F^{i+1}}

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

i N F i ( { } ) . {\displaystyle \bigcup _{i\in \mathbb {N} }F^{i}(\{\}).}

Найденная нами неподвижная точка является наименьшей неподвижной точкой F , поскольку наша итерация началась с наименьшего элемента в области (пустого множества). Чтобы доказать это, нам нужна более сложная теорема о неподвижной точке, такая как теорема Кнастера–Тарского .

Денотационная семантика недетерминированных программ

Концепция доменов мощности была разработана для того, чтобы дать денотационную семантику недетерминированным последовательным программам. Записывая P для конструктора домена мощности, домен P ( D ) является доменом недетерминированных вычислений типа, обозначенного D .

В предметно-теоретических моделях недетерминизма существуют трудности со справедливостью и неограниченностью . [7]

Денотационная семантика параллелизма

Многие исследователи утверждали, что приведенные выше модели предметной области недостаточны для более общего случая параллельных вычислений . По этой причине были введены различные новые модели . В начале 1980-х годов люди начали использовать стиль денотационной семантики для задания семантики для параллельных языков. Примерами являются работа Уилла Клингера с моделью актора ; работа Глинна Винскеля со структурами событий и сетями Петри ; [8] и работа Франсеза, Хоара, Лемана и де Роевера (1979) по семантике трассировки для CSP. [9] Все эти направления исследований остаются в стадии изучения (см., например, различные денотационные модели для CSP [5] ).

Недавно Винскель и другие предложили категорию профункторов в качестве теории доменов для параллелизма. [10] [11]

Денотационная семантика состояния

Состояние (например, куча) и простые императивные функции можно напрямую смоделировать в денотационном семантике, описанной выше. Основная идея заключается в том, чтобы рассматривать команду как частичную функцию в некоторой области состояний. Значение " x:=3" тогда является функцией, которая переводит состояние в состояние с 3назначенным x. Оператор последовательности " ;" обозначается композицией функций. Конструкции с фиксированной точкой затем используются для придания семантики циклическим конструкциям, таким как " while".

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

Обозначения типов данных

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

 список  типов данных =  Минусы  nat  *  list |  Пусто  

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

Другой пример: тип обозначений нетипизированного лямбда-исчисления :

тип данных  D  =  D  из  ( D   D )

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

Полиморфные типы данных — это типы данных, которые определяются параметром. Например, тип α lists определяется как

 тип данных α  список  =  Минусы  α  *  α список | Пустой    

Списки натуральных чисел, таким образом, имеют тип nat list, а списки строк — тип string list.

Некоторые исследователи разработали доменные модели полиморфизма. Другие исследователи также моделировали параметрический полиморфизм в рамках конструктивных теорий множеств.

Недавнее направление исследований было посвящено денотационной семантике для языков программирования, основанных на объектах и ​​классах. [14]

Денотационная семантика для программ ограниченной сложности

После разработки языков программирования, основанных на линейной логике , языкам для линейного использования была дана денотационная семантика (см., например, сети доказательств , пространства когерентности ), а также полиномиальная временная сложность. [15]

Денотационная семантика последовательности

Проблема полной абстракции для последовательного языка программирования PCF долгое время была большим открытым вопросом в денотационном семантике. Трудность с PCF заключается в том, что это очень последовательный язык. Например, в PCF нет способа определить функцию parallel-or . Именно по этой причине подход с использованием доменов, представленный выше, дает денотационную семантику, которая не является полностью абстрактной.

Этот открытый вопрос был в основном решен в 1990-х годах с развитием игровой семантики , а также методов, включающих логические отношения . [16] Более подробную информацию см. на странице PCF.

Денотационная семантика как перевод с одного источника на другой

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

В этом контексте понятия из денотационной семантики, такие как полная абстракция, помогают удовлетворить проблемы безопасности. [17] [18]

Абстракция

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

  1. Независимость от синтаксиса : обозначения программ не должны включать синтаксис исходного языка.
  2. Адекватность (или обоснованность) : все наблюдаемо различные программы имеют различные обозначения;
  3. Полная абстракция : все эквивалентные с точки зрения наблюдения программы имеют одинаковые обозначения.

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

Дополнительные желательные свойства, которые мы могли бы захотеть сохранить между операционной и денотативной семантикой:

  1. Конструктивизм : Конструктивизм занимается вопросом, можно ли с помощью конструктивных методов показать существование элементов предметной области.
  2. Независимость денотационной и операционной семантики : Денотационная семантика должна быть формализована с использованием математических структур, которые независимы от операционной семантики языка программирования; Однако базовые концепции могут быть тесно связаны. См. раздел о композиционности ниже.
  3. Полная полнота или определимость : каждый морфизм семантической модели должен быть обозначением программы. [19]

Композиционность

Важным аспектом денотационной семантики языков программирования является композиционность, посредством которой денотация программы строится из денотаций ее частей. Например, рассмотрим выражение "7 + 4". В этом случае композиционность заключается в том, чтобы предоставить значение для "7 + 4" в терминах значений "7", "4" и "+".

Базовая денотационная семантика в теории доменов является композиционной, поскольку она задается следующим образом. Мы начинаем с рассмотрения фрагментов программ, т. е. программ со свободными переменными. Контекст типизации назначает тип каждой свободной переменной. Например, в выражении ( x + y ) можно рассматривать в контексте типизации ( x : nat, y : nat). Теперь мы задаем денотацию фрагментам программ, используя следующую схему.

  1. Начнем с описания значений типов нашего языка: значение каждого типа должно быть доменом. Мы пишем 〚τ〛 для домена, обозначающего тип τ. Например, значение типа natдолжно быть доменом натуральных чисел: 〚nat〛= . N {\displaystyle \mathbb {N} }
  2. Из значения типов мы выводим значение для контекстов типизации. Мы устанавливаем 〚x 11 ,..., x nn〛 = 〚 τ 1〛× ... ×〚τ n〛. Например, 〚x : nat, y : nat〛= × . Как особый случай, значение пустого контекста типизации, без переменных, является доменом с одним элементом, обозначаемым 1. N {\displaystyle \mathbb {N} } N {\displaystyle \mathbb {N} }
  3. Наконец, мы должны дать значение каждому фрагменту программы в контексте набора текста. Предположим, что P — это фрагмент программы типа σ в контексте набора текста Γ, часто записываемый как Γ⊢ P :σ. Тогда значением этой программы в контексте набора текста должна быть непрерывная функция 〚Γ⊢ P :σ〛:〚Γ〛→〚σ〛. Например, 〚⊢7: nat〛:1→ — это функция с постоянным значением «7», тогда как 〚x : , y : ⊢ x + y : 〛: × — это функция, которая складывает два числа. N {\displaystyle \mathbb {N} } natnatnat N {\displaystyle \mathbb {N} } N {\displaystyle \mathbb {N} } N {\displaystyle \mathbb {N} }

Теперь значение составного выражения (7+4) определяется путем составления трех функций 〚⊢7: nat〛:1→ , 〚⊢4: 〛:1→ , и 〚x : , y : ⊢ x + y : 〛: × . N {\displaystyle \mathbb {N} } nat N {\displaystyle \mathbb {N} } natnatnat N {\displaystyle \mathbb {N} } N {\displaystyle \mathbb {N} } N {\displaystyle \mathbb {N} }

На самом деле, это общая схема для композиционной денотационной семантики. Здесь нет ничего конкретного о доменах и непрерывных функциях. Вместо этого можно работать с другой категорией . Например, в игровой семантике категория игр имеет игры как объекты и стратегии как морфизмы: мы можем интерпретировать типы как игры, а программы как стратегии. Для простого языка без общей рекурсии мы можем обойтись категорией множеств и функций . Для языка с побочными эффектами мы можем работать в категории Клейсли для монады. Для языка с состоянием мы можем работать в категории функторов . Милнер выступал за моделирование местоположения и взаимодействия, работая в категории с интерфейсами как объектами и биграфами как морфизмами. [20]

Семантика против реализации

По словам Даны Скотт (1980): [21]

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

По данным Клингера (1981): [22] : 79 

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

Связи с другими областями компьютерной науки

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

Ссылки

  1. ^ ab Dana S. Scott. Очерк математической теории вычислений. Техническая монография PRG-2, Вычислительная лаборатория Оксфордского университета, Оксфорд, Англия, ноябрь 1970 г.
  2. ^ abcd Дэна Скотт и Кристофер Стрейчи . К математической семантике компьютерных языков. Техническая монография Оксфордской исследовательской группы по программированию. PRG-6. 1971.
  3. ^ Ян Юрьенс. J. Игры в семантике языков программирования – Элементарное введение. Synthese 133, 131–158 (2002). https://doi.org/10.1023/A:1020883810034
  4. ^ Джон Реппи «Параллельное машинное обучение: проектирование, применение и семантика» в Springer-Verlag, Lecture Notes in Computer Science , том 693. 1993
  5. ^ ab AW Roscoe . «Теория и практика параллелизма» Prentice-Hall. Пересмотрено в 2005 г.
  6. ^ Саймон Пейтон Джонс , Аластер Рид, Фергус Хендерсон, Тони Хоар и Саймон Марлоу. «Семантика неточных исключений». Конференция по проектированию и реализации языков программирования. 1999.
  7. ^ Леви, Пол Блейн (2007). «Amb ломает хорошо-точечную точность, Ground Amb — нет». Electron. Notes Theor. Comput. Sci . 173 : 221–239. doi : 10.1016/j.entcs.2007.02.036 .
  8. ^ Семантика структуры событий для CCS и родственных языков . Отчет об исследовании DAIMI, Университет Орхуса, 67 стр., апрель 1983 г.
  9. ^ Ниссим Франсез , К. А. Хоар , Дэниел Леманн и Виллем-Поль де Ровер. «Семантика недетерминизма, параллелизма и коммуникации», Журнал компьютерных и системных наук . Декабрь 1979 г.
  10. ^ Каттани, Джан Лука; Винскел, Глинн (2005). «Профункторы, открытые отображения и бисимуляция». Математические структуры в информатике . 15 (3): 553–614. CiteSeerX 10.1.1.111.6243 . doi :10.1017/S0960129505004718. S2CID  16356708. 
  11. ^ Nygaard, Mikkel; Winskel, Glynn (2004). «Теория доменов для параллелизма». Theor. Comput. Sci . 316 (1–3): 153–190. doi : 10.1016/j.tcs.2004.01.029 .
  12. ^ Питер У. О'Херн , Джон Пауэр, Роберт Д. Теннент, Макото Такеяма. Синтаксический контроль интерференции снова. Electron. Notes Theor. Comput. Sci. 1. 1995.
  13. ^ Фрэнк Дж. Олес. Категорно-теоретический подход к семантике программирования . Кандидатская диссертация, Сиракузский университет , Нью-Йорк, США. 1982.
  14. ^ Ройс, Бернхард; Штрейхер, Томас (2004). «Семантика и логика объектных исчислений». Theor. Comput. Sci . 316 (1): 191–213. doi : 10.1016/j.tcs.2004.01.030 .
  15. ^ Baillot, P. (2004). «Стратифицированные когерентные пространства: денотационная семантика для легкой линейной логики». Theor. Comput. Sci . 318 (1–2): 29–55. doi : 10.1016/j.tcs.2003.10.015 .
  16. ^ O'Hearn, PW; Riecke, JG (июль 1995). «Логические отношения Крипке и PCF». Информация и вычисления . 120 (1): 107–116. doi : 10.1006/inco.1995.1103 . S2CID  6886529.
  17. ^ Мартин Абади. «Защита при переводах языков программирования». Труды ICALP'98 . LNCS 1443. 1998.
  18. ^ Кеннеди, Эндрю (2006). «Защита модели программирования .NET». Theor. Comput. Sci . 364 (3): 311–7. doi : 10.1016/j.tcs.2006.08.014 .
  19. ^ Кьюриен, Пьер-Луи (2007). «Определимость и полная абстракция». Электронные заметки по теоретической информатике . 172 : 301–310. doi : 10.1016/j.entcs.2007.02.011 .
  20. ^ Милнер, Робин (2009). Пространство и движение общающихся агентов . Cambridge University Press. ISBN 978-0-521-73833-0.Черновик 2009 г. Архивировано 2 апреля 2012 г. на Wayback Machine .
  21. ^ «Что такое денотационная семантика?», Серия выдающихся лекций Лаборатории компьютерных наук Массачусетского технологического института, 17 апреля 1980 г., цитируется в Clinger (1981).
  22. ^ Клингер, Уильям Д. (май 1981). Основы семантики акторов (диссертация на степень доктора философии). Массачусетский технологический институт. hdl : 1721.1/6935 . AITR-633.

Дальнейшее чтение

Учебники
  • Милн, Р. Э.; Стрейчи, К. (1976). Теория семантики языка программирования . ISBN 978-1-5041-2833-9.
  • Гордон, MJC (2012) [1979]. Денотационное описание языков программирования: Введение. Springer. ISBN 978-1-4612-6228-2.
  • Stoy, Joseph E. (1977). Денотационная семантика: подход Скотта-Стрейчи к семантике языков программирования . MIT Press. ISBN 978-0-262-19147-0.(Классический, хотя и устаревший учебник.)
  • Шмидт, Дэвид А. (1986). Денотационная семантика: методология развития языка . Allyn & Bacon. ISBN 978-0-205-10450-5.
    • в настоящее время не издается; доступна бесплатная электронная версия: Шмидт, Дэвид А. (1997) [1986]. Денотационная семантика: методология развития языка. Университет штата Канзас.
  • Гюнтер, Карл (1992). Семантика языков программирования: структуры и методы . MIT Press. ISBN 978-0-262-07143-7.
  • Уинскел, Глинн (1993). Формальная семантика языков программирования . MIT Press. ISBN 978-0-262-73103-4.
  • Tennent, RD (1994). "Денотационная семантика". В Abramsky, S.; Gabbay, Dov M.; Maibaum, TSE (ред.). Семантические структуры . Справочник по логике в информатике. Том 3. Oxford University Press. С. 169–322. ISBN 978-0-19-853762-5.
  • Абрамский, С. ; Юнг, А. (1994). «Теория предметной области» (PDF) . Абрамский, Габбай и Майбаум 1994 .
  • Столтенберг-Хансен, В.; Линдстрём, И.; Гриффор, Э. Р. (1994). Математическая теория доменов . Cambridge University Press. ISBN 978-0-521-38344-8.
Конспект лекций
  • Уинскел, Глинн. «Денотационная семантика» (PDF) . Кембриджский университет.
Другие ссылки
  • Грейф, Ирен (август 1975 г.). Семантика коммуникационных параллельных процессов (PDF) (диссертация на степень доктора философии). Проект MAC. Массачусетский технологический институт. ADA016302.
  • Плоткин, ГД (1976). «Конструкция powerdomain». SIAM J. Comput . 5 (3): 452–487. CiteSeerX  10.1.1.158.4318 . doi :10.1137/0205035.
  • Дейкстра, Эдсгер В. (1976). Дисциплина программирования . Серия Прентиса-Холла по автоматическим вычислениям. Энглвуд Клиффс, Нью-Джерси ISBN 0-13-215871-X. OCLC  1958445.{{cite book}}: CS1 maint: location missing publisher (link)
  • Апт, Кшиштоф Р .; де Баккер, JW (1976). Упражнения по денотационной семантике . Афделинг Информатика. Амстердам: Математический центр. ОСЛК  63400684.
  • Де Баккер, Дж. В. (1976). «Возвращение к наименьшим неподвижным точкам». Теоретическая информатика . 2 (2): 155–181. doi : 10.1016/0304-3975(76)90031-1 .
  • Смит, Майкл Б. (1978). «Домены мощности». J. Comput. Syst. Sci . 16 : 23–36. doi : 10.1016/0022-0000(78)90048-X .
  • Francez, Nissim; Hoare, CAR; Lehmann, Daniel; de Roever, Willem-Paul (декабрь 1979 г.). Семантика недетерминизма, параллелизма и коммуникации . Конспект лекций по информатике. Том 64. С. 191–200. doi :10.1007/3-540-08921-7_67. hdl :1874/15886. ISBN 978-3-540-08921-6. {{cite book}}: |work=проигнорировано ( помощь )
  • Линч, Нэнси ; Фишер, Майкл Дж. (1979). «Об описании поведения распределенных систем». В Кан, Г. (ред.). Семантика параллельных вычислений: труды международного симпозиума, Эвиан, Франция, 2-4 июля 1979 г. Springer. ISBN 978-3-540-09511-8.
  • Шварц, Джеральд (1979). «Денотационная семантика параллелизма». Кан 1979 .
  • Уэйдж, Уильям (1979). «Экстенсиональное лечение взаимоблокировки потока данных». Кан 1979 .
  • Back, Ralph-Johan (1980). "Семантика неограниченного недетерминизма". В de Bakker, Jaco; van Leeuwen, Jan (ред.). Автоматы, языки и программирование. Lecture Notes in Computer Science. Vol. 85. Berlin, Heidelberg: Springer. pp. 51–63. doi :10.1007/3-540-10003-2_59. ISBN 978-3-540-39346-7. OCLC  476017025.
  • Park, David (1980). «О семантике честного параллелизма». В Bjøorner, Dines (ред.). Abstract Software Specifications (PDF) . Lecture Notes in Computer Science. Vol. 86. Berlin, Heidelberg: Springer Berlin Heidelberg. pp. 504–526. doi :10.1007/3-540-10007-5_47. ISBN 978-3-540-10007-2.
  • Эллисон, Л. (1986). Практическое введение в денотационную семантику. Cambridge University Press. ISBN 978-0-521-31423-7.
  • Америка, П.; де Баккер, Дж.; Кок, Дж. Н.; Раттен, Дж. (1989). «Денотационная семантика параллельного объектно-ориентированного языка». Информация и вычисления . 83 (2): 152–205. doi : 10.1016/0890-5401(89)90057-6 . S2CID  2405175.
  • Шмидт, Дэвид А. (1994). Структура типизированных языков программирования . MIT Press. ISBN 978-0-262-69171-0.
  • Денотационная семантика. Обзор книги Ллойда Эллисона
  • Шрайнер, Вольфганг (1995). «Структура языков программирования I: Денотационная семантика». Заметки к курсу .
Retrieved from "https://en.wikipedia.org/w/index.php?title=Denotational_semantics&oldid=1240303182"