How to port applications to KolibriOS/ru

From KolibriOS wiki
Revision as of 20:37, 8 December 2009 by Kogemyaka (talk | contribs) (New page: Цель портирования состоит в переносе приложения из одной ОС в другую, без переписывания большей част...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Цель портирования состоит в переносе приложения из одной ОС в

другую, без переписывания большей части кода. Для портирования

требуется иметь исходники нужной программы.

Здесь я расскажу о процессе портирования приложений в Колибри на

примере SQLite - движка БД.

Критерии выбора приложения для портирования

Некоторые приложения портировать проще, чем другие. Поэтому из

приложений со сходными возможностями следует выбирать то,

которое портировать проще.

  • Требуется, чтобы приложение было написано на языке, компилятор

которого для Колибри существует. Или же нужно перевести исходный

код на поддерживаемый язык. В общем, нет особых причин

предпочитать ЯВУ ассемблеру, или наоборот.

  • Чем меньше функций ОС используется, тем лучше. Это объясняется

тем, что для каждой функции ОС, используемой приложением,

требуется найти или написать эквивалент в Колибри. В некоторых

случаях, впрочем, можно оставить вместо этого "затычку", которая

ничего не делает, так, например, я поступил с блокировкой файлов в

SQLite.

  • Предпочтительнее выбирать изначально кроссплатформенные

приложения, т.к. в них уже предусмотрена возможность переноса. В

частности, все вызовы функций ОС часто сгруппированы и не

приходится их искать по всему тексту.

  • Чем меньше объем исходников, тем лучше.
  • Если исходники написаны в хорошем стиле, их гораздо проще читать

и редактировать. Чем меньше в коде всевозможных хитростей и

трюков, тем проще портировать приложение.

  • Приложения, написанные в средах быстрой разработки, вроде Delphi,

переносить очень тяжело, т.к. код собственно приложения может быть

очень мал, однако код библиотек очень велик. Приложения, которые

используют API ОС, лучше.

  • Иногда бывает полезно сократить возможности приложения, т.е.

портировать его часть, отбросив остальной код. Или же выбрать для

портирования раннюю версию программы, код которой меньше по

размеру и использует меньше внешних функций.

Определение внешних зависимостей

На этом этапе нужно написать список функций ОС (или функций

внешних библиотек, которые не были портированы в Колибри),

которые использует данная программа. Достаточно простой способ

это сделать, если программа написана на С - это удалить ссылки на h

-файлы (или спрятать от компилятора эти файлы), и посмотреть, на

что ругается компилятор.

Написание эквивалентов внешних функций

Для каждой функции, выявленной на этапе 2, требуется написать

"обертку" - функцию с теми же параметрами, но работающую в

Колибри.

Пример: приложение использует функцию malloc() стандартной

библиотеки С.


Пишем функцию:

void * malloc(int size)
{
	__asm
	{
		mov eax, 68
		mov	ebx, 12
		mov ecx, size
		int 0x40
	}
}

Эта функция выполняет динамическое выделение памяти, но уже в

Колибри. Соответственно все вызовы функции malloc() теперь будут

использовать системные вызовы Колибри и работать в этой ОС. Отдельного внимания заслуживают файлы, лежащие на SVN в kolibrios.org\programs\develop\ktcc\trunk\libc\ Там находятся реализации большого количества функций стандартной

библиотеки С. Есть еще menuetlibc для GNU C.

Некоторые замечания

  • Для программ, которые активно используют стек, возможно,

потребуется увеличить значение в заголовке, устанавливающее

размер стека.

  • Если есть возможность, следует использовать тот компилятор,

который рекомендуют авторы программы.