Некоторые выводы в процессе работы.
В Обероне не нужно перечислять все используемые процедуры, только модули, из которых они импортированы. Обязательная квалификация (т.е. W.GetDC вместо GetDC) однозначно показывает из какого модуля пришла процедура, и даже если программист забыл какой алиас какому модулю соответствует, нет необходимости искать дальше, чем в списке импорта; практика показывает, что это удобно.
В Обероне нельзя игнорировать результат процедуры, что в ряде случаев позволяет пробегая глазами код понять, что этот результат всё-таки есть и, возможно, загвоздка в нём. Кроме того, неиспользование результата процедуры — признак плохого дизайна (хотя конечно в ряде случаев это дизайн не наш — например, в WinAPI).
Для тех случаев, когда результат нам всё-таки совершенно не нужен, я разработал модуль Ignore, который позволяет игнорировать значение указанного типа, заставляя программиста задуматься хотя бы о типе игнорируемого результата. Оверхед у данного модуля нулевой, т.к. его (сишная) реализация состоит из пустых определений.
В Модуле-2 разрешено описывать проинициализированные переменные.
В ADW Modula-2 можно описывать проинициализированные массивы составной структуры (с записями внутри). В XDev благодаря расширению Олега Комлева можно эмулировать эту возможность с помощью константных массивов.
2Saferoll: Олежек, интересное замечание. Я задал константный массив, получил на него указатель (с помощью SYSTEM.ADR) и попробовал изменить значения массива. И что же: скомпилированная tcc программа спокойно работает, а вот скомпилированная MinGW вылетает с исключением по защите памяти. Из чего я делаю вывод: константные данные массива защищаются от изменений. Поэтому такой финт ушами к использованию не рекомендован, а я просто копирую данные из константного массива в неконстантный и там спокойно работаю с ними на чтение и запись.
ADW Modula-2 предоставляет возможности для строго типизированной работы с функциями WinAPI, в частности, вместо нетипизированного DeleteObject можно применить DeletePen, DeleteBrush (с проверкой типа), NULL_HWND, NULL_HBRUSH, NIL_POINT, NIL_RECT вместо обычного NIL (тоже с проверкой типа).
В Обероне процедуры без параметров не требуют обязательных пустых скобок. Кроме тех, которые возвращают результат. Это категорически удобно, потому что по скобкам сразу видно, что это процедура, а не переменная. А процедуры без параметров и результата не засоряются скобками, потому что это и так видно по контексту.
В ADW Modula-2 целочисленное деление обозначено / и это очень сильно напоминает вещественное деление.
В ADW Modula-2 больше типов, чем в XDev Oberon. Например, в последнем нет типа, который в 32-битной Windows имеет 32 бита, а в 64-битной — 64 (строго говоря, такой тип может быть, потому что разрядность типов вообще задаётся кастомно для каждого проекта, и SIZE(INTEGER) даже может быть равно SIZE(LONGINT), но поскольку я сам такое не практикую и вам не советую, то и не будем это рассматривать). Поэтому такой целочисленный тип приходится эмулировать через указатель SYSTEM.PTR. Из побочных эффектов — он инициализируется в NIL, а все значения, присваиваемые этому типу, приходится преобразовывать через SYSTEM.VAL. Но Оберон традиционно обладает небольшим числом встроенных типов. Впрочем, по мере развития проекта XDev что-то, возможно, и будет сделано в этом направлении.
Ofront был очень слабо приспособлен к разработке программ на WinAPI, пришлось внести много изменений. В принципе, я доволен результатами проделанной работы.
ADW Modula-2 даёт размер Clock.exe 15360 байт, XDev Oberon — 10240 байт для 32 бит (это безо всяких упаковщиков; с UPX этот размер вообще 6656 байт) и 12800 байт для 64. Кроме того, наконец-то удалось избавиться от зависимости от msvcrt.dll
Как сгенерировать при помощи ADW Modula-2 64-битное приложение — не разобрался.
Вложения: |
Clock.zip [24.52 КБ]
Скачиваний: 1054
|
|