Использование COLLAPSE в проектах MCK.

Установка COLLAPSE. Выделите для размещения COLLAPSE директорию, например C:\KOL\Prj\COLLAPSE и распакуйте в нее архив дистрибутива (Ниже, если путь начинается с COLLAPSE, то имеется в виду эта директория).

П-код генерируется в MCK для всех форм автоматически (еще до установки COLLAPSE). В случае, если на форме используются design-time компоненты, для которых генерация П-кода еще не реализована, П-код не генерируется. Отследить эту ситуацию визуально возможно следующими способами:

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

Вот теперь можно убедиться, что inc-файлы содержат П-код, и вызвать П-компилятор. После его завершения все файлы проекта, содержащие П-код, модифицируются и для П-кода формируется откомпилированный ассемблерный код (он содержит только директивы данных DB, DW и DD и начинается с одного из байтов $E4..$E7 вызова одной из процедур RunPCodeN, N=0..3). Осталось запустить полученный проект на исполнение и убедиться, что он работает так же, как и раньше. (Если не так же, то это какая-то ошибка, пишите мне или автору зеркала, вероятна проблема с генерацией П-кода в каком-либо из них). Если требуется запустить П-код на отладку, добавьте в опции проекта символ COLLAPSE_DEBUG (путь к отладчику должен быть прописан в PCompiler.cfg в ключе /D).

В процессе компиляции ассемблерного кода, выданного П-компилятором, Dephi может обнаружить некоторые ошибки.

Теперь можно сравнивать размер исходного exe-файла, без опции Pcode. Для проектов достаточно мелких П-код не приносит выгоды, поскольку первоначально в код программы добавляется 500-600 байт, и уже после этого код начинает постепенно сокращаться. Эффект по уменьшению кода наступает для достаточно больших проектов, при большом размере инициализирующих процедур (т.е. при большом количестве MCK-компонентов на формах), поскольку П-код все-таки в 2 с лишним раза компактнее оригинального Паскаль-кода. Еще большего эффекта, кстати, можно ожидать в случае сжатия проекта какой-либо программой упаковки (например, UPX). П-код не содержит относительных смещений в себе, и может сжиматься по крайней мере не хуже, а то и лучше, чем оригинальный машинный код.

Если в коде проекта имеются другие длинные (и очень длинные) инициализирующие куски кода, например, в OnShow, то их тоже может иметь смысл перекодировать вручную в П-код и подвергнуть П-компиляции. См. соответствующий документ. Если у вас есть компонент KOL с зеркалом MCK и вы хотите его сделать П-кодированным, то вам понадобится так же научить его в design-time строить П-код, аналогично тому, как это делают основные MCK-компоненты. См. так же соответствующую инструкцию.

Дополнительная возможность Collapse: если в файле Collapse.pas раскомментарить строку {$DEFINE NOEXCEPTIONONEXIT}, то при возникновении любого исключения при завершении приложения, исключение будет подавлено, и выполнена системная процедура Halt. Если вам действительно нужно такое поведение, желательно так же выставить переменную AppletTerminating в значение TRUE как только приложение решает начать процедуру завершения (возможно не только в обработчике OnClose главной формы, но и при любом другом способе завершения, чем раньше, тем лучше. В частности, если установить эту переменную в true при запуске приложения, то любое необработанное исключение немедленно завершит приложение без каких-либо сообщений).
Примечание: да, я знаю, что это очень плохо, и лучше так никогда не делать. Но, к сожалению, встречаются ситуации, когда причина исключения неустранима и возникает в какой-либо используемой библиотеке или даже в системной функции, и единственный способ побороть исключение на выходе - это просто подавить его. (Пример: мое приложение для просмотра изображений. Оно использует чужой код для распаковки изображений из различных форматов, который может вести себя некорректно при наличии на входе сбойных изображений, или изображений неподдерживаемых форматов).


Владимир Кладов, 3.12.2005, последнее изменение: 21.01.2006