How to port applications to KolibriOS/ru: Difference between revisions

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 (больше информации на форуме).

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

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