Який сенс речення «ми хотіли, щоб воно було складено, щоб він не спалював процесор, що робив неправильні речі».


10

Я читав цю статтю. У ньому є наступний параграф.

І Скала виявилася швидкою? Ну, яке ваше визначення швидко? Приблизно так само швидко, як і Java. Це не повинно бути таким швидким, як C або збірка. Python не є значно швидшим, ніж Ruby. Ми хотіли зробити більше з меншою кількістю машин, використовуючи кращі переваги одночасності; ми хотіли, щоб він був складений, щоб він не спалював процесор, робив неправильні речі.

Шукаю значення останнього речення. Як інтерпретована мова змусить процесор робити "неправильні" речі?


3
Виклик всього, що компілюється в інтерпретований байтовий код JVM, є дещо ліберальним із використанням.
Ріг

Відповіді:


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

ми хотіли, щоб він був складений, щоб він не спалював процесор, робив неправильні речі.

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

Пояснення складається проти інтерпретується коду тут .

За допомогою компільованої мови код, який ви вводите, зводиться до набору інструкцій, визначених для машини, перед тим як зберігати їх як виконуваний файл. З інтерпретованими мовами код зберігається у тому ж форматі, який ви ввели. Скомпільовані програми зазвичай працюють швидше, ніж інтерпретовані, оскільки інтерпретовані програми повинні бути зведені до машинних інструкцій під час виконання.


Раді дати вам перший +1. Ласкаво просимо в P.SE!
хайлем

4
(Можливо, варто згадати, що Scala - як це є в JVM - технічно складається лише через байт).
хайлем

Не знав, що Scala базується на JVM. Значить його, ймовірно, складений JIT. У такому випадку, чому Twitter просто не перейшов з Ruby on Rails на JRuby? Ви б могли подумати, що це буде легшою міграцією з користю для складеного.
KrisG

3
Вони також шукали кращу модель одночасності, і у них виникли проблеми зі збиранням сміття Рубі. У статті її детально описано.
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, якщо це правда. ІМЕ люди, які підштовхують нісенітницю до предмета продажу товарів - це ті, хто намагається применшити зв’язок між динамічним набором тексту та помилками. ( «Це тільки один тип помилки ,» і т.д.)
Мейсон Wheeler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.