Давайте разберемся несколько вещей:
- Интерактивные скриптовые и статические языки не являются взаимоисключающими. F # и Haskell оба имеют интерфейсы REPL.
- Динамические языки и высокая производительность не являются взаимоисключающими, хотя некоторые оптимизации есть. JavaScript работает чертовски быстро в большинстве браузеров в настоящее время.
- Даже в динамических языках вам все равно нужно документировать, запоминать и думать о типах.
- Из-за растущей популярности вывода типов, многие статические языки больше не должны часто записывать типы. В статических языках со строгим выводом типов компилятор выясняет, какие типы взяты из вашего кода, поэтому большую часть времени сообщает вам, если вы когда-нибудь делаете что-то, что нарушает определения типов. Что касается синтаксиса, это обеспечивает лучшее из обоих миров.
- ООП и динамические языки не являются взаимоисключающими. PHP теперь поддерживает классы и даже наследование.
Помимо всех этих удивительных сходств, есть некоторые практические различия, которые влияют на процесс разработки:
- Динамические языки допускают интересные способы передачи данных в малых .
- Статические языки позволяют вам сократить объемы тестирования, делая невозможными многие виды ошибок.
- В том же духе статические языки допускают интересные функции проверки и автоматического преобразования, такие как единицы измерения в F # .
- Взятые до крайности, статические языки допускают контракты кода и формальную проверку, которая может документировать и выравнивать, предотвращать такие вещи, как потенциальные деления на нули, бесконечные циклы, нулевые ссылки, недопустимые размеры или индексы списка, ошибки диапазона и другое логически недопустимое состояние что вы можете определить.
- Принимая это крайнее значение, можно оптимизировать процессор на основе этих статических ограничений, что приводит к еще большей производительности.
Существует также один тип программ, который никогда бы не был создан без статической типизации: Singularity , ОС без аппаратных границ процессов. Он написан на небольшом количестве C, немного C # и диалекте C #, называемом Spec #, который поддерживает контракты кода.
Несмотря на то, что она написана на языке для сбора мусора, производительность многозадачности и межпроцессного взаимодействия в этой ОС на самом деле лучше, чем что-либо еще, из-за того, что все процессы выполняются в одном пространстве памяти, и из-за формальной оптимизации проверки упомянутый выше. Вы не могли бы сделать это без статической типизации, потому что для того, чтобы программы не могли поставить под угрозу остальную часть системы, объекты связи должны быть статически проверяемыми.
Однако в большинстве случаев архитектура должна выглядеть примерно одинаково. Во многих случаях статические языки могут облегчить анализ программ, поскольку типы четко определены, но хорошо написанная программа с динамическим языком также будет иметь типы, которые, по крайней мере, хорошо определены разработчиками.