Денотационная семантика
Денотацио́нная сема́нтика (англ. denotational semantics) — подход к формализации значений языков программирования путём конструирования математических объектов (денота́ций), которые описывают значения выражений из языков. Этот метод занимается поиском полных частично упорядоченных множеств, называемых доменами. Например, программы (или программные фразы) могут быть представлены частичными функциями или играми между окружающей средой и системой[1].
История возникновения концепции
Понятие денотационная семантика приводят Кристофер Стрейчи и Дана Скотт в своих работах, опубликованных в начале 1970-х годов и отсюда этот метод получает название «математическая семантика» или «семантика Скотта-Стрейчи»[2][3]. Она представляла значение компьютерной программы как функции, которая отображала входные данные в выходные. Чтобы придать значения рекурсивно определённым программам, Скотт предложил работать с непрерывными функциями между доменами, в частности, с полными частичными порядками[4]. Работа была продолжена в исследовании соответствующей денотационной семантики для таких аспектов языков программирования, как последовательность, параллелизм, недетерминизм и локальное состояние .
Основные принципы
Название метода «денотационная семантика» происходит от английского слова denote (обозначать), поскольку математический объект обозначает смысл соответствующей синтаксической сущности. Денотационная семантика — это метод придания точного значения языку программирования. Хотя синтаксис языка всегда формально указан в варианте BNF, более важная часть определения его семантики в основном оставлена естественному языку, который неоднозначен и оставляет много вопросов открытыми. Особенно для построения компилятора для этого языка необходимо более глубокое понимание, чем может быть обеспечено неформальными описаниями.
Денотационная семантика занимается поиском более подходящих моделей — доменов, в том числе, для моделирования таких понятий языков программирования как функциональный тип. Считается, что целесообразно не ограничиваться лишь вычислимыми функциями, а использовать любые непрерывные по Скотту функции на частично упорядоченных множествах, которыми возможно смоделировать также и незавершимые вычисления (а таковые возникают во всяком полном по Тьюрингу языке). Средства теории областей, используемые в денотационной семантике, достаточно выразительны, например, непрерывной по Скотту функцией моделируется «parallel or», определимый далеко не во всех языках программирования.
Композиционность
Важным аспектом денотационной семантики языков программирования является композиционность, посредством которой денотация программы строится из денотаций её частей. Базовая денотационная семантика в теории доменов является композиционной, поскольку она задается следующим образом. Начинают с рассмотрения фрагментов программ, то есть программ со свободными переменными. Контекст типизации назначает тип каждой свободной переменной. Например, в выражении (x + y) можно рассматривать в контексте типизации (x:nat,y:nat). Задаётся денотация фрагментам программ, используя следующую схему:
- Начинают с описания значений типов языка: значение каждого типа должно быть доменом. Пишут〚τ〛 для домена, обозначающего тип τ. Например, значение типа
natдолжно быть доменом натуральных чисел: 〚nat〛= ⊥. - Из значения типов выводят значение для типизирования контекстов. Устанавливают 〚 x1:τ1,…, xn:τn〛 = 〚 τ1〛× … ×〚τn〛. Например, 〚x:
nat,y:nat〛= ⊥×⊥. В качестве особого случая значение пустого контекста типизации без переменных представляет собой домен с одним элементом, обозначаемым 1. - В конце, присваивают значение каждому фрагменту программы в контексте набора текста. Полагая, что P — фрагмент программы типа σ, в контексте набора текста Γ, записывают Γ⊢P:σ. Тогда значение этой программы в контексте набора текста должно быть непрерывной функцией 〚Γ⊢P:σ〛:〚Γ〛→〚σ〛. Например, 〚⊢7:
nat〛:1→⊥ — постоянная функция «7», в то время как〚x:nat,y:nat⊢x+y:nat〛:⊥×⊥→⊥ — функция, которая складывает два числа. Тогда значение суммы (7+4) определяется путем составления трех функций 〚⊢7:nat〛:1→⊥ , 〚⊢4:nat〛:1→⊥ , и 〚x :nat, y :nat⊢ x + y :nat〛:⊥ ×⊥ →⊥ .
Это общая схема для композиционной денотационной семантики. В ней нет конкретики относительно доменов и непрерывных функций. Вместо этого можно работать с другой категорией. В игровой семантике категория игр имеет игры как объекты и стратегии как морфизмы: можно интерпретировать типы как игры, а программы как стратегии. Для простого языка без общей рекурсии можно обойтись категорией множеств и функций.
Концепция доменов мощности была разработана для того, чтобы определить денотационную семантику недетерминированных последовательных программ. Записывая P для конструктора домена мощности, домен P (D) является доменом недетерминированных вычислений типа, обозначенного D . В информатике неограниченный недетерминизм или неограниченная неопределенность — это свойство параллелизма, при котором задержка в обслуживании запроса может стать неограниченной в результате конкуренции за общие ресурсы. При этом сохраняется гарантия, что запрос будет обслужен. Неограниченный недетерминизм стал важным вопросом в развитии денотационной семантики параллелизма и позднее стал частью исследований теоретической концепции гипервычислений[5].
Состояние и простые императивные функции можно напрямую смоделировать в денотационной семантике. Команда рассматривается как частичная функция в некоторой области состояний. Выражение «x:=3» является функцией, которая назначает переменной x состояние 3. Оператор последовательности « ;» понимается как композиция функций. Конструкции с фиксированной точкой используются для придания семантики циклическим конструкциям, таким как « while». При моделировании программ с локальными переменными методы усложняются. Один из подходов заключается в том, чтобы работать не с доменами, а с интерпретациями функторов.
Многие языки программирования позволяют задавать рекурсивные типы данных . Например, тип списков чисел может быть определён следующим образом:
datatype list = Cons of nat * list | Empty
Здесь рассматриваются только функциональные структуры, которые не изменяются. Обычные императивные языки программирования позволяют изменять элементы такого рекурсивного списка.
Другой пример: семантика бестипового лямбда-исчисления:
datatype D = D of (D → D)
Проблема решения уравнений домена связана с поиском доменов, которые моделируют эти типы данных. Чтобы придать λ-исчислению какой-либо смысл, необходимо получить множество, в которое вкладывалось бы его пространство функций. Один из подходов заключается в том, чтобы рассматривать совокупность всех доменов как сам домен, а затем решать рекурсивное определение там.
Денотационная семантика как метод перевода с одного языка на другой
Часто бывает полезно перевести один язык программирования на другой. Например, параллельный язык программирования может быть переведён в исчисление процессов; высокоуровневый язык программирования может быть переведён в байт-код. И тогда денотационную семантику можно рассматривать как интерпретацию языков программирования на внутренний язык категории доменов.
Развитие
В дальнейшем, Д.Скотт развил теорию и модели вычислений, разработал принципы денотационной семантики языков программирования, углубил понятие о вычислимости.
Разработанная Стрейчи и Скоттом денотационная семантика предполагала управление компьютерной программой как функцией, которая переводила входные данные в выходные. Чтобы придать значения рекурсивно определённым программам, Скотт предложил работать с непрерывными функциями между доменами.
В начале 1980-х годов начинают использовать методы денотационной семантики для задания семантики параллельных языков. Примерами являются работа Уилла Клингера с моделью актора; работа Глинна Винскеля со структурами событий и сетями Петри; работа Франсеза, Хоара, Лемана и де Роевера (1979) по семантике трассировки для CSP. Все эти направления исследований остаются в стадии изучения.
После разработки языков программирования, основанных на линейной логике, языкам была дана денотационная семантика для линейного использования (например, сети доказательств, пространства когерентности), а также полиномиальная временная сложность.
Проблема полной абстракции для типизированного функционального языка программирования PCF долгое время не была решена. Трудность с PCF заключается в том, что это очень последовательный язык. Например, в PCF нет способа определить функцию parallel-or . По этой причине подход с использованием доменов даёт денотационную семантику, которая не является полностью абстрактной.
- Типы интерпретируются как определённые домены.
- (натуральные числа с нижним индексом, с прямым перечислением)
- интерпретируется как область непрерывных по Скотту функций от до , в точечном порядке.
- Выражение интерпретируется как:
- Термины в выражении интерпретируются как непрерывные функции
- Переменные термины интерпретируются как проекции
- Лямбда-абстракция и применение интерпретируются с использованием декартовой замкнутой структуры категории доменов и непрерывных функций
- Y интерпретируется путем взятия наименее фиксированной точки аргумента.
Эта модель не является полностью абстрактной для PCF; но она полностью абстрактна для языка, полученного путем добавления параллельного оператора или к PCF. Этот открытый вопрос был в основном решён в 1990-х годах с развитием игровой семантики, а также методов, включающих логические отношения.
Современность
Семантика, предложенная Д. Скоттом и развитая Ю. Л. Ершовым с помощью теории нумераций, является универсальной и важнейшей среди семантик языков программирования.
Денотационная семантика была разработана для современных языков программирования, которые используют такие возможности, как параллелизм и исключения, например, Concurrent ML, CSP, и Haskell. Семантика этих языков является композиционной в том смысле, что значение фразы зависит от значений её подфраз.
Близкой по свойствам к топологии Скотта конструкцией является категория пространств, разработанная Юрием Леонидовичем Ершовым в 1975 году. С её помощью также может быть построена непротиворечивая модель λ-исчисления. В качестве её преимущества отмечается, что категория пространств является декартово замкнутой, каждый объект в ней является топологическим пространством, топология на произведении является произведением топологий сомножителей, а топология в пространстве функций оказывается топологией поточечной сходимости. Такими удобными свойствами топология Скотта не обладает, в частности, произведение топологий Скотта на полных частично упорядоченных множеств в общем случае топологией Скотта на произведении множеств не является.
Домены Ершова-Скотта
Всякий домен Ершова-Скотта можно представить как множество состояний некоторой информационной системы Скотта, а множество состояний всякой информационной системы Скотта всегда является доменом Ершова-Скотта. Пространства Ершова-Скотта имеют многочисленные приложения в теоретическом программировании и теории вычислимости. В частности, они послужили основой для построения моделей бестипового лямбда-исчисления. При этом построении ключевую роль сыграли пространства непрерывных функций, наделённые топологией поточечной сходимости. Пространства Ершова можно рассматривать как топологический подход к теории областей Ершова-Скотта, см. [13], которая является одним из важных разделов современной математики.
Образование
Курс"Денотационная семантика языков программирования" введён в программу высшего образования на базе государственных университетов по направлению подготовки «Математика и компьютерные науки». Так, в Новосибирском государственном университете дисциплина реализуется на Механико-математическом факультете кафедрой дискретной математики и информатики. Основная цель дисциплины — изучение базовых результатов, относящихся к ламбда-исчислению и его семантикам.
Примечания
Литература
- Барендрегт, Хенк. Ламбда-исчисление. Его синтаксис и семантика = The Lambda Calculus. Its syntax and semantics. — М.: Мир, 1985. — 606 с. — 4800 экз.
- Ершов, Юрий. Теория нумераций. — М.: Наука, 1977. — 416 с.
- Milne, R.E. A theory of programming language semantics / R.E. Milne, C. Strachey. — 1976. — ISBN 978-1-5041-2833-9.
- Gordon, M.J.C. The Denotational Description of Programming Languages: An Introduction. — Springer, 2012. — ISBN 978-1-4612-6228-2.
- Stoy, Joseph E. Denotational Semantics: The Scott-Strachey Approach to Programming Language Semantics. — MIT Press, 1977. — ISBN 978-0-262-19147-0. (A classic if dated textbook.)
- Schmidt, David A. Denotational semantics: a methodology for language development. — Allyn & Bacon, 1986. — ISBN 978-0-205-10450-5.
- out of print now; free electronic version available: Schmidt, David A. Denotational Semantics: A Methodology for Language Development. — Kansas State University, 1997.
- Gunter, Carl. Semantics of Programming Languages: Structures and Techniques. — MIT Press, 1992. — ISBN 978-0-262-07143-7.
- Winskel, Glynn. Formal Semantics of Programming Languages. — MIT Press, 1993. — ISBN 978-0-262-73103-4.
- Tennent, R.D. Denotational semantics // Semantic Structures. — Oxford University Press, 1994. — Vol. 3. — P. 169–322. — ISBN 978-0-19-853762-5.
- Abramsky, S. Domain theory // Abramsky, Gabbay & Maibaum, 1994 / S. Abramsky, A. Jung. — 1994.
- Stoltenberg-Hansen, V. Mathematical Theory of Domains / V. Stoltenberg-Hansen, I. Lindström, E.R. Griffor. — Cambridge University Press, 1994. — ISBN 978-0-521-38344-8.
- Winskel, Glynn Denotational Semantics. University of Cambridge.
- Greif, Irene (August 1975). Semantics of Communicating Parallel Processes (PDF) (PhD thesis). Project MAC. Massachusetts Institute of Technology. ADA016302.
- Plotkin, G.D. (1976). “A powerdomain construction”. SIAM J. Comput. 5 (3): 452—487. CiteSeerX 10.1.1.158.4318. DOI:10.1137/0205035.
- Dijkstra, Edsger W. A Discipline of Programming. — Englewood Cliffs, N.J., 1976. — ISBN 0-13-215871-X.
- Apt, Krzysztof R. Exercises in denotational semantics : [] / Krzysztof R. Apt, J. W. de Bakker. — Amsterdam : Mathematisch Centrum, 1976.
- De Bakker, J.W. (1976). “Least Fixed Points Revisited”. Theoretical Computer Science [англ.]. 2 (2): 155—181. DOI:10.1016/0304-3975(76)90031-1.
- Smyth, Michael B. (1978). “Power domains”. J. Comput. Syst. Sci. 16: 23—36. DOI:10.1016/0022-0000(78)90048-X.
- Francez, Nissim. Semantics of nondeterminism, concurrency, and communication / Nissim Francez, C.A.R. Hoare, Daniel Lehmann … [и др.]. — December 1979. — Vol. 64. — P. 191–200. — ISBN 978-3-540-08921-6. — doi:10.1007/3-540-08921-7_67.
- Lynch, Nancy. On describing the behavior of distributed systems // Semantics of concurrent computation: proceedings of the international symposium, Évian, France, July 2-4, 1979 / Nancy Lynch, Michael J. Fischer. — Springer, 1979. — ISBN 978-3-540-09511-8.
- Schwartz, Jerald. Denotational semantics of parallelism // Kahn, 1979. — 1979.
- Wadge, William. An extensional treatment of dataflow deadlock // Kahn, 1979. — 1979.
- Back, Ralph-Johan. Semantics of unbounded nondeterminism // Automata, Languages and Programming : [англ.]. — Berlin, Heidelberg : Springer, 1980. — Vol. 85. — P. 51–63. — ISBN 978-3-540-39346-7. — doi:10.1007/3-540-10003-2_59.
- Park, David. On the semantics of fair parallelism // Abstract Software Specifications. — Berlin, Heidelberg : Springer Berlin Heidelberg, 1980. — Vol. 86. — P. 504–526. — ISBN 978-3-540-10007-2. — doi:10.1007/3-540-10007-5_47.
- Allison, L. A Practical Introduction to Denotational Semantics. — Cambridge University Press, 1986. — ISBN 978-0-521-31423-7.
- America, P.; de Bakker, J.; Kok, J.N.; Rutten, J. (1989). “Denotational semantics of a parallel object-oriented language”. Information and Computation. 83 (2): 152—205. DOI:10.1016/0890-5401(89)90057-6. S2CID 2405175.
- Schmidt, David A. The Structure of Typed Programming Languages. — MIT Press, 1994. — ISBN 978-0-262-69171-0.


