SlideShare ist ein Scribd-Unternehmen logo
1 von 34
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
Мои планы

Weitere ähnliche Inhalte

Was ist angesagt?

Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
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 BeastAlexander 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++ и JavascriptSergey 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 BeastAlexander Dymo
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Внешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlibВнешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlibAndrey Vlasovskikh
 
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...GeeksLab Odessa
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаVladimir Kochetkov
 

Was ist angesagt? (19)

Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
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
 
лекция 4
лекция 4лекция 4
лекция 4
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
python vs ruby
python vs rubypython vs ruby
python vs ruby
 
бегун
бегунбегун
бегун
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
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
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Внешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlibВнешние языки DSL на funcparserlib
Внешние языки DSL на funcparserlib
 
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
 
бегун
бегунбегун
бегун
 

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

Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
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 actionYuri 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
 
Универсальный сигнатурный анализ кода на 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 languageVladimir 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 NovgorodNikita Baksalyar
 
Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст примененияNikita Baksalyar
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Mail.ru Group
 

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

Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Bytecode
BytecodeBytecode
Bytecode
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Blackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложенийBlackbox-тестирование веб-приложений
Blackbox-тестирование веб-приложений
 
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
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
About Python
About PythonAbout Python
About Python
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
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
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст применения
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
 
Enter: legacy code
Enter: legacy codeEnter: legacy code
Enter: legacy code
 
Php
PhpPhp
Php
 

Mehr von Oleg Poludnenko

Дмитрий Красун: Сегодня вы уйдете с новым представлением о REST
Дмитрий Красун: Сегодня вы уйдете с новым представлением о RESTДмитрий Красун: Сегодня вы уйдете с новым представлением о REST
Дмитрий Красун: Сегодня вы уйдете с новым представлением о RESTOleg Poludnenko
 
Александр Трищенко: PHP 7 Evolution
Александр Трищенко: PHP 7 EvolutionАлександр Трищенко: PHP 7 Evolution
Александр Трищенко: PHP 7 EvolutionOleg Poludnenko
 
Александр Трищенко: Phalcon framework
Александр Трищенко: Phalcon frameworkАлександр Трищенко: Phalcon framework
Александр Трищенко: Phalcon frameworkOleg Poludnenko
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPOleg Poludnenko
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Oleg Poludnenko
 
Алексей Рыстенко: Highload и микросервисы
Алексей Рыстенко: Highload и микросервисыАлексей Рыстенко: Highload и микросервисы
Алексей Рыстенко: Highload и микросервисыOleg Poludnenko
 
Алексей Плеханов: Новинки Laravel 5
Алексей Плеханов: Новинки Laravel 5Алексей Плеханов: Новинки Laravel 5
Алексей Плеханов: Новинки Laravel 5Oleg 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 SDKOleg Poludnenko
 
Алексей Рыстенко: Continuous Integration
Алексей Рыстенко: Continuous IntegrationАлексей Рыстенко: Continuous Integration
Алексей Рыстенко: Continuous IntegrationOleg Poludnenko
 
Илья Андриенко: Вёрстка в проекте глазами “неверстальщика”
Илья Андриенко: Вёрстка в проекте глазами  “неверстальщика”Илья Андриенко: Вёрстка в проекте глазами  “неверстальщика”
Илья Андриенко: Вёрстка в проекте глазами “неверстальщика”Oleg Poludnenko
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelOleg Poludnenko
 

Mehr von Oleg Poludnenko (12)

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

Иван Стеценко: ЯП 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 Мои планы