[SP-pm] Referências

Thiago Rondon thiago at aware.com.br
Tue Nov 18 17:52:27 PST 2008


Otávio Fernandes escreveu:
> 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.
>
> um abraço,
>
> Otávio Fernandes <otaviof at gmail.com>
> http://otaviof.blogspot.com/
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
>
>   
Pessoal,

Na minha opnião fica complicado até fazer o compartivo de perfomance, 
pois podemos ter algo como:

__PERL__

sub print_array($) {
  ....
}

# print_array("1");                  - 1
# print_array(@array);            - scalar(@array)
# print_array("1", @array)     - erro

__PERL__

Ou algo como:

__PERL__

sub print_array (\@@) {
    my $array_ref = shift;
    my @another_array = @_;

    print @{$array_ref};

}

my @foo = (1, 2, 3);
my @bar = (4, 5, 6);

# print_array(\@foo, @bar);

__PERL__

Ou seja, as vezes podemos pensar apenas na economia de perfomance por 
casting de uma
única ação, mas em vários casos pela implementação no geral, vejo que 
utilizar protótipos
pode economizar trabalho e ainda perfomance.

Nos casos acima, posso ter que mudar meu algoritimo para poder realizar 
a "ação desejada
print_array() se quiser utilizar casting terei mais "trabalho" e "custo".

Acredito, que sem dúvidas o casting em si deva ser mais rápido (talvez, 
muito pouco), pois
você evita a checagem da utilização em run-time do compilador em relação 
a chamada da
função (que na minha opnião, deve ser minima), mas aí estaremos falando 
apenas da
alternativa técnica casting vs. protótipos.

Resumindo, na maioria dos casos que já verifiquei esta situação, valia 
muito apena utilizar
protótipos ao inves de casting, mesmo pela perfomance, menos código, ....

E complementando...

No Perl utilizar protótipos para apenas a verificação do compilador é 
uma opção apenas,
quando não *documentada no código* pode se tornar um problema maior do 
que em si uma
"referencia" para o compilador, pois o grande trunfo de utilização de 
prototipos em Perl
é poder efetuar coesão de dados, economizando código e perfomance.

-Thiago Rondon








More information about the SaoPaulo-pm mailing list