Difference between revisions of "How to port applications to KolibriOS/ru"
(New page: Цель портирования состоит в переносе приложения из одной ОС в другую, без переписывания большей част...) |
m (исправил перевод строк) |
||
Line 1: | Line 1: | ||
− | Цель портирования состоит в переносе приложения из одной ОС в | + | Цель портирования состоит в переносе приложения из одной ОС в другую, без переписывания большей части кода. Для портирования требуется иметь исходники нужной программы. |
− | + | Здесь я расскажу о процессе портирования приложений в Колибри на примере SQLite - движка БД. | |
− | |||
− | |||
− | |||
− | Здесь я расскажу о процессе портирования приложений в Колибри на | ||
− | |||
− | примере SQLite - движка БД. | ||
== Критерии выбора приложения для портирования == | == Критерии выбора приложения для портирования == | ||
− | Некоторые приложения портировать проще, чем другие. Поэтому из | + | Некоторые приложения портировать проще, чем другие. Поэтому из приложений со сходными возможностями следует выбирать то, которое портировать проще. |
− | |||
− | приложений со сходными возможностями следует выбирать то, | ||
− | |||
− | которое портировать проще. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | * Требуется, чтобы приложение было написано на языке, компилятор которого для Колибри существует. Или же нужно перевести исходный код на поддерживаемый язык. В общем, нет особых причин предпочитать ЯВУ ассемблеру, или наоборот. | |
− | + | * Чем меньше функций ОС используется, тем лучше. Это объясняется тем, что для каждой функции ОС, используемой приложением, требуется найти или написать эквивалент в Колибри. В некоторых случаях, впрочем, можно оставить вместо этого "затычку", которая ничего не делает, так, например, я поступил с блокировкой файлов в SQLite. | |
− | приходится их искать по всему тексту. | + | * Предпочтительнее выбирать изначально кроссплатформенные приложения, т.к. в них уже предусмотрена возможность переноса. В частности, все вызовы функций ОС часто сгруппированы и не приходится их искать по всему тексту. |
* Чем меньше объем исходников, тем лучше. | * Чем меньше объем исходников, тем лучше. | ||
− | * Если исходники написаны в хорошем стиле, их гораздо проще читать | + | * Если исходники написаны в хорошем стиле, их гораздо проще читать и редактировать. Чем меньше в коде всевозможных хитростей и трюков, тем проще портировать приложение. |
− | + | * Приложения, написанные в средах быстрой разработки, вроде Delphi, переносить очень тяжело, т.к. код собственно приложения может быть очень мал, однако код библиотек очень велик. Приложения, которые используют API ОС, лучше. | |
− | + | * Иногда бывает полезно сократить возможности приложения, т.е. портировать его часть, отбросив остальной код. Или же выбрать для портирования раннюю версию программы, код которой меньше по размеру и использует меньше внешних функций. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | * Иногда бывает полезно сократить возможности приложения, т.е. | ||
− | |||
− | портировать его часть, отбросив остальной код. Или же выбрать для | ||
− | |||
− | портирования раннюю версию программы, код которой меньше по | ||
− | |||
− | размеру и использует меньше внешних функций. | ||
== Определение внешних зависимостей == | == Определение внешних зависимостей == | ||
− | На этом этапе нужно написать список функций ОС (или функций | + | На этом этапе нужно написать список функций ОС (или функций внешних библиотек, которые не были портированы в Колибри), которые использует данная программа. Достаточно простой способ это сделать, если программа написана на С - это удалить ссылки на h-файлы (или спрятать от компилятора эти файлы), и посмотреть, на что ругается компилятор. |
− | |||
− | внешних библиотек, которые не были портированы в Колибри), | ||
− | |||
− | которые использует данная программа. Достаточно простой способ | ||
− | |||
− | это сделать, если программа написана на С - это удалить ссылки на h | ||
− | |||
− | -файлы (или спрятать от компилятора эти файлы), и посмотреть, на | ||
− | |||
− | что ругается компилятор. | ||
== Написание эквивалентов внешних функций == | == Написание эквивалентов внешних функций == | ||
− | Для каждой функции, выявленной на этапе 2, требуется написать | + | Для каждой функции, выявленной на этапе 2, требуется написать "обертку" - функцию с теми же параметрами, но работающую в Колибри. |
− | |||
− | "обертку" - функцию с теми же параметрами, но работающую в | ||
− | |||
− | Колибри | ||
− | |||
− | |||
− | |||
− | |||
+ | Пример: приложение использует функцию 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.
Некоторые замечания
- Для программ, которые активно используют стек, возможно, потребуется увеличить значение в заголовке, устанавливающее размер стека.
- Если есть возможность, следует использовать тот компилятор, который рекомендуют авторы программы.