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

From KolibriOS wiki
Jump to navigation Jump to search
(New page: Цель портирования состоит в переносе приложения из одной ОС в другую, без переписывания большей част...)
 
 
(5 intermediate revisions by 4 users not shown)
Line 1: Line 1:
Цель портирования состоит в переносе приложения из одной ОС в  
+
Цель портирования состоит в переносе приложения из одной ОС в другую, без переписывания большей части кода. Для портирования требуется иметь исходники нужной программы.
  
другую, без переписывания большей части кода. Для портирования
+
Здесь я расскажу о процессе портирования приложений в Колибри на примере SQLite - движка БД.
 
 
требуется иметь исходники нужной программы.
 
 
 
Здесь я расскажу о процессе портирования приложений в Колибри на  
 
 
 
примере SQLite - движка БД.
 
  
 
== Критерии выбора приложения для портирования ==
 
== Критерии выбора приложения для портирования ==
  
Некоторые приложения портировать проще, чем другие. Поэтому из  
+
Некоторые приложения портировать проще, чем другие. Поэтому из приложений со сходными возможностями следует выбирать то, которое портировать проще.  
 
 
приложений со сходными возможностями следует выбирать то,  
 
 
 
которое портировать проще.  
 
 
 
* Требуется, чтобы приложение было написано на языке, компилятор
 
  
которого для Колибри существует. Или же нужно перевести исходный  
+
* Требуется, чтобы приложение было написано на языке, компилятор которого для Колибри существует. Или же нужно перевести исходный код на поддерживаемый язык. В общем, нет особых причин предпочитать ЯВУ ассемблеру, или наоборот.
  
код на поддерживаемый язык. В общем, нет особых причин
+
* Чем меньше функций ОС используется, тем лучше. Это объясняется тем, что для каждой функции ОС, используемой приложением, требуется найти или написать эквивалент в Колибри. В некоторых случаях, впрочем, можно оставить вместо этого "затычку", которая ничего не делает, так, например, я поступил с блокировкой файлов в SQLite.
  
предпочитать ЯВУ ассемблеру, или наоборот.
+
* Предпочтительнее выбирать изначально кроссплатформенные приложения, т.к. в них уже предусмотрена возможность переноса. В частности, все вызовы функций ОС часто сгруппированы и не приходится их искать по всему тексту.
 
 
* Чем меньше функций ОС используется, тем лучше. Это объясняется
 
 
 
тем, что для каждой функции ОС, используемой приложением,
 
 
 
требуется найти или написать эквивалент в Колибри. В некоторых
 
 
 
случаях, впрочем, можно оставить вместо этого "затычку", которая
 
 
 
ничего не делает, так, например, я поступил с блокировкой файлов в
 
 
 
SQLite.
 
 
 
* Предпочтительнее выбирать изначально кроссплатформенные  
 
 
 
приложения, т.к. в них уже предусмотрена возможность переноса. В  
 
 
 
частности, все вызовы функций ОС часто сгруппированы и не  
 
 
 
приходится их искать по всему тексту.
 
  
 
* Чем меньше объем исходников, тем лучше.  
 
* Чем меньше объем исходников, тем лучше.  
  
* Если исходники написаны в хорошем стиле, их гораздо проще читать  
+
* Если исходники написаны в хорошем стиле, их гораздо проще читать и редактировать. Чем меньше в коде всевозможных хитростей и трюков, тем проще портировать приложение.
 
 
и редактировать. Чем меньше в коде всевозможных хитростей и  
 
 
 
трюков, тем проще портировать приложение.
 
 
 
* Приложения, написанные в средах быстрой разработки, вроде Delphi,
 
 
 
переносить очень тяжело, т.к. код собственно приложения может быть
 
 
 
очень мал, однако код библиотек очень велик. Приложения, которые
 
 
 
используют API ОС, лучше.
 
 
 
* Иногда бывает полезно сократить возможности приложения, т.е.
 
 
 
портировать его часть, отбросив остальной код. Или же выбрать для
 
  
портирования раннюю версию программы, код которой меньше по
+
* Приложения, написанные в средах быстрой разработки, вроде Delphi, переносить очень тяжело, т.к. код собственно приложения может быть очень мал, однако код библиотек очень велик. Приложения, которые используют API ОС, лучше.
  
размеру и использует меньше внешних функций.  
+
* Иногда бывает полезно сократить возможности приложения, т.е. портировать его часть, отбросив остальной код. Или же выбрать для портирования раннюю версию программы, код которой меньше по размеру и использует меньше внешних функций.  
  
 
== Определение внешних зависимостей ==
 
== Определение внешних зависимостей ==
  
На этом этапе нужно написать список функций ОС (или функций  
+
На этом этапе нужно написать список функций ОС (или функций внешних библиотек, которые не были портированы в Колибри), которые использует данная программа. Достаточно простой способ это сделать, если программа написана на С - это удалить ссылки на h-файлы (или спрятать от компилятора эти файлы), и посмотреть, на что ругается компилятор.  
 
 
внешних библиотек, которые не были портированы в Колибри),  
 
 
 
которые использует данная программа. Достаточно простой способ  
 
 
 
это сделать, если программа написана на С - это удалить ссылки на h
 
 
 
-файлы (или спрятать от компилятора эти файлы), и посмотреть, на  
 
 
 
что ругается компилятор.  
 
  
 
== Написание эквивалентов внешних функций ==
 
== Написание эквивалентов внешних функций ==
  
Для каждой функции, выявленной на этапе 2, требуется написать  
+
Для каждой функции, выявленной на этапе 2, требуется написать "обертку" - функцию с теми же параметрами, но работающую в Колибри.  
 
 
"обертку" - функцию с теми же параметрами, но работающую в  
 
 
 
Колибри.
 
 
 
Пример: приложение использует функцию malloc() стандартной
 
 
 
библиотеки С.
 
  
 +
Пример: приложение использует функцию malloc() стандартной библиотеки С.
  
 
Пишем функцию:
 
Пишем функцию:
<PRE>
+
<syntaxhighlight lang="c">
 
void * malloc(int size)
 
void * malloc(int size)
 
{
 
{
Line 103: Line 38:
 
{
 
{
 
mov eax, 68
 
mov eax, 68
mov ebx, 12
+
mov ebx, 12
 
mov ecx, size
 
mov ecx, size
 
int 0x40
 
int 0x40
 
}
 
}
 
}
 
}
</PRE>
+
</syntaxhighlight>
  
Эта функция выполняет динамическое выделение памяти, но уже в  
+
Эта функция выполняет динамическое выделение памяти, но уже в Колибри. Соответственно все вызовы функции malloc() теперь будут использовать системные вызовы Колибри и работать в этой ОС.
 
+
Отдельного внимания заслуживают файлы, лежащие на SVN в ''kolibrios.org\programs\develop\ktcc\trunk\libc\'' Там находятся реализации большого количества функций стандартной библиотеки С.
Колибри. Соответственно все вызовы функции malloc() теперь будут  
+
Есть еще menuetlibc для GNU C, но она устарела, и ее не нужно использовать. Есть более лучшая newlib (больше информации на форуме).
 
 
использовать системные вызовы Колибри и работать в этой ОС.
 
Отдельного внимания заслуживают файлы, лежащие на SVN в
 
''kolibrios.org\programs\develop\ktcc\trunk\libc\''
 
Там находятся реализации большого количества функций стандартной  
 
 
 
библиотеки С.
 
Есть еще menuetlibc для GNU C.
 
  
 
== Некоторые замечания ==
 
== Некоторые замечания ==
  
* Для программ, которые активно используют стек, возможно,  
+
* Для программ, которые активно используют стек, возможно, потребуется увеличить значение в заголовке, устанавливающее размер стека.
 
 
потребуется увеличить значение в заголовке, устанавливающее  
 
 
 
размер стека.
 
  
* Если есть возможность, следует использовать тот компилятор,  
+
* Если есть возможность, следует использовать тот компилятор, который рекомендуют авторы программы.
  
который рекомендуют авторы программы.
+
[[Category:Manuals]]

Latest revision as of 20:13, 26 December 2020

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

Здесь я расскажу о процессе портирования приложений в Колибри на примере 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, но она устарела, и ее не нужно использовать. Есть более лучшая newlib (больше информации на форуме).

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

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