Вопросы о Скале от Рубииста - PullRequest
27 голосов
/ 28 февраля 2010

Недавно я искал новый язык в свободное время, и Скала кажется очень привлекательной.

У меня есть несколько вопросов по этому поводу:

  1. Не зная Java навязать вызов в изучении этого? Это случится большой недостаток позже? (т.е. как часто люди полагаются на Java-специфичные библиотеки? )

  2. Насколько велика разница? по сравнению с рубином? (Помимо того, что типизированный) много новых терминов, или я буду знакомы с большинством языков механизмы?

  3. Какие ресурсы вы бы порекомендовали? Я смотрю на Programming Scala и Beginning Scala книги

  4. Несмотря на субъективность, разве Scala интересно программировать? : P

Спасибо

Ответы [ 7 ]

36 голосов
/ 28 февраля 2010

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

Ruby <==> Scala (приблизительно!)

  • Mixins <==> Черты
  • Monkey Patching <==> Pimp My Library (неявные преобразования в оболочку с дополнительными методами)
  • Proc / Closure <==> Функция / литерал функции
  • Duck Typing <==> Структурные типы
  • Последний аргумент в виде процесса <==> Список параметров карри (см. Traversable # flatMap)
  • Enumerable <==> Traversable
  • собрать <==> карту
  • ввести <==> foldLeft / foldRight
  • Symbol.toProc <==> Заполнитель синтаксического сахара: people.map(_.name)
  • Динамическая краткость ввода <==> Вывод типа
  • Nil <==> null, хотя Option является предпочтительным. ( Не Ноль, это пустой список!)
  • Все является выражением <==> То же самое
  • символы / хэши в качестве аргументов <==> Именованные параметры и параметры по умолчанию
  • Синглтон <==> object Foo {}
  • Все - это объект <==> Все - это тип или объект (включая функции)
  • Нет примитивов <==> Унифицированная система типов, Any - это супертип для примитивов и объектов.
  • Все является сообщением <==> Операторы - это просто вызовы методов

Возможности Ruby, которые вы можете пропустить

  • method_missing
  • define_method и т. Д.

Особенности Scala, которые вы должны изучить

  • Шаблон соответствия
  • Неизменяемые классы, в частности, тематические классы
  • Неявные представления и неявные параметры
  • Типы, типы и другие типы: универсальные, дисперсионные, абстрактные типы элементов
  • Унификация объектов и функций, особое значение методов apply и update.
19 голосов
/ 28 февраля 2010

Вот мое мнение:

  • Неважно, не зная Java.

  • Scala во многом зависит от библиотек Java. Это не имеет значения вообще. Конечно, у вас могут возникнуть проблемы с чтением некоторых примеров, но этого недостаточно, чтобы быть помехой. Вскоре вы даже не заметите разницы между чтением документации по API Java и документа Scala API (ну, за исключением совершенно другого стиля новейшего скалярного документа).

    Однако часто предполагается знакомство со средой JVM. Если я могу дать один совет, то сначала избегайте Maven и используйте SBT в качестве инструмента для сборки. Это будет ненужным для небольших программ, но с ним будет легче справляться со многими изломами в мире Java-языка. Как только вам понадобится внешняя библиотека, познакомьтесь с SBT. При этом вам не придется иметь дело с каким-либо XML: вы пишете свои правила сборки в самой Scala.

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

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

  • Вы не упомянули , который Программирование Scala, на которое вы смотрели. В Scala есть два плюс одно программирование. Последний написан, среди прочего, создателем языка и широко считается отличной книгой, хотя, возможно, немного медленной. Одна из программ Scala была написана парнем из Twitter - Алексом Пейном - и деканом Уэмплером из бывшего Object Mentor. Это тоже очень хорошая книга. «Scala» была написана создателем Lift Дэвидом Поллаком, и люди говорили об этом хорошо. На самом деле я не слышал, чтобы кто-нибудь жаловался ни на одну из книг о Scala.

    Одна из этих книг наверняка будет полезна. Кроме того, поддержка вопросов переполнения стека для Scala довольно хорошая - я делаю все возможное, чтобы обеспечить это! :-) Есть список рассылки scala-users, где тоже можно получить ответы (если люди не очень заняты), и есть канал #scala IRC на Freenode, где вы также получите хорошую поддержку. Иногда людей просто нет рядом, но, если они есть, они вам помогут.

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

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

