Koda - преобразователь PHP библиотеки в PHP расширение.
Суть проекта преобразовать набор PHP классов в PHP расширение с тем же набором классов для PHP.
Project\MyClass::method($a)
из lib/myclass.php -> Koda преобразования -> Project\MyClass::method($a)
из project.so
Какие преследуются цели:
- Ускорение работы. За счет:
- Все классы сразу вгружены в память
- Ссылки на классы, методы, переменные закешированы на уровсе Си
- Оптимизация методов. Если парсер однозначно видит тип переменной на протяжении всего метода то исользуется алгоритмы работы с примитивным типом вместо контейнера zval.
- Обход call-scope. При жесткой опимизации методы можно вызывать как Си функцию, минуя внутренний механизм PHP вызова методов. В этом случае отладка усложняется и исключения порожденные в расширении могут недосчитаться некторых уровней выова.
- функции PHP, при необходимости, могут быть заменены на более оптимизированные варианты во врмемя преобразования.
- В отличии от HipHop или KPHP нет необходимости менять что-либо в проекте, так как все классы остаются таковыми, но из расширения.
- Ранее закрытые проекты могут распространяться свободно, в виде расширения.
- Если с расширением что-то не так, то можно быстро переключиться на обычный PHP код.
- Реализацию расширения удобно читать на PHP
- Интеграция с composer позволит собрать проект со всеми зависимостями в одно расширение.
- Сопутсвующие анализ кода и генерация документации для расширения.
- Генерация начального расширения из PHP заглушки для будущей работы на ним.
- Возможность подключить и использовать Си библиотеки описываю работу с нимим в PHP [в далеком будущем]
Так как Koda разбирает код библиотеки, то она может собрать максимально полную документацию в формате markdown
с качественной перелинковкой в документации. Для HTTP варианта документации в конечный выраинт будет вкладываться файл index.html
, который будет подгружать через ajax файлы документации в формате markdown
и преобразовывать их в html при помощи pagedown.
Также Koda может производить полный анализ кода по мере его разбора и вести журнал ошибок в коде и замечаний.
Koda идет как зависимость через composer. Лучший вариант Koda должен быть как dev зависимость. После подгрузки пакета Koda в папке vendor/bin/
появляется исполняемый файл koda
.
- Запуск Koda, считывание файла конфигурации из composer.json.
- Composer предоставляет classmap всех классов в проекте и его зависимостях (исключая dev зависимости).
- Koda генерирует необходимые для расширения файлы: config.m4, php_{$name}.c, php_{$name}.h и прочее.
- Koda последовательно обходит все классы для каждого создается .h файл
- Для каждого класса Koda перебирает константы и свойства, регистрируя их в расширении (используется Reflection).
- Для каждого класса Koda перебирает методы, анализирую аргументы и док-блок для определения типа переменных с которыми придется работать (используется Reflection).
- Для тела каждого метода Koda использует PHP-Parser что бы разобрать код на лексемы, которые будут собраны в виде Си кода.
- После завершения работы над классом создается .c файл где описан класс для Zend Engine.
- Компиляция исходников в .so расширение [опционально]
- Запуск тестов проекта, но уже для расширения если они есть, с целью диагностики целостности расширения [опционально]
- Сбор статистики по формату, документированию кода [опционально]
- Zend Engine имеет множество функций для работы с контейнером zval
- Описание методов и аргументов берется из рефлекии и док-блоков
- Если класс бибилиотеки расширяет класс из другой библиотеки то родительский чужой класс так же будет вшит в расширение
- Тяжело будет иммитировать
yield
в Си. Пока есть идея решения черезGOTO
.