З: Я часто чув твердження, що мови, що динамічно набираються, є більш продуктивними, ніж мови, які мають статичний характер. Які причини цієї претензії? "
Це має історичні причини. Якщо повернутися на кілька десятиліть назад, динамічні мови, безперечно, були набагато продуктивнішими, ніж статичні мови (в той же час значно повільніше). Perl, очевидно, набагато продуктивніший, ніж C, якщо ви знаєте і те, і завдання під рукою дозволяє будь-яке. Але з часом мови багато запозичили один у одного, і новіші мови звужують розрив (і в продуктивності, і в продуктивності).
Ось кілька моментів, які слід врахувати:
Збір сміття : Збір сміття - це величезне підвищення продуктивності. Я вважаю, що Java була першою масовою статичною мовою з GC. До цього статичний в основному означав ручне управління пам'яттю. (Примітка. Тут і далі я розглядаю лише основні мови. Існує безліч експериментальних мов і нішевих мов, які надаватимуть контрприклади до будь-якої точки, яку я роблю.)
Безпека пам’яті : Це підвищення продуктивності, що вам не доведеться турбуватися про те, щоб стріляти в ногу. Перед "керованими" статичними мовами, такими як Java, статичні зазвичай означали прямий доступ до пам'яті. Налагодження також є частиною продуктивності, і небезпечний доступ до пам'яті може призвести до дійсно незрозумілих помилок.
Системи громіздкого типу. До впровадження в статичні мови параметризованих типів (наприклад, шаблонів або дженериків) обмеження систем статичних типів часто були тягарем. Наприклад, на Java вам потрібно було явно скинути щоразу, коли ви вибирали предмет із колекції. Таким чином, ви отримали синтаксичні накладні характеристики акторського складу та відсутність безпеки. З огляду на те, наскільки всюди поширені колекції в програмуванні, це був головний недолік.
Необхідність оголошувати тип всього - це надлишкове введення тексту, але при сучасних висновках типу це можна значно зменшити.
Велика стандартна бібліотека. З-за великої стандартної бібліотеки Python славно рекламувався як "батареї включені". Це порівняно з C, які мають дуже мінімалістичну стандартну бібліотеку. Але на таких платформах, як Java та .net, велика стандартна бібліотека стає стандартною, і нові мови, такі як Scala та F #, успадковують це "безкоштовно".
Структури даних першого класу. Динамічні мови, такі як Perl та Python, мають вбудовані першокласні структури даних, такі як списки та карти зі зручними синтаксичними ярликами для звичайних операцій. Порівняно з цим, у C немає вбудованих колекцій, крім масивів фіксованого розміру.
Синтаксис закриттів та лямбда - динамічні мови зазвичай мали це з самого початку, але статичні мови прийняли це, останнім часом Java.
ВІДПОВІДАЙТЕ можливість швидкого тестування фрагментів коду в інтерактивному режимі - величезна користь. Але хоча інструменти IDE, як "безпосереднє" вікно у Visual Studio, статичні мови можуть певною мірою імітувати це.
Розширений інструментарій - окрім перерахованих вище пунктів, коли статичні мови наближаються до зручності динамічних мов, сучасні редактори використовують переваги статичного аналізу таким чином, що динамічні мови мають складну відповідність. Наприклад, редактори можуть забезпечити безпечні автоматичні рефактори, що в динамічній мові суворо неможливо.
Підсумок: Історично це було правдою, але сьогодні відповідь менш чіткий.
Питання: Отже: що можна сказати про продуктивність при динамічному наборі тексту, що насправді є перевагою самої моделі типу?
Дещо важко відокремити модель динамічного набору тексту від динамічних мов, але як приклад C # прийняв з часом більш динамічні функції, навіть незважаючи на те, що вона є основою статичної мови. Це справді підтвердження переваги моделі динамічного типу. Приклади:
Рефлексія
Рефлексія - це принципово динамічна функція набору тексту. Ви перевіряєте типи об'єктів на raterime rater, ніж час компіляції. Коли він був представлений, це було нахмурено, але в C # використання рефлексії стає все більш і більш всюдисущим, наприклад, ASP.Net MVC сильно використовує рефлексію.
Атрибути
Атрибути є прикладом динамічного набору тексту. Ви можете додати довільні атрибути до класу під час компіляції, а потім перевіряєте під час виконання (через відображення) та маніпулюєте на ньому об'єктами. Щось на зразок MEP - це в основному структура розширення, заснована на моделі динамічного типу.
Linq - SQL, EF mv.
Різні трансформатори Linq перевіряють запити як об’єкти виконання та генерують sql на ходу. Це не стає більш динамічним, ніж перевірка коду під час виконання. CodeDom - інша сторона монети, де код може створюватися під час виконання
Roslyn
Roslyn в основному реалізує eval
, що колись вважалося визначальною рисою справді динамічної мови.
Dynamic
The dynamic
-type є найбільш чітко динамічною особливістю в C #, і рекламується при спрощенні та продуктивності взаємодії із зовнішніми об'єктами та мовами. Але він також використовується в Asp.net MVC для зручності.
Перевага всіх перерахованих вище функцій свідчить про те, що динамічна модель має певні переваги навіть у статичній мові з параметризованими типами, структурними типами та типом умовиводу.