рдПрдХреНрд╕рдЯреЗрдВрд╢рди PHP рдФрд░ рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ред рднрд╛рдЧ рддреАрди, рд╢рд╛рдпрдж рдЕрдВрддрд┐рдо

рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ , рдЙрдкрдХрд░рдг рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рддреЗрдВ рдмрддрд╛рдИ рдЧрдИ рд╣реИрдВред

рджреВрд╕рд░рд╛ рднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╛рдЗрд▓, рд╡рд┐рдЪрд╛рд░реЛрдВ, рдпреЛрдЬрдирд╛рдУрдВ, рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдгред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕реА рдФрд░ рдХреЗ / рдПрди рдЗрдВрдЯрд░реЛрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдХрдЯреНрдЯрд░ рд╣реЛрдЧрд╛, рдмрд╣реБрдд рдореИрдХреНрд░реЛрдЬрд╝, рджрд░реНрдж, рдирд┐рд░рд╛рд╢рд╛ рдФрд░ "рдЕрдЪреНрдЫрд╛рдИ рдХреА рдХрд┐рд░рдгреЗрдВ"ред рдмреЗрд╢рдХ рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдзреНрдпрд╛рдп рд╣реЛрдЧрд╛ (рдЖрдкрдиреЗ рдЦреБрдж рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА ... рдФрд░ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рдЬрд╛рдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреАред

рдЕрд╕реНрд╡реАрдХрд░рдг: рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рдХреЛ PHP рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдзреНрдпрд╛рдп рдПрдХ рдЕрдВрддрд░реНрдпрд╛рдореА рднреЛрд▓реЗ


рд╕реА рдореЗрдВ рдХреЗ / рдПрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЪрдХреНрд░ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдпрд╣рд╛рдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ K / N рдореЗрдВ C рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдмрд▓реНрдХрд┐ рдХрдВрдЬреВрд╕ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд░рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди .def рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

headers = php.h 

рдлрд┐рд░ рдЗрд╕реЗ рд╕рд┐рдиреЗрдЯрд░реЙрдк рдирд╛рдордХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЦрд┐рд▓рд╛рдПрдВ ред

 # cinterop -def php.def -o php 

рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ, рдЖрдкрдХреЛ libvp.klib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд┐рд▓реЗрдЧреА рдЬрд┐рд╕рдореЗрдВ llvm рдмрд┐рдЯрдХреЛрдб рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред

рдлрд┐рд░ рдЖрдк рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓рдХрд░, рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ ( #define ) рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 # kotlinc -opt -produce static ${SOURCES} -l libphp.klib -o myLib 

рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред рдФрд░ рдПрдХ рдирд╣реАрдВред

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд░реВрдк рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЗрдХрдЯреНрдард╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛


рдХреНрдпреЛрдВ? рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ php.h рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ:

 #include "php_version.h" #include "zend.h" #include "zend_sort.h" #include "php_compat.h" #include "zend_API.h" 

рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ llvm рдЕрднреА рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ -I рд╕реНрд╡рд┐рдЪ рд╣реИ , рдФрд░ рд╕рд┐рдВрдЯрд░рдЯреЙрдк рдореЗрдВ -copt рд╕реНрд╡рд┐рдЪ рд╣реИ ред рдЦреИрд░, рдЖрдк рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рдЗрд╕ рддрд░рд╣ рдХреА рдХрдорд╛рдВрдб php.h рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

 # cinterop -def my.def -o myLib -I${PHP_LIB_ROOT} -copt -I${PHP_LIB_ROOT} \ -copt -I${PHP_LIB_ROOT}/main \ -copt -I${PHP_LIB_ROOT}/Zend \ -copt -I${PHP_LIB_ROOT}/TSRM 

рдореИрдХреНрд░реЛред рдореИрдВ рддреБрдорд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБ рдФрд░ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реВрдБ! рдирд╣реАрдВ, рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдирдлрд╝рд░рдд рд╣реИред


рдЖрдкрдХреЛ C> K / N #define рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ #define рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛
рдкреНрд░рддреНрдпреЗрдХ C рдореИрдХреНрд░реЛ рдЬреЛ рдХрд┐рд╕реА рд╕реНрдерд┐рд░рд╛рдВрдХ рддрдХ рдлреИрд▓рддрд╛ рд╣реИ, рдХреЛ рдХреЛрдЯрд▓рд┐рди рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рдореИрдХреНрд░реЛрдЬрд╝ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред

рдФрд░ рдлрд┐рд░ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореИрдХреНрд░реЛ рдкрд░ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдФрд░ рдореИрдХреНрд░реЛ рдбреНрд░рд╛рдЗрд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, K / N рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдХрд╕реНрдЯрдо рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрд▓реЗ рдмрд┐рдЬрд▓реА рдХреЗ рдЯреЗрдк рдХрд╛ рдПрдХ рд░реЛрд▓ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдХреНрд░реЛ Z_TYPE_P )

 headers = php.h --- static inline zend_uchar __zp_get_arg_type(zval *z_value) { return Z_TYPE_P(z_value); } 

рдЕрдм K / N рдХреЛрдб рдореЗрдВ __zp_get_arg_type рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛

рдЕрдзреНрдпрд╛рдп рджреЛ PHP INI- рд╕реЗрдЯрд┐рдВрдЧ рдпрд╛ рдПрдХ рд╕рдм-рд╕рдм рдореИрдХреНрд░реЛред


рдпрд╣ PHP рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдУрд░ рдПрдХ "рдЕрдЪреНрдЫреА рдХрд┐рд░рдг" рд╣реИред

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП 4 рдореИрдХреНрд░реЛ рд╣реИрдВ:

 INI_INT(val) INI_FLT(val) INI_STR(val) INI_BOOL(val) 

рдЬрд╣рд╛рдВ val рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред

рдЕрдм рдЖрдЗрдП INI_STR рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдореИрдХреНрд░реЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред

 #define INI_STR(name) zend_ini_string_ex((name), sizeof(name)-1, 0, NULL) 

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ "рдШрд╛рддрдХ рджреЛрд╖" рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛?

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВ - рдпрд╣ sizeof рд╕рдорд╛рд░реЛрд╣ рд╣реИред рдЬрдм рдЖрдк рд╕реАрдзреЗ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ:

 php_printf("The value is : %s", INI_STR("my.ini")); 

рдЬрдм рдЖрдк .def рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧрд╛рдбрд╝реА рдХрджреНрджреВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЖрдХрд╛рд░ (рдирд╛рдо) рд╕реВрдЪрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЪреЗрдХрдореЗрдЯ рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЪрдХреНрдХрд░ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред

  1. рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рд░реНрдп рдЬреЛ рд╡реЗ рд╕рдВрд▓рдЧреНрди рд╣реИрдВред
  2. рд╣рд╛рд░реНрдбрдХреЛрдб рдЖрд╡рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рднреА рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рдХреЛрдИ рднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрдЧрд╛ рдХрд┐ рдореИрдХреНрд░реЛ рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧреАред рдЗрд╕рд▓рд┐рдП, рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ, рдЧрд╣рд░реА рдЕрд╕рдВрддреЛрд╖ рдХреА рднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде, рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ред

рдЕрдзреНрдпрд╛рдп рддреАрди рдбрд┐рдмрдЧ? рдХреНрдпрд╛ рдбреАрдмрдЧ?


рдПрдХреНрдЯ 1 - рдЗрдВрдЯрд░реЛрдкред


рдПрдХ рдмрд┐рдВрджреБ рдкрд░, 20 рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмреНрд▓реВ рдЯреЗрдк рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рдЕрджреНрднреБрдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред

 Exception in thread "main" java.lang.Error: /tmp/tmp399964332777824085.c:103:38: error: too many arguments to function call, expected 2, have 3 at org.jetbrains.kotlin.native.interop.indexer.UtilsKt.ensureNoCompileErrors(Utils.kt:137) at org.jetbrains.kotlin.native.interop.indexer.IndexerKt.indexDeclarations(Indexer.kt:902) at org.jetbrains.kotlin.native.interop.indexer.IndexerKt.buildNativeIndexImpl(Indexer.kt:892) at org.jetbrains.kotlin.native.interop.indexer.NativeIndexKt.buildNativeIndex(NativeIndex.kt:56) at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.processCLib(main.kt:283) at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.interop(main.kt:38) at org.jetbrains.kotlin.cli.utilities.InteropCompilerKt.invokeInterop(InteropCompiler.kt:100) at org.jetbrains.kotlin.cli.utilities.MainKt.main(main.kt:29) 


рдЖрдзрд╛ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рдмрд╛рдХреА рдХреЗ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ ... рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣реЗрдбрд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд▓рдВрдмреА рд╣реИ ... (рд╣рд╛рдБ, рдпрд╣ рдПрдХ рджрд░реНрдЬрди рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЪрдврд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдФрд░ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЖрд╡рд░реНрдзрдХ рдЧреНрд▓рд╛рд╕, рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЗ рд╕рд╛рде)ред

рджреВрд╕рд░рд╛ "рд░реЗ рдХреА рдЧреБрдб" рдЬреЗрдЯрдмреНрд░реЗрди рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдзрд┐рдирд┐рдпрдо 2 - рдХреНрд░рдоред


рдореБрдЭреЗ рд░рдирдЯрд╛рдЗрдо рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рдореЗрдВ рдЦрд░рд╛рдмреА рд╣реИ ред рдЕрдЪреНрдЫрд╛ рдареАрдХ рд╣реИ, рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдбрд┐рдмрдЧрд░ рдореЗрдВ рдЪрдврд╝ рд░рд╣рд╛ рд╣реВрдВред рдЙрдореНрдореНрдо ... рдПрд╕рдЯреАрдП?

 Program received signal SIGSEGV, Segmentation fault. kfun:kotlinx.cinterop.toKString@kotlinx.cinterop.CPointer<kotlinx.cinterop.ByteVarOf<kotlin.Byte>>.()kotlin.String () at /opt/buildAgent/work/4d622a065c544371/Interop/Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt:402 402 /opt/buildAgent/work/4d622a065c544371/Interop/Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt: No such file or directory. 


рдЕрдзреНрдпрд╛рдп рдЪрд╛рд░ рдореИрдВрдиреЗ рдЖрдкрдХреА рдЪрд╛рдп рдореЗрдВ рдЪрд╛рдп рдбрд╛рд▓реА рддрд╛рдХрд┐ рдЖрдк рдЪрд╛рдп рдкреАрддреЗ рд╕рдордп рдЪрд╛рдп рдкреА рд╕рдХреЗрдВред


рдпрд╣рд╛рдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрдХрд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред

рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреАрдПрдЪрдкреА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдбреАрдПрд╕рдПрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди, рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреЗ / рдПрди рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ make рд░рди рдХрд░рддреЗ make рдФрд░ рдЪрдорддреНрдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреАрдПрдЪрдкреА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ 4 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  1. C рдФрд░ K / N (рд╕рдорд╛рди cinterop ) рдХреЗ рдмреАрдЪ рдПрдХ рдкрд░рдд рдмрдирд╛рдирд╛
  2. рд╡рд┐рд╕реНрддрд╛рд░ рд╕реА рдХреЛрдб рдкреАрдврд╝реА
  3. рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди
  4. рд▓рдХреНрд╖реНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рдВрдХрд▓рди

рд▓рдХреНрд╖реНрдп K / N рдХреЛрдб рдореЗрдВ рдПрдХ PHP рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рд╡рд░реНрдЧ getInstance() рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХреЗред рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛред

рд╕реА рдореЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдПрдХ рдпрд╛ рджреЛ рдмрд╛рд░ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред

 zval *obj = malloc(sizeof(zval)); object_init_ex(obj, myClass); 

рдпрд╣ рд╕рд░рд▓ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕реЗ рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдХреЗ / рдПрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ myClass ...

рд▓реЗрдХрд┐рди zend_class_entry* рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╣реИ, рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реА рдХреЛрдб рдореЗрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдЬреНрдЮрд╛рдд рдирд╛рдо рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдкрдиреЗ рд╣рд╛рде рджреЗрдЦреЛред рдЖрдкрдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ K / N рдХреЛрдб рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ myClass рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрддреНрдкрдиреНрди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╕реА-рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рддрдм рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдВрддрдд: рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреЛ рдирдИ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдЖ: .h рдФрд░ .kt рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреЗ рдЪрд░рдг рдореЗрдВ, рд╕рд┐рдВрдЯрд░рдЯреЙрдк рдЪрд░рдг рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рдПрдкрд┐рдХ рдлреЗрдХреИрдк, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдЕрдзреНрдпрд╛рдп рдкрд╛рдБрдЪ рдореЗрд░реЗ рдирд╛рдо рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?


рдХреНрдпреЛрдВ рдХреА рдХрдерд╛:

 enum class ArgumentType { PHP_STRING, PHP_LONG, PHP_DOUBLE, PHP_NULL, ... } 

рдЗрд╕рд╕реЗ рдмреЗрд╣рддрд░:

 enum class ArgumentType { STRING, LONG, DOUBLE, NULL, ... } 

рд╣рд╛рдВ, рдЗрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ ArgumentType.NULL рдХреЛрдЯрд▓рд┐рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:

 struct { extension_kt_kref_php_extension_dsl_ArgumentType (*get)(); /* enum entry for NULL. */ } NULL; 

рдФрд░ рдпрд╣ рдХреИрд╕реЗ gcc рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред

 /root/simpleExtension/phpmodule/extension_kt_api.h:113:17: error: expected identifier or '(' before 'void' } NULL; ^ 

