#!/bin/less # -*- Mode: text; Encoding: utf-8; -*- ---- Сначала мы описываем структуры данных, потом для них пишем код. ---- В программировании встречаются колдунство и магия. Колдунство, это алгоритмы. О магии наш расказ. ---- Запрещёная магия. Её не надо использовать, Можно сломать всё. ---- Начнём. ---- Главный кирпич. SV - Scalar Value Flags : What is it ? Any magic ? refcount ? ---- SV может содержать в себе: SvRV - Reference Value SvPV - Pointer Value (string) SvIV - Integer Value SvNV - Numeric Value ---- А может и всё вместе. $! errno, errstr ---- А ещё может быть наделён магической силой. magic: tie, taint, ... MGVTBL таблица виртуальных функций. ---- AV - Array Value HV - Hash Value ---- AV - Массив. [[PRE: AV* newAV(); void av_push(AV*, SV*); SV* av_pop(AV*); SV* av_shift(AV*); void av_unshift(AV*, I32 num); I32 av_len(AV*); SV** av_fetch(AV*, I32 key, I32 lval); SV** av_store(AV*, I32 key, SV* val); PP(pp_splice) :PRE]] ---- HV - Хэш [[PRE: HV* newHV(); SV** hv_store(HV*, const char* key, U32 klen, SV* val, U32 hash); SV** hv_fetch(HV*, const char* key, U32 klen, I32 lval); bool hv_exists(HV*, const char* key, U32 klen); SV* hv_delete(HV*, const char* key, U32 klen, I32 flags); :PRE]] ---- GV - Glob Value Содержит указатели на SV AV HV CV *io Для каждого имени. ---- Хэш наш главный герой ---- STASH - Symbol Table hASH ---- STASH: HV* gv_stashpv(const char* name, I32 create) {name=>*GV} ---- оператор :: строит дерево хэшей [[PRE: Data:: =>{ Dumper::=>*{'Data::Dumper::'} }, %Data::Dumper:: = ( ... ) :PRE]] ---- perl -MData::Dumper -e 'print Dumper(\%::)' ---- scratchpad Содержит имена, значения, опкоды ---- Лексическая область видимости [[PRE: my :PRE]] scratchpad[0] Содержит SV имена scratchpad[1..] значения можно входить рекурсивно. scratchpad[1..][0] = @_ ---- scratchpad != stash my $variable; # scratchpad our $variable; # scratchpad -> stash ---- our Всегда GV ---- Ищется имя в текущем паде Ищется в родительских падах Найдено - создать заглушку ---- STACK: Только для @_ local в другом стэке ---- MEMORY ---- Есть много элементов одинакового размера. Можно оптимизировать ---- Арены, куски по 4k Соединены в цепочки Каждая содержит элементы одного типа. PL_sv_arenaroot Указатель на цепочку арен для SV ---- Есть случаи используется просто malloc() ---- realloc() ---- GARBAGE COLLECTOR ---- А зачем нам коллектор ? У нас есть refcount ---- Целься: sv_2mortal() Огонь: FRETMPS ---- А теперь серьёзно о кирпичах ---- GV - Glob Value Содержит имя. И указатели на соответствующие *V ---- CV - Code Value Он же заведует форматами. Ничего интересного. CV -> XPVCV ---- Все *V живут на аренах. Состоят из головы и тела. SV -> xrv, xpv, xpviv ---- my $greet; $pad{'$greet'}=newSV(); ---- $greet="Hello Perlmongers"; $pad{'$greet'}->{PV}=newSVpvn ("Hello Perlmongers",length("Hello Perlmongers")); ---- SvRV - Reference Value Флаг SVprv_WEAKREF (Магия) S_sv_del_backref(pTHX_ SV *sv) Находит и удаляет себя. ---- Blessed Objects SV* sv_bless(SV* sv, HV* stash); ---- SvPV - Pointer Value (string) SvGROW curlen & utf8_curlen Строка имеет offset и padding substr и s/// оставляют дырки ---- SvPV Для строки считается hash Операция сравнивнения дешёвая строка легко становится ключём ---- IV - Integer Value ---- NV - Numeric Value XPVNV Огромные числа. ---- AV - Array Value начало и конец, смещение и размер. Массив заголовков SV ---- AV* newAV(); ---- void av_push(AV*, SV*); O(1) В большенстве случаев realloc() $#a=$size; ---- Ломать легче чем строить SV* av_pop(AV*); SV* av_shift(AV*); O(1) Оставляет дырки ---- void av_unshift(AV*, I32 num); е сли offset=0 O(N) Смещает только на еденичку. ---- I32 av_len(AV*); SV** av_fetch(AV*, I32 key, I32 lval); SV** av_store(AV*, I32 key, SV* val); Настоящая функция PP(pp_splice) ---- HV - Hash Value hash_table[hash_size] Следующая степень двойки после размера хэша ---- Массив-список HE HE - Hash Element HE char* -> SV Отрицательная длинна ключа utf-8 ---- Хэштаблица PERL_HASH_INTERNAL(h,k,l) h=c; h+=c<<10; h^=c>>6; h+=c<<3; h^=c>>11; HE = ht( hash & (I32)hs) ---- O(1) ---- Хэш содержит скаляры. ---- Вроде всё. ---- Всем Спасибо. Ivan B. Serehkin. И все авторы перла.