O desafio das línguas

“O Desafio das Línguas: da má gestão ao bom-senso”, esse é o título de um livro muito interessante que agora está disponível em PDF. O livro, traduzido ao português a partir do francês, trata dos problemas da troca de informações entre diferentes línguas, muitas vezes feitas num inglês muito precário, numa mistura de idiomas, à base de gestos, ou com tradutores automáticos (que a gente sabe que são ótimos geradores de risadas, mas pra traduzir mesmo são outros 500).

Eu tenho a edição anterior desse livro, impressa, e não conseguia parar de ler de tão interessante que achei. Agora temos uma versão nova e disponível na internet, que beleza! Peguem qualquer capítulo (ou leiam tudo em ordem) e com certeza vão encontrar coisas interessantes lá (inclusive frases engraçadas geradas por tradução ruim!).

Até o capítulo 6, o autor explica bem o problema com dados e exemplos concretos, focando bastante nos mitos que “inglês é fácil”, “todo mundo fala inglês”, etc. Do capítulo 7 em diante, ele mostra uma proposta de solução para esse problema. Uma solução geralmente ignorada, mas com muitas vantagens…

Passagem de parâmetros em Java

Ontem no grupo de Computação Gráfica na UFRGS a gente teve uma bela discussão sobre passagem de parâmetros em Java. O interessante é que todo mundo sabia como funciona o mecanismo, só que uns chamavam de um jeito e outros (no caso, só o Pamplona, hehehe) chamavam a mesma coisa de outro nome. Por exemplo:

No caso de uma variável de um tipo primitivo, ela é passada por valor (isto é, por cópia).

No caso de uma variável contendo um objeto, o ponteiro pro objeto, ou melhor, a referência (assim costuma-se dizer em Java) é passada por valor.

E aqui havia a bifurcação:

Eu e todo mundo dizíamos, que se a referência ao objeto é passada, o objeto é passado por referência, então! Simples e lógico…

Já o Pamplona concluía que então tudo era passado por valor, já que a referência ao objeto era passada por valor, do mesmo jeito que os tipos primitivos. Faz sentido também, mas eu ainda acho que passar uma referência é passagem por referência. :)

Não me lembrei de perguntar: “Se isso aí não é passagem por referência, o que é passagem por referência então?”. Bom, imagino que a resposta seria: “Passagem por referência é passar a própria referência por referência”. Pra mim isso o nome disso é exatamente o que eu escrevi: passagem de referência por referência. Confuso? Acho que não! (o outro caso era passagem de objeto por referência, só pra relembrar) :D

No fim das contas, eu acho que o programador não pode deixar de saber que existe tanto o objeto quanto sua referência. São 2 expressões (passagem por valor e passagem por referência) pra expressar 3 conceitos (valor, referência por valor e referência por referência). Não tem como explicar melhor as coisas sem dar a explicação completa. Dizer que é tudo por valor não explica bem todos os casos, e dizer que tipos primitivos são passados por valor e objetos são passados por referência também é uma explicação meio incompleta (fica faltando: “é a referência ao objeto que é passada por valor”).

Agora, não é incrível que uma linguagem tão usada como o Java tenha apenas essas duas maneiras de passar parâmetros? Bah, isso é uma coisa básica, falta uma passagem por referência pra tipos primitivos… Como é que eu vou criar uma função pra trocar dois valores (fazer um “swap“)? Não dá! Em C++, tem a função std::swap. Ela é engraçada pois, apesar de ser um conceito simples, precisa usar um recurso avançado da linguagem: templates (fora a indispensável passagem por referência™, é claro). Mas funciona. E Python, Lua e outras linguagens, nem precisam dessa função, basta fazer algo como (em Lua): y, x = x, y. Pronto, x e y estão trocados… Só pra comparar, em C o negócio também é problemático, não sei se pior ou melhor que Java. C# e D têm passagem por referência, cada um ao seu jeito.