суббота, 15 сентября 2007 г.

Система: компиляция

[id:26]

X++ — объектно-ориентированный язык программирования. Да вы уже сами догадались об этом. Догадались ли вы о том, что это также интерпретируемый язык? Видимо тоже да. Может удивить вас тем, что результатом компиляции является некий байт-код? А знаете ли вы, что сгенерированный байт-код будет во время исполнения интерпретироваться? И вся эта байткодовая возня ради того, чтобы увеличить скорость ваших решений вы тоже знали?

Сохранение изменений объекта – суть тоже самое, что и компиляция. Скомпилировать объект – это значит, что его также сохранили.

Есть одна неприятная новость, и снова глупенький компилятор. Лучше это прочувствовать самому; поэтому создайте проект с двумя классами в нем: Новый проект Код для классов: class BLG26_BaseClass { public int baseMethod(int _i) { return _i + _i; } } class BLG26_ChildClass extends BLG26_BaseClass { public int baseMethod(int _i) { return super(_i) + super(_i); } static void main(Args args) { BLG26_ChildClass cls = new BLG26_ChildClass(); ; info(strfmt('%1', cls.baseMethod(5))); } } Итак, здесь мы создали два класса — папу и дочку. В дочернем классе перекрыли метод "baseMethod()". И, конечно, создали метод main(), чтобы проверить работу написанного кода. Запустил, увидел цифру 20. Пока все нормально, дальше будет хуже.

Поменяем сигнатуру метода baseMethod() в базовом классе: class BLG26_BaseClass { public real baseMethod(real _i) { return _i + _i; } } Компилируйте базовый класс (в дереве проекта щелкните правой кнопкой мыши на классе "BLG26_BaseClass" и во всплывающем меню выберите пункт «Компилировать»). Все в порядке. Откомпилируйте дочерний класс. И снова: все в порядке! Хотя нужно ожидать ошибки. Ведь перегруженный в дочернем классе метод "baseMethod()" по-прежнему работает с целыми числами и вызывает метод "baseMethod()" своего родителя, вполне законно ожидая, что тот тоже работает с целыми числами. А на самом деле папаша уже переметнулся и манипулирует вещественными переменными. Однако компилятор молчит.
Если вы снова выполните метод "main()" дочернего класса, то снова получите цифру 20.

Выход из сложившегося положения — инкрементная компиляция. Для этого щелкните правой кнопкой на родительском классе — "BLG26_BaseClass" —, пункт «Надстройки», «Инкрементная компиляция»: Спасательный круг - инкрементная компиляция Это действие занимает несколько больше времени, чем просто компиляция, потому что система заново генерирует байт-код для текущего класса и всех его дочек. И, о, чудо! Ошибка найдена! Ошибочка вышла Мне было сказано: «ошибка 85, Перегруженная функция имеет неправильный тип возвращаемого значения».

Итог:
  • Аксапта исполняет предварительно созданый байт-код;
  • инкрементная компиляция поможет в трудную минуту.

Комментариев нет: