Каковы особенности динамических языков (таких как Ruby или Clojure), которые отсутствуют в Scala? - PullRequest
13 голосов
/ 02 апреля 2010

Что вы теряете на практике, когда выбираете статически типизированный язык, такой как Scala (или F #, Haskell, C #), вместо динамически типизируемого, такого как Ruby, Python, Clojure, Groovy (который имеет макросы или возможности метапрограммирования во время выполнения )? Пожалуйста, рассмотрите лучшие статически типизированные языки и лучшие (по вашему мнению) динамически типизированные языки, а не худшие.

Сводка ответов :

Ключевые преимущества динамических языков, таких как Ruby, перед языком со статической типизацией, таким как Scala IMHO:

  • Быстрый цикл редактирования-запуска (уменьшает ли пробел JavaRebel?)
  • В настоящее время сообщество Scala / Lift гораздо меньше, чем Ruby / Rails или Python / Django
  • Возможно изменение определений типов (хотя мотивация или необходимость в этом не очень ясны)

Ответы [ 7 ]

9 голосов
/ 02 апреля 2010

В принципе, вы отказываетесь от возможности игнорировать, какой тип вы используете, когда неясно (в статическом контексте), что нужно делать, и это все.

Поскольку сложная проверка типов может занимать довольно много времени, вы также, вероятно, вынуждены отказаться от быстрого онлайн-метапрограммирования.

На практике со Скалой вы отказываетесь от всего остального - и ничего, что меня особенно волнует. Вы не можете внедрить новые методы, но вы можете скомпилировать и запустить новый код. Вы должны указать типы в аргументах функции (и возвращаемый тип с рекурсивными функциями), что немного раздражает, если вы никогда не делаете ошибок типа самостоятельно. Так как он компилирует каждую команду, Scala REPL не такой быстрый, как, например, оболочка Python. А поскольку он использует механизмы отражения Java, вам не так легко проводить онлайн-инспекцию, как, например, с помощью Python (в любом случае, не без создания собственной инспекционной библиотеки).

4 голосов
/ 02 апреля 2010

Выбор для статического или динамического языка более важен, чем сам статический / динамический выбор. Некоторые динамические языки имеют хорошую производительность и хорошие инструменты. Некоторые статические языки могут быть краткими, выразительными и инкрементными. Некоторые языки обладают некоторыми из этих качеств, но имеют большие библиотеки проверенного кода.

3 голосов
/ 02 апреля 2010

Я не уверен, что вы потеряете что-нибудь, кроме простоты. Системы статического типа являются дополнительным бременем для обучения.

Полагаю, вы обычно тоже теряете eval, но я никогда не использую его, даже в динамических языках.

Я считаю, что проблема гораздо больше обо всем иначе , когда дело доходит до выбора языка, который нужно использовать для выполнения определенной задачи. Инструменты, культура, библиотеки гораздо интереснее, чем печатать, когда дело доходит до решения проблемы с языком.

Исследование языка программирования, с другой стороны, совершенно другое. :)

3 голосов
/ 02 апреля 2010
  1. Динамические языки, как правило, имеют гораздо более гибкие системы типов. Например, Python позволяет вводить новый метод в существующие классы или даже в один объект.
  2. Многие (не все) статические языки не имеют возможности создавать сложные литералы. Например, такие языки, как C # и Java, не могут легко имитировать следующий JavaScript { 'request':{'type':'GET', 'path':mypath}, 'oncomplete':function(response) { alert(response.result) } }.
  3. Динамические языки имеют очень плавную семантику. Python позволяет операторам импорта, определениям функций и определениям классов появляться внутри функций и if операторов.
  4. eval является основным продуктом большинства динамических языков и немногих статических языков.
  5. Программирование высшего порядка проще (по моему субъективному мнению) в динамических языках, чем в статических, из-за неловкости необходимости полностью указывать типы параметров функции.
    • Это особенно относится к рекурсивным конструкциям HOP, где система типов может реально помешать.
  6. Пользователи динамического языка не должны иметь дело с ковариацией и контравариантностью.
  7. Универсальное программирование поставляется практически бесплатно на динамических языках.
