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. Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного программного обеспечения. За основу при разработке языка были взяты две идеи:

  1. Язык программирования компонентного ПО должен быть масштабируемым в том смысле, что должна быть возможность с помощью одних и тех же концепций описать как маленькие, так и большие части. Поэтому внимание было сконцентрировано на механизмах абстракции, композиции и декомпозиции вместо введения большого количества примитивов, которые могут быть полезными только на каком-то одном уровне масштабирования.
  2. Масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование. Некоторые из основных технических новшеств 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#, демонстрирующий некоторые различия в синтаксисе (постфиксная запись типов переменных, отсутствие специального синтаксиса для доступа к массивам). В этом примере описывается консольная программа, которая выводит все опции, переданные через командную строку. Опции начинаются с символа «-» (минус).

В 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.

Примечания

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

Литература

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

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

  • Хорстман К. Scala для нетерпеливых. — ДМК пресс, 2013. — 408 с. — 300 экз. — ISBN 978-5-94074-920-2, 978-0-321-77409-5.
  • Scala в примерах, перевод руководства Мартина Одерски в викиучебнике
  • Scala Школа! и Эффективная Scala — русские версии открытых учебников от Twitter
  • Путеводитель по Scala: серия статей на сайте IBM developerWorks

Ссылки