рдкрд░реНрджрд╛! рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рджреЗрдЦреЛред

рддрдкрд╕реНрдпрд╛ рдЕрдзреНрдпрд╛рдпред рдЖрдк рдЦреБрдж рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдХреЛрдИ рднреА рдЖрдкрдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдП рд╣реИрдВред рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдбреВрдмреЗ, рдХреЛрдЯрд▓рд┐рди рдиреЗрдЯрд┐рд╡ рдкрд░ PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП "рд░реВрдкрд░реЗрдЦрд╛" рддреИрдпрд╛рд░ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдкреЙрд▓рд┐рд╢ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреБрдж рдФрд░, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдкреНрд░рд▓реЗрдЦрди, рдЬреАрдердм рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ K / N рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреЗрд╡рд▓ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕ рдкрд░ рд▓рд┐рдЦрдирд╛ рдПрдХ рдЦреБрд╢реА рд╣реИ, рдФрд░ рдЫреЛрдЯреЗ рд╢реЛрд▓реЗ рдФрд░ рдЦреБрд░рджрд░рд╛рдкрди рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрд░реИрдбрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ рд╣реИ :)

рдЖрдЦрд┐рд░реА рдЕрдзреНрдпрд╛рдпред рдмрд┐рдирд╛ рдХреЛрдЯреНрд╕ рдХреЗ, рдЕрдЪреНрдЫреА рдХреА рдХрд┐рд░рдгреЗрдВред


