ݺߣ

ݺߣShare a Scribd company logo
Zephir
Еще один язык программирования
О чем будем слушать?
• Суть интерпретируемого PHP и как с этим
жить.
• Панацея Zephir. “А что там под капотом?”
• “Как выучить Zephir за 21 день.”
• Что же будет дальше?
Суть интерпретируемого
PHP и как с этим жить.
Переменные
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;
Массивы
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;
Функции
• Создание стека для функции.
• Передача аргументов в стек.
• Вызов функции.
• Парсинг аргументов.
• Логика.
• Возврат значений.
• Удаление стека.
нацея Zephir. “А что там под капотом
Zephir - Zend Engine Php
Intermediate
Zephir - высокоуровневый язык программирования
для быстрого и простого создания PHP extensions.
Мотивация
• С — сложно.
• 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,
"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
Чем отличается от PHP
• Декларативный стиль.
• Статическая/динамическая типизация.
• Пространства имен - обязательно!
• Запрещен глобальный код.
• Компиляция Ahead-of-time.
• Безопасная работа с памятью.
Динамическая типизация
Практически ничем не отличается от 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;
Поддерживаемые типы
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
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";
Немного переменных
String
Char
Array
Long
Double
Встроенные методы
Функционал в объектно-ориентированном стиле
для всех имеющихся типов
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
Встроенные методы для 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));
• Парадигма ООП.
• Один файл - один класс.
Пространства имен
mylibrary/router.zep mylibrary/router/exception.zep
Методы/Функции
• Можем указать тип возвращаемых
данных.
• Можем указать тип параметров.
• Тип передаваемого аргумента
приводится к ожидаемому в случае, если
они не совпадают, и это возможно.
• Можем указать read-only параметры.
• Имеем сахар для get, set, toString.
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;
}
}
Маленький класс
Имеем возможность использовать функции
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;
}
}
Функции
Не можем присвоить результат функции к
переменной статического типа.
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;
}
}
Функции
config.json
• Оптимизации при трансляции.
• Warnings при статическом анализе.
• Глобальные переменные на расширение.
• Общая информация.
• Блок phpinfo()
Оптимизации при трансляции
• 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
Function call optimizers
• Уходим от PHP_FUNCTION.
• Используем функции вшитые в C или
пишем свои.
Подмена вызовов типичных функций из
ядра Zend Engine на оптимизированные свои.
Алгоритм работы
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 Runtime
• ZephirVM
https://pledgie.com/campaigns/27405
Материальная помощь
Переписать часть ядра Symfony на Zephir.
@firec0der
Мои планы

More Related Content

What's hot (19)

Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
Infinity
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
Ontico
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo
лекция 4
лекция 4лекция 4
лекция 4
Надежда Бровко
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
Badoo Development
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
Sergey Staroletov
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Sergey Platonov
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
Внешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlibВнешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlib
Andrey Vlasovskikh
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
GeeksLab Odessa
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
Vladimir Kochetkov
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
Infinity
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
Ontico
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
Badoo Development
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
Sergey Staroletov
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Sergey Platonov
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
Внешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlibВнешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlib
Andrey Vlasovskikh
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
GeeksLab Odessa
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
Vladimir Kochetkov

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

Javascript 1
Javascript 1Javascript 1
Javascript 1
Andrey Dolinin
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
CodeFest
Blackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложенийBlackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложений
beched
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
Yuri Trukhin
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
About Python
About PythonAbout Python
About Python
Yury Yurevich
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
Иван Кочуркин
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
Mail.ru Group
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Yandex
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
Open-IT
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
Alexander Kucherenko
The basic design of the PHP language
 The basic design of the PHP language The basic design of the PHP language
The basic design of the PHP language
Vladimir Burdaev
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
Roman Timushev
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
Nikita Baksalyar
Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст применения
Nikita Baksalyar
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Mail.ru Group
Enter: legacy code
Enter: legacy codeEnter: legacy code
Enter: legacy code
Kamil Samigullin
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
CodeFest
Blackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложенийBlackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложений
beched
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
Иван Кочуркин
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
Mail.ru Group
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Yandex
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
Open-IT
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
Alexander Kucherenko
The basic design of the PHP language
 The basic design of the PHP language The basic design of the PHP language
