Техника трансляции
Представление типов
Контроль типов
Представление типов
-
Примитивные типы:
-
int, boolean, char, void, …, invalid_type
-
Составные типы Конструкторы типов
Конструкторы типов Массивы
-
Если T – тип, то array (I, T) – тип, обозначающий тип массива с элементами типа T и индексным множеством I. Статические массивы.
-
Если T – тип, то array (T) – тип, обозначающий тип массива с элементами типа T. Динамические массивы.
-
Пример.
-
var A: array [1..10] of integer;
-
связывает
-
тип array (1..10, integer) с идентификатором A.
Конструкторы типов Произведение типов
-
Если T1 и T2 – типы, то их декартово произведение T1xT2 также является типом.
Конструкторы типов Структуры
-
Конструктор struct применяется к кортежу пар (field_name, field_type).
-
Например.
-
type row = record
-
address: integer;
-
lexeme: array [1:15] of char
-
var table: array [1..13] of row;
-
struct ((address x integer) x
-
(lexeme x array (1..15, char))
-
)
Конструкторы типов Указатели
Если T – тип, то pointer (T) также является типом.
Например.
var p: ^ row
определяет переменную p типа
pointer (p).
Конструкторы типов Процедуры
-
Если T1 и T2 – типы, то proc (T1, T2) также является типом.
-
Пример.
-
proc (int x int, int) - тип функции mod,
-
proc (char x char, pointer (int)) – тип функции function f (a, b: char) : ^int.
Представление типов
Дерево DAG
proc
proc
x
^
x
^
integer
char
char
integer
char
Представление типов
Линейное представление дерева
proc (x (char, char), pointer (integer))
Линейное представление DAG’a.
proc, 2, m1, m2, m2
m1: pointer, integer
m2: char
Контроль типов
-
Статический и динамический контроль типов.
-
Язык со статическим контролем типов или строго типизированный язык (strongly typed language).
-
Контроль индексов вырезки в Паскале.
Структурная эквивалентость типов Structural equivalence
bool sequiv (s, t)
{
if (s и t – два одинаковых примитивных типа)
{
return true;
}
else if (s == array (s1, s2) && t == array (t1, t2))
{
return sequiv (s1, t1) && sequiv (s2, t2);
}
…
else
{
return false;
}
}
Эквивалентность типов по имени Name equivalence of type
-
В этом случае каждое имя типа рассматривается как уникальный тип
-
-
два имени типов эквивалентны, если они идентичны.
-
type link = ^cell;
-
var next: link;
-
last: link;
-
p: ^cell;
-
q, r: ^cell;
Эквивалентны ли типы переменных на слайде 12?
-
Структурная эквивалентность все объявленные переменные имеют одинаковый тип
-
Эквивалентность по имени одинаковый тип имеют переменные p, q, r и p, next
-
А что верно для Паскаля?
Что верно для Паскаля?
type link = ^cell;
np = ^cell;
npg = ^cell;
var next: link;
last: link;
p: np;
q, r: npq;
type link = ^cell;
var next: link;
last: link;
p: ^cell;
q, r: ^cell;
Преобразования типов
-
real + int
-
Явное преобразование типов (explicit type conversion)
-
Неявное преобразование типов (implicit type conversion) - приведение (coercion)
Преобразования типов в Algol 68
-
6 типов приведений.
-
Распроцедуривание – proc m m
-
Разыменование – ref m m
-
Объединение – m union (m)
-
Векторизация – m []m
-
Обобщение – int real,
-
real complex
-
Опустошение – m void
Преобразования типов в Algol 68
-
5 типов контекстных позиций.
-
Сильная (strong) позиция
-
Крепкая (firm) позиция
-
Раскрытая (meek) позиция
-
Слабая (weak) позиция
-
Мягкая (soft) позиция