Zend Engine изнутри Дмитрий Стогов. Немного истории Zend Engine была разработана в качестве ядра для PHP 4 Andi Gutmans и Zeev Suraski в 1999 PHP 5.0.

Slides:



Advertisements
Similar presentations
Lecture Computer Science I - Martin Hardwick The Programming Process rUse an editor to create a program file (source file). l contains the text of.
Advertisements

Introduction to C++ An object-oriented language Unit - 01.
DEVICE DRIVER VINOD KAMATH CS691X PROJECT WORK. Introduction How to write/install device drivers Systems, Kernel Programming Character, Block and Network.
C Programming Getting Started Getting Started Hello World Hello World Data types and variables Data types and variables main() main() I/O routines I/O.
C’ POINTERS Basic&Examples. Q:what’s the output? int array[] = { 45, 67, 89 }; int *array_ptr = array; printf(" first element: %i\n", *(array_ptr++));
What's new in Microsoft Visual C Preview
Class 15 - Overhead 11Object Oriented Programming Using C #define t_circle 1 #define t_rectangle 2 struct circle_shape {short type; double x,y; double.
Chapter 17 Templates. Generic Algorithms Algorithms in which the actions or steps are defined, but the data types of the items being manipulated are not.
C# Language Report By Trevor Adams. Language History Developed by Microsoft Developed by Microsoft Principal Software Architect Principal Software Architect.
Union, bitfield, typedef, enum union nama_u{ }; union nama_u{ struct nama_s byte; }; enum{ }; Tipedef var BYTE.
Building a JIT compiler for PHP in 2 days Nuno Lopes Instituto Superior Técnico Technical University of Lisbon.
Informática II Prof. Dr. Gustavo Patiño MJ
ООП Классы. Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Что нового в PHP 5.3 Дмитрий Стогов. Немного о себе сотрудник Zend Technologies отдел Advanced Technologies активный разработчик PHP и ZE автор и мантейнер.
Python in PHP: Internals Jon Parise 2002 International PHP Conference Frankfurt, Germany November 6, 2002.
ООП Классы – 2. Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10;
Structure of a C program
1 Генерация контекстных ограничений для баз данных Выполнил: Жолудев В. Научный руководитель: Терехов А.Н. Рецензент: Иванов А.Н.
Apache Harmony или как сделать курсовую работу в рамках этого проекта Фурсов Михаил.
 Нужно много различных протоколов связи  Каждый из них может реализовываться на разных платформах Современные сети Много устройств, компьютеров и сетей.
PHP как язык программирования. Типы данных логические величины int, integer – целые числа real, double, float – вещественные числа string – строки array.
Синтаксис языка Java.
Пользовательские действия (custom actions) в JSP. JSTL.
String C and Data Structures Baojian Hua
Поиск оптимального набора значений опций компиляции Студент: Чирцов Артём, ФИТ/IV Руководитель: Илья Чёрный
Проект «Безопасный браузер» Визовитин Николай Кадашев Дмитрий.
Объектно-ориентированное проектирование DSP-систем в телекоммуникациях Подготовил: Сергеев Виктор Николаевич СПбГУ, математико-механический Факультет,
Проект «Безопасный браузер» Визовитин Николай Научный руководитель: Д.В. Иртегов.

