E se o compilador jogasse um warning quando estamos usando algo que claramente tem undefined behavior (como alguns casos tabelados) ?<div><br></div><div>Seria o melhor dos dois mundos: ou o programador sabe com certeza o que esta fazendo ou o compilador/interpretador/etc avisa "hum... danadinho..."<br>
<br><div class="gmail_quote">2011/2/14 Blabos de Blebe <span dir="ltr"><<a href="mailto:blabos@gmail.com">blabos@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">>> Enfim, o que quero dizer é que o Perl tem um imenso potencial de produzir<br>
>> código cheio de Pseudo-undefined Behavior; por que ninguém tem obrigação de<br>
>> saber todas as faces de todos os operadores; isso sem contar as L<perlvar>.<br>
<br>
</div>Este email também tem potencial pra produzir undefined behavior.<br>
Deveríamos parar de escrever emails por causa disso?<br>
<br>
Opa, espere um momento. Como assim um programador não deve saber<br>
exatamente o que ele está usando?<br>
<br>
É claro que o programador *tem* sim que conhecer exatamente como<br>
funciona cada token que ele está usando, senão é melhor ir vender água<br>
de coco na praia.<br>
<br>
É por isso que certas empresas abrem certas falhas de segurança em<br>
certos servidores de produção.<br>
<br>
O problema é que Perl é uma linguagem muito abrangente e concordo com<br>
vc que é praticamente impossível memorizar todos os operadores. Mas se<br>
vc *usa*, vc é obrigado a saber.<br>
<br>
O ponto aliás nem é esse. Desconhecer, não implica em undefined<br>
behavior. Implica em não obter o resultado que era esperado, logo a<br>
falha está em não ser competente o suficiente para usar esta<br>
ferramenta da linguagem.<br>
<br>
Já em C por exemplo, existem construções que *produzem* undefined<br>
behavior, ou seja fica a cargo de quem implementou o compilador<br>
resolver. Se ele quiser formatar seu disco ao atingir um ponto desses,<br>
ele é livre pra isso.<br>
<br>
Por exemplo, o padrão C não define se variáveis automáticas (alocadas<br>
na pilha) são ou não inicializadas automaticamente. Daí, num<br>
compilador do Solaris (o Fernando pode confirmar), todas as variáveis<br>
automáticas são inicializadas automaticamente (zero para inteiros). Já<br>
no gcc não (mantém-se o valor que já estava na memória). Então, você<br>
escreve um código no Solaris, compila, testa, homologa e ok. Aí você<br>
leva esse código, que está dentro do padrão, para compilar no gcc e ao<br>
rodar na nova plataforma ele quebra.<br>
<br>
Isso sim é um problema. O mesmo código, estritamente dentro do padrão,<br>
apresentando comportamentos diferentes dependendo da situação.<br>
<br>
Oras, o programador experiente tem que conhecer bem a linguagem pra<br>
não cair nessas armadilhas. Se não conhece, não deveria codificar<br>
*profissionalmente*.<br>
<br>
É como se eu pegasse uma faca e saísse dizendo que sou cirurgião, só<br>
porque sei cortar carne. E aí, posso fazer uma neurocirugia em você?<br>
Eu tenho potencial pra ser um ótimo cirurgião :)<br>
<br>
As pessoas tem que ter mais responsabilidade. Hoje qualquer mané que<br>
mal consegue encadear uma idéia, aprende um if e um for, copia e cola<br>
Perl 3 do forum ultra hacker e sai falando que é Analista Programador.<br>
É foda viu!<br>
<br>
De qualquer forma eu acho ótimo esse debate com pontos de vistas<br>
diferentes. Ninguém é dono da verdade.<br>
<div><div></div><div class="h5"><br>
Abraços<br>
<br>
2011/2/14 Stanislaw Pusep <<a href="mailto:creaktive@gmail.com">creaktive@gmail.com</a>>:<br>
> Aliás, o que explode o meu cérebro é a frase "These rules look complicated,<br>
> but usually they will do what you want.", a respeito do "given/when", também<br>
> em L<perlsyn> ;)<br>
><br>
> ABS()<br>
><br>
><br>
><br>
> 2011/2/14 Stanislaw Pusep <<a href="mailto:creaktive@gmail.com">creaktive@gmail.com</a>><br>
>><br>
>> Ehehe, vou tentar contextualizar a minha lembrança... Tomo como exemplo a<br>
>> "tabela-verdade" do operador ~~ ("smart matching", L<perlsyn>):<br>
>><br>
>> $a $b Type of Match Implied Matching Code<br>
>> ====== ===== ===================== =============<br>
>> Any undef undefined !defined $a<br>
>><br>
>> Any Object invokes ~~ overloading on $object, or dies<br>
>><br>
>> Hash CodeRef sub truth for each key[1] !grep { !$b->($_) }<br>
>> keys %$a<br>
>> Array CodeRef sub truth for each elt[1] !grep { !$b->($_) }<br>
>> @$a<br>
>> Any CodeRef scalar sub truth $b->($a)<br>
>><br>
>> Hash Hash hash keys identical (every key is found in<br>
>> both hashes)<br>
>> Array Hash hash slice existence grep { exists<br>
>> $b->{$_} } @$a<br>
>> Regex Hash hash key grep grep /$a/, keys %$b<br>
>> undef Hash always false (undef can't be a key)<br>
>> Any Hash hash entry existence exists $b->{$a}<br>
>><br>
>> Hash Array hash slice existence grep { exists<br>
>> $a->{$_} } @$b<br>
>> Array Array arrays are comparable[2]<br>
>> Regex Array array grep grep /$a/, @$b<br>
>> undef Array array contains undef grep !defined, @$b<br>
>> Any Array match against an array element[3]<br>
>> grep $a ~~ $_, @$b<br>
>><br>
>> Hash Regex hash key grep grep /$b/, keys %$a<br>
>> Array Regex array grep grep /$b/, @$a<br>
>> Any Regex pattern match $a =~ /$b/<br>
>><br>
>> Object Any invokes ~~ overloading on $object, or falls<br>
>> back:<br>
>> Any Num numeric equality $a == $b<br>
>> Num numish[4] numeric equality $a == $b<br>
>> undef Any undefined !defined($b)<br>
>> Any Any string equality $a eq $b<br>
>><br>
>> 1 - empty hashes or arrays will match.<br>
>> 2 - that is, each element smart-matches the element of same index<br>
>> in the<br>
>> other array. [3]<br>
>> 3 - If a circular reference is found, we fall back to referential<br>
>> equality.<br>
>> 4 - either a real number, or a string that looks like a number<br>
>><br>
>> Olha, não sei quanto aos outros participantes da lista, mas eu<br>
>> simplesmente não consigo me ater a todos esses detalhes<br>
>> :(<br>
>> Então nunca uso esse operador que me confunde (PARA MIM, é um "Undefined<br>
>> Behavior"), preferindo fazer "à moda antiga" (última coluna). Enfim, sou<br>
>> desses caras que enchem qqer operação de ()'s, tipo: ((($x / $y) - $z) > 0).<br>
>> Enfim, o que quero dizer é que o Perl tem um imenso potencial de produzir<br>
>> código cheio de Pseudo-undefined Behavior; por que ninguém tem obrigação de<br>
>> saber todas as faces de todos os operadores; isso sem contar as L<perlvar>.<br>
>><br>
>> ABS()<br>
>><br>
>><br>
>><br>
>> 2011/2/14 Blabos de Blebe <<a href="mailto:blabos@gmail.com">blabos@gmail.com</a>><br>
>>><br>
>>> Oras, isso me lembra<br>
>>><br>
>>> <a href="http://www.ioccc.org/1987/wall.c" target="_blank">http://www.ioccc.org/1987/wall.c</a><br>
>>><br>
>>> Uma coisa é você usar isso em um golf, outra é usar em código de<br>
>>> produção.<br>
>>><br>
>>> Tem gente que empeteca o código com meia dúzia de regexp e se ahca 'O<br>
>>> Hackerzão'.<br>
>>><br>
>>> A maior parte dos bugs (com os quais estou lidando agora, por<br>
>>> exemplo), teria sido evitada se fossem respeitados os padrões mínimos<br>
>>> de boas práticas. Coisa que qualquer estagiário *deveria* sair da<br>
>>> escolinha sabendo.<br>
>>><br>
>>> Abraços<br>
>>><br>
>>> 2011/2/14 Stanislaw Pusep <<a href="mailto:creaktive@gmail.com">creaktive@gmail.com</a>>:<br>
>>> > Não sei pq, mas lembrei da seguinte sintaxe, compilável em Perl:<br>
>>> ><br>
>>> > -f>@+?*<.-&'_:$#/%!<br>
>>> ><br>
>>> > ABS()<br>
>>> ><br>
>>> ><br>
>>> ><br>
>>> > 2011/2/14 Blabos de Blebe <<a href="mailto:blabos@gmail.com">blabos@gmail.com</a>><br>
>>> >><br>
>>> >> Bom dia,<br>
>>> >><br>
>>> >> Sem querer entrar em flames, ou no mérito da discussão, que tomo<br>
>>> >> apenas como exemplo.<br>
>>> >><br>
>>> >> A thread abaixo é uma discussão que está acontecendo na principal<br>
>>> >> lista de C++ brasileira, sobre undefined behavior.<br>
>>> >><br>
>>> >><br>
>>> >><br>
>>> >> <a href="http://groups.google.com/group/ccppbrasil/browse_thread/thread/9b9a7be45917095e#" target="_blank">http://groups.google.com/group/ccppbrasil/browse_thread/thread/9b9a7be45917095e#</a><br>
>>> >><br>
>>> >> Notem como o Undefined behavior deste exemplo em particular pode ser<br>
>>> >> resolvido com 'codificação elegante'. Ok, o assunto era outro e foi só<br>
>>> >> um exemplo rápido, mas levantou a discussão que está acontecendo até<br>
>>> >> agora.<br>
>>> >><br>
>>> >> A maioria dos 'Undefined Behaviors' das linguagens de programação que<br>
>>> >> conheço (não são muitos) são casos específicos, incomuns, bem<br>
>>> >> documentados, bem avisados, normalmente abertos por 'depender da<br>
>>> >> implementação' e invocados por código porco de programadores meia-boca<br>
>>> >> (não que este caso de *exemplo* seja um).<br>
>>> >><br>
>>> >> É claro, nenhuma linguagem é perfeita (exceto lisp), mas elas possuem<br>
>>> >> especificações, mais abrangentes ou menos abrangentes. Por isso, não<br>
>>> >> importa a linguagem, ou você se aprofunda e aprende, ou mais cedo ou<br>
>>> >> mais tarte, vai acabar caindo em alguma dessas asrmadilhas.<br>
>>> >><br>
>>> >> Na minha opinião, C tem mais armadilhas e/ou hacks que precisam de um<br>
>>> >> pouco mais de conhecimento de arquitetura de computadores para escapar<br>
>>> >> do que Perl, enquanto Perl tem outros tipos de armadilhas.<br>
>>> >><br>
>>> >> Entenda armadilha aqui como "algo que eu imaginava de um jeito, mas<br>
>>> >> aconteceu de outro", independente da expectativa ser razoável ou não.<br>
>>> >><br>
>>> >> O negócio é que como Perl é mais fácil de lidar do que C, você alcança<br>
>>> >> as armadilhas de Perl mais cedo do que conseguiria caminhar em C para<br>
>>> >> alcançar as suas, logo, Perl parece mais imprevisível.<br>
>>> >><br>
>>> >> Abraços<br>
>>> >> =begin disclaimer<br>
>>> >> Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
>>> >> SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
>>> >> L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
>>> >> =end disclaimer<br>
>>> ><br>
>>> ><br>
>>> > =begin disclaimer<br>
>>> > Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
>>> > SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
>>> > L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
>>> > =end disclaimer<br>
>>> ><br>
>>> ><br>
>>> =begin disclaimer<br>
>>> Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
>>> SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
>>> L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
>>> =end disclaimer<br>
>><br>
><br>
><br>
> =begin disclaimer<br>
> Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
> SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
> L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
> =end disclaimer<br>
><br>
><br>
=begin disclaimer<br>
Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Tiago B. Peczenyj<br>Linux User #405772<br><br><a href="http://pacman.blog.br">http://pacman.blog.br</a><br>
</div>