18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики



Скачать 296.43 Kb.
страница3/4
Дата02.01.2013
Размер296.43 Kb.
ТипДокументы
1   2   3   4

Унарные операторы.

Синтаксическая форма:

Унарное-выражение →+ выражение;

Унарное-выражение →- выражение;

Унарное-выражение →~ выражение;

Унарное-выражение → ! выражение;

Вычисление этих выражений подобно вычислению бинарных операторв.

Представим правила перехода для оператора отрицания:


Приведение типов.

Синтаксическая форма: приводимое-выражение → (Название-типа) выражение
Статическая функция CastType: tasks typename.указывает старый тип, из которого преобразуется выражение. ValueType указывает новый тип выражения. Статическая функция Convert:typename × typename × values values преобразует элементы одного универсума в соответствующие элементы другого универсума. Например Convert(float, int, X) – самое близкое к Х целое.(Х – число с плавающей точкой).

Для выполнения приведения вычисляется выражение аргумента и используется ф-ция Convert для получения надлежащего возвращаемого значения.

В нашей последовательности задач приводимое выражение стоит перед задачей. Выполняющей приведение типов; т.о. аргумент приведения оказывается уже вычисленным и его значение доступно.

Правила перехода для приведения типов:


24. Операционная семантика языка Си в формализме ASM.

Второй уровень определения семантики.

Pre и post ++ и --, адресация, разименование, массивы.
Выражения Pre++ и Pre --

Синтаксическая форма:

Pre-incr-выражение → ++ выражение;

Pre-decr-выражение →-- выражение;

Чтобы вычислить выражение pre++ (pre--), увеличиваем(уменьшаем) указанное, хранящееся в памяти значение, на единицу и заменяем в памяти старое значение новым. Изменяемое выражение может быть и указателем.в этом случае значение увеличивается (уменьшается) на размер объекта, на который указывает указатель (как и при обычном сложении или вычитании указателей).

Правила перехода для Pre++:

gif" name="graphics32" align=bottom width=615 height=351 border=0>

Выражения Post++ и Post –

Синтаксическая форма:

Post-incr-выражение → выражение ++;

Post-decr-выражение → выражение --;

Операторы post++ (post--) управляются аналогично pre ++ (pre--),только последовательность операций обратная: значение родтельского выражения устанавливается до выполнения увеличения (уменьшения).

Правила перехода для Post++:

Адресация.

Синтаксическая форма:

Адресуемое-выражение → &выражение1.

Оператор &в Си возвращает в качестве результата адрес указанного в качестве аргумента выражения.

Т.к. мы вычисляем выражения, ссылающиеся на объекты в памяти, надо знать, что именно нам необходимо в наших вычислениях: адрес объекта или непосредственно объект.

Статическая частичная ф-ция ValueMode: tasks → {lvalue, rvalue} указывает, какая информация должна быть вычислена для данной задачи. (lvalueадрес, rvalue - значени)

Пусть ValueMode(е) = lvalue для подвыражения выражения1; т.о. значение, возвращаемое при вычислении выражения , - это адрес в памяти (а не значение!) аргумента.

Правила перехода:

Разыменование

Синтаксическая форма:

Dereference-выражение →* выражение1.

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

Правила перехода:


Массивы

Синтаксическая форма:

Значение-массива → выражение1 [выражение2]

Согласно [KR], ссылка на массив вида a[b] идентична, по определению, выражению * ((a) + (b)). Это определение корректно, т.к. имя массива в Си может быть использовано как указатель на первый элемент массива.

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

Второй уровень определения семантики.

Вызовы функций, идентификаторы, структуры и объединения,

битовые поля.
Вызовы функций

Синтаксическая форма:

Выражение-вызова-функции → выражение (списо- выражений)

Т.к. мы запретили непосредственный вызов функций, то для получения значения вызываемой функции будем использовать внешнюю функцию FunctionValue: tasks → results.

Правила перехода:

Идентификаторы

Внешняя функция FindID: tasks addresses отображает идентификаторы в соответствующую область памяти, используемую связываемой переменной.

При обработке идентификаторов возвращаем либо адрес переменной, ее значение, что определяется функцией ValueMode


Правила перехода:


Структуры и объединения

