Q: Я часто слышал утверждение, что динамически типизированные языки более производительны, чем статически типизированные. Каковы причины этого требования? "
Это имеет исторические причины. Если вы вернетесь на несколько десятилетий назад, динамические языки были, несомненно, значительно более продуктивными, чем статические (хотя и значительно медленнее). Очевидно, что Perl гораздо более продуктивен, чем C, если вы знаете и то, и другое, и задача под рукой позволяет либо. Но со временем языки многое позаимствовали друг у друга, и новые языки сокращают разрыв (как в производительности, так и в производительности).
Вот некоторые моменты для рассмотрения:
Сборка мусора : Сборка мусора - огромный прирост производительности. Я считаю, что Java был первым основным статическим языком с GC. До этого статическое в основном означало ручное управление памятью. (Примечание: здесь и далее я рассматриваю только основные языки. Существует множество экспериментальных и нишевых языков, которые предоставят контрпримеры к любому пункту, который я сделаю.)
Безопасность памяти : это повышение производительности, при котором вам не нужно беспокоиться о том, чтобы выстрелить себе в ногу. До «управляемых» статических языков, таких как Java, статический обычно подразумевал прямой доступ к памяти. Отладка также является частью производительности, и небезопасный доступ к памяти может привести к действительно неясным ошибкам.
Громоздкие системы типов. До введения параметризованных типов (таких как шаблоны или обобщения) в статических языках ограничения систем статических типов часто были обузой. Например, в Java вы должны были явно понижать значение каждый раз, когда выбирали элемент из коллекции. Таким образом, у вас есть синтаксические накладные расходы на приведение и отсутствие безопасности типов. Учитывая, насколько распространены коллекции в программировании, это стало серьезным недостатком.
Необходимость объявлять тип всего - много избыточной типизации, но с современным выводом типа это может быть значительно уменьшено.
Большая стандартная библиотека. Известно, что Python рекламировался как «включенные батареи» из-за большой стандартной библиотеки. Это по сравнению с C, которые имеют очень минималистскую стандартную библиотеку. Но с такими платформами, как Java и .net, обширная стандартная библиотека становится стандартной, и новые языки, такие как Scala и F #, наследуют это «бесплатно».
Первоклассные структуры данных. Динамические языки, такие как Perl и Python, имеют встроенные первоклассные структуры данных, такие как списки и карты, с удобными синтаксическими ярлыками для обычных операций. По сравнению с этим, в C нет встроенных коллекций, кроме массивов фиксированного размера.
Замыкания и лямбда-синтаксис - динамические языки обычно имели это с самого начала, но статические языки приняли это, совсем недавно Java.
REPL Возможность быстро тестировать фрагменты кода в интерактивном режиме - огромное преимущество. Но хотя инструменты IDE, такие как «немедленное» окно в Visual Studio, статические языки могут до некоторой степени эмулировать это.
Расширенный инструментарий - в дополнение к вышеперечисленным моментам, когда статические языки становятся ближе к удобству динамических языков, современные редакторы используют преимущества статического анализа таким образом, что динамические языки сталкиваются с трудностями сопоставления. Например, редакторы могут обеспечить безопасный автоматический рефакторинг, что, строго говоря, невозможно в динамическом языке.
Итог: Исторически это было правдой, но сегодня ответ менее ясен.
Q: Итак: что можно сказать о производительности с динамической типизацией, которая действительно является преимуществом самой модели типов?
Довольно сложно отделить модель динамической типизации от динамических языков, но в качестве примера C # принял более динамические функции с течением времени, даже несмотря на то, что его ядром является статический язык. Это действительно доказательство преимуществ модели динамического типа. Примеры:
Отражение
Отражение - это, по сути, функция динамического набора текста. Вы проверяете типы объектов во время выполнения, а не во время компиляции. Когда это было введено, это было своего рода неодобрение, но в C # использование отражения становится все более и более повсеместным, например, ASP.Net MVC интенсивно использует отражение.
Атрибуты
Атрибуты являются примером динамической типизации. Вы можете добавить произвольные атрибуты в класс во время компиляции, а затем проверять во время выполнения (посредством отражения) и манипулировать объектами на его основе. Нечто подобное MEP в основном является структурой расширения, основанной на модели динамического типа.
Linq to SQL, EF mv.
Различные преобразователи Linq проверяют запросы как объекты времени выполнения и генерируют sql на лету. Он не становится более динамичным, чем проверка кода во время выполнения. CodeDom - это другая сторона медали, где код может быть сгенерирован во время выполнения.
Roslyn
Roslyn в основном реализует eval
, что когда-то считалось определяющей чертой действительно динамичного языка.
Динамическийdynamic
-тип наиболее явно динамическая функция в C #, и рекламируется на обеспечение взаимодействия с внешними объектами и языками более простыми и производительными. Но он также используется в Asp.net MVC для удобства.
Преимущество всех вышеперечисленных функций показывает, что динамическая модель имеет определенные преимущества даже в статическом языке с параметризованными типами, структурными типами и выводом типов.