The basic design of the PHP language
Vladimir Burdaev
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
Roman Timushev
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
Nikita Baksalyar
Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст применения
Nikita Baksalyar
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Mail.ru Group

More from Oleg Poludnenko (12)

Дмитрий Красун: Сегодня вы уйдете с новым представлением о REST
Дмитрий Красун: Сегодня вы уйдете с новым представлением о RESTДмитрий Красун: Сегодня вы уйдете с новым представлением о REST
Дмитрий Красун: Сегодня вы уйдете с новым представлением о REST
Oleg Poludnenko
Александр Трищенко: PHP 7 Evolution
Александр Трищенко: PHP 7 EvolutionАлександр Трищенко: PHP 7 Evolution
Александр Трищенко: PHP 7 Evolution
Oleg Poludnenko
Александр Трищенко: Phalcon framework
Александр Трищенко: Phalcon frameworkАлександр Трищенко: Phalcon framework
Александр Трищенко: Phalcon framework
Oleg Poludnenko
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHP
Oleg Poludnenko
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Oleg Poludnenko
Алексей Рыстенко: Highload и микросервисы
Алексей Рыстенко: Highload и микросервисыАлексей Рыстенко: Highload и микросервисы
Алексей Рыстенко: Highload и микросервисы
Oleg Poludnenko
Алексей Плеханов: Новинки Laravel 5
Алексей Плеханов: Новинки Laravel 5Алексей Плеханов: Новинки Laravel 5
Алексей Плеханов: Новинки Laravel 5
Oleg Poludnenko
Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥
Oleg Poludnenko
Дмитрий Тарасов: Google App Engine & PHP SDK
Дмитрий Тарасов: Google App Engine & PHP SDKДмитрий Тарасов: Google App Engine & PHP SDK
Дмитрий Тарасов: Google App Engine & PHP SDK
Oleg Poludnenko
Алексей Рыстенко: Continuous Integration
Алексей Рыстенко: Continuous IntegrationАлексей Рыстенко: Continuous Integration
Алексей Рыстенко: Continuous Integration
Oleg Poludnenko
Илья Андриенко: Вёрстка в проекте глазами “неверстальщика”
Илья Андриенко: Вёрстка в проекте глазами  “неверстальщика”Илья Андриенко: Вёрстка в проекте глазами  “неверстальщика”
Илья Андриенко: Вёрстка в проекте глазами “неверстальщика”
Oleg Poludnenko
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать Laravel
Oleg Poludnenko
Дмитрий Красун: Сегодня вы уйдете с новым представлением о REST
Дмитрий Красун: Сегодня вы уйдете с новым представлением о RESTДмитрий Красун: Сегодня вы уйдете с новым представлением о REST
Дмитрий Красун: Сегодня вы уйдете с новым представлением о REST
Oleg Poludnenko
Александр Трищенко: PHP 7 Evolution
Александр Трищенко: PHP 7 EvolutionАлександр Трищенко: PHP 7 Evolution
Александр Трищенко: PHP 7 Evolution
Oleg Poludnenko
Александр Трищенко: Phalcon framework
Александр Трищенко: Phalcon frameworkАлександр Трищенко: Phalcon framework
Александр Трищенко: Phalcon framework
Oleg Poludnenko
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHP
Oleg Poludnenko
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Oleg Poludnenko
Алексей Рыстенко: Highload и микросервисы
Алексей Рыстенко: Highload и микросервисыАлексей Рыстенко: Highload и микросервисы
Алексей Рыстенко: Highload и микросервисы
Oleg Poludnenko
Алексей Плеханов: Новинки Laravel 5
Алексей Плеханов: Новинки Laravel 5Алексей Плеханов: Новинки Laravel 5
Алексей Плеханов: Новинки Laravel 5
Oleg Poludnenko
Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥
Oleg Poludnenko
Дмитрий Тарасов: Google App Engine & PHP SDK
Дмитрий Тарасов: Google App Engine & PHP SDKДмитрий Тарасов: Google App Engine & PHP SDK
Дмитрий Тарасов: Google App Engine & PHP SDK
Oleg Poludnenko
Алексей Рыстенко: Continuous Integration
Алексей Рыстенко: Continuous IntegrationАлексей Рыстенко: Continuous Integration
Алексей Рыстенко: Continuous Integration
Oleg Poludnenko
Илья Андриенко: Вёрстка в проекте глазами “неверстальщика”
Илья Андриенко: Вёрстка в проекте глазами  “неверстальщика”Илья Андриенко: Вёрстка в проекте глазами  “неверстальщика”
Илья Андриенко: Вёрстка в проекте глазами “неверстальщика”
Oleg Poludnenko
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать Laravel
Oleg Poludnenko

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

  • 1. Zephir Еще один язык программирования
  • 2. О чем будем слушать? • Суть интерпретируемого PHP и как с этим жить. • Панацея Zephir. “А что там под капотом?” • “Как выучить Zephir за 21 день.” • Что же будет дальше?
  • 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. Массивы 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. Функции • Создание стека для функции. • Передача аргументов в стек. • Вызов функции. • Парсинг аргументов. • Логика. • Возврат значений. • Удаление стека.
  • 7. нацея Zephir. “А что там под капотом
  • 8. Zephir - Zend Engine Php Intermediate Zephir - высокоуровневый язык программирования для быстрого и простого создания PHP extensions.
  • 9. Мотивация • С — сложно. • Zend Engine — сложно + страшно + долго. • С+Zend Engine — (сложно+страшно)^2.
  • 10. Решение Zephir — DSL (Domain Specific Language).
  • 11. *.zep С-parser (json) Static analysis + Block Optimisation Code generation + Optimisation С + Zephir Kernel Make files Что под капотом?
  • 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. Чем отличается от PHP • Декларативный стиль. • Статическая/динамическая типизация. • Пространства имен - обязательно! • Запрещен глобальный код. • Компиляция Ahead-of-time. • Безопасная работа с памятью.
  • 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;
  • 16. Статическая типизация • Более эффективный статический анализ кода при компиляции. • Возможность провести дополнительные оптимизации при компиляции. • Лучший выбор для высокопроизводительных приложений.
  • 17. Поддерживаемые типы boolean unsigned integer/integer unsigned char/char unsigned long/long float/double string array
  • 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. String Char Array Long Double Встроенные методы Функционал в объектно-ориентированном стиле для всех имеющихся типов
  • 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. Встроенные методы для 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. • Парадигма ООП. • Один файл - один класс. Пространства имен mylibrary/router.zep mylibrary/router/exception.zep
  • 23. Методы/Функции • Можем указать тип возвращаемых данных. • Можем указать тип параметров. • Тип передаваемого аргумента приводится к ожидаемому в случае, если они не совпадают, и это возможно. • Можем указать read-only параметры. • Имеем сахар для get, set, toString.
  • 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. Имеем возможность использовать функции 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. Не можем присвоить результат функции к переменной статического типа. 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. config.json • Оптимизации при трансляции. • Warnings при статическом анализе. • Глобальные переменные на расширение. • Общая информация. • Блок phpinfo()
  • 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. Function call optimizers • Уходим от PHP_FUNCTION. • Используем функции вшитые в C или пишем свои. Подмена вызовов типичных функций из ядра Zend Engine на оптимизированные свои.
  • 30. Алгоритм работы 1. $ zephir init test 2. Пишем код проекта. 3. $ zephir build 4. Add extension=test.so to your php.ini
  • 31. Дополнительные возможности • Генерация автокомплита для IDE • Генерация документации
  • 32. Будущее Zephir • PHP 7 (Zend Engine 3) • Больше оптимизаций • Переработка архитектуры на компоненты • Развитие Zephir Runtime • ZephirVM
  • 34. Переписать часть ядра Symfony на Zephir. @firec0der Мои планы