Синтаксическая форма:

Struct-выражение →выражение1.идентификатор
Есть также и другая форма:

Struct-выражение →выражение1 -> идентификатор


Выражения в форме "a->b" эквивалентны выражениям в форме "(*a) .b". Поэтому можем рассматривать только ссылки вида "*a. b", считая, что ссылки другой формы представлtys в эквивалентном виде.

Ф-ция ConstVal , применённая к задаче обращения к структуре, возвращает смещение в памяти, необходимое для получения адреса или значения конкретного поля структуры.

Правила перехода:


Битовые поля

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

Большинство информации о битовых полях зависит от реализации, например, каким образом битовые поля пакуются в смежные файлы, действительно ли необозначенные "дыры" появятся в структурах между битовыми полями, читаются битовые поля слева направо или справа налево. Как правило, операции имеют дело с байтами (даже битовые операции); покажем, как обработать битовые поля в модели на основе байта памяти.

Пример структуры, использующей битовые поля, показан ниже. Здесь, поле b может хранить 4-битовое целое число без знака, и c может хранить 15-битовое целое число без знака. Так как байты обычно включают 8 битов, c вероятно храниться в двух или трех последовательных байтах в памяти, возможно совместно используя байт с b.
struct {

unsigned int a;
unsigned int b:4;
unsigned int c:15;


} bitty;
Предположим, что мы хотим выполнить операцию bitty.c = 12. Мы должны получить байты, которые хранят биты c и изменить эти биты соответствухющим образом , оставляя все другие биты неизменными. Это дает начало статической функции

BitAssign: results x typename x resultsresults, которая указывает изменение, произошедшее в значении соответствующей коллекции смежных байтов при изменении битового поля. Учитывая содержание oldval соответствующей области памяти, BitAssign (oldval, bittype, 12), возвращает новое значение; здесь bittype - тип c в bitty.
Таким образом, присваивание битовым полям немного отличается.

Правила перехода для простого присваивания битовым полям:


Вычисление ссылок к битовым полям тоже немного отличается, т.к. необходимо извлечь значение битового поля из обычно большего включающего значения. Статическая функция BitExtract: results x typename results осуществляет это извлечение. Статическая частичная функция BitType: tasks typename указывает тип ссылаемого битового поля.
Правила перехода для задач :


26. Операционная семантика языка Си в формализме ASM.

Третий уровень определения семантики.


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

Объявления

Мы представляем объявления в Cи как элементы универсума tasks, связанные в надлежащем порядке в соответствии с операторами задач при помощью функции NextTask.

Cи различает так называемые статические переменные и другие переменные. Различие между статическими и нестатическими переменными возникает, когда управление передается к задаче объявления переменной. Если переменная не является статической, для переменной при каждом объявлении выделяется новая память и инициализирующим выражением переменной (если оно существует), определяется значением выражения, назначаемого в новую область памяти. Если переменная является статической, вышеупомянутое распределение и инициализация выполняются только в первый раз, при объявлении переменной ; если объявление переменной происходит еще раз , ей выделяется тот же сегмент памяти.

Статическая частичная функция DecType: tasks {static, non-static} указывает тип объявляемой переменной (Отметим, что в Си существуют также внешние объявления переменных при которых не происходит резервирования памяти, они служат как синтаксическое связывание переменных. Мы опускаем рассмотрение таких объявлений). Статическая частичная функция Initializer: tasks tasks указывает соответствующее инициализирующее выражение (если есть). Будем хранить значение инициализирующего выражения используя RightValue.

Частичная функция StaticAddr: tasks addresses хранит текущий адрес (если есть), назначенный статической переменной. На третьем уровне StaticAddr на самом деле не необходима , так как функция OnlyValue обеспечила бы надлежащее хранение адреса статической переменной. Однако, это упростит другие правила, которые будут представлены. Внешняя функция NewMemory: tasks addresses возвращает адрес области памяти, используемой для данной задачи объявления.

Правила перехода для объявления статической переменной:


Правила перехода для объявления нестатической переменной:


Динамические переменные и нелокальные переходы

Для динамических (или локальных) переменны выделенная память, не только при обычном начале выполнении блока, но также если блоку передается управление с помощью нелокального оператора goto .

