Difference between revisions of "How to port applications to KolibriOS/ru"

From KolibriOS wiki
Jump to navigation Jump to search
(New page: Цель портирования состоит в переносе приложения из одной ОС в другую, без переписывания большей част...)
 
m (исправил перевод строк)
Line 1: Line 1:
Цель портирования состоит в переносе приложения из одной ОС в  
+
Цель портирования состоит в переносе приложения из одной ОС в другую, без переписывания большей части кода. Для портирования требуется иметь исходники нужной программы.
  
другую, без переписывания большей части кода. Для портирования
+
Здесь я расскажу о процессе портирования приложений в Колибри на примере SQLite - движка БД.
 
 
требуется иметь исходники нужной программы.
 
 
 
Здесь я расскажу о процессе портирования приложений в Колибри на  
 
 
 
примере SQLite - движка БД.
 
  
 
== Критерии выбора приложения для портирования ==
 
== Критерии выбора приложения для портирования ==
  
Некоторые приложения портировать проще, чем другие. Поэтому из  
+
Некоторые приложения портировать проще, чем другие. Поэтому из приложений со сходными возможностями следует выбирать то, которое портировать проще.  
 
 
приложений со сходными возможностями следует выбирать то,  
 
 
 
которое портировать проще.  
 
 
 
* Требуется, чтобы приложение было написано на языке, компилятор
 
 
 
которого для Колибри существует. Или же нужно перевести исходный
 
 
 
код на поддерживаемый язык. В общем, нет особых причин
 
 
 
предпочитать ЯВУ ассемблеру, или наоборот.
 
 
 
* Чем меньше функций ОС используется, тем лучше. Это объясняется
 
 
 
тем, что для каждой функции ОС, используемой приложением,
 
 
 
требуется найти или написать эквивалент в Колибри. В некоторых
 
 
 
случаях, впрочем, можно оставить вместо этого "затычку", которая
 
 
 
ничего не делает, так, например, я поступил с блокировкой файлов в
 
 
 
SQLite.
 
 
 
* Предпочтительнее выбирать изначально кроссплатформенные
 
  
приложения, т.к. в них уже предусмотрена возможность переноса. В
+
* Требуется, чтобы приложение было написано на языке, компилятор которого для Колибри существует. Или же нужно перевести исходный код на поддерживаемый язык. В общем, нет особых причин предпочитать ЯВУ ассемблеру, или наоборот.
  
частности, все вызовы функций ОС часто сгруппированы и не  
+
* Чем меньше функций ОС используется, тем лучше. Это объясняется тем, что для каждой функции ОС, используемой приложением, требуется найти или написать эквивалент в Колибри. В некоторых случаях, впрочем, можно оставить вместо этого "затычку", которая ничего не делает, так, например, я поступил с блокировкой файлов в SQLite.
  
приходится их искать по всему тексту.
+
* Предпочтительнее выбирать изначально кроссплатформенные приложения, т.к. в них уже предусмотрена возможность переноса. В частности, все вызовы функций ОС часто сгруппированы и не приходится их искать по всему тексту.
  
 
* Чем меньше объем исходников, тем лучше.  
 
* Чем меньше объем исходников, тем лучше.  
  
* Если исходники написаны в хорошем стиле, их гораздо проще читать  
+
* Если исходники написаны в хорошем стиле, их гораздо проще читать и редактировать. Чем меньше в коде всевозможных хитростей и трюков, тем проще портировать приложение.
  
и редактировать. Чем меньше в коде всевозможных хитростей и
+
* Приложения, написанные в средах быстрой разработки, вроде Delphi, переносить очень тяжело, т.к. код собственно приложения может быть очень мал, однако код библиотек очень велик. Приложения, которые используют API ОС, лучше.  
  
