Что Вы теряете на практике при выборе статически типизированного языка, такого как Scala (или F#, Haskell, C#) вместо с динамическим контролем типов как Ruby, Python, Clojure, Groovy (которые имеют макросы или возможности метапрограммирования во время выполнения)? Рассмотрите лучшие статически типизированные языки и лучше всего (по Вашему мнению) динамически типизированные языки, не худшие.
Сводка ответов:
Главные преимущества динамических языков как Ruby по статически типизированному языку как Scala, по моему скромному мнению:
В принципе, вы отказываетесь от возможности игнорировать, какой тип вы используете, когда неясно (в статическом контексте), что правильно делать есть, и это все.
Поскольку сложная проверка типов может занять довольно много времени, вы, вероятно, также будете вынуждены отказаться от быстрого онлайн-метапрограммирования.
На практике, используя Scala, вы отказываетесь от очень немногого - и от того, что меня особенно волнует. Вы не можете внедрять новые методы, но можете компилировать и запускать новый код. Вы должны указать типы в аргументах функции (и тип возвращаемого значения с рекурсивными функциями), что немного раздражает, если вы никогда сами не делаете ошибок типа. Поскольку он компилирует каждую команду, Scala REPL не так быстр, как, например, оболочка Python. А поскольку он использует механизмы отражения Java, у вас нет такой легкости онлайн-проверки, как, например, Python (во всяком случае, не без создания собственной библиотеки инспекций).
Выбор , статический или динамический язык более важен, чем сам выбор статического / динамического. Некоторые динамические языки обладают хорошей производительностью и хорошими инструментами. Некоторые статические языки могут быть краткими, выразительными и инкрементными. Некоторые языки обладают немногими из этих качеств, но имеют большие библиотеки проверенного кода.
{'request': {'type': 'GET', 'path': mypath}, 'oncomplete': function (response) {alert (response .result)}}
. if
. eval
является основным продуктом большинства динамических языков и нескольких статических языков. Некоторая критика Scala была высказана Стивом Йегге здесь и здесь , а также Guido ван Россум , который в основном критиковал сложность системы типов Scala. Однако они явно не «программисты Scala». С другой стороны, вот некоторые похвалы от Джеймса Страчана .
На мой взгляд, разница между статической и динамической типизацией сводится к стилю кодирования. Хотя в Scala есть структурные типы, большую часть времени программист думает о типе объекта, включая классные гаджеты, такие как trait. С другой стороны, я думаю, что программисты Python / Javascript / Ruby думают в терминах прототипа объекта (списка методов и свойств), который немного отличается от типов.
Например, предположим, что существует семейство классов под названием Транспортное средство
, подклассы которого включают самолет
, Поезд
и Автомобиль
; и другое семейство классов под названием Animal
, подклассы которого включают Cat
, Dog
и Horse
.Программист на Scala, вероятно, создал бы трейт под названием Transportation
или что-то, что имеет
def ride: SomeResult
def ride(rider: Someone): SomeResult
в качестве члена, чтобы он мог использовать как Train
, так и Horse
в качестве средства транспорта. Программист на Python просто передал бы объект поезда без дополнительного кода. Во время выполнения язык определяет, что объект поддерживает ride
.
Тот факт, что вызовы методов разрешаются во время выполнения, позволяет таким языкам, как Python и Ruby, иметь библиотеки, которые переопределяют значение свойств или методов. Хорошим примером этого является отображение O / R или привязка данных XML, в которых неопределенное имя свойства интерпретируется как имя поля в таблице / типе XML. Я думаю, что это то, что люди подразумевают под «гибкостью».
По моему очень ограниченному опыту использования динамических языков, я думаю, что это более быстрое программирование на них, если вы не делаете ошибок. И, вероятно, когда вы или ваши коллеги научитесь кодить на динамическом языке, они будут делать меньше ошибок или начнут писать больше модульных тестов (удачи). Судя по моему ограниченному опыту, мне потребовалось очень много времени, чтобы найти простые ошибки в динамических языках, которые Scala может отловить за секунду. Кроме того, наличие всех типов во время компиляции упрощает рефакторинг.
Я не уверен, что вы потеряете что-нибудь но простота. Системы статического типа являются дополнительным бременем для изучения.
Я полагаю, вы обычно также теряете eval
, но я никогда не использую его, даже в динамических языках.
Я считаю, что проблема гораздо больше во всем остальном , когда дело доходит до выбора языка, который следует использовать для данной задачи. Инструменты, культура, библиотеки - все это намного интереснее, чем набор текста, когда дело доходит до решения проблемы с языком.
С другой стороны, исследование языков программирования совершенно иное. :)
Мои 2 цента ...
ИМО (сильные) статически типизированные языки могут уменьшить количество необходимого тестового кода, потому что часть этой работы будет выполняться компилятором. С другой стороны, если этап компиляции относительно длинный, это затрудняет программирование в «инкрементальном стиле», что в реальной жизни может привести к ошибочному коду, который был протестирован только на прохождение компилятора.
С другой стороны, языки с динамической типизацией чувствуют, что существует меньший порог для изменения вещей, что может сократить время ответа с момента исправления ошибок и улучшения, и в результате может обеспечить более плавную кривую во время разработки приложения. : обработка постоянного потока мелких изменений проще / менее рискованна, чем обработка изменений, которые поступают порциями ошибок.
Например, для проекта, в котором дизайн очень неясен и предполагается, что он часто меняется, было бы проще использовать динамический язык, чем статический, если бы он помог уменьшить взаимозависимости между различными частями. (Я не настаиваю на этом :))
Я думаю, что Scala находится где-то посередине (например, вам не нужно явно указывать типы переменных, что может облегчить обслуживание кода по сравнению, например, с C ++, но если вы в конечном итоге сделаете неправильное предположение о типах, компилятор напомнит об этом, в отличие от PHP, где вы можете писать что угодно, и если у вас нет хороших тестов, охватывающих функциональность, вы обречены узнать это, когда все живые и истекающие кровью).Конечно, может быть ужасно неправильно :)