Scala (язык программирования): различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
Использование String#toInt вместо Integer.parseInt |
Метка: редактор вики-текста 2017 |
||
Строка 7: | Строка 7: | ||
| designer = [[Мартин Одерски]] |
| designer = [[Мартин Одерски]] |
||
| developer = Programming Methods Laboratory of [[École Polytechnique Fédérale de Lausanne|EPFL]] |
| developer = Programming Methods Laboratory of [[École Polytechnique Fédérale de Lausanne|EPFL]] |
||
| latest_release_version = 2.12.0 |
|||
| latest_release_date = 3 ноября 2016<ref>[http://www.scala-lang.org/news/2.12.0 Scala 2.12.0 is now available! | The Scala Programming Language<!-- Заголовок добавлен ботом -->]</ref> |
|||
| typing = [[Статическая типизация|статическая]], [[Строгая типизация|строгая]], [[Вывод типов|с автовыведением типов]], [[Структурная система типов|структурная]] |
| typing = [[Статическая типизация|статическая]], [[Строгая типизация|строгая]], [[Вывод типов|с автовыведением типов]], [[Структурная система типов|структурная]] |
||
| influenced_by = [[Java]], [[Haskell]], [[Erlang]], [[Standard ML]], [[Objective Caml]], [[Smalltalk]], [[Scheme]], [[Algol68]], [[Lisp]] |
| influenced_by = [[Java]], [[Haskell]], [[Erlang]], [[Standard ML]], [[Objective Caml]], [[Smalltalk]], [[Scheme]], [[Algol68]], [[Lisp]] |
Версия от 21:26, 5 января 2017
Scala | |
---|---|
Класс языка | Мультипарадигмальный: функциональный, объектно-ориентированный, императивный |
Появился в | 2003 |
Автор | Мартин Одерски |
Разработчик | Programming Methods Laboratory of EPFL |
Расширение файлов |
.scala или .sc |
Выпуск |
|
Система типов | статическая, строгая, с автовыведением типов, структурная |
Испытал влияние | Java, Haskell, Erlang, Standard ML, Objective Caml, Smalltalk, Scheme, Algol68, Lisp |
Повлиял на | Kotlin |
Лицензия | BSD и Apache License 2.0[2] |
Сайт | scala-lang.org |
Платформа | Java Virtual Machine, JavaScript[3] и Native[вд][4] |
Медиафайлы на Викискладе |
Scala — мультипарадигмальный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности функционального и объектно-ориентированного программирования.
Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерски, язык реализован для платформ Java и .Net. По мнению Джеймса Стрэчена (англ. James Strachan), создателя языка программирования Groovy, Scala может стать преемником языка Java[5].
История
Язык был создан в 2001—2004 годах в Лаборатории методов программирования EPFL. Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного программного обеспечения. За основу при разработке языка были взяты две идеи:
- Язык программирования компонентного ПО должен быть масштабируемым в том смысле, что должна быть возможность с помощью одних и тех же концепций описать как маленькие, так и большие части. Поэтому внимание было сконцентрировано на механизмах абстракции, композиции и декомпозиции вместо введения большого количества примитивов, которые могут быть полезными только на каком-то одном уровне масштабирования.
- Масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование. Некоторые из основных технических новшеств Scala — это концепции, представляющие собой сплав этих парадигм программирования. В статически типизированных языках, к которым относится Scala, эти парадигмы до сих пор были почти полностью разделены.
Язык был выпущен для общего пользования на платформе JVM в январе 2004 года и на платформе .NET в июне 2004 года, в 2016 году создан LLVM-компилятор (Scala Native)[6].
Истоки дизайна
На дизайн языка оказали влияние многие языки и исследовательские работы.
Прежде всего, язык впитал значительное число концепций и синтаксических соглашений 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[7].
Функциональный язык
Каждая функция — это значение. Язык предоставляет легковесный синтаксис для определения анонимных и каррированных функций. Каждая конструкция возвращает значение. Сопоставление с образцом естественно применимо к обработке 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("Выбраны опции:");
for (String arg: args) if (arg.startsWith("-")) System.out.println(" " + arg.substring(1));
}
}
// 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("Выбраны опции:");
Arrays.stream(args).filter(o -> o.startsWith("-")).forEach(o -> System.out.println(" " + o.substring(1)));
}
}
|
В 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 — Lift, Play, Circumflex, написаны в основном на Scala и предназначены для программирования на Scala. Среди их пользователей отмечены ряд крупных сервисов, в частности, Play используют Gilt и Coursera[8], а Foursquare — Lift[9].
Социальная сеть LinkedIn использует микрофреймворк Scalatra для поддержки своего Signal API[10].
В апреле 2009 года Twitter объявил, что перевёл значительную часть своего серверного кода с Ruby на Scala и собирается перевести оставшийся[11]. В апреле 2011 онлайн-версия газеты The Guardian была переведена с Java на Scala[12].
Проекты фонда Apache Apache Spark, Apache Ignite (свободная версия основного продукта компании GridGain) и Apache Kafka написаны в основном на Scala.
Одним из активных пользователей языка также является банк UBS[13].
Важная составляющая инфраструктуры разработки на Scala — средство автоматической сборки Sbt — также написана на Scala.
Примечания
- ↑ https://www.scala-lang.org/download/3.5.0.html
- ↑ https://www.scala-lang.org/news/2.12.8
- ↑ http://www.scala-js.org/
- ↑ http://www.scala-native.org/
- ↑ Strachan, James Scala as the long term replacement for java/javac? (6 июля 2009). Дата обращения: 7 января 2012. Архивировано 10 февраля 2012 года.
- ↑ Paul Krill. Scala language moves closer to bare metal . Infoworld (11 мая 2016). Дата обращения: 4 декабря 2016.
- ↑ http://www.scala-lang.org/docu/files/ScalaTutorial.pdf
- ↑ Why we love Scala at Coursera
- ↑ Scala, Lift, and the Future
- ↑ Synodinos, Dionysios G. LinkedIn Signal: A Case Study for Scala, JRuby and Voldemort . InfoQ (11 октября 2010).
- ↑ Greene, Kate The Secret Behind Twitter's Growth, How a new Web programming language is helping the company handle its increasing popularity. Technology Review. MIT (1 апреля 2009). Дата обращения: 6 апреля 2009.
- ↑ Guardian switching from Java to Scala . Heise Online (5 апреля 2011). Дата обращения: 5 апреля 2011.
- ↑ Binstock, Andrew. Interview with Scala's Martin Odersky . Dr. Dobb's Journal (14 июля 2011). Дата обращения: 10 февраля 2012.
Литература
Англоязычная
- Joshua D. Suereth. Scala in Depth. — Manning Publications, Spring, 2011. — P. 225. — ISBN 978-1-935182-70-2.
- Gregory Meredith. Monadic Design Patterns for the Web. — 1st. — 2011. — P. 300.
- Nilanjan Raychaudhuri. Scala in Action. — 1st. — Manning, Fall 2011. — P. 525. — ISBN 978-1-935182-75-7.
- Dean Wampler, Alex Payne. Programming Scala: Scalability = Functional Programming + Objects. — 1st. — O'Reilly Media, September 15, 2009. — P. 448. — ISBN 0-596-15595-6.
- Martin Odersky, Lex Spoon, Bill Venners. Programming in Scala: A Comprehensive Step-by-step Guide. — 2nd. — Artima Inc, December 13, 2010. — P. 883/852. — ISBN 978-0-9815316-4-9.
- David Pollak. Beginning Scala. — 1st. — Apress, May 25, 2009. — P. 776. — ISBN 1-4302-1989-0.
- Perrett, Tim. Lift in Action. — 1st. — Manning, July 2011. — P. 450. — ISBN 978-1-935182-80-1.
- Christos Loverdos, Apostolos Syropoulos. Steps in Scala: An Introduction to Object-Functional Programming. — 1st. — Cambridge University Press, September 2010. — P. xviii + 485. — ISBN 978-0-521-74758-5.
- Venkat Subramaniam. Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine. — 1st. — Pragmatic Bookshelf, July 28, 2009. — P. 250. — ISBN 1-934356-31-X.
- Cay Horstmann. Scala for the Impatient. — 1st. — Addison-Wesley Professional, March, 2012. — P. 360. — ISBN 0-321-77409-4.
Русскоязычная
- Хорстман К. Scala для нетерпеливых. — ДМК пресс, 2013. — 408 с. — 300 экз. — ISBN 978-5-94074-920-2, 978-0-321-77409-5.
- Scala в примерах, перевод руководства Мартина Одерски в викиучебнике
- Scala Школа! и Эффективная Scala — русские версии открытых учебников от Twitter
- Путеводитель по Scala: серия статей на сайте IBM developerWorks
Ссылки
- The Scala Programming Language (англ.) — веб-сайт языка программирования Scala.
- The Scala Language Specification (англ.) — спецификация языка программирования Scala.
- Руководство по Scala (рус.) перевод англоязычного руководства
- Обзор языка программирования Scala — перевод статьи, описывающей причину разработки, идеи, возможности языка.