[SP-pm] Referências

Thiago Rondon thiago at aware.com.br
Tue Nov 18 19:23:00 PST 2008


Luis Motta Campos escreveu:
> Otávio Fernandes wrote:
>> 2008/11/18 Luis Motta Campos <luismottacampos em yahoo.co.uk>:
>>> André Garcia Carneiro wrote:
>>>> Já em Perl, não precisamos nos preocupar com isso, principalmente
>>>> porque não existem tipos. No entanto, a partir da versão 5.10(me
>>>> corrijam se estiver errado) do perl, se não me engano, ele já permite
>>>> fazer protótipos, só que com um propósito diferente. Eu não sei muito
>>>> bem porque ainda não estou mexendo com perl 5.10. O Champs disse que
>>>> um dos propósitos de protótipos em perl  é o de garantir uma
>>>> pré-transformação(se eu entendi o que ele disse), mas sinceramente,
>>>> não sei.
>>> OPA! Calminha aí! Toda a família do Perl 5 suporta protótipos. E acho
>>> que mesmo alguns dos mais antigos (4.X) também podem.
>>>
>>> "Protótipo" é um nome infeliz para a funcionalidade. O que acontece 
>>> (e o
>>> Eden citou a palavra certa) é "coerção" de dados: o Perl consegue
>>> "formatar" (num sentido restrito) a informação que está sendo passada.
>>> Vou me repetir, mas quero mesmo fazer vocês pensarem sobre isso:
>>>
>>> __PERL__
>>> sub proto_example ( $;$ ) {
>>>  print "@_";
>>> }
>>> my @arg = ( 1, 2, 3 );
>>> proto_example @arg; # imprime "3". Por que?
>>> &proto_example @arg; # imprime "123". Por que?
>>> __END__
>>>
>>> Este trechinho de código condensa tudo o que é importante saber sobre
>>> "protótipos". Agora, ponham estas cabecinhas para funcionar, por 
>>> favor... ;)
>>>
>>> Putamplexos!
>>> -- 
>>> Luis Motta Campos is a software engineer,
>>> Perl Programmer, foodie and photographer.
>>> _______________________________________________
>>> SaoPaulo-pm mailing list
>>> SaoPaulo-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>> Luis,
>>
>> Falando sobre o seu exemplo: no primeiro caso, ou seja, simplesmente
>> chamando a função ("()") e utilizando os parâmetros assim como
>> protótipo nos impõe, é impresso "3" porque é o número de parâmetros
>> informados no array, já que nós o convertemos para um scalar. No
>> segundo caso, sobrescrevendo o protótipo ("&{}"), é impresso o array
>> completo, ou seja, "123". Realmente este exemplo condensa tudo o que é
>> importante neste assunto, eu acho.
>>
>> Eu trabalhei um bom tempo com o Amavisd-New e nele o uso de protótipos
>> é extensamente utilizado, e, devo admitir, o desempenho não é o forte
>> deste software. Esta thread e a lembraça do Amavisd-New me fizeram
>> ficar pensando se todo o casting, tratamento e conversão de parâmetros
>> utilizados, fosse feito manualmente, e não via protótipos... será que
>> ele ganharia algum desempenho; ou, o código necessário para fazer todo
>> este trabalho poderia deixar o programa mais lento do que utilizando
>> os protótipos do Perl? Não vejo uma forma simples de provar isso com
>> um benchmark formal, mas fico pensando nesta teoria.
>
> O Abeltje, autoridade máxima da máquina de expressões regulares do 
> Perl, me garantiu que a diferença de performance é mínima. Parece que 
> a implementação de protótipos é apenas uma alteração no ponteiro que 
> determina o contexto durante a passagem de argumentos.
>
> Vale à pena fazer um benchmark, eu acho.
>
> Putamplexos
Fiquei curioso e baixai o código do Perl 5.10 para verificar como 
realmente é.

Li o arquivo op.c (não inteiramente, por que precisaria de mais tempo 
ainda).

Quando uma função é solicitada, o Perl verifica em sua tabela de referencia
(uma arvore OP), e caso perceba que existe um protótipo definido ele irá
sempre "clonar" os parametros baseados nos argumentos da função para
realizar a coesão em tempo de execução.

Resumindo, exatamente o que você disse. :-)

Vale a leitura da função op_const_sv deste arquivo, para quem ficar mais 
curioso.

-Thiago Rondon



More information about the SaoPaulo-pm mailing list