Depois de mais de 1 mês de espera pra ter meu patch no parser do Perl aceito, hoje eu entrei pra lista de autores! Fantástico!
Encontrei um bug com mais de 5 anos, que passou despercebido aos olhos de muitos programadores do core do Perl 5.
Acho que é uma virtude minha detectar erros em texto... eu poderia virar revisor de livro ou equivalente. Leio com atenção, presto atenção nos detalhes, detecto padrões e anomalias.
Quer contribuir você também para o Perl? Comece por aqui.
Páginas
Showing posts with label perl. Show all posts
Showing posts with label perl. Show all posts
Sunday, November 20, 2011
Friday, November 4, 2011
Thursday, September 15, 2011
Perl, Ruby, Python & Racket: time matters
Estava aqui pensando em duas coisas:
Para as outras linguagens é similar, veja:
c.pl (Perl)
a
b
c
real 0m0.053s
user 0m0.030s
sys 0m0.020s
- Qual o comportamento de diversas linguagens de programação quando fazemos um "import" ou "require", e o que acontece se um mesmo arquivo for requirido várias vezes na árvore de dependências.
- Qual o tempo que leva para executar um script mínimo.
A motivação vem da diferença que dá usar #lang racket x #lang racket/base em Racket. Quando usamos a linguagem completa, temos todas as baterias em nossas mãos, e como penalização carregamos um monte de código pra memória sem que este seja efetivamente necessário. A segunda opção é mais leve, tem apenas definido elementos mais centrais da linguagem, ideal para usar quando estamos criando nossas bibliotecas.
Há uns anos atrás já havia feito experimentos similares (provavelmente não documentados) com Python. Agora fiz pequenos scripts em Python, Racket, Ruby e Perl para comparar. Atenção não leve em consideração os números deste post como "benchmarks" ou classificadores/qualificadores de uma ou outra linguagem.
O procedimento experimental
Para reproduzir este experimento, crie 4 diretórios:
mkdir t{python,ruby,racket,perl}
(Não entendeu a linha acima? Veja meu post sobre o uso de chaves no Bash)
Em cada um, crie 3 arquivos, "a", "b" e "c", com a extensão da respectiva linguagem.
O resultado final fica assim:
./tperl├── a.pl├── b.pl└── c.pl./tracket├── a.rkt├── b.rkt└── c.rkt./truby├── a.rb├── b.rb└── c.rb./tpython├── a.py├── b.py└── c.py
Cada arquivo contém:
tpython/a.py
::::::::::::::
print "a"
tpython/b.py
::::::::::::::
import a
print "b"
tpython/c.py
::::::::::::::
import a, b
print "c"
Para as outras linguagens é similar, veja:
c.pl (Perl)
require "a.pl";c.rkt (Racket)
require "b.pl";
print "c\n";
#lang racket/basec.rb (Ruby)
(require "a.rkt" "b.rkt")
(displayln "c")
require 'a.rb'
require 'b.rb'
puts 'c'
Resultado 1
Todas as 4 linguagens parecem ser consistentes em:
- executar todo o código do corpo de um arquivo importado (incluindo efeitos-colaterais)
- não re-executar código já importado anteriormente (mesmo que por dependência indireta)
Ou seja, o resultado visual da execução de todos os exemplos é:
a
b
c
Resultado 2
Entretanto, o tempo de execução é bem diferente. Usando o time, os melhores resultados encontrados após muitas execuções num Core2Duo 2.2GHz com Ubuntu 10.10 64bits:
time perl c.pl
real 0m0.007s
user 0m0.000s
sys 0m0.000s
time ruby c.rb
real 0m0.010s
user 0m0.000s
sys 0m0.000s
time python c.py
real 0m0.015s
user 0m0.010s
sys 0m0.000s
time racket c.rkt
real 0m0.084s
user 0m0.060s
sys 0m0.020s
Se compilarmos o código Racket usando o "raco make", temos:
raco make c.rkt
time racket c.rkt
real 0m0.053s
user 0m0.030s
sys 0m0.020s
Conclusão
- Racket e Python permitem fazer importação de vários módulos num único comando, enquanto que Ruby e Perl não. (Sim, existe o gem require_all pro Ruby, e certamente existe algo similar pro Perl no milagroso CPAN -- mas pelo que sei não existe solução "built-in" na linguagem)
- Meus amigos Perl Monges devem ficar felizes porque Perl despontou como o mais rápido, né Breno, Diogo, Samir, Ronald, e cia?
- Meus amigos adeptos do Ruby vão ficar felizes e dizer que Ruby é mais rápido do que Python :P
- Meus amigos Pythonistas, pé no chão, vão concordar que Python é rápido o suficiente e é mais divertido que Ruby (e que a conclusão acima, dos rubistas, não pode ser considerada já que meus resultados não provam nada...)
- Meus amigos que ainda estão conhecendo Racket podem fazer caretas, normal... não tô nem aí :)
Não me importo em "pagar o preço" para programar numa linguagem mais poderosa e bonita.
Obs: como as diferentes linguagens usam diferentes terminologias, perdoem o uso nem sempre preciso de "módulo", "arquivo", "importar", "requerer", etc. Espero não causar ambiguidade para o leitor.
Friday, November 26, 2010
Estou no rumo certo do TDD e Baby Steps?
Costumamos falar destes termos toda semana no DojoRio, mas imagino que nem todos de fato compreendem os termos para além das traduções pro português e mais alguma idéia superficial ou distorcida do que seja.
Isto não é um ataque, e sim um convite a reflexão para que cada um faça um "self-check"...
E aí, será que posso melhorar a qualidade do meu código? Será que faço TDD de verdade, ou só estou enrolando ou me enganando? Esses tais passos de bebê são úteis pra mim? Estou fazendo a coisa certa?
Graças ao link que o Berrondo mandou pra lista de emails recentemente (numa retrospectiva do que rolou na última quarta), vi que o Aniche fez boas considerações sobre este ponto:
http://www.aniche.com.br/2010/11/cuidado-com-seus-baby-steps/
Na quarta, depois do nosso randori normal de toda quarta, tivemos um kata do Juan Bernabó mostrando como ele ataca o problema de transformar números arábicos em romanos sem pensar! Isso mesmo, sem pensar. Sem parar de fazer o simples processo de escrever testes, identificar padrões e refatorar.
Confira o resultado do kata:
http://code.google.com/p/dojo-rio/source/browse/#svn/trunk/2010/20101124 - inteiros para romanos - perl
Isto não é um ataque, e sim um convite a reflexão para que cada um faça um "self-check"...
E aí, será que posso melhorar a qualidade do meu código? Será que faço TDD de verdade, ou só estou enrolando ou me enganando? Esses tais passos de bebê são úteis pra mim? Estou fazendo a coisa certa?
Graças ao link que o Berrondo mandou pra lista de emails recentemente (numa retrospectiva do que rolou na última quarta), vi que o Aniche fez boas considerações sobre este ponto:
http://www.aniche.com.br/2010/11/cuidado-com-seus-baby-steps/
Na quarta, depois do nosso randori normal de toda quarta, tivemos um kata do Juan Bernabó mostrando como ele ataca o problema de transformar números arábicos em romanos sem pensar! Isso mesmo, sem pensar. Sem parar de fazer o simples processo de escrever testes, identificar padrões e refatorar.
Confira o resultado do kata:
http://code.google.com/p/dojo-rio/source/browse/#svn/trunk/2010/20101124 - inteiros para romanos - perl
Subscribe to:
Posts (Atom)