Каковы функции динамических языков (как Ruby или Clojure), который Вы пропускаете в Scala?

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

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

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

  • Быстрый управляемый редактированием цикл (делает JavaRebel, уменьшает разрыв?)
  • В настоящее время общественный из Scala/Lift намного меньше затем Ruby/направляющих или Python/Django
  • Возможный изменить определения типа (хотя мотивация или потребность в этом не очень ясны),
13
задан 7 revs, 3 users 87% 22 July 2013 в 16:59
поделиться

7 ответов

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

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

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

9
ответ дан 1 December 2019 в 22:38
поделиться

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

4
ответ дан 1 December 2019 в 22:38
поделиться
  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. Общее программирование на динамических языках практически бесплатно.
3
ответ дан 1 December 2019 в 22:38
поделиться

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

1
ответ дан 1 December 2019 в 22:38
поделиться

На мой взгляд, разница между статической и динамической типизацией сводится к стилю кодирования. Хотя в 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 может отловить за секунду. Кроме того, наличие всех типов во время компиляции упрощает рефакторинг.

0
ответ дан 1 December 2019 в 22:38
поделиться

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

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

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

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

3
ответ дан 1 December 2019 в 22:38
поделиться

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

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

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

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

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

1
ответ дан 1 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: