Модули

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

Каждый исходный файл состоит из заголовка модуля, за которым следует, возможно, пустой список импорта, за которым следует, возможно, пустой набор описаний типов, констант, переменных, функций и методов и, возможно, вход в модуль.

Модуль: Исходный-файл+
Исходный-файл:
    Заголовок-модуля
    Список-импорта
    Описание-или-вход*

Заголовок-модуля:
    'модуль' Идентификатор Разделитель
     ('осторожно' Разделитель)?

Описание-или-вход: Описание | Вход

Заголовок модуля

Каждый исходный файл начинается с заголовка модуля. Заголовок содержит идентификтор, который определяет модуль, к которому принадлежит файл. Идентификатор не принадлежит никакой области действия и не связан ни с каким объектом.

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

Импорт

Наличие импорта в исходном файле указывает, что этот исходный файл зависит от функциональности импортируемого модуля. Импорт обеспечивает доступ к экспортированным идентификаторам импортируемого модуля.

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

Список-импорта: Импорт*
Импорт: 'импорт' Путь-импорта Разделитель
Путь-импорта: '"' Путь-в-хранилище | Файловый-путь '"' 

Явное задание имени импорта

Импорт добавляет описание идентификатора, текстуально равного последнему имени в пути импорта, который будет использоваться для доступа к экспортированным объектам импортируемого модуля.

модуль x

импорт "стд::вывод"

вход {
    вывод.ф("Привет!")
}

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

Путь-в-хранилище: 
    Имя-хранилища '::' Имя-папки ('/' Имя-папки)*

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

импорт "стд::юникод/utf8" 

пусть декодер = utf8.декодер(...)

Язык не определяет формально набор символов, которые могут использоваться в имени хранилища и имени папки, надеясь на здравый смысл разработчиков.

Файловый путь может быть аболютным или относительным (в терминах инструментальной платформы). Не рекомендуется использовать абсолютные пути, так как это приводит к непереносимому коду. Относительный путь всегда трактуется как путь относительно той папки, в которой запущен компилятор (рабочая папка).

Например в случае импорта:

импорт "трик/лексер"

будет импортирован модуль, который расположен в подпапке трик/лексер рабочей папки.

Имена папок должны разделяться символом / (слеш) независимо от инструментальной платформы, на которой используется компилятор.

%Ошибка компиляции, если знак экспорта указан для идентификатора, описанного не на уровне модуля.

Вход или инициализация модуля

Модуль может содержать действия, которые выполняются при инициализации модуля – вход в модуль.

Вход: 'вход' Блок

Описать: переменные с поздней инициализацией

Система должна обеспечивать следующие условия инициализации модуля М:

  • инициализация модуля выполняется один раз
  • инициализации М выполняется после инициализации всех модулей, которые импортирует М
  • инициализации М выполняется до инициализации тех модулей, которые импортируют М

Инициализация и исполнение программы

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

Исполнение программы состоит из:

  • инициализации всех модулей, импортированных из головного модуля. Это приводит к рекурсивной инициализации всех используемых модулей программы. Для корректной инициализации граф импорта должен быть ациклическим.
  • и, затем, выполнение входа головного модуля.