Русская Википедия:Scala (язык программирования)
Шаблон:Значения Шаблон:Карточка языка программирования Scala — мультипарадигмальный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности функционального и объектно-ориентированного программирования.
Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерски, язык реализован для платформ Java и JavaScript. По мнению Шаблон:Нп5, создателя языка программирования Groovy, Scala может стать преемником языка Java[1].
История
Язык был создан в 2001—2004 годах в Лаборатории методов программирования EPFL. Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного программного обеспечения. За основу при разработке языка были взяты две идеи:
- Язык программирования компонентного ПО должен быть масштабируемым в том смысле, что должна быть возможность с помощью одних и тех же концепций описать как маленькие, так и большие части. Поэтому внимание было сконцентрировано на механизмах абстракции, композиции и декомпозиции вместо введения большого количества примитивов, которые могут быть полезными только на каком-то одном уровне масштабирования.
- Масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование. Некоторые из основных технических новшеств Scala — это концепции, представляющие собой сплав этих парадигм программирования. В статически типизированных языках, к которым относится Scala, эти парадигмы до сих пор были почти полностью разделены.
Язык был выпущен для общего пользования на платформе JVM в январе 2004 года и на платформе .NET в июне 2004 года, в 2016 году создан LLVM-компилятор (Scala Native)[2].
Истоки дизайна
На дизайн языка оказали влияние многие языки и исследовательские работы.
Прежде всего, язык впитал значительное число концепций и синтаксических соглашений Java и C#. Способ выражения свойств во многом заимствован из Шаблон:Нп5. Из Smalltalk взята концепция унифицированной объектной модели. Из BETA пришла идея, что всё, включая классы, должно допускать вложенность. Абстрактные типы в Scala очень похожи на абстрактные типы сигнатур в SML и OCaml, обобщённые в контексте полноценных компонентов.
В некотором смысле Scala — это продолжение работы Шаблон:Нп5. Как и Pizza, Scala компилируется под Java VM, добавляя функции высшего порядка, сопоставление с образцом, конструкции, которые исходно были созданы в сообществе функционального программирования. В то время как Pizza обратно совместима с Java, цель Scala — всего лишь возможность взаимодействия, так что у неё больше степеней свободы в дизайне. Ещё одна цель Scala — предоставить расширенные конструкции для абстракции и композиции компонентов — общая с несколькими недавними исследовательскими разработками.
Ключевые аспекты языка
Scala-программы во многом похожи на Java-программы, и могут свободно взаимодействовать с Java-кодом. Язык включает единообразную объектную модель — в том смысле, что любое значение является объектом, а любая операция — вызовом метода. При этом является также функциональным языком в том смысле, что функции — это полноправные значения.
В Scala включены мощные и единообразные концепции абстракций как для типов, так и для значений. В частности, язык содержит гибкие симметричные конструкции примесей для композиции классов и типажей. Возможно позволяет производить декомпозицию объектов путём сравнения с образцом; образцы и выражения при этом были обобщены для поддержки естественной обработки XML-документов. В целом, эти конструкции позволяют легко выражать самостоятельные компоненты, использующие библиотеки Scala, не пользуясь специальными языковыми конструкциями.
Язык допускает внешние расширения компонентов с использованием представлений (Шаблон:Lang-en2). Возможности обобщённого программирования реализуются за счёт поддержки обобщённых функций (Шаблон:Lang-en2), в том числе высшего типажа (Шаблон:Lang-en2). Кроме различных классических структурных типов данных, в язык включена поддержка экзистенциальных типов.
Объектно-ориентированный язык
В языке используется чистая объектно-ориентированная модель, похожая на применяемую в Smalltalk: каждое значение — это объект, и каждая операция — это отправка сообщения. Например, сложение x+y
интерпретируется как x.+(y)
, то есть как вызов метода +
с аргументом y
и x
в качестве объекта-приёмника.
Рассмотрим другой пример: 1+2
. Это выражение интерпретируется как (1).+(2)
. Обратите внимание, что скобки вокруг чисел обязательны, потому что лексический анализатор Scala разбивает выражение на лексемы по принципу самого длинного возможного сопоставления. Таким образом, выражение 1.+(2)
разобьется на лексемы 1.
,+
и 2
, потому что лексема 1.
длиннее лексемы 1
и первый аргумент сложения будет интерпретирован, как тип Double вместо Int[3].
Функциональный язык
Каждая функция — это значение. Язык предоставляет легковесный синтаксис для определения анонимных и каррированных функций. Каждая конструкция возвращает значение. Сопоставление с образцом естественно применимо к обработке XML с помощью регулярных выражений.
Повторное использование и адаптация
Каждая компонентная система с мощными конструкциями абстракции и композиции сталкивается с проблемой, когда дело доходит до интеграции подсистем, разработанных различными командами в разное время. Проблема состоит в том, что интерфейс компонентов, разработанных той или иной группой, часто не подходит клиентам, намеренным использовать этот компонент.
Scala представляет новую концепцию решения проблемы внешней расширяемости — представления (Шаблон:Lang-en2). Они позволяют расширять класс новыми членами и типажами. Представления в Scala в некотором смысле соответствуют классам типов, используемым в Haskell, но в отличие от классов типов, область видимости представлений можно контролировать, причём в разных частях программы могут сосуществовать параллельные представления.
Примеры программ
Программа, как и в Java, представляет собой класс. Это пример консольной программы, которая выводит строчку текста на экран.
object HelloWorld {
def main(args: Array[String]) =
println("Привет, МИР!")
}
// Более короткая версия
object HelloWorld extends App {
println("Привет, МИР!")
}
Следующий простой пример программы написан на Java, Scala и C#, демонстрируя некоторые различия в синтаксисе (постфиксная запись типов переменных, отсутствие специального синтаксиса для доступа к массивам). В этом примере описывается консольная программа, которая выводит все опции, переданные через командную строку. Опции начинаются с символа «-» (минус). Шаблон:Col-begin
// 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")));
}
}
Шаблон:Col-end В 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 используют Gilt и Coursera[4], а Foursquare — Lift[5].
Социальная сеть LinkedIn использует микрофреймворк Scalatra для поддержки своего Signal API[6].
В апреле 2009 года Twitter объявил, что перевёл значительную часть своего серверного кода с Ruby на Scala и собирается перевести оставшийся[7]. В апреле 2011 онлайн-версия газеты The Guardian была переведена с Java на Scala[8].
Проекты фонда Apache: Apache Spark, Apache Kafka написаны в основном на Scala.
Одним из активных пользователей языка также является банк UBS[9].
Важная составляющая инфраструктуры разработки на Scala — средство автоматической сборки Sbt — также написана на Scala.
Примечания
Литература
Англоязычная
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга Шаблон:Wayback
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
Русскоязычная
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Scala в примерах, перевод руководства Мартина Одерски в викиучебнике
- Scala Школа! и Эффективная Scala — русские версии открытых учебников от Twitter
- Путеводитель по Scala: серия статей на сайте IBM developerWorks
Ссылки
- The Scala Programming LanguageШаблон:Ref-en — веб-сайт языка программирования Scala.
- The Scala Language SpecificationШаблон:Ref-en — спецификация языка программирования Scala.
- Руководство по ScalaШаблон:Ref-ru перевод англоязычного руководства
- Обзор языка программирования Scala — перевод статьи, описывающей причину разработки, идеи, возможности языка.
- Русская Википедия
- Объектно-ориентированные языки программирования
- Функциональные языки программирования
- Свободные компиляторы и интерпретаторы
- Языки программирования платформы Java
- Scala
- Транспиляция
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Википедия
- Статья из Википедии
- Статья из Русской Википедии