Студия/Компиляция

From SunFlurry wiki
Jump to: navigation, search

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

  • Модулях (в т.ч. глобальных). Модули являются отдельными файлами, полностью отданные под хранение исходных текстов.
  • Визуальных событиях. Тексты событий хранятся внутри особых контейнеров внутри файлов-описаний форм. События, описанные таким образом, могут быть привязаны как к элементам формы (причем каждому элементу может быть задано множество событий), так и к самой форме в общем.
  • События пунктов меню и события панели инструментов. Тексты триггеров событий хранятся внутри файлов с описанием меню и панелей инструментов. События выполняются, когда пользователь выбирает определенный пункт меню или нажимает на кнопку на панели инструментов.
  • Триггеры (события) объектов базы данных. Тексты хранятся внутри файла метаданных и вызываются в моменты создания, записи или обработки объектов.

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

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

  • При ошибках в программе, отладчик может быть запущен непосредственно на удаленной стороне. Для отладки, необходимо наличие исходных текстов программы, которые будут присутствовать на сервере и быть доступны пользователям системы с административными правами.
  • С учетом того, что исходные тексты проекта чаще всего могут находиться в другой сети, существует вероятность их утери или утери доступа к ним. Чтобы восстановить рабочую папку проекта, в которой можно продолжать делать изменения с помощью Студии, необходимо наличие копий всех исходных файлов проекта на сервере. Для восстановления исходных файлов проекта из рабочей копии на сервере системы, можно воспользоваться главным меню Студии (см. Общая информация и интерфейс Студии, пункт Импортировать проект из рабочей конфигурации...).


Диалог компиляции исходного кода проекта может вызываться с помощью главного меню Студии (Развертывание) или непосредственно из исходного кода с помощью комбинации клавиш Ctrl+F9 (обычная компиляция) или Shift+Ctrl+F9 (безусловная компиляция). Общий вид диалога после успешной компиляции показан на рисунке 1.


Для разработчика доступны следующие способы компиляции:

  • Обычная компиляция проекта, вызывается из главного меню Студии (Развертывание - Компиляция проекта...), либо из любого места Студии в т.ч. из редактора исходных файлов с помощью комбинации клавиш Ctrl+F9. Обычная компиляция работает только с теми файлами проекта, которые не были изменены с момента их предыдущей компиляции. Такой режим позволяет произвести компиляцию мгновенно, однако, в определенных случаях, может пропустить ошибку. К примеру, если в модуле удалена функция, которая вызывается из обработчика события формы, привязанной к данному модулю, при обычной компиляции форма, содержимое которой не изменялось разработчиком, будет пропущена, и Студия не предупредит о том, что обработчик события пытается вызвать несуществующую функцию, ошибка будет найдена во время работы пользователя. Принимая во внимание подобные случаи, к обычной компиляции нужно подходить с осторожностью.
  • Безусловная компиляция всех модулей вызывается из главного меню Студии (Развертывание - Безусловная компиляция всех модулей...), либо из любого места Студии в т.ч. из редактора исходных файлов с помощью комбинации клавиш Shift+Ctrl+F9. Безусловная компиляция работает со всеми файлами проекта, даже если они не изменялись с момента их предыдущей компиляции. Такой режим затрачивает больше времени на компиляцию и может производиться после больших изменений в конфигурации проекта или перед созданием дистрибутива коммерческого проекта для того, чтобы убедиться, что проект не содержит скрытых ошибок. Обычно после такой компиляции будет увеличен номер сборки проекта (эта установка доступна в установках проекта).
  • Синтаксический контроль всех модулей вызывается из главного меню Студии (Развертывание - Синтаксический контроль всех модулей...), и позволяет провести безусловную компиляцию проекта без сохранения результатов компиляции в папку компилированных текстов проекта. Такой способ компиляции полезен, если необходимо проверить все файлы проекта на скрытые ошибки компиляции, однако, нежелательно обновлять все компилированные файлы, чтобы не вызвать большое количество обновлений при разворачивании проекта на сервере.
  • Синтаксический контроль работает в редакторе модулей для модуля, активного в данный момент времени, вызывается из главного меню Студии (Модуль - Синтаксический контроль), либо с помощью панели инструментов редактора модулей. Функция позволяет провести мгновенный синтаксический контроль редактируемого в данный момент модуля. Результаты компиляции не будут сохранены на диск, при наличии ошибок, последние будут выведены в лог ошибок, как и при обычной компиляции.

Компиляция файлов проекта (за исключением синтаксического контроля одного модуля) происходит по следующему алгоритму:

  • В первую очередь происходит компиляция глобальных модулей, так как они содержат глобальные переменные и функции, которые могут использоваться во всех других модулях. Если компиляция глобальных модулей останавливается с синтаксической ошибкой, компиляция проекта продолжена не будет.
  • Студия загружает один за другим все файлы проекта, подлежащие компиляции (в том числе, главные меню, файл метаданных, файл панелей инструментов). Прежде чем осуществить компиляцию, дата последнего изменения соответствующего файла сравнивается с датой скомпилированного файла в каталоге, если эти даты совпадают, файл будет пропущен при компиляции, таким образом в проекте компилируются только те файлы, которые были изменены.
    • Если при компиляции файла (модуля, формы и пр.) обнаружена ошибка, она будет выведена в лог компиляции (нижняя панель Студии, которая обычно спрятана) и файл будет пропущен. Общий результат компиляции в этом случае не будет успешным, однако, процесс компиляции файлов не будет остановлен, система просто перейдет к компиляции следующего по очереди файла. Ошибки компиляции, накопленные в нижней панели ошибок, являются интерактивными ссылками. При двойном клике по ссылке, Студия автоматически откроет нужный файл или обработчик события формы для редактирования, и перейдет в место синтаксической ошибки. См. рис. 2 для примера.
    • Если компиляция успешна, Студия создает и сохраняет скомпилированный файл с тем, чтобы в дальнейшем перенести обновленные файлы на удаленные серверы с помощью процедуры развертывания проекта.
  • После компиляции последнего файла, если в процессе компиляции не найдено ни одной ошибки, компиляция считается успешной и, в зависимости от типа компиляции и настроек развертывания проектов, Студия может выполнить следующие действия:
    • Если производилась полная безусловная компиляция, либо не используется опция "увеличивать номер сборки только при безусловной компиляции" (см. установки проекта), будет увеличен текущий номер сборки проекта и создана новая строка наименования версии проекта. Кроме того, будет выведена информация по количеству строк в проекте и общем размере кода проекта (см. рис. 1).
    • Если в проекте заданы серверы развертывания проекта и по крайней мере на одном сервере установлена опция "Развертывать обновление на данном сервере после любой компиляции" (обычно такая опция задает для локального сервера, с которым работает разработчик проекта), будет автоматически вызван диалог развертывания проектов и будет выполнена попытка развернуть изменения на серверах с упомянутой опцией.