У динамічних мовах, таких як JavaScript або Python, тип змінної визначається під час виконання. Це одна з причин, чому вони повільніше, ніж набрані мови, такі як Java.
Як проводиться перевірка типу? Яка істотна причина цього процесу повільний?
У динамічних мовах, таких як JavaScript або Python, тип змінної визначається під час виконання. Це одна з причин, чому вони повільніше, ніж набрані мови, такі як Java.
Як проводиться перевірка типу? Яка істотна причина цього процесу повільний?
Відповіді:
У питанні є плутанина.
Існує припущення, що перевірка типу повільна, що не обов'язково.
Питання також , здається, плутають процес типу відправки з перевіркою типів , і це дві різні речі. Один - це процес, який виконується під час виконання, інший - процес компіляції. Я підозрюю, що питання справді задає питання про відправку типу.
Це тип диспетчеризації, який може вводити накладні витрати під час виконання, оскільки обчислення витрачає час на інструкції, які динамічно вирішують, яку дію вжити, виходячи з типів значень, які він бачить під час виконання. наприклад, в динамічній мові, якщо я застосую "+" до двох речей, я можу означати числове додавання або з'єднання рядків, тому мені потрібно витратити час на перегляд того, що під рукою, щоб вирішити, що робити. Існують стратегії оцінювання, які можуть знизити вартість динамічної відправки. (наприклад, відстеження JIT)
Що стосується перевірки типу в JavaScript, див: http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/ . Для більш загального огляду того, як працюють шашки, стандартний підручник з мови програмування буде охоплювати алгоритми. Наприклад, http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/
В основному, у нетипізованих мовах кожна опорна точка на об’єкт, що містить і тип, і значення. Наприклад, var a = 3
вказує на екземпляр, який містить значення 3 та тип int, якщо ви робите a = "bla"
, посилання оновлюється до екземпляра, який містить рядок "bla" та рядок типу, старий об'єкт відкидається тощо.
Це повільно, оскільки щоразу, коли операція (наприклад a + b
) повинна бути виконана з цим базовим типом, час виконання спочатку повинен знеструмлювати об'єкти, перевірити їх сумісність, виконати операцію, створити новий об'єкт.
На відміну від цього, a + b
у C ++ або Java під час компіляції перевіряється, що типи є дійсними та сумісними, тоді a і b зберігаються як безпосередні значення (а не посилання), а додавання - це проста операція процесора над цими значеннями.
Звичайно, це все дуже теоретично. На практиці в цьому процесі можна зробити багато оптимізації, щоб уникнути більшої частини накладних витрат, а динамічно набрані мови можуть отримати досить швидко.
Кожне значення зберігається разом із його типом, який потрібно спочатку перевірити. Також конверсії говорять, що від рядка до числа йдуть на перевірку, на ходу.