Cтраница 1
Применения примитивных функций включают ( рекурсивную) редукцию строгих аргументов примитива и проведение затем примитивной операции в соответствии с б-правилами. [1]
Рассмотрим применение примитивной функции 1 ( succ2), где succ, как и прежде, является функцией следования на множестве целых чисел. [2]
Макросы, соответствующие применению примитивных функций, используют подходящее дельта-правило этого примитива, а полный набор макросов для операций со стеком и дампом, работы с графами и для вызова функций и возврата описан в трех следующих разделах. Однако, хотя смысл и сущность этих операций станут ясны по мере их рассмотрения, эта часть текста может быть пропущена при первом прочтении и использоваться лишь для ссылок при необходимости. Сначала, однако, следует ввести несколько общих обозначений. [3]
Условные выражения могут рассматриваться как применения примитивной функции cond в связи с ленивой семантикой функционирования G-машины в МОП-системе, с другой стороны, условные выражения рассматриваются как особый случай ( по этому вопросу см. также гл. [4]
Правила преобразования графа, соответствующего применению примитивной функции, задаются б-правилами для этой функции. [5]
Это необходимо для повышения эффективности при применении примитивных функций, требующих строгой семантики и выполняющих основные арифметические, логические и условные операции. Их аргументы находятся на вершине дампа, что помогает сократить вычислительные затраты, связанные с конструированием графов. Заметьте, что дамп хранит атомарные данные и, как мы увидим ниже, информацию о состоянии программы в момент вызова функции, а стек содержит лишь указатели на составные части графа выражения, редуцируемого в данный момент. Подвыражения, представленные этими указателями, также могут быть ( косвенно доступными) атомами, но чаще бывают списками или частично вычисленными применениями функции. [6]
![]() |
Спуск по гребню графа выражения 12. а - начальное состояние. б - одни шаг вниз по гребню. в - конец спуска. [7] |
Для инициации вычисления г - го аргумента применения примитивной функции мы просто выполняем подъемом через / вершин вверх по гребню ( считая от первой не - вершины) и затем входим в гребень аргумента по правой дуге соответствующей - вершины. [8]
![]() |
Стек после рекурсивного вызова редуктора графов. [9] |
При этом возможны обратный просмотр гребня для нахождения подграфов аргументов и подъем при завершении применения примитивной функции. [10]
Различные графовые преобразования могут заключаться либо в подстановке аргумента вместо параметра, как при р-редукции, либо в применении примитивной функции согласно встроенным правилам, как при б-редукции. [11]
Исключая случаи небулева предиката и применения выражения, которое не является функцией, ошибка типа обнаружилась бы в денотационной семантике только при применении примитивной функции к объекту неподходящего типа; при этом допустимые типы аргументов задаются спецификациями примитивных функций. [12]
Задав б-правила, которые нельзя детально специфицировать в общем случае, мы можем теперь довольно просто определить преобразование графа, соответствующее редукции редекса применения примитивной функции. [13]
Примитивные операции, используемые абстрактной машиной, могут быть разделены на 4 класса: операции со стеком и дампом, создание и изменение вершин графа ( и, таким образом, графов), вызов функций и возврат из них, а также вычисление применений примитивных функций. Каждая такая операция представлена макросом в коде G-машины, генерированном компилятором; эти макросы образуют набор команд абстрактной машины, который может быть реализован на любом компьютере, обладающем соответствующими языковыми средствами. Например, макроинструкции PUSH и SLIDE требуют применения команд с индексированием. Таким образом, промежуточный язык, основанный на макросах, является мобильным и может быть реализован на выбранном компьютере с помощью обычных языков программирования или машинного языка. [14]
![]() |
Примитивы Лиспа. [15] |