Почему Scala очень сложен? [закрытый]

16
задан Anantha Kumaran 4 April 2010 в 08:33
поделиться

11 ответов

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

Чисто с точки зрения языка три наиболее характерных особенности Java:

  1. это императив
  2. объектно-ориентированный подход
  3. сборка мусора

Функции 1 и 2 делают его очень похожим на широкий спектр языков из семейство Algol / C и C ++. Все эти языки либо имеют общие черты в своей парадигме, либо даже используют одни и те же.

Например, C #, несмотря на его синтаксические различия, Windows как основная целевая ОС и .NET framework как «библиотека классов» очень легко освоить Java-программистом. Это связано с тем, что оба языка используют одну и ту же парадигму программирования.

С другой стороны, Scala - несмотря на то, что он работает на JVM, обеспечивает легкую совместимость с Java API - это то, что обычно называют многопарадигмальным языком. Язык обеспечивает глубокую синтаксическую интеграцию функций языка функционального программирования, но при этом структурирует код объектно-ориентированным образом.

Концепция функционального программирования - особенно если вы перейдете к коду, выходящему за рамки тривиальных руководств - оказывается сложной для разработчиков, которые имеют опыт работы только с императивными, объектно-ориентированными языками. Мой личный опыт оказания помощи другим разработчикам в освоении Scala и др. Заключается в том, что это очень помогает сначала научить их Scheme;) Это красивый, небольшой, чистый диалект Lisp.Это помогает в передаче передовых функциональных концепций. Если вы решите попробовать, я рекомендую вам взглянуть на «Маленького интригана» и «Опытного интригана». Бьюсь об заклад, после того, как вы прочтете обе книги, вам будет легче разобраться в синтаксисе Scala и более ясно увидеть его концепции.

В двух словах: ИМХО, трудно изучить парадигму функционального программирования , это причина для большинства разработчиков, которые знакомы только с императивными языками, с трудом набирает скорость.

37
ответ дан 30 November 2019 в 15:02
поделиться

Я более сложный, потому что он должен иметь всю силу, которую он имеет. Java проще, но Java также не имеет такого же количества возможностей, как Scala.

Java:

  • +меньше для изучения
  • -замыканий
  • -типа вывода
  • -признаков
  • -падежу операторов
1
ответ дан 30 November 2019 в 15:02
поделиться

Здесь есть два вопроса:

  1. Сложнее ли изучать Scala, чем Java?
  2. Код, написанный на Scala, имеет тенденцию быть более сложным чем код, написанный на Java?

На первый вопрос легче ответить: язык Scala богаче Java. В частности, его система типов более выразительна, чем Java, что означает, что можно выразить больше логических ошибок как ошибок времени компиляции. Однако, чтобы использовать эти возможности, необходимо знать различные конструкции языка (зависимые типы, классы случаев, аннотации отклонений, представления и многие другие). Их освоение требует времени, и поэтому Scala сложнее в изучении, чем Java.

Второй вопрос сложнее. Сторонники Scala утверждают, что эти новые конструкции облегчают написание правильных программ и что результирующий код проще.Другие говорят, что дополнительные возможности Scala не перевешивают сложности понимания сематники его конструкций (например, взгляните на этот доклад . Найдите «Scala»). Это проявление более широкого спора:что статических и динамически типизированных языков.

13
ответ дан 30 November 2019 в 15:02
поделиться

Scala сложна по нескольким причинам:

Она привносит парадигмы функционального программирования. Благодаря этому библиотека Scala Collection намного шире, чем библиотека Java.

Это позволяет создавать модульные и плавные API. Например, в Scala метод #map реализован в TraversableLike (один из корневых классов в библиотеке коллекций), но его тип результата является типом наиболее подходящей конкретной коллекции (для BitSet он вернет BitSet, если отображение преобразует Int в Int и Set в противном случае). Это стало возможным благодаря языку, а не обману компилятора.

Он статически типизирован. Легче создать динамический язык, обладающий перечисленными выше функциями, но статическая типизация обеспечивает поддержку и производительность IDE.

ИМХО, все эти функции очень важны и стоят дополнительных сложностей.

Однажды я был в том месте, где находились вы. Когда я столкнулся со Scala в 2006 году, я отказался от него через некоторое время, пытаясь изучить его, из-за его сложности. Мне пришлось выучить это для проекта, над которым я работаю, и я очень счастлив, что я это сделал. Я считаю, что не научился этому в 2006 году, одной из самых больших ошибок в моей профессиональной жизни.

5
ответ дан 30 November 2019 в 15:02
поделиться

Scala предоставляет возможность создавать библиотеки, которые можно использовать очень кратко. Библиотеки Java часто имеют многословный и громоздкий интерфейс. Звучит как плюс для Scala, но не обязательно. В Scala две функции могут работать совершенно по-разному и при этом выглядеть очень похожими в использовании - синтаксис не является руководством к поведению. В то время как в Java некоторые вещи всегда становятся очевидными благодаря синтаксису.

Предположим, у вас есть функция foo в Java, и она вызывается следующим образом:

foo(v > 5);

Итак, мы, очевидно, передаем ей логическое значение . Не так быстро! Предположим, в Java есть функция, которая позволяет функции foo захватывать выражение и оценивать его позже (возможно, в другом потоке). Таким образом, вместо принятия логического значения, foo принимает функцию, которая не принимает параметров, и возвращает логическое ​​логическое .Вы не можете сказать, что происходит, просто взглянув на место вызова; вы должны знать детали того, как работает foo , чтобы знать, когда будет вычислено выражение v> 5 . В то время как сегодня в Java выражение всегда будет вычисляться до выполнения foo .

Java-программистов это, вероятно, сильно расстраивает. Но в Scala есть именно эта функция.

Этот разрыв связи между синтаксисом и поведением делает Scala более склонным сбивать с толку неосторожных. С другой стороны, он позволяет создавать встроенные предметно-ориентированные языки, где все дело в том, что существует краткая и эффективная нотация, подходящая для конкретной предметной области.

3
ответ дан 30 November 2019 в 15:02
поделиться

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

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

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

7
ответ дан 30 November 2019 в 15:02
поделиться

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

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

7
ответ дан 30 November 2019 в 15:02
поделиться

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

Scala является объектно-ориентированной и функциональной. Оба этих языковых типа когда-то считались довольно сложными (хотя сейчас объектно-ориентированный язык стал более распространенным), но их объединение открывает множество новых дверей. Некоторые из этих дверей выглядят как короткие пути к «миссии выполнена»! За некоторыми из этих дверей сидят львы. Функциональное программирование дает вам все необходимое, чтобы выполнить свою работу, повеситься и связать свой район узлами на долгие годы. Вам решать, как не навредить себе на функциональном языке программирования.

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

8
ответ дан 30 November 2019 в 15:02
поделиться

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

Это не только объектно-ориентированное, но и функциональное, что представляет собой другую парадигму программирования.

Не путайте сложность функционального программирования со сложным языком. Функциональное программирование может сильно сбивать с толку тех, кто используется для объектно-ориентированного (или процедурного) программирования.

3
ответ дан 30 November 2019 в 15:02
поделиться

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

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

6
ответ дан 30 November 2019 в 15:02
поделиться

Один из самых популярных вопросов о Scala на Stack Overflow прямо сейчас касается сложности библиотек Scala 2.8 . Предлагаю вам прочитать.

0
ответ дан 30 November 2019 в 15:02
поделиться
Другие вопросы по тегам:

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