WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте
Scala
Класс языка Мультипарадигмальный: функциональный, объектно-ориентированный, императивный
Появился в 2003
Автор Мартин Одерски
Разработчик Programming Methods Laboratory of EPFL
Выпуск 2.12.7 (27.09.2018)
Система типов статическая, строгая, с автовыведением типов, структурная
Испытал влияние Java, Haskell, Erlang, Standard ML, Objective Caml, Smalltalk, Scheme, Algol68, Lisp
Повлиял на Kotlin, Swift
Лицензия BSD
Платформа Java Virtual Machine, JavaScript[1] и Native[d][2]
Сайт scala-lang.org

Scala — мультипарадигмальный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности функционального и объектно-ориентированного программирования.

Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерски, язык реализован для платформ Java и JavaScript. По мнению Джеймса Стрэчена[en], создателя языка программирования Groovy, Scala может стать преемником языка Java[3].

История

Язык был создан в 20012004 годах в Лаборатории методов программирования EPFL. Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного программного обеспечения. За основу при разработке языка были взяты две идеи:

  1. Язык программирования компонентного ПО должен быть масштабируемым в том смысле, что должна быть возможность с помощью одних и тех же концепций описать как маленькие, так и большие части. Поэтому внимание было сконцентрировано на механизмах абстракции, композиции и декомпозиции вместо введения большого количества примитивов, которые могут быть полезными только на каком-то одном уровне масштабирования.
  2. Масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование. Некоторые из основных технических новшеств Scala — это концепции, представляющие собой сплав этих парадигм программирования. В статически типизированных языках, к которым относится Scala, эти парадигмы до сих пор были почти полностью разделены.

Язык был выпущен для общего пользования на платформе JVM в январе 2004 года и на платформе .NET в июне 2004 года, в 2016 году создан LLVM-компилятор (Scala Native)[4].

Истоки дизайна

На дизайн языка оказали влияние многие языки и исследовательские работы.

Прежде всего, язык впитал значительное число концепций и синтаксических соглашений Java и C#. Способ выражения свойств во многом заимствован из Sather[en]. Из Smalltalk взята концепция унифицированной объектной модели. Из BETA пришла идея, что всё, включая классы, должно допускать вложенность. Абстрактные типы в Scala очень похожи на абстрактные типы сигнатур в SML и OCaml, обобщённые в контексте полноценных компонентов.

В некотором смысле Scala — это продолжение работы Pizza[en]. Как и 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[5].

Функциональный язык

Каждая функция — это значение. Язык предоставляет легковесный синтаксис для определения анонимных и каррированных функций. Каждая конструкция возвращает значение. Сопоставление с образцом естественно применимо к обработке 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 используют Gilt и Coursera[6], а Foursquare — Lift[7].

Социальная сеть LinkedIn использует микрофреймворк Scalatra для поддержки своего Signal API[8].

В апреле 2009 года Twitter объявил, что перевёл значительную часть своего серверного кода с Ruby на Scala и собирается перевести оставшийся[9]. В апреле 2011 онлайн-версия газеты The Guardian была переведена с Java на Scala[10].

Проекты фонда Apache Apache Spark, Apache Ignite (свободная версия основного продукта компании GridGain) и Apache Kafka написаны в основном на Scala.

Одним из активных пользователей языка также является банк UBS[11].

Важная составляющая инфраструктуры разработки на Scala — средство автоматической сборки Sbt — также написана на Scala.

Примечания

  1. http://www.scala-js.org/
  2. http://www.scala-native.org/
  3. Strachan, James Scala as the long term replacement for java/javac? (6 июля 2009). Проверено 7 января 2012. Архивировано 10 февраля 2012 года.
  4. Paul Krill. Scala language moves closer to bare metal. Infoworld (11 мая 2016). Проверено 4 декабря 2016.
  5. http://www.scala-lang.org/docu/files/ScalaTutorial.pdf
  6. Why we love Scala at Coursera
  7. Scala, Lift, and the Future
  8. Synodinos, Dionysios G. LinkedIn Signal: A Case Study for Scala, JRuby and Voldemort. InfoQ (11 октября 2010).
  9. 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 (April 1, 2009). Проверено 6 апреля 2009.
  10. Guardian switching from Java to Scala. Heise Online (5 апреля 2011). Проверено 5 апреля 2011.
  11. Binstock, Andrew. Interview with Scala's Martin Odersky. Dr. Dobb's Journal (14 июля 2011). Проверено 10 февраля 2012.

Литература

Англоязычная

Русскоязычная

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии