[Cascavel-pm] Porque é impossível esconder o código fonte de aplicações em Perl

Nilson Santos Figueiredo Junior acid06 em gmail.com
Sábado Março 18 21:03:58 PST 2006


Pessoal,

Essa discussão ocorreu por aqui recentemente e eu resolvi mostrar por
aqui apenas uma pequena demonstração de porque é impossível esconder o
código fonte de aplicações em Perl.

Como parte de um projeto pessoal (e apenas agora fui pensar que ele
poderia ser uma demonstração disso tudo) eu fiz ontem um módulo, que
está na CPAN. Trata-se do Class::Serializer (
http://search.cpan.org/~nilsonsfj/Class-Serializer-0.01/ ).

O Class::Serializer é um módulo experimental e que ainda não é
completo. Porém ele tenta fazer algo que eu considero muito
interessante: gerar o código fonte de uma classe inteira a partir do
seu estado atual na memória.

Numa situação em que você modifica as classes em run-time, utilizando
coisas como mixins e classes que exportam métodos pra outras classes,
etc, caso surja a necessidade de tornar persistente o estado atual da
classe, o módulo vem a calhar (que é exatamente o que eu vou precisar
no meu projeto).

Bom, isso está parecendo uma propaganda do meu módulo. ;-)
Mas era só uma "contextualizada". O ponto é que, não sei se já deu pra
perceber mas, com isso, você consegue gerar o código de qualquer
classe que esteja em memória (ou ao menos uma parte significante
dele). Basta que você consiga fazer com que o módulo Class::Serializer
seja carregado de alguma forma e seu método serializador (?) seja
chamado.

Perl é dinâmico por natureza. Não adianta tentar mudar a natureza das coisas...

PS: o módulo que eu fiz não é nada brilhante, é apenas um uso esperto
do Data::Dumper que, junto do B::Deparse, consegue gerar o código de
coderefs. Quem realmente merece o crédito é o B::Deparse (porque o
Data::Dumper, nesse caso, faz apenas um uso esperto do B::Deparse).

PPS: uma coisa que eu achei especialmente legal no módulo é que num
dos seus casos de teste, eu fiz com que ele gerasse o código dele
mesmo e depois executasse a versão gerada e re-gerasse seu próprio
código novamente. E tudo funcionou. ;-)
[quer dizer, depois que eu arrumei os bugs... as maravilhas de
test-driven development]

-Nilson Santos F. Jr.


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