«Неправильные вещи» здесь означают накладные расходы, которые требуются интерпретатору для анализа и обработки кода. Это связано с понятием интерпретируемых и скомпилированных языков. Существует несколько моделей перевода кода, которые примерно относятся к одной из следующих категорий:
- Собственная компиляция - исходный код напрямую компилируется в машинный код. Лучшая производительность за счет портативности. Обычно ассоциируется с C и C ++,
- Промежуточная компиляция - исходный код компилируется в упрощенный промежуточный язык (байт-код), который позднее интерпретируется или компилируется (компиляция точно в срок) в машинный код во время выполнения. Лучшая переносимость, чем собственный код, лучшая производительность, чем чистая интерпретация, сохраняя при этом некоторые преимущества интерпретации (например, позднее связывание). Примеры включают C #, Java и другие языки, ориентированные на JVM и .NET CLR,
- Интерпретация - исходный код напрямую не переводится в машинный код, а интерпретируется и выполняется специальной программой-интерпретатором. Интерпретаторы различаются по сложности, в наивной реализации, однако все сводится к анализу, анализу и исполнению исходного кода построчно. Интерпретация обеспечивает большую гибкость, чем компиляция, поэтому интерпретируемые языки, например, более широко используют динамическую типизацию или рефлексию. Интерпретируемые языки часто рассматриваются как обеспечивающие повышенную производительность труда разработчиков, так как они требуют меньшего количества стандартного кода и прекрасно подходят для быстрого создания прототипов. Недостатком является снижение производительности. Обычно ассоциируется с JavaScript, Ruby или Python.
Следовательно, выбор между интерпретируемым и скомпилированным языком сводится к вопросу, что мы ценим больше, производительность разработчика или производительность? Миграция, описанная в этой статье, похоже, придерживается той же мысли: сильный язык прототипов Ruby заменен на Scala на основе JVM из соображений производительности.