рдФрд░ рдЕрдм, рдкреВрд░реА рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдФрд░ рдЧрд╣рд░реЗ рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде, рдореИрдВ JetBrains рдХреЗ рд▓реЛрдЧреЛрдВ рдФрд░ Kotlin рдиреЗрдЯрд┐рд╡ рд╕реНрд▓реИрдм рдЪреИрдирд▓ рдХреЗ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдк рд╕реБрдкрд░ рд╣реИрдВ!

рдФрд░ рдирд┐рдХреЛрд▓рд╕ рдЗрдЧреЛрдЯреА рдХреЛ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рджред



рдмреЛрдирд╕ред рдорд╣рд╛рдХрд╛рд╡реНрдп рдлрдХрдкред


рдЪреМрдереЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдкреНрд░рд╕рдВрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рджрд░рдЕрд╕рд▓, рдЬрдм рд╕рдм рдХреБрдЫ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рд╣реБрдИ - рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, PHP рдиреЗ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рдкрдХреНрд╖ рд╕реЗ рдЦреЛрд▓рд╛ред

 # php -dextension=./phpmodule/modules/extension.so -r "var_dump(ExampleClass::getInstance());" *RECURSION* # 

"Figase!" - рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдореИрдВ PHP рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдорд┐рд▓рд╛ рдФрд░ рдРрд╕рд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдорд┐рд▓рд╛ред

 case IS_OBJECT: if (Z_IS_RECURSIVE_P(struc)) { PUTS("*RECURSION*\n"); return; } 

рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛:

 printf("%u", Z_IS_RECURSIVE_P(struc)) 

рдХреЗ рдиреЗрддреГрддреНрд╡ рдореЗрдВ:

 undefined symbol: Z_IS_RECURSIVE_P in Unknown on line 0 

"Figase!" рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЛрдЪрд╛ред

рдЙрд╕ рд╕рдордп, рдЬрдм рдореИрдВрдиреЗ php.h (7.1.8) рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдерд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рд╣реЛрд╕реНрдЯ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рди рдХрд┐ рдорд╛рд╕реНрдЯрд░ рдмреНрд░рдВрдЪ (7.3.x) рд╕реЗ рдЬреАрдердм рд╕реЗ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рдПрдХ рджрд┐рдиред рд╕реАрдзреЗ рд▓рдЬреНрдЬрд┐рдд рд╣реБрдПред

рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдПрдХ рдЕрдЯреЗрд░рди рдирд╣реАрдВ рдерд╛ред

рдореИрдВрдиреЗ рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреЗ рдЬреАрд╡рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛, рдЙрд╕рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рд╣реА рдкреБрдирд░рд╛рд╡рд░реНрддрди рдЬрд╛рдБрдЪ рдХреЛрдб, рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрди рдЬрдЧрд╣реЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдРрд╕реА рдЪреАрдЬ рдереА - рдЬрд┐рд╕рдореЗрдВ рдореЗрд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ var_dump рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ

 RETURN_OBJ( example_symbols()->kotlin.root.php.extension.proxy.objectToZval( example_symbols()->kotlin.root.exampleclass.getInstance(/* */) ) ) 