трюков, тем проще портировать приложение.
+
* Иногда бывает полезно сократить возможности приложения, т.е. портировать его часть, отбросив остальной код. Или же выбрать для портирования раннюю версию программы, код которой меньше по размеру и использует меньше внешних функций.  
 
 
* Приложения, написанные в средах быстрой разработки, вроде Delphi,
 
 
 
переносить очень тяжело, т.к. код собственно приложения может быть
 
 
 
очень мал, однако код библиотек очень велик. Приложения, которые
 
 
 
используют API ОС, лучше.
 
 
 
* Иногда бывает полезно сократить возможности приложения, т.е.  
 
 
 
портировать его часть, отбросив остальной код. Или же выбрать для  
 
 
 
портирования раннюю версию программы, код которой меньше по  
 
 
 
размеру и использует меньше внешних функций.  
 
  
 
== Определение внешних зависимостей ==
 
== Определение внешних зависимостей ==
  
На этом этапе нужно написать список функций ОС (или функций  
+
На этом этапе нужно написать список функций ОС (или функций внешних библиотек, которые не были портированы в Колибри), которые использует данная программа. Достаточно простой способ это сделать, если программа написана на С - это удалить ссылки на h-файлы (или спрятать от компилятора эти файлы), и посмотреть, на что ругается компилятор.  
 
 
внешних библиотек, которые не были портированы в Колибри),  
 
 
 
которые использует данная программа. Достаточно простой способ  
 
 
 
это сделать, если программа написана на С - это удалить ссылки на h
 
 
 
-файлы (или спрятать от компилятора эти файлы), и посмотреть, на  
 
 
 
что ругается компилятор.  
 
  
 
== Написание эквивалентов внешних функций ==
 
== Написание эквивалентов внешних функций ==
  
Для каждой функции, выявленной на этапе 2, требуется написать  
+
Для каждой функции, выявленной на этапе 2, требуется написать "обертку" - функцию с теми же параметрами, но работающую в Колибри.  
 
 
"обертку" - функцию с теми же параметрами, но работающую в  
 
 
 
Колибри.
 
 
 
Пример: приложение использует функцию malloc() стандартной
 
 
 
библиотеки С.
 
  
 +
Пример: приложение использует функцию malloc() стандартной библиотеки С.
  
 
Пишем функцию:
 
Пишем функцию:
Line 110: Line 45:
 
</PRE>
 
</PRE>
  
Эта функция выполняет динамическое выделение памяти, но уже в  
+
Эта функция выполняет динамическое выделение памяти, но уже в Колибри. Соответственно все вызовы функции malloc() теперь будут использовать системные вызовы Колибри и работать в этой ОС.
 
+
Отдельного внимания заслуживают файлы, лежащие на SVN в ''kolibrios.org\programs\develop\ktcc\trunk\libc\'' Там находятся реализации большого количества функций стандартной библиотеки С.
Колибри. Соответственно все вызовы функции malloc() теперь будут  
 
 
 
использовать системные вызовы Колибри и работать в этой ОС.
 
Отдельного внимания заслуживают файлы, лежащие на SVN в
 
''kolibrios.org\programs\develop\ktcc\trunk\libc\''
 
Там находятся реализации большого количества функций стандартной  
 
 
 
библиотеки С.
 
 
Есть еще menuetlibc для GNU C.
 
Есть еще menuetlibc для GNU C.
  
 
== Некоторые замечания ==
 
== Некоторые замечания ==
  
* Для программ, которые активно используют стек, возможно,  
+
* Для программ, которые активно используют стек, возможно, потребуется увеличить значение в заголовке, устанавливающее размер стека.
 
 
потребуется увеличить значение в заголовке, устанавливающее  
 
 
 
размер стека.
 
 
 
* Если есть возможность, следует использовать тот компилятор,
 
  
который рекомендуют авторы программы.
+
* Если есть возможность, следует использовать тот компилятор, который рекомендуют авторы программы.

Revision as of 17:08, 9 December 2009

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

Здесь я расскажу о процессе портирования приложений в Колибри на примере 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.

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

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