/koda-builder

PHP extension generator from PHP

Primary LanguagePHP

Koda [Underconstruction]

Koda - преобразователь PHP библиотеки в PHP расширение. Build Status

Суть проекта преобразовать набор 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.