[Cascavel-pm] Fw: Safe::World - By brasucas!

Fabiano Reese Righetti frighetti em cascavel.pm.org
Sábado Dezembro 6 08:02:03 CST 2003


From: "Graciliano M. P." <gmpowers em terra.com.br>
To: <cascavel-pm em mail.pm.org>
Subject: Safe::World - By brasucas!
Date: Sat, 6 Dec 2003 11:43:46 -0300

E ai pessoal,

Bom, 1o um feliz natal e próspero ano novo. [ bem adiantado mesmo para não
esquecer! :-) ]

[Que bom poder escrever em português, e desculpe se estiver meio enrolado!]

Recentemente publiquei um novo módulo no CPAN, Safe::World, e recebi várias
respostas, mas nenhuma do Brasil. Tive até a colaboração de gente da Nova
Zelândia que testou o módulo em várias versões do Perl no Win32, Linux e Mac
OSX e apontou todos os bugs que apareceram. Bom, agora já publiquei a versão
0.03, que parece não ter mais nenhum bug.

Gostaria da opinião de vcs sobre o módulo, e que fizessem os devidos testes,
de preferência tentar usa-lo de maneira complexa, pois é aí que encontramos
os benditos bugs.

Mas o que é o Safe::World?

Com o Safe::World vc pode criar várias instâncias virtuais do interpretador
Perl dentro do interpretador real, que funcionam de maneira independente dos
outros (não confunda com múltiplos threads, pois a execução é de apenas 1
fluxo por thread). Na verdade cada instância é um compartimento onde os
códigos executados dentro dos compartimentos não conseguem sair dele
(enxergar fora dele ou modificar qualquer coisa fora). Os códigos dentro do
compartimento pensam que estão sendo executados em um interpretador novo e
normal. Quem já utilizou o módulo Safe já deve ter visto algo parecido, mas
sabe que o ambiente interno está longe de ser parecido com um interpretador.

A coisa mais interessante sobre o Safe::World é que os mundos podem ser
montados juntos. Por exemplo, pode-se criar 2 objetos Safe::World,
"linka-los" e executa-los como se fossem 1 só. Mas qual a utilidade disto?

Por exemplo, pode-se usar um World para carregar as classes comuns a um site
(World Cache), e utilizar múltiplos World para executar o código específico
de cada página (World Exec). E depois da execução o link pode ser desfeito,
e apenas o World Exec é destruído, mantendo-se o World Cache como cache das
classes em memória. Tal prática torna a execução bem mais rápida e com menos
memória, pois não é necessário carregar novamente as classes comuns a cada
execução.

Bom, criei o Safe::World especialmente para ser utilizado com mod_perl, e
quem sabe, disponibilizar o mod_perl para web hosts compartilhados.

Outra característica do Safe::World são os mecanismos de saída de dados,
onde cada instância tem a sua própria implementação. Ou seja, cada World tem
seu próprio STDOUT, STDERR e STDIN. Onde a saída dos dados (STDOUT e STDERR)
pode ser redirecionada para qualquer coisa (1 arquivo, socket ou até mesmo
uma váriável SCALAR ou um sub). Dentro do STDOUT também é implementada uma
saída extra, chamada HEADOUT, que serve para os headers. Então se for feita
uma execução de CGI dentro do World, pode-se ter o content separado dos
headers automaticamente. O mecanismo do HEADOUT também permite o envio de
headers depois do envio do content, ou seja, pode-se enviar um cookie (pelo
protocolo) no fim de uma página sem se preocupar com nada.

Com o Safe::World pode-se também utilizar versões diferentes de um módulo em
diferentes instâncias, já que cada instância não interfere nas outras ou no
interpretador principal. Ou seja, os módulos carregados dentro de um World
são apenas carregados dentro dele.

Download em:
http://search.cpan.org/~gmpassos/Safe-World-0.03/

Documentação:
http://search.cpan.org/~gmpassos/Safe-World-0.03/lib/Safe/World.pm

Testado em:
- Perl-5.8.1 Win32|Linux|FreeBSD
- Perl-5.8.2 Win32|Linux|FreeBSD|MacOSX
- Perl-5.6.1 Win32|Linux
- Perl-5.6.2 Win32

Atenciosamente,
Graciliano M. P.



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