"Coisas erradas" aqui significam a sobrecarga necessária para o intérprete analisar e processar o código. Está ligado à noção de linguagens interpretadas versus linguagens compiladas. Existem vários modelos de tradução de código em uso, que se enquadram aproximadamente em uma das seguintes categorias:
- Compilação nativa - o código fonte é diretamente compilado no código da máquina. Melhor desempenho às custas da portabilidade. Comumente associado a C e C ++,
- Compilação intermediária - o código-fonte é compilado em uma linguagem intermediária simplificada (bytecode), que é posteriormente interpretada ou compilada (compilação just-in-time) no código da máquina durante a execução. Melhor portabilidade do que o código nativo, melhor desempenho do que a interpretação pura, mantendo algumas das vantagens da interpretação (como ligação tardia). Os exemplos incluem C #, Java e outras linguagens direcionadas à JVM e .NET CLR,
- Interpretação - o código fonte não é traduzido diretamente em código de máquina, mas é interpretado e executado por um programa de intérprete dedicado. Os intérpretes variam em sofisticação, na implementação ingênua, no entanto, tudo se resume a analisar, analisar e executar o código fonte linha por linha. A interpretação permite maior flexibilidade do que a compilação; portanto, linguagens interpretadas fazem uso mais amplo de digitação ou reflexão dinâmica, por exemplo. As linguagens interpretadas costumam ser vistas como oferecendo maior produtividade ao desenvolvedor, pois exigem menos código padrão e se prestam de maneira agradável à prototipagem rápida. A desvantagem é o desempenho reduzido. Comumente associado ao JavaScript, Ruby ou Python.
Portanto, a escolha entre linguagem interpretada e compilada se resume à questão: o que mais valorizamos, produtividade ou desempenho do desenvolvedor? A migração descrita no artigo parece seguir a mesma linha de pensamento, com a forte linguagem de prototipagem Ruby sendo substituída pelo Scala baseado em JVM devido a considerações de desempenho.