8 голосов
/ 28 февраля 2010

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

  1. Модель памяти Java и какие механизмы платформа обеспечивает для параллелизма. Я говорю о синхронизации, потоках и т. Д.

  2. Разница между примитивными типами (double, float и т. Д.) И ссылочными типами (то есть подклассами Object). Scala предоставляет несколько хороших механизмов, чтобы скрыть это от разработчика, но очень важно, если вы пишете код, который должен быть быстродействующим, знать, как они работают

Это происходит в обоих направлениях: среда выполнения Java предоставляет функции, которые (я подозреваю, хотя я могу и ошибаться) недоступны в Ruby и принесут вам огромную пользу:

  • Расширения управления (MBeans)
  • JConsole (для мониторинга времени выполнения памяти, ЦП, устранения проблем параллелизма)
  • JVisualVM (для инструментария времени выполнения кода для устранения проблем с памятью и производительностью)

Эти пункты № 1 и № 2 не являются непреодолимыми препятствиями, и я думаю, что другие упомянутые здесь сходства будут сильно работать в вашу пользу. О, и Скала, безусловно, очень весело!

7 голосов
/ 28 февраля 2010

У меня нет опыта работы с Ruby, но, тем не менее, я могу вам помочь.

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

  2. Я начал с чтения Programming Scala и повернулся, чтобы прочитать исходный код библиотеки Scala. Последний очень помог понять язык. И как всегда: код, код, код. Чтение без кодирования ни к чему не приведет, но я уверен, что вы уже это знаете. :-) Еще один полезный ресурс - блоги, см. https://stackoverflow.com/questions/1445003/what-scala-blogs-do-you-regularly-follow, где собраны хорошие блоги Scala.

  3. Это так! Как вы заявили, это очень субъективно. Но для меня, исходя из фона Java, это очень весело.

3 голосов
/ 26 октября 2011

Это очень поздно, но я в какой-то степени согласен с тем, что сказал oxbow_lakes. Недавно я перешел с Python на Scala, и знание того, как работает Java - особенно ограничения Java в отношении универсальных типов - помогло мне понять некоторые аспекты Scala.