CS 192 Lecture 3 Winter 2003 December 5, 2003 Dr. Shafay Shamail.
An Introduction to PHP The University of Tennessee at Chattanooga C. Daniel Chase “An introduction to basic PHP use with a focus on the power of dynamic.
Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет Обнинск, 2004.
C Tokens Identifiers Keywords Constants Operators Special symbols.
Attribute Grammar Examples and Symbol Tables Compiler Design Lecture (02/23/98) Computer Science Rensselaer Polytechnic.
IBM PHP Runtime Team © 2006 IBM Corporation Understanding PHP Opcodes Andy Wharmby.
PHP 프로그래밍. Let ’ s start test
Язык программирования C#
КРУПНЕЙШАЯ ТЕХНИЧЕСКАЯ КОНФЕРЕНЦИЯ MICROSOFT В УКРАИНЕ Metro приложения: работа с данными Краковецкий Александр, MVP/RD/PhD. DevRain Solutions.
C# C1 CSC 298 Elements of C# code (part 1). C# C2 Style for identifiers  Identifier: class, method, property (defined shortly) or variable names  class,
Разработка безопасных проектов с использованием Bitrix Framework.
Data Structure and c K.S.Prabhu Lecturer All Deaf Educational Technology.
Gator Engineering 1 Chapter 2 C Fundamentals (Continued) Copyright © 2008 W. W. Norton & Company. All rights reserved.
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Machine-Level Programming V: Unions and Memory layout.
Computer Engineering 2 nd Semester Dr. Rabie A. Ramadan 3.
UNION UNIT -II. Unions A union is another compound datatype like a structure. So what is the properties of structure? Eg: Union exam { int roll_no; Char.
ROOT Team Meeting Axel Naumann CERN PH/SFT Crienftlex Extended Version. And also Director’s Cut. Crienftlex.
Structure A collection of values (members) struct date{ int day; char month[10]; int year; }; Declare a structure variable struct date today; struct struct_name.
Introduction C# program is collection of classes Classes are collection of methods and some statements That statements contains tokens C# includes five.
C syntax (simplified) BNF. Program ::= [ ] Directives ::= [ ] ::= | |… ::=#include > ::=#define.
Object Oriented Programming Lecture 2: BallWorld.
Лекции марта 2016 г.. оператор объявления переменных : int a; char a, b = 5, c; присваивание ( Assign ): id = ; пустой оператор ; if( ) else.
Enum. enum – a new type 2 enum is a set of constant int values, that defines a type: enum Season { WINTER,// = 0 by default SPRING,// = WINTER + 1 SUMMER,//
Shyam Gurram Graduate Assistant
C++ Lesson 1.
Ex-1 #include <stdio.h> struct sample { int a=0; char b='A';
Machine-Level Programming V: Unions and Memory layout
.Net Programming with C#
null, true, and false are also reserved.
פרטים נוספים בסילבוס של הקורס
אבני היסוד של תוכנית ב- C++
אבני היסוד של תוכנית ב- C++
Govt. Polytechnic,Dhangar
Code Generation Example
Object-Oriented Programming (OOP) Lecture No. 37
Seoul National University
The important features of OOP related to C#:
Module 2 Variables, Assignment, and Data Types
Programming Language C Language.
Seoul National University
Presentation transcript:

Zend Engine изнутри Дмитрий Стогов

Немного истории Zend Engine была разработана в качестве ядра для PHP 4 Andi Gutmans и Zeev Suraski в 1999 PHP 5.0 основан на Zend Engine 2 с новой объектной моделью PHP 5.1 основан на Zend Engine 2.1 со специализированной VM PHP 5.2 основан на Zend Engine 2.2 с новым менеджером памяти PHP 5.3 основан на Zend Engine 2.3 которая включает большинство улучшений и нововведений из PHP6, за исключением Unicode, (namespace-ы, сборщик мусора, LSB, оператор goto, ленивая инициализация таблиц символов, новый сканнер основанный на re2c) PHP 6 основан на Zend Engine 3 с поддержкой Unicode

Подсистемы ZE Менеджер памяти API для доступа к внутренним структурам данных Компилятор PHP Виртуальная машина PHP API для ресурсов (файлы, DB коннекшены) API для внешних расширений PHP Набор внутренних функций Сборщик мусора (5.3)

Стадии работы PHP

Thread Safe Resource Manager non-ZTS-build (single-thread) ZTS-build (thread-safe) Каждый thread работает со своими глобальными данными ZE использует compiler_globals (CG) и executor_globals (EG) Любое расширение PHP может определить свои глобальные данные, которые должны быть уникальными для разных thread-ов

TSRM макросы void some_function(void) { process(EG(symbol_table)); // compilation error }

TSRM макросы void some_function(void) { int some_local_variable; TSRMLS_FETCH(); process(EG(symbol_table)); } void some_function(TSRMLS_D) { process(EG(symbol_table)); } some_function(TSRMLS_C); void some_function(int some_paremeter TSRMLS_DC) { process(EG(symbol_table)); } some_function(0 TSRMLS_CC);

Менеджер памяти emalloc() efree() erealloc() estrdup() estrndup() ecalloc() $ USE_ZEND_ALLOC=0 valgrind php test.php

Значения (zval-коетейнер) typedef struct _zval_struct { zend_uchar type; zvalue_value value; zend_uchar is_ref; zebd_uint refcount; } zval;

Значения (zval-коетейнер) typedef struct _zval_struct { zend_uchar type; zvalue_value value; zend_uchar is_ref; zebd_uint refcount; } zval; IS_NULL IS_LONG IS_DOUBLE IS_BOOL IS_ARRAY IS_OBJECT IS_STRING IS_RESOURCE IS_CONSTANT IS_CONSTANT_ARRAY

Значения (zval-коетейнер) typedef struct _zval_struct { zend_uchar type; zvalue_value value; zend_uchar is_ref; zebd_uint refcount; } zval; typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } zvalue_value;

Ссылки <?php $a = 10; $b =& $b; $a $b … EG(symbol_table) type value is_ref refcount IS_LONG zval HashTable

Присваивание и копирование при записи <?php $a = 1; $b = $a; $b = 2; $b =& $a; $b = 3; $b =& $c; // $a = {1, refcount=1, is_ref=0} // $a = {1, refcount=2, is_ref=0} // $b = {1, refcount=2, is_ref=0} // $a = {1, refcount=1, is_ref=0} // $b = {2, refcount=1, is_ref=0} // $a = {1, refcount=2, is_ref=1} // $b = {1, refcount=2, is_ref=1} // $a = {3, refcount=2, is_ref=1} // $b = {3, refcount=2, is_ref=1} // $a = {3, refcount=1, is_ref=0} // $b = {?, refcount=?, is_ref=1}

Компилятор Основан на flex/bison based (основан на re2c/bison начиная с 5.3) Однопроходная компиляция (на самом деле два прохода) – AST не создается – Прямая компиляция в байт-кодVM – Быстрая компиляция – Оптимизация практически не выполняется

Глобальные данные компилятора (CG) struct _zend_compiler_globals { … HashTable *function_table; HashTable *class_table; zend_class_entry *active_class_entry; zend_op_array *active_op_array; … }; CG(function_table)

Функции PHP (op_array) typedef struct _zend_op_array { zend_uchar type; char *function_name; zend_class_entry *scope; zend_uint fn_flags; zend_op *opcodes; zend_compiled_variables *vars; zend_uint last, lat_var, T; HashTable *static_variables; … } zend_op_array;

Инструкции VM (zend_op) typedef struct _zend_op { zend_uchar opcode; ulong extended_value; znode op1; znode op2; znode result; uint lineno; opcode_handler_t handler; } zend_op;

Инструкции VM (zend_op) typedef struct _zend_op { zend_uchar opcode; ulong extended_value; znode op1; znode op2; znode result; uint lineno; opcode_handler_t handler; } zend_op; ZEND_NOP ZEND_ADD ZEND_SUB ZEND_IS_EQUAL ZEND_JMP ZEND_JMPZ ZEND_ASSIGN ZEND_DO_FCALL ZEND_RETURN ~150 opcodes in zend_vm_opcodes.h

Инструкции VM (zend_op) typedef struct _zend_op { zend_uchar opcode; ulong extended_value; znode op1; znode op2; znode result; uint lineno; opcode_handler_t handler; } zend_op; typedef struct _znode { int op_type; union { zval constant; zend_uint var; zend_uint opline_num; zend_op *jmp_addr; struct { zend_uint var; zend_uint type; } EA; } u; } znode;

Операнды (znode) typedef struct _znode { int op_type; union { zval constant; zend_uint var; zend_uint opline_num; zend_op *jmp_addr; struct { zend_uint var; zend_uint type; } EA; } u; } znode; IS_CONST IS_CV IS_TMP_VAR IS_VAR IS_UNUSED

Пример компиляции (5.0) <?php $a = “Hello”; $b = “World”; echo $a.” “. $b; ?> // FETCH_WC(“a”)-> V(0) // ASSIGNV(0), C(“Hello”) // FETCH_WC(“b”)-> V(1) // ASSIGNV(1), C(“World”) // FETCH_RC(“a”)-> V(2) // CONCATV(2), C(“ “)-> T(3) // FETCH_RC(“b”)-> V(4) // CONCATT(3), V(4)-> T(5) // ECHOT(5) // RETURNC(NULL)

Пример компиляции (5.1) <?php $a = “Hello”; $b = “World”; echo $a.” “. $b; ?> // // ASSIGNCV(0)[“a”], C(“Hello”) // // ASSIGNCV(1)[“b”], C(“World”) // // CONCATCV(0)[“a”], C(“ “)-> T(0) // CONCATT(0), CV(1)[“b”]-> T(1) // ECHOT(1) // // RETURNC(NULL)

Глобальные данные VM (EG) struct _zend_executor_globals { … HashTable *active_symbol_table; HashTable symbol_table;// $GLOBALS[] HashTable *function_table; HashTable *class_table; HashTable *zend_constants; zval *This; zend_class_entry *scope; zend_op_array *active_op_array; zend_op **opline_ptr; struct _zend_execute_data *current_execute_data; … }; EG(symbol_table)

Switch-threaded Executor (4.*) void execute(zend_op_array *op_array TSRMLS_DC) { zend_execute_data execute_data; // initialization EX(opline) = op_array->opcodes; while (1) { switch (EX(opline)->opcode) { … case ZEND_RETURN; … return; }

Call-threaded Executor (5.*) void execute(zend_op_array *op_array TSRMLS_DC) { zend_execute_data execute_data; // initialization EX(opline) = op_array->opcodes; while (1) { if (EX(opline)->handler(&execute_data TSRMLS_CC)) { return; }

Call-threaded Executor (5.0) int zend_concat_handler(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); concat_function(&EX_T(opline->result.u.var).tmp_var, get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R)); FREE_OP1(EX(Ts), &opline->op1, EG(free_op1)); FREE_OP2(EX(Ts), &opline->op2, EG(free_op2)); EX(opline)++; return 0; }

Специализация в VM (5.1) ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV) { zend_op *opline = EX(opline); zend_free_op free_op1, free_op2; concat_function(&EX_T(opline->result.u.var).tmp_var, GET_OP1_ZVAL_PTR(BP_VAR_R), GET_OP2_ZVAL_PTR(BP_VAR_R)); FREE_OP1(); FREE_OP2(); EX(opline)++; return 0; }

Специализация в VM (5.1) int ZEND_CONCAT_SPEC_CV_CONST_HANDLER( ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); concat_function(&EX_T(opline->result.u.var).tmp_var, _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R), &opline->op2.u.constant); EX(opline)++; return 0; }

Классы typrdef struct _zend_class_entry { char type; char *name; zend_class_entry *parent; zend_uint ce_flags; HashTable function_table; HashTable default_properties; HashTable properties_info; HashTable *static_members; HashTable constants_table; zend_class_entry **interfaces; … } zend_class_entry;

Объекты typedef struct _zend_object_value { zend_uint handle;//Z_OBJ_HANDLE(zval) zend_object_handlers *handlers;//Z_OBJ_HT(zval) } zend_object_value; typedef struct _zend_object { zend_class_entry *ce;//Z_OBJCE(zval) HashTable *properties;//Z_OBJPROP(zval) } zend_object;

Вопросы?