рдореИрдХреНрд░реЛ RETURN_OBJ рдХреЛ рдЕрдВрдд рддрдХ рдЦреЛрд▓реЗрдВред рддрдВрддреНрд░рд┐рдХрд╛ рдФрд░ рдЧрд░реНрднрд╡рддреА рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рд╕реЗ рджреВрд░!

 1) RETURN_OBJ(r) 2) { RETVAL_OBJ(r); return; } 3) { ZVAL_OBJ(return_value, r); return; } 4) { do { zval *__z = (return_value); Z_OBJ_P(__z) = (r); Z_TYPE_INFO_P(__z) = IS_OBJECT_EX; } while (0); return; } 5) { do { zval *__z = (return_value); Z_OBJ(*(__z)) = (r); Z_TYPE_INFO(*(__z)) = (IS_OBJECT | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)); } while (0); return; } 6) { do { zval *__z = (return_value); (*(__z)).value.obj = (r); (*(__z)).u1.type_info = (8 | ((1<<0) << 8)); } while (0); return; } 

рдпрд╣рд╛рдВ рддрдм рдореБрдЭреЗ рджреВрд╕рд░реА рдмрд╛рд░ рд╢рд░реНрдо рдорд╣рд╕реВрд╕ рд╣реБрдИред рдореИрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреА рдиреАрд▓реА рдЖрдБрдЦ рдкрд░, zval* zend_object* рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣рд╛ zend_object* рдФрд░ рд▓рдЧрднрдЧ рджреЛ рджрд┐рди рддреНрд░реБрдЯрд┐ рдХреА рдЦреЛрдЬ рдореЗрдВ рдмрд┐рддрд╛рдПред

рд╕рднреА рдХреЛ рдХреЛрдЯрд▓рд┐рди рдХрд╛ рд╢реБрдХреНрд░рд┐рдпрд╛! :)

рдкреБрдирд╢реНрдЪред рдпрджрд┐ рдПрдХ рджрдпрд╛рд▓реБ рдЖрддреНрдорд╛ рд╣реИ рдЬреЛ рдореЗрд░реА рдЕрдирд╛рдбрд╝реА рдЕрдВрдЧреНрд░реЗрдЬреА рдкрдврд╝рддреА рд╣реИ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдареАрдХ рдХрд░рддреА рд╣реИ - рддреЛ рдореЗрд░реА рдХреГрддрдЬреНрдЮрддрд╛ рдХреА рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/hi423145/


All Articles