1 голос
/ 07 апреля 2010

Мои 2 цента ...

IMO (сильные) статически типизированные языки могут сократить объем необходимого тестового кода, потому что часть этой работы будет выполнена компилятором. С другой стороны, если этап компиляции является относительно длинным, это усложняет выполнение программирования в "инкрементном стиле", что в реальной жизни может привести к подверженному ошибкам коду, который был протестирован только для прохождения компилятора.

С другой стороны, языки с динамической типизацией чувствуют, что существует меньше порогов для изменения, что может сократить время отклика с точки зрения исправления ошибок и улучшения, и в результате может обеспечить более плавную кривую во время разработки приложения. : обрабатывать постоянный поток небольших изменений легче / менее рискованно, чем обрабатывать изменения, которые появляются в блоках ошибок.

Например, для проекта, где дизайн очень непонятен и предполагается, что он часто меняется, было бы проще использовать динамический язык, чем статический, если он помогает уменьшить взаимозависимости между различными частями. (Я не настаиваю на этом, хотя :))

Я думаю, что Scala находится где-то посередине (например, вам не нужно явно указывать типы переменных, что может упростить сопровождение кода по сравнению, например, с C ++, но если вы в итоге ошибаетесь в предположении о типах, компилятор напомнит об этом, в отличие от PHP, где вы можете написать что угодно, и если у вас нет хороших тестов, охватывающих функциональность, вы обречены это выяснить, когда все живо и кровоточит). Конечно, это может быть ужасно неправильно:)

1 голос
/ 03 апреля 2010

Некоторая критика Скалы была высказана Стивом Йегге здесь и здесь и Гвидо ван Россумом , который в основном атаковал сложность системы типов Скалы. Они явно не "программисты Scala". С другой стороны, вот некоторые похвалы от Джеймса Страхана .

0 голосов
/ 04 апреля 2010

На мой взгляд, разница между статической и динамической типизацией сводится к стилю кодирования. Хотя в Scala есть структурные типы, в большинстве случаев программист думает о типе объекта, включая такие гаджеты, как trait. С другой стороны, я думаю, что программисты Python / Javascript / Ruby думают с точки зрения прототипа объекта (список методов и свойств), который немного отличается от типов.

Например, предположим, что есть семейство классов под названием Vehicle, подклассы которого включают Plane, Train и Automobile; и другое семейство классов, называемое Animal, подклассы которого включают Cat, Dog и Horse. Программист Scala, вероятно, создаст черту с именем Transportation или что-то с

def ride: SomeResult
def ride(rider: Someone): SomeResult

как член, поэтому она может обращаться как с Train, так и с Horse как средство передвижения. Программист Python просто передал бы объект train без дополнительного кода. Во время выполнения язык выясняет, что объект поддерживает ride.

Тот факт, что вызовы методов разрешаются во время выполнения, позволяет таким языкам, как Python и Ruby, иметь библиотеки, которые переопределяют значение свойств или методов. Хорошим примером этого является сопоставление O / R или привязка данных XML, в котором неопределенное имя свойства интерпретируется как имя поля в типе таблицы / XML. Я думаю, что это то, что люди подразумевают под «гибкостью».

В моем очень ограниченном опыте использования динамических языков, я думаю, что они быстрее кодируют в них, если вы не делаете ошибок. И, вероятно, когда вы или ваши коллеги освоите кодирование на динамическом языке, они будут делать меньше ошибок или начнут писать больше юнит-тестов (удачи). Из моего ограниченного опыта я очень долго находил простые ошибки в динамических языках, которые Scala может поймать за секунду. Кроме того, наличие всех типов во время компиляции облегчает рефакторинг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...