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
Еще один язык программирования
О чем будем слушать?
• Суть интерпретируемого PHP и как с этим
жить.
• Панацея Zephir. “А что там под капотом?”
• “Как выу...
Суть интерпретируемого
PHP и как с этим жить.
Переменные
typedef union _zvalue_value {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_o...
Массивы
typedef struct _hashtable {
uint nTableSize;
uint nTableMask;
uint nNumOfElements;
ulong nNextFreeElement;
Bucket ...
Функции
• Создание стека для функции.
• Передача аргументов в стек.
• Вызов функции.
• Парсинг аргументов.
• Логика.
• Воз...
нацея Zephir. “А что там под капотом
Zephir - Zend Engine Php
Intermediate
Zephir - высокоуровневый язык программирования
для быстрого и простого создания PHP ...
Мотивация
• С — сложно.
• Zend Engine — сложно + страшно +
долго.
• С+Zend Engine — (сложно+страшно)^2.
Решение
Zephir — DSL (Domain Specific Language).
*.zep
С-parser (json)
Static analysis + Block Optimisation
Code generation + Optimisation
С + Zephir Kernel
Make files
Что...
AST
namespace Test;
abstract class SimpleClass
{
abstract public function simpleMethod(string something);
}
[
{
"char": 8,...
Чем отличается от PHP
• Декларативный стиль.
• Статическая/динамическая типизация.
• Пространства имен - обязательно!
• За...
Динамическая типизация
Практически ничем не отличается от PHP
Декларативный стиль:
объявили и только после используем
var ...
Поддерживаемые типы
boolean
integer
float/double
string
array
object
resource
null
Статическая типизация
• Более эффективный статический
анализ кода при компиляции.
• Возможность провести дополнительные
оп...
Поддерживаемые типы
boolean
unsigned integer/integer
unsigned char/char
unsigned long/long
float/double
string
array
// Dynamical
var a = 1;
// arrays
var b = [1, 2, 3];
array b = [1, 2, 3];
array c = [1: 'a', "index": false];
// Statical
...
String
Char
Array
Long
Double
Встроенные методы
Функционал в объектно-ориентированном стиле
для всех имеющихся типов
string s;
s->length(); // strlen()
s->trim(); // trim()
s->upperfirst(); // ucfirst()
array a = [1: "one", "two": 2];
a->r...
Встроенные методы для array
array arr, usigned, signed;
arr = [1, 5, -200, 666, -15];
arr->walk(
function(int value) {
if ...
• Парадигма ООП.
• Один файл - один класс.
Пространства имен
mylibrary/router.zep mylibrary/router/exception.zep
Методы/Функции
• Можем указать тип возвращаемых
данных.
• Можем указать тип параметров.
• Тип передаваемого аргумента
прив...
namespace Test;
class Hello
{
const HELLO = "hello";
protected customString = null {
get, set
};
public function say(strin...
Имеем возможность использовать функции
PHP.
namespace MyLibrary;
class Encoder
{
public function encode(string text)
{
if ...
Не можем присвоить результат функции к
переменной статического типа.
namespace MyLibrary;
class Encoder
{
public function ...
config.json
• Оптимизации при трансляции.
• Warnings при статическом анализе.
• Глобальные переменные на расширение.
• Общ...
Оптимизации при трансляции
• static-type-inference
• static-type-inference-second-pass
• local-context-pass
• constant-fol...
Function call optimizers
• Уходим от PHP_FUNCTION.
• Используем функции вшитые в C или
пишем свои.
Подмена вызовов типичны...
Алгоритм работы
1. $ zephir init test
2. Пишем код проекта.
3. $ zephir build
4. Add extension=test.so to your php.ini
Дополнительные возможности
• Генерация автокомплита для IDE
• Генерация документации
Будущее Zephir
• PHP 7 (Zend Engine 3)
• Больше оптимизаций
• Переработка архитектуры на компоненты
• Развитие Zephir Runt...
https://pledgie.com/campaigns/27405
Материальная помощь
Переписать часть ядра Symfony на Zephir.
@firec0der
Мои планы
Upcoming SlideShare
Loading in …5
×

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

807 views

Published on

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

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

Published in: Technology
  • 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 Мои планы

×