|
Статья рассказывает о рантайме встроенном в
OS/2 начиная с версии 4 и о путях его использования.
Так получилось, что сразу после MS (PC)-DOS мне довелось работать на
AIX там я узнал для себя очень много нового и одним из таких знаний стало
то, что в AIX есть библиотека системных функций которую можно динамически
вызывать из своих программ. Благодаря такой функции мои программы на AIX
(даже учитывая, что это RISC процессор) были в разы меньше того, что было
под DOS.
Когда я обнаружил очередное творение IBM (OS/2) для персоналок я установил
его и стал работать на персоналках. Долгие годы разборок с нею и её внутренностями
привели меня в годы использования Warp 3 (с фикспаками) к обнаружению этого
самого рантайма С функций. Он размещался (и по сей день там-же) в DLL файлах
директории \os2\dll\clib*.dll. Я никак не мог смириться с тем, что такая
чудесная вещь никак мною не задействована и я стал копать вширь и вглубь.
В конце концов я скачал ToolKit v4, и нашел там некие средства для использования
этого рантайма, а именно файлы: libc*.lib. Только одно НО, я программирую
в Watcom C а его линкер не понимал форматов этих библиотек. Пришлось ставить
VAC++.
Это всё в прошлом.
Какова ситуация на сегодняшний день?
В OS/2 по прежнему есть рантайм С функций, и по-прежнему его мало кто
использует (я знаю только NetDrive)! Хотя, на мой взгляд преимущества,
его использования очевидны:
-
уменьшается код программ,
-
уменьшается используемая системой память, так как каждая программа уже
не несёт в себе набора используемых С функций,
-
при количестве программ использующих данный рантайм больше одной сокращается
время загрузки приложений, так как библиотека будет уже в памяти.
Что нужно для использования данного рантайма?
-
Компилятор VAC v 3.0.8 (по словам самой IBM VAC++ 3.6.5 не поддерживает
данный рантайм, буду рад если кто-то докажет, что это не так) или Watcom
C (с некоторыми модификациями);
-
OS/2 Toolkit v 4.5 -- это самый последний тулкит для OS/2 и если вы используете
Watcom, то вам необходим именно он.
Прочтите документацию в файле os2tk45\book\xpg4ref.inf там подробно описаны
все функции. К сожалению нет описания библиотек os2tk45\lib\libc*.lib.
Вот что мне удалось выяснить из переписки с составителями ToolKit (в будущих
версиях они включат это в документацию):
The C-runtime DLL's shipped with OS/2 V4.0 (and above) are XPG4
compliant. They are based upon the source code to the VisualAge
C++ rutimes, but are modified to use OS/2 internationalization.
DLL с рантаймом С функций поставляются с 4 версией OS/2 (и выше)
соответствуют стандарту XPG4. Они основаны на исходном коде библиотеке
рантайма от VisualAge, но модифицированы для использования функций интернационализации
имеющейся в OS/2.
The DLL's in question are: (DLL файлы вызвавшие вопросы)
\OS2\DLL\LIBCM.DLL - Multi-threaded library многопоточная версия
\OS2\DLL\LIBCS.DLL - Single-threaded library если у вас один поток в программе
\OS2\DLL\LIBCN.DLL - Subsystem library Subsystem -- используется при написании драйверов
The appropriate compiler flags (-Gm+, -Gm-, and -Rn) should be used
when building code to use these DLL's.
Необходимо использование соответствующих флагов компилятора при
компилировании программ, использующих рантайм: -Gm+, -Gm-, -Rn
The following LIB files should be used if you are building your code
using the _Optlink calling convention (-Mp, the default setting):
Следующие LIB файлы должны быть использованы, если вы компилируете используя стиль вызовов _Optlink (-Mp установка по умолчанию)
libcni.lib - Subsystem library
libcsi.lib - Single-threaded library
libcmi.lib - Multi-threaded library
The following LIB files should be used if you require the _System
calling convention (i.e., you are compiling with the -Ms option):
Файлы перечисленные ниже используются если вы хотите использовать
стиль вызовов _System
libcnsi.lib - Subsystem library
libcssi.lib - Single-threaded library
libcmsi.lib - Multi-threaded library
You must also force the _LNK_CONV identifier to the value of "_System"
prior to including the libc headers.
Вы также должны установить идентификатор _LNK_CONV в значение "_System"
перед использованием файлов заголовков рантайма
Steve Turner, OS/2 Developer's Tools, Austin, TX.
Файлы заголовков рантайма ToolKit v 4.5 расположены в директории os2tk45\h\libc.
Компиляция.
В обоих компиляторах необходимо отключить использование "генерации
информации стандартных библиотек".
Компиляция с VAC++ v 3.0.8 не должна вызвать никаких затруднений, если
кто-то проверит это для версии VAC++ 3.6.5 и напишет комментарий мы (все)
будет только рады. За себя могу сказать что это работает в VAC++ v4.
Watcom тут всё немного сложнее. Внутренности компилятора очень сильно
завязаны на использование внутренних функций работы с памятью, поставляемых
в комплекте с ним. Я имел общение с человеком из Sybase в группе новостей
*.openwatcom на сервере news.scitechsoft.com (именно эта компания является
координатором разработки OpenSource версии компилятора Watcom) и выяснил
следующее: необходимо исключить из стандартной библиотеки функции работы
с памятью, но тогда всё упирается в один внутренний модуль, который к счастью
можно заменить своей пустышкой. Кроме того Watcom при отключении "генерации
информации стандартных библиотек" перестаёт использовать startup code и
вы лишаетесь, например, argv и argc -- параметров командной строки, но
всё это решаемо.
Итак:
Поверьте, игра стоит свеч (свичей? свечей? ).
Если кто-то получит какую-то дополнительную информацию, пожалуйста поделитесь
с нами, чтобы хоть как-то поспособствовать повышению качества программирования
в OS/2.
Обсудить материал (число отзывов:0) предыдущий материал | следующий материал |