Рассмотрим для примера простейшую программу, состоящую из 4-х компонент.
Это сильно вырожденный случай, например, простая программ, которая сейчас делается в Вире, состоит примерно из 500 компонентов. Более сложные состоят из тысяч компонент.
Замечу, что стрелки здесь – это не статические связи, не импорт (include, require, …).
Компонента A не зависит [статически] от компонент B, C, D и наоборот. Естественно, что между ними есть взаимодействие во время работы программы, но разрабатываются они независимо друг от друга. О взаимодействии разговор будет позже.
Картинка показывает схему программы, и в отличии от обычных инструментов разработки, схема программы сохранится и в исполняемой (рабочей) программе, и будет играть в ней определяющую роль.
Схема программы – это схема соединения компонент. Схема позволяет сделать разные программы из набора компонент, так же, как из деталей конструктора Лего можно сделать разные модели.
Естественно, что в рабочей программе кроме схемы есть исполняемый код, но структура его отличается от обычной. Он не провязан вызовами, взаимодействие между компонентами определяется схемой, а не последовательностью вызовов.
Перед тем, как подробнее поговорить о коде, напомню, что компонента может состоять из компонент более низких уровней. Самыми простыми компонентами являются простые функции, которые в заметках о стандартизации я сравнивал с «саморезами».
Функции, как компоненты самого простого уровня, уложены в некоторое хранилище или Словарь. Я использую слово «словарь», так как оно подразумевает структуру и возможность поиска, а функции называю словарными статьями.
В нынешнем «Вирту» статьи хранятся в бинарном виде (код x86), а не в semi-binary, как должно быть в кросс-платформенном Вире-2. Статья компилируется один раз (пока не изменится), и потом используется в бинарном виде.
Компоненты более высоких уровней собираются из словарных статей + уникальный код + устройство (структура). Оставим пока устройство на потом, остановимся на том, что каждой компоненте может соответствовать множество кодовых частей (статей и не только).
Если учесть, что
- одна статья может использоваться в разных компонентах,
- плюс в компоненте часто есть дополнительные части кода,
то для программы можно построить множество кодовых частей программы, которое строится как замыкание множеств кодовых частей компонент.
Примерно так (в Вирту каждая кодовая часть имеет свой уникальный идентификатор, здесь я использую номер для иллюстрации):
Компонента | Использует кодовую часть |
A | №1, №2, №3 |
B | №4, №2 |
C | №5, №3, №6 |
D | №7 |
Тогда для работы этой программы нужны кодовые части: с №1 до №7
Именно эти части будут уложены в файл кода программы в некотором порядке. Замечу, что без схемы в этом кодовом файле нет смысла. В качестве шутки можно как-нибудь сделать две разные программы, которые будут состоять из одного набора кодовых частей.
Что еще есть в исполняемой программе кроме схемы и кода?
Есть стартовый код, который запускает сборку программы по схеме и выполнение собственно программы. И есть, как обычно, ресурсы, необходимые для работы программы.
В итоге, исполняемая программа состоит из:
- Некоторого startup кода – одинакового для всех программ (exe файл для Windows)
- Схемы программы, которую я предпочитаю рисовать так:
Для каждой компоненты кроме имени указан стартовый сегмент кода. В действительности, в схеме есть еще данные, но об этом позже.
- Файла кодовых частей, который содержит все необходимые для работы кодовые части + оглавление для быстрого поиска
В нашем случае:
Оглавление | №1 | №2 | №3 | №4 | №5 | №6 | №7 |
- И ресурсов, среди которых выделены картинки для GUI (если у программы есть GUI).
Если кому-то из читателей будет не лень установить демо-версию программы «Сайткрафт-Студии» (http://sitecraft.ru/) и посмотреть в папку, в которую установлена программа, то он увидит:
- sc4.exe – startup код (там еще куча DLL, являющихся наследием тяжелого прошлого)
- Storage\Stack\stack.txt – схема программы
- Storage\Codes\codes.sdb – файл кодовых частей
- Storage\ PictureStack\* — картинки для интерфейсов
- И много еще всего в папке Storage, того, что необходимо для работы конкретной программы и не нужно в общем случае.
- Есть еще любопытная папка Storage\Plugins, в которой лежат дополнения, которые устроены аналогично программе: схема + код + ресурсы.
На вопросы «Зачем» и «Почему» я постараюсь ответить дальше.