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…

Anúncios

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.