Як перевіряється тип в інтерпретаторі / компіляторі динамічної мови, такому як JavaScript?


11

У динамічних мовах, таких як JavaScript або Python, тип змінної визначається під час виконання. Це одна з причин, чому вони повільніше, ніж набрані мови, такі як Java.

Як проводиться перевірка типу? Яка істотна причина цього процесу повільний?


Вони не повільніші, тому що вони динамічні, вони повільніші, тому що важче зробити їх швидшими. JavaScript насправді найбільш оптимізований і досить швидкий.
Дерек Літц

Відповіді:


5

У питанні є плутанина.

Існує припущення, що перевірка типу повільна, що не обов'язково.

Питання також , здається, плутають процес типу відправки з перевіркою типів , і це дві різні речі. Один - це процес, який виконується під час виконання, інший - процес компіляції. Я підозрюю, що питання справді задає питання про відправку типу.

Це тип диспетчеризації, який може вводити накладні витрати під час виконання, оскільки обчислення витрачає час на інструкції, які динамічно вирішують, яку дію вжити, виходячи з типів значень, які він бачить під час виконання. наприклад, в динамічній мові, якщо я застосую "+" до двох речей, я можу означати числове додавання або з'єднання рядків, тому мені потрібно витратити час на перегляд того, що під рукою, щоб вирішити, що робити. Існують стратегії оцінювання, які можуть знизити вартість динамічної відправки. (наприклад, відстеження JIT)

Що стосується перевірки типу в JavaScript, див: http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/ . Для більш загального огляду того, як працюють шашки, стандартний підручник з мови програмування буде охоплювати алгоритми. Наприклад, http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/


Я також написав невелике опитування про відстеження JIT та динамічних мов на hashcollision.org/comprehensive/tracing.pdf

Інтерпретатор Javascript містить біти тегів з кожним значенням для відправки типу. Не могли б ви детальніше зупинитися на цьому? Наприклад, в чому користь бітів тегів? Чи трохи відповідає типу?

Поняття типу не завжди пов'язане з представленням. Наприклад, у нас може бути поняття типу «миля» проти типу «кілометр», і розумно мати мову, яка може статично визначати під час компіляції, чи обчислення неправильно застосовують операції над значеннями, які псують типи . Ви можете собі уявити, що вони мали б однакове представлення, і якщо компілятор може під час компіляції гарантувати, що вони ніколи не будуть змішуватися, то немає жодної причини, чому значенням потрібне додаткове маркування у представленні.

1
Продовження: але часто, особливо на динамічних мовах, потрібно представляти значення різних типів. Існує кілька способів зробити цю дискримінацію. Теги типу є загальними, але є й інші методи. Наприклад, ви можете розмістити певні типи в заблокованих областях пам'яті. Див. "Представлення інформації про тип на динамічно набраних мовах". lambda-the-ultimate.org/node/3912 для комплексного опитування методик представлення.

7

В основному, у нетипізованих мовах кожна опорна точка на об’єкт, що містить і тип, і значення. Наприклад, var a = 3вказує на екземпляр, який містить значення 3 та тип int, якщо ви робите a = "bla", посилання оновлюється до екземпляра, який містить рядок "bla" та рядок типу, старий об'єкт відкидається тощо.

Це повільно, оскільки щоразу, коли операція (наприклад a + b) повинна бути виконана з цим базовим типом, час виконання спочатку повинен знеструмлювати об'єкти, перевірити їх сумісність, виконати операцію, створити новий об'єкт.

На відміну від цього, a + bу C ++ або Java під час компіляції перевіряється, що типи є дійсними та сумісними, тоді a і b зберігаються як безпосередні значення (а не посилання), а додавання - це проста операція процесора над цими значеннями.

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


1
Трюки, такі як поліморфні вбудовані кеші, можуть значно покращити продуктивність. Записи Девіда Унгара ("Я") та Еліота Міранди ("Скрік", "Віртуальні машини Smalltalk", віртуальні машини) є найбільш інформативними щодо динамічної мовної роботи.
Френк Ширар

0

Кожне значення зберігається разом із його типом, який потрібно спочатку перевірити. Також конверсії говорять, що від рядка до числа йдуть на перевірку, на ходу.


Так, це все, це просто перевірка виконання, нічого фантазійного.
Anon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.