Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Иван Стеценко: ЯП Zephir. Панацея или лечение?

Доклад с PUG#6 https://www.facebook.com/events/837043689707114/

Поговорим о:
- сути интерпретируемого PHP, обсудим, как с этим жить;
- панацее Zephir. «А что там под капотом?»;
- наглядном профите. Поиграем с Symfony, Yii, Magento;
- будущем Zephir.

  • Be the first to comment

  • Be the first to like this

Иван Стеценко: ЯП Zephir. Панацея или лечение?

  1. 1. Zephir Еще один язык программирования
  2. 2. О чем будем слушать? • Суть интерпретируемого PHP и как с этим жить. • Панацея Zephir. “А что там под капотом?” • “Как выучить Zephir за 21 день.” • Что же будет дальше?
  3. 3. Суть интерпретируемого PHP и как с этим жить.
  4. 4. Переменные typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } zvalue_value; typedef struct _zval_struct { zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; } zval;
  5. 5. Массивы typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement; Bucket *pInternalPointer; Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; zend_bool bApplyProtection; #if ZEND_DEBUG int inconsistent; #endif } HashTable; typedef struct bucket { ulong h; uint nKeyLength; void *pData; void *pDataPtr; struct bucket *pListNext; struct bucket *pListLast; struct bucket *pNext; struct bucket *pLast; const char *arKey; } Bucket;
  6. 6. Функции • Создание стека для функции. • Передача аргументов в стек. • Вызов функции. • Парсинг аргументов. • Логика. • Возврат значений. • Удаление стека.
  7. 7. нацея Zephir. “А что там под капотом
  8. 8. Zephir - Zend Engine Php Intermediate Zephir - высокоуровневый язык программирования для быстрого и простого создания PHP extensions.
  9. 9. Мотивация • С — сложно. • Zend Engine — сложно + страшно + долго. • С+Zend Engine — (сложно+страшно)^2.
  10. 10. Решение Zephir — DSL (Domain Specific Language).
  11. 11. *.zep С-parser (json) Static analysis + Block Optimisation Code generation + Optimisation С + Zephir Kernel Make files Что под капотом?
  12. 12. AST namespace Test; abstract class SimpleClass { abstract public function simpleMethod(string something); } [ { "char": 8, "file": "/User/firecoder/test/simpleclass.zep", "line": 3, "name": "Test", "type": "namespace" }, { "abstract": 1, "char": 14, "file": "/User/firecoder/test/simpleclass.zep", "final": 0, "line": 3, "name": "SimpleClass", "type": "class" "definition": { "char": 14, "file": "/User/firecoder/test/simpleclass.zep", "line": 3, "methods": [ { "char": 28, "file": "/User/firecoder/test/simpleclass.zep", "line": 5, "name": "simpleMethod", "parameters": [ { "char": 59, "const": 0, "data-type": "string", "file": "/User/firecoder/test/simpleclass.zep", "line": 5, "mandatory": 0, "name": "something", "reference": 0, "type": "parameter" } ], "type": "method", "visibility": [ "abstract", "public" ] } ] } } ] $HOME/test/simpleclass.zep
  13. 13. Чем отличается от PHP • Декларативный стиль. • Статическая/динамическая типизация. • Пространства имен - обязательно! • Запрещен глобальный код. • Компиляция Ahead-of-time. • Безопасная работа с памятью.
  14. 14. Динамическая типизация Практически ничем не отличается от PHP Декларативный стиль: объявили и только после используем var a, b, c; // Initialize variables let a = "hello", b = false; // Change their values let a = 10, b = “140"; // Perform operations between them let c = a + b;
  15. 15. Поддерживаемые типы boolean integer float/double string array object resource null
  16. 16. Статическая типизация • Более эффективный статический анализ кода при компиляции. • Возможность провести дополнительные оптимизации при компиляции. • Лучший выбор для высокопроизводительных приложений.
  17. 17. Поддерживаемые типы boolean unsigned integer/integer unsigned char/char unsigned long/long float/double string array
  18. 18. // Dynamical var a = 1; // arrays var b = [1, 2, 3]; array b = [1, 2, 3]; array c = [1: 'a', "index": false]; // Statical int a = -1; let a = false; // automatically casted to 0 let a = "string"; // throws a compiler exception uint a = 1; float pi = 3.14; bool a = true; string a = "Test string"; char a = 'A'; // Objects var myObject; let myObject = new stdClass(), myObject->property = "value"; Немного переменных
  19. 19. String Char Array Long Double Встроенные методы Функционал в объектно-ориентированном стиле для всех имеющихся типов
  20. 20. string s; s->length(); // strlen() s->trim(); // trim() s->upperfirst(); // ucfirst() array a = [1: "one", "two": 2]; a->rev(); // array_reverse() a->keys(); // array_keys() a->hasKey(“one”); array b; a->merge(b) // array_merge() int a = -1; a->pow(2); Встроенные методы https://github.com/phalcon/zephir/tree/master/Library/Types
  21. 21. Встроенные методы для array array arr, usigned, signed; arr = [1, 5, -200, 666, -15]; arr->walk( function(int value) { if (value >= 0) { let signed[] = value; } else { let usigned[] = value; } } ); array arr = [1, 4, 42, 6, 100500]; array powArray = arr->map(value => pow(value, 4));
  22. 22. • Парадигма ООП. • Один файл - один класс. Пространства имен mylibrary/router.zep mylibrary/router/exception.zep
  23. 23. Методы/Функции • Можем указать тип возвращаемых данных. • Можем указать тип параметров. • Тип передаваемого аргумента приводится к ожидаемому в случае, если они не совпадают, и это возможно. • Можем указать read-only параметры. • Имеем сахар для get, set, toString.
  24. 24. namespace Test; class Hello { const HELLO = "hello"; protected customString = null { get, set }; public function say(string word) -> string { return word; } public function sayHelloTo(string! name) -> string { return this::HELLO . " " . name; } public function sayHello() { return this::HELLO; } } Маленький класс
  25. 25. Имеем возможность использовать функции PHP. namespace MyLibrary; class Encoder { public function encode(string text) { if strlen(text) != 0 { if function_exists("my_custom_encoder") { return my_custom_encoder(text); } else { return base64_encode(text); } } return false; } } Функции
  26. 26. Не можем присвоить результат функции к переменной статического типа. namespace MyLibrary; class Encoder { public function encode(string text) -> string | bool { string encoded = ""; if strlen(text) != 0 { let encoded = (string) base64_encode(text); return '(' . encoded . ')'; } return false; } } Функции
  27. 27. config.json • Оптимизации при трансляции. • Warnings при статическом анализе. • Глобальные переменные на расширение. • Общая информация. • Блок phpinfo()
  28. 28. Оптимизации при трансляции • static-type-inference • static-type-inference-second-pass • local-context-pass • constant-folding • static-constant-class-folding • call-gatherer-pass Включить: $ zephir -fstatic-type-inference -flocal-context-pass build
  29. 29. Function call optimizers • Уходим от PHP_FUNCTION. • Используем функции вшитые в C или пишем свои. Подмена вызовов типичных функций из ядра Zend Engine на оптимизированные свои.
  30. 30. Алгоритм работы 1. $ zephir init test 2. Пишем код проекта. 3. $ zephir build 4. Add extension=test.so to your php.ini
  31. 31. Дополнительные возможности • Генерация автокомплита для IDE • Генерация документации
  32. 32. Будущее Zephir • PHP 7 (Zend Engine 3) • Больше оптимизаций • Переработка архитектуры на компоненты • Развитие Zephir Runtime • ZephirVM
  33. 33. https://pledgie.com/campaigns/27405 Материальная помощь
  34. 34. Переписать часть ядра Symfony на Zephir. @firec0der Мои планы

×