Наиболее заметно:

  1. У Java ужасно сломанная ошибка, известная как «стирание типа». Эта поломка, к сожалению, присутствует и в JVM. Это особенно касается программирования с универсальными типами - проблема, которая просто не возникает вообще в динамически типизированных языках, таких как Ruby и Python, но очень велика в статически типизированных языках. Scala справляется с этой задачей настолько хорошо, насколько может, но величина поломки означает, что часть ее неизбежно переходит в Scala. Кроме того, некоторые исправления в Scala для этой проблемы (например, манифесты) являются недавними и хакерскими и действительно требуют понимания того, что происходит под ними. Обратите внимание, что эта проблема поначалу, вероятно, не повлияет на ваше понимание Scala, но вы столкнетесь с ней, когда начнете писать реальные программы, использующие универсальные типы, поскольку есть вещи, которые вы попытаетесь сделать, но они просто не будут работать. , и вы не будете знать почему, если / пока не поймете ограничения, вызванные стиранием типа.

  2. Рано или поздно вы также столкнетесь с проблемами, связанными с другой ошибкой Java, которая заключается в разделении типов на объекты (классы) и примитивных типов (целые числа, числа с плавающей запятой, логические значения) - и, в частности, тот факт, что примитивные типы не являются частью объектной системы. Scala на самом деле делает потрясающую работу, скрывая это от вас, но может быть полезно узнать о том, что делает Java в определенных угловых случаях, которые в противном случае могут быть сложными - особенно с использованием универсальных типов, в основном из-за прерывания стирания типов, описанного в # 1. (Стирание типов также приводит к значительному снижению производительности при использовании массивов, хеш-таблиц и аналогичных универсальных типов над примитивами; это одна из областей, в которой знание Java очень поможет.)

  3. Несоответствие № 3 - массивы также обрабатываются специально и неортогонально в Java. В Scala это не так просто, как для примитивов, но гораздо лучше, чем для стирания типов. Механизм сокрытия иногда раскрывается (например, тип ArrayWrapper), что может иногда приводить к проблемам, но на удивление самая большая проблема на практике, опять же, связана с универсальными типами.

  4. Параметры класса Scala и способ, которым Scala обрабатывает конструкторы классов. В этом случае Java не нарушена. Можно утверждать, что Scala тоже не подходит, но то, как он обрабатывает конструкторы классов, довольно необычно, и на практике мне было трудно это понять. Я действительно смог разобраться в поведении Scala, выяснив, как соответствующий код Scala переводится в Java (или, вернее, в скомпилированную Java), а затем обдумал, что будет делать Java. Поскольку я предполагаю, что в этом отношении Ruby во многом похож на Java, я не думаю, что у вас возникнет слишком много проблем, хотя вам, возможно, придется выполнить то же ментальное преобразование.

  5. I / O. Это на самом деле проблема с библиотекой, а не языковая проблема. В большинстве случаев Scala предоставляет свои собственные библиотеки, но Scala на самом деле не имеет библиотеки ввода-вывода, поэтому у вас практически нет другого выбора, кроме как напрямую использовать библиотеку ввода-вывода Java. Для программистов на Python или Ruby этот переход немного болезненный, поскольку библиотека ввода-вывода в Java большая и громоздкая, и ее не так просто использовать для выполнения простых задач, например, перебирая все строки в файле.

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

  1. Вызов подпроцесса, также несколько большой и громоздкий
  2. Сеть - но это всегда несколько болезненно
  3. Отражение, то есть динамическое исследование методов и / или полей в классе или динамический вызов метода по имени, когда имя не известно во время компиляции. Это несколько эзотерический материал, с которым большинству людей не нужно иметь дело. Очевидно, у Scala 2.10 будет своя собственная библиотека отражений, но в настоящее время вы должны использовать API отражения Java, что означает, что вам нужно знать немало о том, как Scala преобразуется в Java. (К счастью, есть опция -print для компилятора Scala, чтобы точно показать, как происходит это преобразование.)
1 голос
/ 26 октября 2011

Это еще один поздний ответ, недавно я сам пришел в Скалу, но я могу ответить на 1, 3 и 4:

1) Я перенес большой многогранный проект F # в Scala без использования библиотек Java или .NET. Так что для многих проектов можно полностью придерживаться родного Scala. Знание экосистемы Java было бы плюсом, но его можно постепенно приобретать во время и после изучения Scala.

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

4) Я использовал около дюжины различных языков программирования, от ассемблера до Prolog, но Scala и F # - два самых забавных языка программирования, которые я когда-либо использовал - с большим отрывом. (Scala и F # очень похожи, пример "конвергентной эволюции" в двух разных экосистемах - JVM и .NET.)

-Neil

1 голос
/ 28 февраля 2010

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

Навыки, связанные с Java, связаны с Java платформой . то есть вы все еще работаете с JVM, которая выполняет загрузку классов, сборку мусора, JIT-компиляцию и т. д. Так что опыт в этом полезен. Но совсем не обязательно.

Обратите внимание, что Scala 2.8 неизбежен, и есть некоторые несовместимые изменения в отношении. 2,7. Поэтому любая книга и т. Д., Которую вы покупаете, должна знать о таких различиях.

...