Языки программирования, 21 лекция (от 21 ноября)

Материал из ESyr's Wiki pages.

Перейти к: навигация, поиск

Предыдущая лекция | Следующая лекция

Глава 6. Раздедльная трансляция.

Тезнологическая возможность, который кадждый индустр. ЯП долден поддерживаться. Уже в Фортране она была. Одной из первых причин, по коророй Алгол-60 провалился, потому что там её не было.

Виды трансляции

  1. Цельная. Алгол-60 – первый пример с цельной трансляцией, Паскаль стандартный. Существенно упрощает язык и транслятор. Тем не менее, все мало-мальбские реализации позволяли делать раздельую трансляцию. Одно из шлавных препятствий, которое не опзволило Паскалю широко распространиться
  2. Пошаговая трансляция. Программа разбивается на чёткие куски, которые предъявляются транслятору. Пример – первые версии Бейсика, и первые версии интерактивных языков. Одним шагом в таких языка служит одна конструкция. До сих пор на одной строке пишется один оператор (хотя в совр появилась возможность писать несколько операторов на одной строке). Ещё один пример – шелл. Особенно часто её исопльзуют интерпретаторы.
  3. Инкрементная трансляция. Когда транслятор сам догадывается, на какие кусочки разбивать. Делается в дебаггерах иногда. Используется только в нке-рых трансляторах и средах, так как очень сложно.
  4. Раздельная. Программа разбивается на единицы компиляции.
    1. Раздельная независимая трансляция. Когда компилятор не видит больше единиц компиляции кроме той, которую он компилирует. Такая схема упрощает сам транслятор. Усложняется жизнь программиста. Так как всё равно существует понятие контекст трансляции. При этом контекст трансляции есть всегда. При цельной он стоит из стандартных идентификатороов. Почему усложняется жизнь программиста – программист должен руками сам описывать контекст. Примеры языков: Фортран, язык Ассемблера
Ассемблер:
М: Public N
M1: Extrn N, T

В чём нелогичность Си: extern ничего не значит. Функция может быть описана ниже, сам extern можно опускать. Самая большая неприятность в этих языках – мы должны один раз определить и много раз использовать. Так как Си использует стандартный загрузчик, то он хранит не тип, а размер, и если типы в разных модулях отличаются, а размеры не совпадают, то никакой л инковщик не подкопается. Соответственно, программисты на Си ручками моделируют механизм зависимой трансляции. Инклюды, уникальность включения инлюдов... Чем приходится платить: если обычный размер модуля 1-2 тысячи строк, то на самом деле, есил взять кол-во строк, которые входят в инклюд, более 85% трансляции – инклюды. В совр программах – более 95 процентов. Как с этим борятся разраб. компиляторов: PCH.

    1. Раздельная зависимая трансляция. Есть транслятор, ему на вход подаётся единица компиляции, на выходе получается объектный модуль и библиотека трансляции, информацию из этой библиотеки он использует в других модулях.

Механизмы раздельных трансляции: М-2, Оберон, Дельфы – очень простые механизмы.

Библиотечный модуль и есть единица компиляции.

Оберон – явный импорт Модула – хранить дефинишн и имплементайшн

Возникает понятие зависимости. Зависимость модулей – если Модуль М1 инклюд, то он от него зависит.

Зависимости определяют порядок компиляции и загрузки модулей в память.

Отношение зависимости – отношение частичного порядка.

Кольцевую зависимость находит препроцессор.

Эта зависимость ни в Си, ни в Си++ не влияет на порядок загрузки.

Используется схема, которая проверяет, инициализирована ли переменная или нет, и инициализирует её.

Язык Ада:

Существует поенятие единицы компиляции, но. Что может являться единицей компиляции:

  • Пакет
  • Спецификация пакета
  • Тело пакета
  • Отдельная процедура или функция

Дело программиста, как разбивать программу.

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

Есть пакет STANDARD, и любая единица компиляции вложена в этот пакет.

IMPORT

WITH

WITH M1, M2, M3; USE M1, M2;

Подгрузить три модуля и сделать видимыми имена из двух.

Есть односторонняя связь (котоая обычно и используется), когда определяется универсальный сервисный модуль, и клиентский. Клиентский модуль знает о сервисном, сервисный о клиентском – нет.

Двусторонняя связь – связь, которая в полном виде реализована только в Аде.

package Main is
  package P is
    ...
  end P;
  procedure PP is ... end PP;
end Main;


package body Main is
  package body P is separate;
  procedure PP is separate;
  procedure Inner is separate;
 ...
end Main;

к труднопонимаемости вложенных структур: ... То же самое на лекциях, когда лектор говорит-говорит, потом вспоминает что-то, потом ещё что-то, потом начинает возвращаться. Аудитория в момент первого-втоорго возврата просто отключатеся. Так, конечно лекции вести нельзя. Собственно, на чём мы остановились...

ООЯП:

С шарп, Джава.

Явная конструкция импорта.

Джава: Единица компиляции – файл.

В файле должен быть публичный класс, в ней должен быть main.

Пакеты языка Джава:

Пакеты в общем случае это некоторая .. имеет имя имя1.имя2. ... .имяN. Джава машина, так как единицей компиляции является файл, то он должен где-то находиться. ФС имеет иерархическую структуру, Интернет, в общем, то же. Иерархическая структура пакетов не отражает их вложенность.

С шарп

пространство имён может быть вложено.

Пространство имён открыто снизу.

namepace NS1 {
  namepace NS2 { }
}
f1.cs:
namepace NS1 {
}

f2.cs:
namepace NS1.NS2 {
}

Как получить доступ – только через имя.

Пеар 705.


Языки Программирования


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29


Календарь

чт вт чт вт чт вт чт вт чт вт
Сентябрь
  05 07 12 14 19 21 26 28
Октябрь
  03 05 10 12 17 19 24 26 31
Ноябрь
02 14 16 21 23 28 30
Декабрь
05 07 12 14 19


Эта статья является конспектом лекции.

Эта статья ещё не вычитана. Пожалуйтса, вычитайте её и исправьте ошибки, если они есть.
Личные инструменты