В чем смысл предложения «мы хотели, чтобы оно было скомпилировано, чтобы процессор не записывал неправильные вещи».


10

Я читал эту статью. У него есть следующий абзац.

И Скала оказалась быстрой? Ну, как вы определяете пост? Примерно так же быстро, как Java. Это не должно быть так быстро, как C или Assembly. Python не значительно быстрее, чем Ruby. Мы хотели сделать больше с меньшим количеством машин, используя преимущества параллелизма; мы хотели, чтобы он был скомпилирован, чтобы процессор не записывал неправильные вещи.

Я ищу смысл последнего предложения. Как интерпретируемый язык заставит процессор делать «неправильные» вещи?


3
Вызов всего, что компилируется в байт-код JVM, интерпретируется немного либерально с использованием.
Rig

Ответы:


47

Если код говорит

A = A + 1

скомпилированный код делает это

add A, 1

интерпретированный код делает это (или некоторое изменение)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

получить идею?


3
Иногда чрезмерное упрощение действительно делает изображение более четким ;-) (просто для полноты: многие известные интерпретаторы оптимизируют некоторые шаги, поэтому они находятся здесь на полпути между двумя примерами «реализаций»).
Иоахим Зауэр

3
@JoachimSauer: Вы правы, конечно. По-прежнему сложно заставить интерпретатор работать с потерей скорости менее чем в 10 раз по сравнению со скомпилированным кодом. Если язык - тот, который действительно тратит все свое время на подчиненные скомпилированные функции, которые должны быть вызваны так или иначе, такие как математические библиотеки или ввод / вывод, стоимость интерпретации не является проблемой.
Майк Данлавей

1
Это удивительное описание
Джейми Тейлор

13

мы хотели, чтобы он был скомпилирован, чтобы процессор не записывал неправильные вещи.

Похоже, они имеют в виду скомпилированные и интерпретированные. Скорее всего, вплоть до истории о перемещении задач фоновой обработки в Scala (скомпилировано) после первоначальной разработки в Ruby On Rails (интерпретировано).

Объяснение скомпилированного и интерпретированного кода здесь .

При использовании скомпилированного языка вводимый код сокращается до набора машинно-специфических инструкций перед сохранением в виде исполняемого файла. В интерпретируемых языках код сохраняется в том же формате, который вы ввели. Скомпилированные программы обычно работают быстрее, чем интерпретируемые, потому что интерпретируемые программы должны быть сведены к машинным инструкциям во время выполнения.


Рад дать вам ваш первый +1. Добро пожаловать в P.SE!
Хайлем

4
(Стоит упомянуть, что Scala - так как он на JVM - технически только скомпилирован байт).
Хайлем

Не знал, что Scala основана на JVM. Это значит, что JIT скомпилирован. В таком случае, почему Twitter просто не перешел с Ruby on Rails на JRuby? Можно подумать, что это будет проще для миграции с преимуществом компилирования.
KrisG

3
Они также искали лучшую модель параллелизма, и у них были проблемы со сборкой мусора в Ruby. Статья описывает это подробно.
scrwtp

9

«Неправильные вещи» здесь означают накладные расходы, которые требуются интерпретатору для анализа и обработки кода. Это связано с понятием интерпретируемых и скомпилированных языков. Существует несколько моделей перевода кода, которые примерно относятся к одной из следующих категорий:

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

Следовательно, выбор между интерпретируемым и скомпилированным языком сводится к вопросу, что мы ценим больше, производительность разработчика или производительность? Миграция, описанная в этой статье, похоже, придерживается той же мысли: сильный язык прототипов Ruby заменен на Scala на основе JVM из соображений производительности.


-1 способ, которым сформулирован ответ, выглядит слишком упрощенно. Он полностью игнорирует такие вещи, как JIT ( сборка точно в срок ) - кстати, как Scala работает над JVM / CLR
gnat

Правда. Перепишите ответ, он немного добавил к теме.
scrwtp

-3

В данном случае я имею the wrong stuffв виду отсутствие безопасности типов в некомпилированном коде.

Таким образом, код не только интерпретируется медленнее, но и более глючит ...


8
Вы предполагаете, что скомпилированные языки безопасны по типу, а интерпретируемые - нет. Существует множество контрпримеров. Например, lisp может быть скомпилирован и не является строго типизированным, в то время как Haskell может интерпретироваться и является ОЧЕНЬ безопасным типом
Zachary K

1
Приравнивать «не тип безопасности» к «больше глючит» - это FUD, подталкиваемый людьми с продуктами для продажи.
user16764

1
@ user16764: Это не FUD, если это правда. IME - люди, выдвигающие глупости на тему продажи продуктов, - те, кто пытается преуменьшить связь между динамической типизацией и ошибками. («Это только один тип ошибок » и т. Д.)
Мейсон Уилер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.