Interested Article - Scala (язык программирования)
- 2020-10-19
- 1
Scala — мультипарадигмальный язык программирования , спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения , сочетающий возможности функционального и объектно-ориентированного программирования .
Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерски , язык реализован для платформ Java и JavaScript . По мнению , создателя языка программирования Groovy , Scala может стать преемником языка Java .
История
Язык был создан в 2001 — 2004 годах в Лаборатории методов программирования EPFL . Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного программного обеспечения. За основу при разработке языка были взяты две идеи:
- Язык программирования компонентного ПО должен быть масштабируемым в том смысле, что должна быть возможность с помощью одних и тех же концепций описать как маленькие, так и большие части. Поэтому внимание было сконцентрировано на механизмах абстракции , композиции и декомпозиции вместо введения большого количества , которые могут быть полезными только на каком-то одном уровне масштабирования.
- Масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование . Некоторые из основных технических новшеств Scala — это концепции, представляющие собой сплав этих парадигм программирования . В статически типизированных языках, к которым относится Scala, эти парадигмы до сих пор были почти полностью разделены.
Язык был выпущен для общего пользования на платформе JVM в январе 2004 года и на платформе .NET в июне 2004 года, в 2016 году создан LLVM -компилятор (Scala Native) .
Истоки дизайна
На дизайн языка оказали влияние многие языки и исследовательские работы.
Прежде всего, язык впитал значительное число концепций и синтаксических соглашений Java и C# . Способ выражения свойств во многом заимствован из . Из Smalltalk взята концепция унифицированной объектной модели . Из BETA пришла идея, что всё, включая классы, должно допускать вложенность. Абстрактные типы в Scala очень похожи на абстрактные типы сигнатур в SML и OCaml , обобщённые в контексте полноценных компонентов.
В некотором смысле Scala — это продолжение работы . Как и Pizza, Scala компилируется под Java VM, добавляя функции высшего порядка , сопоставление с образцом , конструкции, которые исходно были созданы в сообществе функционального программирования . В то время как Pizza обратно совместима с Java, цель Scala — всего лишь возможность взаимодействия, так что у неё больше степеней свободы в дизайне. Ещё одна цель Scala — предоставить расширенные конструкции для абстракции и композиции компонентов — общая с несколькими недавними исследовательскими разработками.
Ключевые аспекты языка
Scala-программы во многом похожи на Java -программы, и могут свободно взаимодействовать с Java-кодом. Язык включает единообразную объектную модель — в том смысле, что любое значение является объектом, а любая операция — вызовом метода . При этом является также функциональным языком в том смысле, что функции — это полноправные значения.
В Scala включены мощные и единообразные концепции абстракций как для типов, так и для значений. В частности, язык содержит гибкие симметричные конструкции примесей для композиции классов и типажей . Возможно позволяет производить декомпозицию объектов путём сравнения с образцом ; образцы и выражения при этом были обобщены для поддержки естественной обработки XML -документов. В целом, эти конструкции позволяют легко выражать самостоятельные компоненты, использующие библиотеки Scala, не пользуясь специальными языковыми конструкциями.
Язык допускает внешние расширения компонентов с использованием представлений (views). Возможности обобщённого программирования реализуются за счёт поддержки обобщённых функций (generics), в том числе высшего типажа (generics of a higher kind). Кроме различных классических структурных типов данных, в язык включена поддержка экзистенциальных типов .
Объектно-ориентированный язык
В языке используется чистая
объектно-ориентированная
модель, похожая на применяемую в
Smalltalk
: каждое значение — это
объект
, и каждая операция — это отправка сообщения. Например, сложение
x+y
интерпретируется как
x.+(y)
, то есть как вызов метода
+
с аргументом
y
и
x
в качестве объекта-приёмника.
Рассмотрим другой пример:
1+2
. Это выражение интерпретируется как
(1).+(2)
. Обратите внимание, что скобки вокруг чисел обязательны, потому что лексический анализатор Scala разбивает выражение на лексемы по принципу самого длинного возможного сопоставления. Таким образом, выражение
1.+(2)
разобьется на лексемы
1.
,
+
и
2
, потому что лексема
1.
длиннее лексемы
1
и первый аргумент сложения будет интерпретирован, как тип Double вместо Int
.
Функциональный язык
Каждая функция — это значение. Язык предоставляет легковесный синтаксис для определения анонимных и каррированных функций. Каждая конструкция возвращает значение. Сопоставление с образцом естественно применимо к обработке XML с помощью регулярных выражений .
Повторное использование и адаптация
Каждая компонентная система с мощными конструкциями абстракции и композиции сталкивается с проблемой, когда дело доходит до интеграции подсистем, разработанных различными командами в разное время. Проблема состоит в том, что интерфейс компонентов, разработанных той или иной группой, часто не подходит клиентам, намеренным использовать этот компонент.
Scala представляет новую концепцию решения проблемы внешней расширяемости — представления (views). Они позволяют расширять класс новыми членами и типажами . Представления в Scala в некотором смысле соответствуют классам типов , используемым в Haskell , но в отличие от классов типов, область видимости представлений можно контролировать, причём в разных частях программы могут сосуществовать параллельные представления.
Примеры программ
Программа, как и в Java, представляет собой класс. Это пример консольной программы, которая выводит строчку текста на экран.
object HelloWorld { def main(args: Array[String]) = println("Привет, МИР!") }
// Более короткая версия object HelloWorld extends App { println("Привет, МИР!") }
Следующий простой пример программы написан на Java , Scala и C# , демонстрируя некоторые различия в синтаксисе (типов переменных, отсутствие специального синтаксиса для доступа к массивам ). В этом примере описывается консольная программа, которая выводит все опции, переданные через командную строку. Опции начинаются с символа «-» (минус).
// Java: class PrintOptions { public static void main(String[] args) { System.out.println("Выбраны опции:"); Stream.of(args) .filter(arg -> arg.startsWith("-")) .map(arg -> arg.substring(1)) .forEach(System.out::println); } }
// Scala: object PrintOptions { def main(args: Array[String]) { println("Выбраны опции:") for (arg <- args if arg startsWith "-") { println(" " + (arg substring 1)) } } }
// В функциональном стиле Scala: object PrintOptions { def main(args: Array[String]) = println("Выбраны опции:" +: (args filter (_ startsWith "-") map (" " + _.drop(1))) mkString "\n") }
// В функциональном стиле C#: class PrintOptions { static void Main(String[] args) { Console.WriteLine("Выбраны опции:" + args.Where(x => x.StartsWith("-")).Aggregate((r, x) => r + " " + x.Substring(1))); } }
// В функциональном стиле Java: class PrintOptions { public static void main(String[] args) { System.out.println("Выбраны опции:\n" + Arrays.stream(args) .filter(o -> o.startsWith("-")) .map(o -> " " + o.substring(1)) .collect(Collectors.joining("\n"))); } }
В Scala объявляется не класс объекта, а сразу экземпляр объекта. Так естественным способом реализуется шаблон проектирования, где в программе должен быть только один экземпляр класса («Одиночка» — «Singleton»).
Пример программы, которая суммирует все элементы списка, который передаётся через аргументы:
object Main { def main(args: Array[String]) { try { println("Сумма аргументов: " + args.map(_.toInt).sum) } catch { case e: NumberFormatException => println("Ошибка в аргументах. Использовать следует так: scala Main <число1> <число2> ... ") } } }
На Java:
public class Main { public static void main(String[] args) { try { System.out.println("Сумма аргументов: " + Arrays.stream(args).mapToInt(Integer::parseInt).sum()); } catch (NumberFormatException e) { System.out.println("Ошибка в аргументах. Использовать следует так: java Main <число1> <число2> ... "); } } }
С помощью метода
map
перебираются все аргументы. Все они преобразовываются в целое число методом
Integer.parseInt
и добавляются в список (массив)
elems
. Затем с помощью метода
свёртки списка
foldRight
вычисляется сумма элементов.
Интеграция с Java
Scala может взаимодействовать с кодом, написанным на Java. Все классы из пакета
java.lang
уже подключены по умолчанию, в то же время другие должны быть подключены явно.
Использование
Основные веб-фреймворки, написанные на Scala — Play , Lift . Среди их пользователей отмечены ряд крупных сервисов, в частности, Play используют и Coursera , а Foursquare — Lift .
Социальная сеть LinkedIn использует микрофреймворк Scalatra для поддержки своего Signal API .
В апреле 2009 года Twitter объявил, что перевёл значительную часть своего серверного кода с Ruby на Scala и собирается перевести оставшийся . В апреле 2011 онлайн-версия газеты The Guardian была переведена с Java на Scala .
Проекты фонда Apache: Apache Spark , Apache Kafka написаны в основном на Scala.
Одним из активных пользователей языка также является банк UBS .
Важная составляющая инфраструктуры разработки на Scala — средство автоматической сборки Sbt — также написана на Scala.
Примечания
- . 28 августа 2023 года. Дата обращения: 30 мая 2023.
- Strachan, James (неопр.) (6 июля 2009). Дата обращения: 7 января 2012. 10 февраля 2012 года.
- Paul Krill. (неопр.) . Infoworld (11 мая 2016). Дата обращения: 4 декабря 2016. 27 ноября 2016 года.
- (неопр.) . Дата обращения: 7 ноября 2010. Архивировано из 5 июля 2010 года.
- (неопр.) . Дата обращения: 26 октября 2014. 1 апреля 2014 года.
- (неопр.) . Дата обращения: 26 октября 2014. 13 января 2016 года.
- Synodinos, Dionysios G. (неопр.) . (11 октября 2010). Дата обращения: 26 октября 2014. 26 октября 2014 года.
- Greene, Kate (неопр.) Technology Review . MIT (1 апреля 2009). Дата обращения: 6 апреля 2009. 17 апреля 2012 года.
- (неопр.) . (5 апреля 2011). Дата обращения: 5 апреля 2011. 9 апреля 2011 года.
- Binstock, Andrew. (неопр.) . Dr. Dobb's Journal (14 июля 2011). Дата обращения: 10 февраля 2012. 20 февраля 2012 года.
Литература
Англоязычная
- Joshua D. Suereth. (неопр.) . — (англ.) (, 2012. — С. . — ISBN 978-1-935182-70-2 .
- Gregory Meredith. (неопр.) . — 1st. — 2011. — С. 300.
- Nilanjan Raychaudhuri. (неопр.) . — 1st. — Manning, 2013. — С. 525. — ISBN 978-1-935182-75-7 .
- Dean Wampler, Alex Payne. (англ.) . — 1st. — O’Reilly Media , 2009. — P. 448. — ISBN 0-596-15595-6 .
- Martin Odersky, Lex Spoon, Bill Venners. (англ.) . — 2nd. — , 2010. — P. 883/852. — ISBN 978-0-9815316-4-9 .
- David Pollak. (неопр.) . — 1st. — Apress , 2009. — С. 776. — ISBN 1-4302-1989-0 . от 5 декабря 2010 на Wayback Machine
- Perrett, Tim. Lift in Action (неопр.) . — 1st. — Manning , 2011. — С. 450. — ISBN 978-1-935182-80-1 .
- Christos Loverdos, Apostolos Syropoulos. (англ.) . — 1st. — Cambridge University Press , 2010. — P. xviii + 485. — ISBN 978-0-521-74758-5 .
- Venkat Subramaniam. (англ.) . — 1st. — (англ.) (, 2009. — P. 250. — ISBN 1-934356-31-X .
- Cay Horstmann. (неопр.) . — 1st. — Addison-Wesley Professional , 2012. — С. 360. — ISBN 0-321-77409-4 .
Русскоязычная
- Хорстман К. Scala для нетерпеливых. — , 2013. — 408 с. — ISBN 978-5-94074-920-2 , 978-0-321-77409-5.
- Одерски М., Спун Л., Веннерс Б. Scala. Профессиональное программирование = Programming in Scala: Updated for Scala 2.12. — Питер , 2018. — 688 с. — ISBN 978-5-496-02951-3 .
- Прокопец А. Конкурентное программирование на SCALA. — , 2017. — 342 с. — ISBN 978-5-97060-572-1 .
- , перевод руководства Мартина Одерски в викиучебнике
- и — русские версии открытых учебников от Twitter
Ссылки
-
- (англ.) — веб-сайт языка программирования Scala.
- (англ.) — спецификация языка программирования Scala.
- (рус.) перевод англоязычного руководства
- — перевод статьи, описывающей причину разработки, идеи, возможности языка.
- 2020-10-19
- 1