Я заметил, что поддержка IDE далеко не так хороша, но сам язык поддерживает функциональные идиомы программирования гораздо более четко.
Я заметил, что поддержка IDE далеко не так хороша, но сам язык поддерживает функциональные идиомы программирования гораздо более четко.
Ответы:
Я программирую на Scala уже больше года, поэтому постараюсь отодвинуться на год, чтобы ответить на этот вопрос.
Вышеуказанные пункты были более или менее то, что я думал о Скала, прежде чем я начал изучать это.
В течение года вот что я узнал:
Ну, я думаю, что Скала слишком сложна. Это похоже на C ++ в том смысле, что в нем есть множество разных способов ведения дел. Некоторые называют это «богатством», «выразительностью» или «силой», но ваш пробег может варьироваться. Во многих реальных проектах вам придется искусственно ограничивать какие языковые функции вы собираетесь использовать, а какие нет, чтобы все участвующие разработчики могли говорить на одном и том же подмножестве языка.
Для функционального программирования я предпочитаю Clojure , который намного проще, чем Scala.
Пусть начнется священная война ;-)
Около года назад, когда я все больше и больше разочаровывался в будущем продуктов своего стартапа, если продолжал использовать Java, я решил попробовать Scala. Я уже программировал на JavaScript и Python в то время, Ruby также был хорошей альтернативой, но я искал статически типизированный язык, предпочтительно тот, который мог бы работать на JVM.
Я действительно пытался полюбить Scala, правда, но я обнаружил, что этот код совершенно безобразен и труден для понимания. Я сильно удивился, что если Scala был нашим лучшим ответом на Java, то меня наверняка обвинили и приговорили к продолжению работы с языком, который мне все-таки не нравился ...
К счастью, вскоре после этого я узнал о Фантоме . О, чувак, я любил это! Для меня это было похоже на великолепный ответ американцев немецкой бюрократии! Он соответствовал требованиям, которые я искал в Scala, но гораздо более элегантно . Он имел интеграцию с Vim , Eclipse и Netbeans , хорошую веб-инфраструктуру , работающие с ним зрелые продукты , небольшое, но невероятно полезное сообщество ... Динамическая и статическая типизация! Я радовался!
(Я мог бы продолжить, но этот пост предназначен для Скалы, а не для Фантома, поэтому я остановлюсь здесь. Мои предпочтения ясны , тем не менее, есть этот пост, сравнивающий их. Я никогда не мог понять, почему Фантому уделяется так мало внимания по сравнению со Скалой. Но, видимо, я не единственный, если вы слушаете этот подкаст [ mp3 ] до конца.)
Когда я 2 года назад баловался со Scala, он выглядел чуждым и пугающим для меня. В какой-то момент я обнаружил, что базовый язык на самом деле намного проще, чем Java, но его синтаксис и семантика настолько гибки, что вы можете создавать подобные языковые конструкции даже без макрофункции. С тех пор я полностью переключился на Scala для всех моих Java-проектов, потому что он позволяет мне писать без лишнего шаблонного кода.
Мне нравится Clojure, но бывают ситуации, когда платформе нужно, чтобы вы компилировали статический байт-код (Android, апплеты, ...), и, хотя вы можете это сделать, в Scala он просто есть.
Хотя Scala позволяет вам функционально решать многие проблемы, я часто нахожу проблемы, когда использование классов кажется более естественным. Это делает вещи немного сложнее, но далеко не так сложно и сложно в C ++.
Самым большим выводом для меня, когда я действительно начал изучать язык, было то, что я мог программировать точно так же, как я делал на Java, просто без шума (немного похоже на то, когда вы запускаете Groovy), но в конце концов вы хотите попытаться погрузиться глубже во власть языка - он растет вместе с тобой.
О вопросе IDE: После использования Emacs для всех, все мои проблемы IDE исчезли :-)
Мне нравится Scala по многим причинам, но есть одна, которую часто упускают из виду: ее простота.
Скала может быть не так проста, как, скажем, Оберон, но она намного проще, чем некоторые другие языки. Спецификация языка Scala составляет ~ 160 страниц, Спецификация языка Java составляет ~ 600 (только язык, а не JVM или библиотеки!), Спецификация языка ECMA-334 C # (которая AFAIK соответствует подмножеству Visual C # 2.0) ~ 440 страниц (без таких вещей, как понимание запросов LINQ, лямбда-выражения, методы расширения, общая ко-и контравариантность dynamic
, необязательные аргументы со значениями по умолчанию, аргументы ключевых слов, var
). Даже текущий черновик для ECMAScript 5.1 больше на ~ 210 страницах. И, конечно же, мой собственный язык по умолчанию - Ruby, чей нынешний черновик ISO весит ~ 310 страниц, что указывает лишь на почти непривычно крошечное подмножество пересечений Ruby 1.8.6, 1.9.1 и 1.9.2.
Вот что отстой в Scala:
Нулевой указатель был довольно плохой идеей для начала. Хоар назвал это «ошибкой в миллиард долларов», но Скала еще хуже. У него есть объекты с именами null, Null, None и Nil. ноль для взаимодействия с Java. Null - это нулевой указатель из спецификации W3C DOM, None - это то, чем должен быть заменен null, а Nil - пустое значение.
Когда языковые конструкции оказываются хакерскими, обычно виноват не программист, а программист. Однако в Scala базовый язык уже содержит библиотечные классы, чье единственное документированное поведение - «Это взлом». Не верь этому? Найдите в scaladoc файл scala.xml.Group.
Не в последнюю очередь, Scala плохо документирована. Вряд ли какой-либо из классов scala в официальной документации поставляется с примером кода. Scala изучать значительно сложнее, чем Java, и требует глубоких знаний в области компьютерных наук.
Чтобы меня не приняли за Скала-ненавистника, вот что мне нравится в этом:
null
является нулевым указателем Java, Null
является его "типом". None
является одним из возможных «состояний» Option[T]
коллекции с одним или нулевыми элементами. Nil
это пустой список. Хотя вы хотите, чтобы это звучало пугающе, это не так. Эти типы не являются взаимозаменяемыми или взаимозаменяемыми и ведут себя точно так же, как и должны.
Scala является сложным. Нет пути! Его синтаксис чрезвычайно гибок и может быть настроен множеством способов (прежде всего операторы / инфиксная запись) - и система типов имеет больше различных функций, чем любой другой язык, который я знаю.
Так что все не так просто, как, например, в Haskell: классы типов, чтобы охватить их все.
Поскольку Scala пытается объединить функциональное программирование, ОО, процедурное программирование и библиотеки Java, а также собственные идеи, мы, наконец, в итоге получаем множество концепций, которые как-то движутся «в одном направлении»:
Выбор среди них поначалу кажется трудным, и можно легко задаться вопросом, нашел ли кто-то правильное решение какой-то проблемы. Даже легко получить хакерские вещи, злоупотребляя implicit
с.
Но самое интересное: Scala работает. Иногда трудно понять почему (особенно выясняя, через какие неявные преобразования + наследование + ... какой-то объект имеет функциональность X
), но вам не нужно беспокоиться об этом большую часть времени.
Напишите Scala как можно проще, и это сработает. Не запутайтесь во всем, что возможно, и просто используйте то, что вам нужно. И если вам что-то нужно, вы можете быть уверены, что у Scala это как-то есть;)
И чем лучше вы становитесь, тем больше вы сможете настраивать Scala с операторами, имплицитами, монадами, прикольным синтаксисом ... и, наконец, получить что-то близкое к DSL, которое идеально решит вашу проблему.
В конце концов, у вас всегда есть возможность просто использовать Scala как гораздо лучшую Java с более чистым, легким синтаксисом, выводом типов и некоторыми функциональными возможностями.
Это отличный язык, который во многих отношениях проще, чем Java.
Большинству людей не понравится, программист на Java или нет, по тем же причинам, по которым большинство людей, программисты или нет, не любят изучать новые языки программирования. Я подозреваю, что большинство людей, которые выучили язык программирования, даже не любили это изучать.
Если вы беспокоитесь о таком сложном языке, как C ++, я бы избегал Clojure как чумы. Утверждение, что Scala сложнее, чем Clojure, стало запасным аргументом для людей, которые совершенно не знают об одном или обоих языках.
В Clojure есть макросы, что означает, что вы можете изменять синтаксис языка столько раз, сколько захотите, предоставляя вам не просто «множество различных способов ведения дел», но практически бесконечное количество способов выполнения действий. И ни один из этого нового синтаксиса, который программисты создают с помощью макросов, не будет документирован нигде в спецификации языка.
«Но мы можем избегать использования макросов или регулировать, какие из них разрешены в нашем коде», - говорите вы. Поздравляем, у вас теперь есть «искусственное ограничение того, какие языковые функции вы собираетесь использовать, а какие нет», именно это и использовали болтающие идиоты, которые используют Clojure из Scala, в качестве причины, чтобы с самого начала избегать Scala.
Мне действительно нравятся более детальные типы библиотеки Scala. Кажется, что новая библиотека коллекций была хорошо продумана. Мне также нравится, как он уменьшает объем кода, требуемого для простых классов, и функциональные концепции, которые он добавляет. Его вывод типа также очень полезен. Похоже на Яву без тренировочных колес. После использования C # в течение некоторого времени, Scala фактически чувствует себя конкурентом, а Java все еще полезна, но остается позади.
Как программист на Java, я изначально находил Scala интересным. Однако, после того, как я какое-то время баловался этим (и сталкивался почти со всеми позитивами / негативами, уже перечисленными другими), я чувствовал себя очень «ме» к этому. Улучшения языка компенсируются меньшей доступностью наборов инструментов. Я просто не мог придумать какой-либо определяющей причины для переключения. Это хорошо, но это не «лучше», чтобы обосновать необходимость переключения. Также не имеет этого субъективного фактора возбуждения (как, кажется, Clojure).