В качестве примера рассмотрим следующий фрагмент кода:



В этом фрагменте, если оператор for выполняется в обычном режиме, то переменной local будет выделена память и она будет инициализирована 1. При выполнении оператора goto , переменная local должен быть рзмещена в памяти прежде, чем будет выполнен оператор, обозначенный как target , хотя никакая инициализация не выполнена.

Наши правила для создания графа задач только предусматривают единственный момент, когда данная переменная может быть размещена.
Поэтому мы вводим новый тип задач indirect-declaration (косвенное объявление) . Раньше функция NextTask для каждой задачи перехода отображала непосредственно ее адресата. Теперь, мы помещаем задачу косвенного объявления для каждой локальной переменной между задачей перехода и ее адресатом. Функция Decl отображает для каждой новой задаче первоначальное объявление переменной.
Правило перехода для обработки косвенных объявлений:


Исправление: Идентификаторы

Статическая частичная функция Decl: tasks tasks отображает задачи, соответствующие возникновениям идентификатора в задачу, соответствующей объявлению этой переменной. Измененное правило перехода для идентификаторов (полученное путем замены каждого вхождения функции FindIDQ на OnlyValue (Decl())


Инициализаторы

Инициализаторы в Cи могут иметь две формы:

выражения (для переменных элементарных типов) и списки выражений (для переменных, представляющих массивы и структуры).

Наши предыдущие правила для вычисления выражений будут обрабатывать инициализаторы для простых выражений.

Для обработки составных выражений используется статическая функция

AddTo: typename x results x results results , привешивающая значение в конец составной структуры указанного типа.

(Например, если [42, 8] - целочисленный массив, то AddTo (array, [42, 8], 4) = [42,8,4].)

Проиллюстрируем с помощью графа, как выражения с составными инициализаторами (то есть выражения, инициализатор которых есть список выражений) представлены в нашей алгебре:


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

Функция WhichChild возвращает значение aggregate, если вычисляемое занчение – компонента составного инициализатора.

Расширим макрокоманду ReportValue для правильного объединения составных выражений:

1   2   3   4

Похожие:

18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconПредмет семантики
Семантика, как и всякая научная дисциплина, имеет свой предмет. Но определить этот предмет не так просто, как это может показаться....
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconВопросы по курсу ксе первый уровень освоения курса – «иметь представление о курсе»
Первый уровень освоения курса – «иметь представление о курсе», т е знать основные определения, положения и принципы
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconВопросы к экзамену Примеры различных направлений, стилей и техник программирования
Операционная семантика языков программирования. Абстрактная машина и интерпретатор
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики icon1. Синтаксис и семантика языков программирования. Алфавит языка Borland Pascal. Описание синтаксиса языка: синтаксические диаграммы
Синтаксис языка совокупность правил, определяющих допустимые конструкции (слова, предложения) языка, его форму
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconКомпьютерная семантика русского языка
Существует только один способ такого разграничения, суть которого сводится к построению формального семантического языка и двухстороннему...
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconЛекция Какие семантики бывают. Исчисление предикатов как прототипический пример формального языка Владимир Борщев, винити ран
Лекция Какие семантики бывают. Исчисление предикатов как прототипический пример формального языка
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconЛекция Определение языков программирования Прежде чем анализировать конкретные парадигмы программирования, рассмотрим задачу определения систем программирования
Прежде чем анализировать конкретные парадигмы программирования, рассмотрим задачу определения систем программирования. Строится простейшее...
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconС. Н. Селезнёва г. Красноярск, Россия Динамика семантики слова патриарх в культурно-историческом аспекте
Васильев: 1994, 157]. Наиболее ярко история духа народа может наблюдаться в судьбах слов, семантика которых включает компонент аксиологического...
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconМашины абстрактных состояний. Основные идеи, мотивировки. Понятие состояния машины и связанные с ним определения. Правила перехода. Примеры применения
Предоставить средства построения т наз исполняемых спецификаций или исполняемых моделей программных систем, т е спецификации asm...
18. Операционная семантика языка Си в формализме asm. Первый уровень определения семантики iconВопросы семантики и прагматики грамматических категорий в курсе русского языка как иностранного

Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org