Техника трансляции. Представление типов контроль типов. Конструкторы типов "Массивы". Конструкторы типов "Произведение типов"

Страницы работы

Содержание работы

Техника трансляции

Представление типов Контроль типов

Представление типов

  • Примитивные типы:
    • 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
    • end;
  • 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?

  • Структурная эквивалентность  все объявленные переменные имеют одинаковый тип
    • Algol 68, C (?), ML.
  • Эквивалентность по имени  одинаковый тип имеют переменные p, q, r и p, next
    • Java, Ada.
  • А что верно для Паскаля?

Что верно для Паскаля?

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)
    • ord, chr
    • Casts
  • Неявное преобразование типов (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) позиция

Похожие материалы

Информация о работе