[Cascavel-pm] Re: Re: Safe::World 0.04 released

Graciliano M. P. gmpowers em terra.com.br
Quarta Dezembro 10 21:37:52 CST 2003


> Eu não tive oportunidade de olhar o código ainda por
> questão de tempo disponível para tanto, mas fiquei
> (bastante) curioso: como funciona (basicamente) a
> mágica acima?

Mágica?! Quando eu era pequeno sempre quis ser mágico! eheheh ;-P

Mágica nada, é muito trabalho e testes para encotrar um caminho para
resolver esta locura.

O Safe world é baseado em 4 "técnicas":

1 - Safe, que permite a execução de um código dentro d um pacote X, mas de
uma maneira que o código pense que está no pacote main, e sem conseguir
acessar nada no nível inferior deste pacote. O que cria um compartimento
seguro, onde alguns operadores também podem ser restringidos (como exit(),
thread() e lock()). Na verdade quem faz a mágica deste recurso é o módulo
'Opcode', através da função 'Opcode::_safe_call_sv'.

2 - Gerenciamento das variáveis globais compartilhadas pelos compartimentos
com o "interpretador" normal (main::). Já que as váriáveis globais (@INC,
%INC, @_, $@, $_...) dentro e fora são as mesmas (fazem a mesma referência),
já que são globais e especiais, o seu estado interno e externo tem que ser
respeitado. Então antes de qualquer execução interna a um compartimento, é
selecionado o estado interno do compartimento em questão nas variáveis
compartilhadas, e após a execução elas voltam ao normal, criando basicamente
uma estrutura de Stack (pilha) em cada variável.

3 - Gerenciamento da saída de dados através de tied handlers. Então quando
algum dado é enviado para STDOUT ou STDERR ele passa pelos métodos tie de
cada handler, onde é possível redirecionar os dados para diferentes
estruturas (SCALAR, IO, CODE), incluindo a chamada de funções do usuário. No
STDOUT também é implementado um gerenciador automático dos headers, o que
serve para separar o seu documento html dos headers que devem ser enviados
para o browser, permitindo a execução de um filtro sobre os headers gerados,
tanto para checar a sua validade como para arruma-los. Tal prática também
permite o envio de headers após ou durante o envio do content.

4 - Sistema de destruição completa de um compartimento. Andei estudando qual
a maneira mais eficiente para limpar totalmente um compartimento
(pacote/package) do interpretador normal. Nas 1as implementações do recurso,
após 1000 execuções de um código de teste o processo utilizava 150Mb,
atualmente no Safe::World o mesmo teste utiliza 8Mb! O que significa que
apenas 8KB ficam de refugo, e não 150KB como antes. Também observei que
liberar a memória utilizada para execuções futuras agiliza a execução, pois
requerir memória ao sistema consome bastante tempo de execução.

Depois de ter esses 4 recursos definidos e funcionando o resto é feito sobre
eles. Como o recurso de lincar 2 objetos Safe::World e faze-los funcionar
como 1 só. Isto é feito manipulando-se a tabela de símbolos (symbol table)
de um pacote. Na verdade implementar o Safe::World utiliza muitas técnicas
de referência, tie, e tudo orientado a objeto para separar-se bem cada
isntância (representação, já que isntância não é um termo exclusivo a OO) de
Safe::World.

Outra técnica que possibilitou td, principalmente no caso da seleção dos
estados de um compartimento, é a técnica de select em Safe::World::Select.
Onde cria-se um objeto select de um compartimento quando quer-se selecionar
o mesmo. E quando o objeto é destruído ele reestabelece os estados
anteriores. Isto cria automaticamente a estrutura de Stack nas variáveis
(virtualmente). Também facilita o controle do retorno de um método, já que o
código de reestabelecer os estado tem que ser executado após o retorno, ou
então o uso de variáveis auxiliáres seria penoso e lento demais.

Ao meu ver o Safe::World, na verdade a possibilidade dele ter sido feito
apenas com Perl puro, demonstra como o intepretador Perl é rico em recursos,
e como ele permite que o usuário manipule o seu comportamento da maneira que
quiser. Também demonstra como Perl tem uma infinidade de coisas para
aprendermos. Há alguns anos atrás tive a estupidez de achar que sabia tudo
sobre Perl, mas até hoje aprendo coisas novas, e ainda acho que tenho muita
coisa a aprender.

Bom, tudo isso foi criado para utilizarmos o nosso velho e bom mod_perl de
uma forma ainda melhor. ;-P

Querm tiver maior curiosidade pode consultar o código do Safe::World, já que
tudo em Perl é em código aberto, e se não foce nunca teria conseguido
fazê-lo. ;-)

Atenciosamente,
Graciliano M. P.





Mais detalhes sobre a lista de discussão Cascavel-pm