Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Скала ( / с к ɑː л ɑː / SKAH -lah ) [7] является языком программирования общего назначения , обеспечивая поддержку как объектно-ориентированного программирования и функционального программирования . В языке есть сильная система статических типов . Созданный для краткости [8], многие проектные решения Scala направлены на устранение критики Java . [6]

Исходный код Scala предназначен для компиляции в байт-код Java , чтобы полученный исполняемый код работал на виртуальной машине Java . Scala обеспечивает языковую совместимость с Java , поэтому на библиотеки, написанные на любом языке, можно ссылаться непосредственно в коде Scala или Java. [9] Как Java, Scala является объектно-ориентированным , и использует фигурные скобки синтаксис напоминает о языке программирования Си . В отличие от Java, Scala имеет множество функций языков функционального программирования, таких как Scheme , Standard ML и Haskell , включая каррирование., неизменяемость , ленивое вычисление и сопоставление с образцом . Он также имеет расширенную систему типов , поддерживающую алгебраические типы данных , ковариацию и контравариантность , типы более высокого порядка (но не типы более высокого ранга ) и анонимные типы . Другие функции Scala, отсутствующие в Java, включают перегрузку операторов , необязательные параметры, именованные параметры и необработанные строки . И наоборот, функция Java не в Scala - это проверенные исключения , что оказалось спорным. [10]

Название Scala является контаминация из масштабируемых и языка , что означает , что она предназначена для расти с требованиями пользователей. [11]

История [ править ]

Разработка Scala началась в 2001 году Мартином Одерски в Федеральной политехнической школе Лозанны (EPFL) (в Лозанне , Швейцария ) . Он стал продолжением работы над Funnel, языком программирования, сочетающим идеи функционального программирования и сетей Петри . [12] Одерский раньше работал над Generic Java и javac , компилятором Sun Java. [12]

После внутреннего освобождения в конце 2003 года, Scala была выпущена публично в начале 2004 года на платформе Java , [13] [6] [12] [14] Вторая версия (v2.0) , а затем в марте 2006 года [6]

17 января 2011 года команда Scala выиграла пятилетний исследовательский грант на сумму более 2,3 миллиона евро от Европейского исследовательского совета . [15] 12 мая 2011 года Одерский и его сотрудники основали компанию Typesafe Inc. (позже переименованную в Lightbend Inc. ), предоставляющую коммерческую поддержку, обучение и услуги для Scala. В 2011 году компания Typesafe получила от Greylock Partners инвестиции в размере 3 миллионов долларов . [16] [17] [18] [19]

Платформы и лицензия [ править ]

Scala работает на платформе Java ( виртуальная машина Java ) и совместима с существующими программами Java . [13] Поскольку приложения Android обычно пишутся на Java и транслируются из байт-кода Java в байт-код Dalvik (который может быть дополнительно переведен в машинный код во время установки) при упаковке, совместимость Scala с Java делает его хорошо подходящим для разработки Android, тем более, когда функциональный подход предпочтительнее. [20]

Эталонный дистрибутив программного обеспечения Scala, включая компилятор и библиотеки, выпускается под лицензией Apache . [21]

Другие компиляторы и цели [ править ]

Scala.js является Scala компилятор , который компилируется в JavaScript, что позволяет писать программы Scala , которые могут работать в веб - браузерах или Node.js . [22] Компилятор находился в разработке с 2013 года, а в 2015 году был объявлен не экспериментальным (v0.6). Версия v1.0.0-M1 была выпущена в июне 2018 года. В сентябре 2020 года это версия 1.1.1. [23]

Scala Native - это компилятор Scala , нацеленный на инфраструктуру компилятора LLVM для создания исполняемого кода, использующего облегченную управляемую среду выполнения, которая использует сборщик мусора Boehm . Проект возглавляет Денис Шабалин, и его первая версия, 0.1, вышла 14 марта 2017 года. Разработка Scala Native началась в 2015 году с целью быть быстрее, чем своевременная компиляция для JVM, за счет исключения начальной компиляции во время выполнения код, а также предоставляет возможность напрямую вызывать собственные процедуры. [24] [25]

Эталонный компилятор Scala, ориентированный на .NET Framework и ее Common Language Runtime, был выпущен в июне 2004 г. [12], но официально был прекращен в 2012 г. [26]

Примеры [ править ]

Пример "Hello World" [ править ]

Программа Hello World, написанная на Scala, имеет следующий вид:

 объект  HelloWorld  расширяет  приложение  {  println ( "Hello, World!" )  }

В отличие от автономного приложения Hello World для Java , здесь нет объявления класса и ничего не объявляется статическим; объект синглтона создается с объектом ключевым словом используется вместо этого.

Когда программа сохраняется в файле HelloWorld.scala , пользователь компилирует ее с помощью команды:

$ scalac HelloWorld.scala

и запускает его с

$ scala HelloWorld

Это аналогично процессу компиляции и выполнения кода Java. Действительно, модель компиляции и выполнения в Scala идентична модели Java, что делает ее совместимой с инструментами сборки Java, такими как Apache Ant .

Более короткая версия программы "Hello World" на Scala:

println ( "Привет, мир!" )

Scala включает интерактивную оболочку и поддержку сценариев. [27] Сохраненный в файле с именем HelloWorld2.scala, его можно запустить как сценарий без предварительной компиляции, используя:

$ scala HelloWorld2.scala

Команды также можно вводить непосредственно в интерпретатор Scala с помощью параметра -e :

$ scala -e 'println ("Привет, мир!")'

Выражения можно вводить интерактивно в REPL :

$ scala Добро пожаловать в Scala 2.12.2 (64-разрядная серверная виртуальная машина Java HotSpot (TM), Java 1.8.0_131). Введите выражения для оценки. Или попробуйте: помогите.scala> List (1, 2, 3) .map (x => x * x) res0: List [Int] = List (1, 4, 9)scala>

Базовый пример [ править ]

В следующем примере показаны различия между синтаксисом Java и Scala. Функция mathFunction принимает целое число, возводит его в квадрат, а затем добавляет кубический корень из этого числа к натуральному логарифму этого числа, возвращая результат (т. Е. ):

Некоторые синтаксические различия в этом коде:

  • Scala не требует точки с запятой в конце операторов.
  • Типы значений пишутся с заглавной буквы: Int, Double, Booleanвместо int, double, boolean.
  • Параметр и возвращаемые типы следуют, как в Паскале , а не предшествуют , как и в C .
  • Методы должны предшествовать def.
  • Локальным переменным или переменным класса должен предшествовать val(указывает на неизменяемую переменную) или var(указывает на изменяемую переменную).
  • В функции returnоператор не нужен (хотя и разрешен); значение последнего выполненного оператора или выражения обычно является значением функции.
  • Вместо оператора приведения Java в (Type) fooScala используется foo.asInstanceOf[Type]специальная функция, например toDoubleили toInt.
  • Вместо Java import foo.*;Scala использует import foo._.
  • Функция или метод foo()также могут называться просто foo; метод thread.send(signo)также может называться просто thread send signo; и метод foo.toString()также можно назвать просто foo toString.

Эти синтаксические ослабления предназначены для поддержки языков, специфичных для предметной области .

Некоторые другие основные синтаксические отличия:

  • Ссылки на массивы записываются как вызовы функций, например, array(i)а не array[i]. (Внутри Scala первый расширяется до array.apply (i), который возвращает ссылку)
  • Универсальные типы записываются, например, List[String]а не Java List<String>.
  • Вместо псевдотипа в voidScala есть фактический одноэлементный класс Unit (см. Ниже).

Пример с классами [ править ]

В следующем примере сравнивается определение классов в Java и Scala.

В приведенном выше коде показаны некоторые концептуальные различия между обработкой классов Java и Scala:

  • В Scala нет статических переменных или методов. Вместо этого у него есть одноэлементные объекты , которые по сути являются классами только с одним экземпляром. Объекты-одиночки объявляются с использованием objectвместо class. Обычно статические переменные и методы помещаются в одноэлементный объект с тем же именем, что и имя класса, который затем известен как сопутствующий объект . [13] (Базовый класс для одноэлементного объекта имеет $добавленный. Следовательно, для class Fooс сопутствующим объектом object Fooпод капотом находится класс, Foo$содержащий код сопутствующего объекта, и один объект этого класса создается с использованием одноэлементного шаблона .)
  • Вместо параметров конструктора в Scala есть параметры класса , которые помещаются в класс, аналогично параметрам функции. При объявлении с модификатором valили varполя также определяются с тем же именем и автоматически инициализируются из параметров класса. (Под капотом внешний доступ к общедоступным полям всегда осуществляется через методы доступа (получатель) и мутатор (установщик), которые создаются автоматически. Функция доступа имеет то же имя, что и поле, поэтому в приведенном выше примере нет необходимости явно объявлять методы доступа.) Обратите внимание, что альтернативные конструкторы также могут быть объявлены, как в Java. Код, который войдет в конструктор по умолчанию (кроме инициализации переменных-членов), переходит непосредственно на уровень класса.
  • Видимость по умолчанию в Scala - public.

Возможности (применительно к Java) [ править ]

Scala имеет ту же модель компиляции, что и Java и C # , а именно раздельная компиляция и загрузка динамических классов , так что код Scala может вызывать библиотеки Java.

Рабочие характеристики Scala такие же, как у Java. Компилятор Scala генерирует байт-код, почти идентичный тому, который генерируется компилятором Java. [13] Фактически, код Scala можно декомпилировать в читаемый код Java, за исключением некоторых операций конструктора. Для виртуальной машины Java (JVM) код Scala и код Java неотличимы. Единственное отличие - одна дополнительная библиотека времени выполнения scala-library.jar. [28]

Scala добавляет большое количество функций по сравнению с Java и имеет некоторые фундаментальные отличия в лежащей в основе модели выражений и типов, которые делают язык теоретически более чистым и устраняют несколько угловых случаев в Java. С точки зрения Scala это практически важно, потому что несколько дополнительных функций Scala доступны также и в C #. Примеры включают:

Синтаксическая гибкость [ править ]

Как упоминалось выше, Scala обладает значительной синтаксической гибкостью по сравнению с Java. Ниже приведены некоторые примеры:

  • Точки с запятой не нужны; строки автоматически соединяются, если они начинаются или заканчиваются маркером, который обычно не может стоять в этой позиции, или если есть незакрытые круглые скобки или скобки.
  • Любой метод может использоваться как инфиксный оператор, например, "%d apples".format(num)и "%d apples" format numэквивалентны. Фактически, арифметические операторы, такие как +и <<, обрабатываются так же, как и любые другие методы, поскольку имена функций могут состоять из последовательностей произвольных символов (за некоторыми исключениями, сделанными для таких вещей, как скобки, скобки и скобки, которые должны обрабатываться особым образом); единственная особая обработка, которой подвергаются такие именованные с помощью символов методы, касается обработки приоритета.
  • Методы applyи updateимеют синтаксические краткие формы. foo()-Где fooпредставляет собой значение (Singleton объекта или экземпляра класса) -это короткий для foo.apply(), и foo() = 42это сокращение foo.update(42). Точно так же foo(42)это сокращение от foo.apply(42)и foo(4) = 2является сокращением от foo.update(4, 2). Это используется для классов коллекций и распространяется на многие другие случаи, такие как ячейки STM .
  • Scala различает методы no-parens ( def foo = 42) и empty-parens ( def foo() = 42). При вызове метода с пустыми скобками скобки можно опустить, что полезно при вызове библиотек Java, которые не знают этого различия, например, при использовании foo.toStringвместо foo.toString(). По соглашению, метод должен быть определен с пустыми скобками, когда он выполняет побочные эффекты .
  • Имена методов, оканчивающиеся на двоеточие ( :), ожидают аргумента слева и получателя справа. Например, 4 :: 2 :: Nilэто то же самое Nil.::(2).::(4), что и первая форма, визуально соответствующая результату (список с первым элементом 4 и вторым элементом 2).
  • Переменные тела класса могут быть прозрачно реализованы как отдельные методы получения и установки. Ибо trait FooLike { var bar: Int }реализация может быть . На сайте звонка по-прежнему можно будет использовать лаконичный .object Foo extends FooLike { private var x = 0; def bar = x; def bar_=(value: Int) { x = value }} } }foo.bar = 42
  • В вызовах методов разрешено использование фигурных скобок вместо круглых. Это позволяет реализовать новые управляющие структуры в чистом виде. [29] Например, breakable { ... if (...) break() ... }выглядит так, как будто breakableэто ключевое слово, определенное языком, но на самом деле это просто метод, принимающий аргумент thunk . Методы, использующие преобразователи или функции, часто помещают их во второй список параметров, позволяя смешивать круглые и фигурные скобки синтаксис: Vector.fill(4) { math.random }такой же, как Vector.fill(4)(math.random). Вариант фигурных скобок позволяет выражению занимать несколько строк.
  • For-выражения (объясненные ниже) могут поддерживать любой тип, который определяет монадические методы, такие как map, flatMapи filter.

Сами по себе эти варианты могут показаться сомнительными, но в совокупности они служат цели, позволяющей определять в Scala предметно-ориентированные языки без необходимости расширения компилятора. Например, специальный синтаксис Erlang для отправки сообщения субъекту, то есть actor ! messageможет быть (и реализуется) в библиотеке Scala без необходимости расширения языка.

Единая система типов [ править ]

В Java проводится четкое различие между примитивными типами (например, intи boolean) и ссылочными типами (любой класс ). Только ссылочные типы являются частью схемы наследования, производной от java.lang.Object. В Scala все типы наследуются от класса верхнего уровня Any, непосредственными дочерними элементами которого являются AnyVal(типы значений, такие как Intи Boolean) и AnyRef(ссылочные типы, как в Java). Это означает, что различие в Java между примитивными типами и упакованными типами (например, intvs. Integer) в Scala отсутствует; упаковка и распаковка полностью прозрачны для пользователя. Scala 2.10 позволяет пользователю определять новые типы значений.

Фор-выражения [ править ]

Вместо циклов « foreach » Java для прохождения цикла через итератор в Scala есть for-выражения, которые похожи на понимание списков в таких языках, как Haskell, или комбинацию понимания списков и выражений генератора в Python . Выражения For, использующие yieldключевое слово, позволяют создавать новую коллекцию путем итерации по существующей, возвращая новую коллекцию того же типа. Они переводятся компилятором в ряд map, flatMapи filterзвонков. Там, где yieldон не используется, код приближается к циклу императивного стиля путем преобразования в foreach.

Простой пример:

val  s  =  for  ( x  <- от  1  до  25,  если  x * x  >  50 )  дает  2 * x

Результатом его запуска будет следующий вектор:

Vector(16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50)

(Обратите внимание, что выражение 1 to 25не является специальным синтаксисом. Метод toопределен в стандартной библиотеке Scala как метод расширения для целых чисел с использованием техники, известной как неявные преобразования [30], которая позволяет добавлять новые методы к существующим типам.)

Более сложный пример перебора карты:

// Учитывая карту с указанием пользователей Twitter, упомянутых в наборе твитов, // и количество упоминаний каждого пользователя, найдите пользователей // на карте известных политиков и верните новую карту, дающую только // Демократический политики (как объекты, а не строки). val  dem_mentions  =  for  {  ( упоминание ,  раз )  <-  упоминает  аккаунт  <-  аккаунты . получить ( упомянуть )  если  аккаунт . party  ==  "Демократическая"  }  доходность  ( счет ,  раз)

Выражение (mention, times) <- mentions- это пример сопоставления с образцом (см. Ниже). Итерация по карте возвращает набор кортежей «ключ-значение» , а сопоставление с образцом позволяет легко деструктурировать кортежи на отдельные переменные для ключа и значения. Точно так же результат понимания также возвращает кортежи «ключ-значение», которые автоматически встраиваются в карту, поскольку исходный объект (из переменной mentions) является картой. Обратите внимание: если mentionsвместо этого будет храниться список, набор, массив или другая коллекция кортежей, точно такой же код, приведенный выше, даст новую коллекцию того же типа.

Функциональные тенденции [ править ]

Поддерживая все объектно-ориентированные функции, доступные в Java (и фактически расширяя их различными способами), Scala также предоставляет большое количество возможностей, которые обычно встречаются только в языках функционального программирования . Вместе эти функции позволяют писать программы Scala в почти полностью функциональном стиле, а также позволяют смешивать функциональные и объектно-ориентированные стили.

Примеры:

  • Никакого различия между утверждениями и выражениями
  • Вывод типа
  • Анонимные функции с семантикой захвата (например, замыкания )
  • Неизменяемые переменные и объекты
  • Ленивая оценка
  • Разграниченные продолжения (начиная с версии 2.8)
  • Функции высшего порядка
  • Вложенные функции
  • Каррирование
  • Сопоставление с образцом
  • Алгебраические типы данных (через классы case )
  • Кортежи

Все есть выражение [ править ]

В отличие от C или Java, но подобно языкам, таким как Lisp , Scala не делает различий между операторами и выражениями. Фактически, все операторы являются выражениями, которые дают некоторое значение. Функции, которые были бы объявлены как возвращающие voidв C или Java, и подобные операторы whileлогически не возвращают значения, в Scala считается, что они возвращают тип Unit, который является одноэлементным типом , только с одним объектом этого типа. Функции и операторы, которые никогда не возвращаются (например, throwоператор или функция, которая всегда выходит нелокально с использованием исключения), логически имеют тип возврата Nothing, особый тип, не содержащий объектов; то есть нижний тип, т.е. подкласс всех возможных типов. (Это, в свою очередь, делает тип Nothingсовместимым со всеми типами, что позволяет правильному выводу типов .)

Точно так же if-then-else«оператор» на самом деле является выражением, которое производит значение, т. Е. Результат оценки одной из двух ветвей. Это означает, что такой блок кода можно вставить везде, где требуется выражение, устраняя необходимость в тернарном операторе в Scala:

По тем же причинам returnв Scala операторы не нужны, да и не приветствуются. Как и в Лиспе, последнее выражение в блоке кода является значением этого блока кода, и если блок кода является телом функции, он будет возвращен функцией.

Чтобы было понятно, что все функции являются выражениями, даже возвращающие методы Unitзаписываются со знаком равенства

def  printValue ( x :  String ) :  Unit  =  {  println ( "Я съел% s" . format ( x )) }

или эквивалентно (с выводом типа и опусканием ненужных фигурных скобок):

def  printValue ( x :  String )  =  println ( "Я съел% s"  формат  x )

Вывод типа [ править ]

Из-за вывода типа тип переменных, возвращаемые значения функции и многие другие выражения обычно могут быть опущены, поскольку компилятор может это определить. Примеры: val x = "foo"(для неизменяемой константы или неизменяемого объекта ) или var x = 1.5(для переменной, значение которой впоследствии может быть изменено). Вывод типов в Scala по существу является локальным, в отличие от более глобального алгоритма Хиндли-Милнера , используемого в Haskell , ML и других более чисто функциональных языках. Это сделано для облегчения объектно-ориентированного программирования. В результате все еще необходимо объявить определенные типы (в первую очередь, параметры функций и типы возвращаемых рекурсивных функций ), например

def  formatApples ( x :  Int )  =  «Я съел% d яблок» . формат ( x )

или (с возвращаемым типом, объявленным для рекурсивной функции)

def  factorial ( x :  Int ) :  Int  =  if  ( x  ==  0 )  1  else  x * факториал ( x  -  1 )

Анонимные функции [ править ]

В Scala функции являются объектами, и существует удобный синтаксис для указания анонимных функций . Примером является выражение x => x < 2, которое определяет функцию с одним параметром, который сравнивает свой аргумент, чтобы увидеть, меньше ли он 2. Оно эквивалентно форме Лиспа (lambda (x) (< x 2)). Обратите внимание, что ни тип, xни тип возвращаемого значения не нужно указывать явно, и, как правило, их можно вывести путем вывода типа ; но они могут быть указаны явно, например как (x: Int) => x < 2или даже (x: Int) => (x < 2): Boolean.

Анонимные функции ведут себя как настоящие замыкания в том смысле, что они автоматически захватывают любые переменные, которые лексически доступны в среде включающей функции. Эти переменные будут доступны даже после возврата из включающей функции, и, в отличие от анонимных внутренних классов Java, не нужно объявлять окончательные. (Можно даже изменять такие переменные, если они изменяемы, и измененное значение будет доступно при следующем вызове анонимной функции.)

Еще более короткая форма анонимной функции использует переменные- заполнители : например, следующее:

list map { x => sqrt(x) }

можно записать более кратко как

list map { sqrt(_) }

или даже

list map sqrt

Неизменяемость [ править ]

В Scala проводится различие между неизменяемыми и изменяемыми переменными. Изменяемые переменные объявляются с помощью varключевого слова, а неизменяемые значения объявляются с помощью valключевого слова. Переменная, объявленная с использованием valключевого слова, не может быть переназначена так же, как переменная, объявленная с использованием finalключевого слова, не может быть переназначена в Java. Однако следует отметить, что они valявляются лишь поверхностно неизменяемыми, то есть объект, на который ссылается val, не гарантирует неизменяемость самого себя.

Однако неизменные классы поощряются соглашением, а стандартная библиотека Scala предоставляет богатый набор неизменяемых классов коллекций . Scala предоставляет изменяемые и неизменяемые варианты большинства классов коллекций, а неизменяемая версия всегда используется, если изменяемая версия не импортирована явно. [31] Неизменяемые варианты - это постоянные структуры данных, которые всегда возвращают обновленную копию старого объекта вместо деструктивного обновления старого объекта на месте. Примером этого являются неизменяемые связанные списки.где добавление элемента к списку выполняется путем возврата нового узла списка, состоящего из элемента и ссылки на конец списка. Добавление элемента в список может быть выполнено только путем добавления всех элементов в старом списке к новому списку только с новым элементом. Таким же образом, вставка элемента в середину списка копирует первую половину списка, но сохраняет ссылку на вторую половину списка. Это называется структурным разделением. Это обеспечивает очень простой параллелизм - никаких блокировок не требуется, так как общие объекты никогда не изменяются. [32]

Ленивая (нестрогая) оценка [ править ]

По умолчанию оценка является строгой («нетерпеливой»). Другими словами, Scala оценивает выражения, как только они становятся доступными, а не по мере необходимости. Однако можно объявить переменную нестрогой («ленивой») с помощью lazyключевого слова, что означает, что код для создания значения переменной не будет оцениваться до первого обращения к переменной. Также существуют нестрогие коллекции различных типов (например, тип Stream, нестрогий связанный список), и любую коллекцию можно сделать нестрогой с помощьюviewметод. Нестрогие коллекции обеспечивают хорошее семантическое соответствие таким вещам, как данные, создаваемые сервером, где оценка кода для генерации более поздних элементов списка (что, в свою очередь, запускает запрос к серверу, возможно, расположенному где-то еще в Интернете). происходит, когда элементы действительно нужны.

Хвостовая рекурсия [ править ]

Функциональные языки программирования обычно обеспечивают оптимизацию хвостового вызова, чтобы обеспечить широкое использование рекурсии без проблем с переполнением стека . Ограничения байт-кода Java усложняют оптимизацию хвостового вызова на JVM. В общем, функция, которая вызывает себя с хвостовым вызовом, может быть оптимизирована, а взаимно рекурсивные функции - нет. Батуты были предложены как обходной путь. [33] Поддержка батутов обеспечивается библиотекой Scala вместе с объектом, scala.util.control.TailCallsначиная с версии Scala 2.8.0 (выпущенной 14 июля 2010 г.). Функция может быть дополнительно аннотирована @tailrec, и в этом случае она не будет компилироваться, если она не является хвостовой рекурсивной. [34]

Классы регистра и сопоставление с образцом [ править ]

Scala имеет встроенную поддержку сопоставления с образцом , которую можно рассматривать как более сложную, расширяемую версию оператора switch , в которой можно сопоставлять произвольные типы данных (а не просто простые типы, такие как целые числа, логические значения и строки), включая произвольные гнездование. Предоставляется специальный тип класса, известный как класс case , который включает автоматическую поддержку сопоставления с образцом и может использоваться для моделирования алгебраических типов данных.используется во многих языках функционального программирования. (С точки зрения Scala класс case - это просто обычный класс, для которого компилятор автоматически добавляет определенные варианты поведения, которые также могут быть предоставлены вручную, например, определения методов, обеспечивающих глубокое сравнение и хеширование, а также деструктуризацию класса case в его конструкторе. параметры во время сопоставления с образцом.)

Пример определения алгоритма быстрой сортировки с использованием сопоставления с образцом:

def  qsort ( list :  List [ Int ]) :  List [ Int ]  =  список  соответствий  {  case  Nil  =>  Nil  case  pivot  ::  tail  =>  val  ( меньше ,  остальное )  =  хвост . раздел ( _  <  pivot )  qsort ( меньше )  :::  pivot  ::  qsort ( rest ) }

Идея здесь в том, что мы разбиваем список на элементы меньше, чем точка поворота, и элементы не меньше, рекурсивно сортируем каждую часть и вставляем результаты вместе с точкой между ними. При этом используется та же стратегия « разделяй и властвуй» , что и при сортировке слиянием, и другие алгоритмы быстрой сортировки.

matchОператор используется , чтобы сделать поиск по шаблону на объекте , хранящемся в list. Каждое caseвыражение проверяется по очереди, чтобы увидеть, будет ли оно совпадать, и первое совпадение определяет результат. В этом случае соответствует Nilтолько литеральный объект Nil, но pivot :: tailсоответствует непустому списку и одновременно разрушает список в соответствии с заданным шаблоном. В этом случае связанный код будет иметь доступ к локальной переменной с именем, pivotсодержащей заголовок списка, и другой переменной, tailсодержащей конец списка. Обратите внимание, что эти переменные доступны только для чтения и семантически очень похожи на привязки переменных, устанавливаемые с помощью letоператора в Lisp и Scheme.

Сопоставление с образцом также происходит в объявлениях локальных переменных. В этом случае возвращаемое значение вызова tail.partition- это кортеж - в данном случае два списка. (Кортежи отличаются от других типов контейнеров, например списков, тем, что они всегда имеют фиксированный размер, а элементы могут быть разных типов - хотя здесь они оба одинаковы.) Сопоставление с образцом - самый простой способ получить две части кортеж.

Форма _ < pivot- это объявление анонимной функции с переменной-заполнителем; см. раздел выше об анонимных функциях.

Появляются операторы списка ::(который добавляет элемент в начало списка, как consв Lisp и Scheme) и :::(который объединяет два списка, как appendв Lisp и Scheme). Несмотря на внешний вид, ни в одном из этих операторов нет ничего «встроенного». Как указано выше, любая строка символов может служить именем функции, а метод, применяемый к объекту, может быть записан в инфиксном стиле без точки или скобок. Строка выше, как написано:

qsort(smaller) ::: pivot :: qsort(rest)

также можно было бы написать так:

qsort(rest).::(pivot).:::(qsort(smaller))

в более стандартной нотации вызова метода. (Методы, заканчивающиеся двоеточием, являются правоассоциативными и привязаны к объекту справа.)

Частичные функции [ править ]

В приведенном выше примере сопоставления с шаблоном тело matchоператора представляет собой частичную функцию , которая состоит из серии caseвыражений с преобладающим первым совпадающим выражением, аналогично телу оператора switch . Частичные функции также используются в части tryоператора, обрабатывающей исключения :

попробуйте  {  ... }  поймать  {  case  nfe : NumberFormatException  =>  {  println ( nfe );  Список ( 0 )  }  case  _  =>  Nil }

Наконец, частичную функцию можно использовать отдельно, и результат ее вызова эквивалентен выполнению matchнад ней. Например, предыдущий код для быстрой сортировки можно записать так:

val  qsort :  List [ Int ]  =>  List [ Int ]  =  {  case  Nil  =>  Nil  case  pivot  ::  tail  =>  val  ( меньше ,  остальное )  =  хвост . раздел ( _  <  pivot )  qsort ( меньше )  :::  pivot  ::  qsort ( rest ) }

Здесь объявляется переменная , доступная только для чтения , тип которой является функцией от списков целых чисел до списков целых чисел и связывает ее с частичной функцией. (Обратите внимание, что единственный параметр частичной функции никогда явно не объявляется или не именуется.) Однако мы все равно можем вызывать эту переменную точно так же, как если бы это была обычная функция:

scala >  qsort ( List ( 6 , 2 , 5 , 9 )) res32 :  List [ Int ]  =  List ( 2 ,  5 ,  6 ,  9 )

Объектно-ориентированные расширения [ править ]

Scala - это чистый объектно-ориентированный язык в том смысле, что каждое значение является объектом . Типы данных и поведение объектов описываются классами и признаками . Абстракции классов расширяются путем создания подклассов и гибкого механизма композиции на основе миксинов , чтобы избежать проблем множественного наследования .

Traits - это Scala, заменяющий интерфейсы Java . Интерфейсы в версиях Java до 8 сильно ограничены и могут содержать только объявления абстрактных функций. Это привело к критике за то, что предоставление удобных методов в интерфейсах неудобно (одни и те же методы должны быть повторно реализованы в каждой реализации), а расширение опубликованного интерфейса обратно совместимым способом невозможно. Черты похожи на классы миксинов в том, что они обладают почти всей мощью обычного абстрактного класса, не имея только параметров класса (эквивалент Scala параметрам конструктора Java), поскольку черты всегда смешиваются с классом. ВsuperОператор ведет себя особым образом в свойствах, позволяя объединять черты в цепочку с использованием композиции в дополнение к наследованию. Следующий пример представляет собой простую оконную систему:

абстрактный  класс  Window  {  // абстрактный  def  draw () }class  SimpleWindow  расширяет  окно  {  def  draw ()  {  println ( "in SimpleWindow" )  // рисование основного окна  } }trait  WindowDecoration  расширяет  Window  {  }trait  HorizontalScrollbarDecoration  extends  WindowDecoration  {  // здесь необходимо "абстрактное переопределение", чтобы "super ()" работала, потому что родительская  // функция является абстрактной. Если бы он был конкретным, было бы достаточно обычного «переопределения».  абстрактное  переопределение  def  draw ()  {  println ( "в HorizontalScrollbarDecoration" )  супер . draw ()  // теперь рисуем горизонтальную полосу прокрутки  } }черта  VerticalScrollbarDecoration  расширяет  WindowDecoration  {  абстрактное  переопределение  def  draw ()  {  println ( "в VerticalScrollbarDecoration" )  супер . draw ()  // теперь рисуем вертикальную полосу прокрутки  } }черта  TitleDecoration  расширяет  WindowDecoration  {  абстрактное  переопределение  def  draw ()  {  println ( "в TitleDecoration" )  супер . draw ()  // теперь рисуем строку заголовка  } }

Переменная может быть объявлена ​​так:

val  mywin  =  new  SimpleWindow  с  VerticalScrollbarDecoration  с  HorizontalScrollbarDecoration  с  TitleDecoration

Результат звонка mywin.draw():

в  TitleDecoration в  HorizontalScrollbarDecoration в  VerticalScrollbarDecoration в  SimpleWindow

Другими словами, вызов drawсначала выполнил код в TitleDecoration(последний признак, смешанный с), затем (через super()вызовы) прошел обратно через другие смешанные признаки и, в конечном итоге, к коду Window, даже если ни один из признаков не унаследован от друг друга . Это похоже на шаблон декоратора , но является более кратким и менее подверженным ошибкам, так как не требует явной инкапсуляции родительского окна, явной пересылки функций, реализация которых не изменяется, или использования инициализации взаимосвязей сущностей во время выполнения. . В других языках подобный эффект может быть достигнут во время компиляции с длинной линейной цепочкой наследования реализации., но с недостатком по сравнению со Scala, что одна цепочка линейного наследования должна быть объявлена ​​для каждой возможной комбинации добавлений.

Система экспрессивных шрифтов [ править ]

Scala оснащена выразительной системой статических типов, которая в основном обеспечивает безопасное и связное использование абстракций. Однако система шрифтов не надежна . [35] В частности, система типов поддерживает:

  • Классы и абстрактные типы как члены объекта
  • Структурные типы
  • Типы, зависящие от пути
  • Составные типы
  • Явно типизированные ссылки на себя
  • Общие классы
  • Полиморфные методы
  • Верхняя и нижняя границы типа
  • Дисперсия
  • Аннотации
  • Взгляды

Scala может определять типы по их использованию. Это делает большинство объявлений статических типов необязательными. Статические типы не нужно объявлять явно, если ошибка компилятора не указывает на необходимость. На практике некоторые объявления статических типов включены для ясности кода.

Обогащение типов [ править ]

Распространенная техника в Scala, известная как «обогатить мою библиотеку» [36] (первоначально названная Мартином Одерски в 2006 году « прокачать мою библиотеку »; [30] эта формулировка вызывала опасения из-за ее отрицательной коннотации [37] и незрелости [ 38] ), позволяет использовать новые методы, как если бы они были добавлены к существующим типам. Это похоже на концепцию методов расширения C #, но более мощную, потому что методика не ограничивается добавлением методов и может, например, использоваться для реализации новых интерфейсов. В Scala этот метод включает объявление неявного преобразованияот типа, «принимающего» метод, к новому типу (обычно классу), который является оболочкой исходного типа и предоставляет дополнительный метод. Если метод не может быть найден для данного типа, компилятор автоматически ищет любые применимые неявные преобразования к типам, которые предоставляют рассматриваемый метод.

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

В следующем примере показано обогащение типа Intметодами isEvenи isOdd:

объект  MyExtensions  {  неявный  класс  IntPredicates ( i :  Int )  {  def  isEven  =  i  %  2  ==  0  def  isOdd  =  ! isEven  } }import  MyExtensions._  // неявное обогащение в области 4. isEven  // -> true

Импорт членов MyExtensionsпереносит неявное преобразование в класс расширения IntPredicatesв область видимости. [39]

Параллелизм [ править ]

Стандартная библиотека Scala включает поддержку модели акторов в дополнение к стандартным API-интерфейсам параллелизма Java. Lightbend Inc. предоставляет платформу [40] , который включает в Акку , [41] отдельные рамки с открытым исходным кодом , который обеспечивает актер на основе параллелизма. Акторы Akka могут быть распределены или объединены с программной транзакционной памятью ( транзакторами ). Альтернативными реализациями коммуникационных последовательных процессов (CSP) для передачи сообщений на основе каналов являются Communicating Scala Objects [42] или просто через JCSP .

Актер подобен экземпляру потока с почтовым ящиком. Его можно создать system.actorOf, переопределив receiveметод получения сообщений и используя метод !(восклицательный знак) для отправки сообщения. [43] В следующем примере показан EchoServer, который может получать сообщения и затем распечатывать их.

вал  echoServer  =  актер ( новый  закон  {  стать  {  случай  тзд  =>  Println ( "эхо"  +  тзд )  } }) echoServer  !  "Здравствуй"

Scala также имеет встроенную поддержку параллельного программирования данных в виде Parallel Collections [44], интегрированного в его стандартную библиотеку, начиная с версии 2.9.0.

В следующем примере показано, как использовать параллельные коллекции для повышения производительности. [45]

val  urls  =  List ( "https://scala-lang.org" ,  "https://github.com/scala/scala" )def  fromURL ( url :  String )  =  scala . io . Источник . fromURL ( URL )  . getLines (). mkString ( "\ n" )val  t  =  Система . currentTimeMillis () URL . пар . map ( fromURL ( _ ))  // par возвращает параллельную реализацию коллекции println ( "time:"  +  ( System . currentTimeMillis  -  t )  +  "ms" )

Помимо поддержки акторов и параллелизма данных, Scala также поддерживает асинхронное программирование с Futures и Promises, программной транзакционной памятью и потоками событий. [46]

Кластерные вычисления [ править ]

Самым известным решением для кластерных вычислений с открытым исходным кодом, написанным на Scala, является Apache Spark . Кроме того, Apache Kafka , очередь сообщений публикации-подписки, популярная в Spark и других технологиях обработки потоков, написана на Scala.

Тестирование [ править ]

Есть несколько способов протестировать код в Scala. ScalaTest поддерживает несколько стилей тестирования и может интегрироваться со средами тестирования на основе Java. [47] ScalaCheck - это библиотека, аналогичная QuickCheck в Haskell . [48] specs2 - это библиотека для написания спецификаций исполняемого программного обеспечения. [49] ScalaMock обеспечивает поддержку тестирования высокоуровневых и каррированных функций. [50] JUnit и TestNG - популярные среды тестирования, написанные на Java.

Версии [ править ]

Сравнение с другими языками JVM [ править ]

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

Scala имеет статическую типизацию , а Groovy и Clojure - динамически . Это делает систему типов более сложной и трудной для понимания, но позволяет обнаруживать почти все [35] ошибки типов во время компиляции и может привести к значительно более быстрому выполнению. Напротив, динамическая типизация требует большего количества тестов для обеспечения правильности программы и, как правило, медленнее, чтобы обеспечить большую гибкость и простоту программирования. Что касается разницы в скорости, текущие версии Groovy и Clojure допускают необязательные аннотации типов, чтобы помочь программам избежать накладных расходов на динамическую типизацию в случаях, когда типы практически статичны. Эти накладные расходы еще больше уменьшаются при использовании последних версий JVM, которые были расширены за счет динамического вызова.инструкция для методов, которые определены с динамически типизированными аргументами. Эти достижения сокращают разрыв в скорости между статической и динамической типизацией, хотя язык со статической типизацией, такой как Scala, по-прежнему является предпочтительным выбором, когда эффективность выполнения очень важна.

Что касается парадигм программирования, Scala наследует объектно-ориентированную модель Java и расширяет ее различными способами. Groovy, хотя и сильно объектно-ориентирован, более ориентирован на снижение многословности. В Clojure объектно-ориентированному программированию не уделяется должного внимания, поскольку функциональное программирование является основной сильной стороной языка. Scala также имеет множество средств функционального программирования, включая функции, имеющиеся в продвинутых функциональных языках, таких как Haskell , и пытается не зависеть от двух парадигм, позволяя разработчику выбирать между двумя парадигмами или, что чаще, их комбинацией.

Что касается синтаксического сходства с Java, Scala наследует большую часть синтаксиса Java, как и в случае с Groovy. Clojure, с другой стороны, следует синтаксису Lisp , который отличается как по внешнему виду, так и по философии. Однако изучение Scala также считается трудным из-за его множества дополнительных функций. Это не относится к Groovy, несмотря на то, что он также является многофункциональным языком, главным образом потому, что он был разработан в основном как язык сценариев. [ необходима цитата ]

Принятие [ править ]

Рейтинг языков [ править ]

По состоянию на 2013 год все языки на основе JVM (Clojure, Groovy, Kotlin, Scala) значительно менее популярны, чем исходный язык Java, который обычно занимает первое или второе место [104] [105] и который также одновременно развивается с течением времени. .

Индекс популярности языков программирования [106], который отслеживает поиск языковых руководств, поставил Scala на 15-е место в апреле 2018 г. с небольшой тенденцией к снижению и на 17-е место в январе 2021 г. Это делает Scala вторым по популярности языком на основе JVM после Java, с Kotlin , язык на основе JVM, занявший 12-е место.

Индекс популярности языков программирования TIOBE [105] использует рейтинги в поисковых системах и аналогичный подсчет публикаций для определения популярности языка. По состоянию на апрель 2018 года Scala занимает 34-е место, опустившись на четыре позиции за последние два года, но, как упоминалось в разделе «Ошибки и запросы на изменение», TIOBE знает о проблемах с его методологией использования условий поиска, которые могут не соответствовать обычно используется в некоторых сообществах языков программирования. В этом рейтинге Scala опережает некоторые функциональные языки, такие как Haskell (42-е место), Erlang , но уступает другим языкам, таким как Swift (15-е), Perl (16-е), Go (19-е) и Clojure (30-е).

ThoughtWorks Radar Technology, которая является мнение , основанное раз в два года доклад группы старших технологов, [107] рекомендовал принять Scala в языках и рамок категории в 2013 году [108] В июле 2014, эта оценка была сделана более конкретной и теперь относится на «Scala, хорошие части», который описывается как «Чтобы успешно использовать Scala, вам необходимо изучить язык и иметь очень твердое мнение о том, какие части вам подходят, создав свое собственное определение Scala, хорошие части . ". [109]

В рейтинге языков программирования RedMonk, который устанавливает рейтинг на основе количества проектов GitHub и вопросов, заданных на Stack Overflow , Scala занимает 14-е место. [104] Здесь Scala находится внутри второго эшелона группы языков, впереди Go , PowerShell и Haskell , а вслед за Swift , Objective-C , Машинопись и R . Однако в своем отчете за 2018 год рейтинги отметили падение рейтинга Scala в третий раз подряд, задав вопрос, «сколько из доступного кислорода для Scala потребляется Kotlin, поскольку последний продолжает подниматься в этом рейтинге». [104]

В исследовании «Состояние Java» за 2018 год [110], в котором были собраны данные от 5160 разработчиков по различным темам, связанным с Java, Scala занимает третье место по использованию альтернативных языков в JVM. По сравнению с прошлогодним опросом, использование Scala среди альтернативных языков JVM упало почти на четверть (с 28,4% до 21,5%), обогнав Kotlin, который вырос с 11,4% в 2017 году до 28,8% в 2018 году.

Компании [ править ]

  • В апреле 2009 года Twitter объявил, что большую часть своей серверной части он переключил с Ruby на Scala и намеревается преобразовать остальную часть. [111]
  • Gilt использует Scala и Play Framework . [112]
  • Foursquare использует Scala и Lift . [113]
  • Coursera использует Scala и Play Framework . [114]
  • Apple Inc. использует Scala в определенных командах, а также Java и платформу Play. [115] [116]
  • The Guardian сайтбольшим трафиком газеты guardian.co.uk [117] было объявлено в апреле 2011 годачто это был переход от Java в Scala. [118] [119]
  • В 2014 году New York Times сообщила, что ее внутренняя система управления контентом Blackbeard построена с использованием Scala, Akka и Play. [120]
  • Газета Huffington Post начала использовать Scala как часть своей системы доставки контента Athena в 2013 году [121].
  • Швейцарский банк UBS одобрил Scala для общего производственного использования. [122]
  • LinkedIn использует Scalatra микрокаркас для питания его API сигнала. [123]
  • Meetup использует нефильтрованный инструментарий для API реального времени. [124]
  • Помните, что Milk использует Unfiltered toolkit, Scala и Akka для общедоступного API и обновлений в реальном времени. [125]
  • Verizon стремится создать «фреймворк нового поколения» с использованием Scala. [126]
  • Airbnb разрабатывает программное обеспечение для машинного обучения с открытым исходным кодом Aerosolve, написанное на Java и Scala. [127]
  • Zalando переместила свой стек технологий с Java на Scala и Play. [128]
  • SoundCloud использует Scala для своей серверной части, используя такие технологии, как Finagle (микросервисы), [129] Scalding и Spark (обработка данных). [130]
  • Databricks использует Scala для платформы больших данных Apache Spark .
  • Morgan Stanley широко использует Scala в своих финансовых проектах и ​​проектах, связанных с активами. [131]
  • В Google / Alphabet Inc. есть команды , использующие Scala, в основном благодаря таким приобретениям, как Firebase [132] и Nest. [133]
  • Walmart Canada использует Scala в качестве серверной платформы. [134]
  • Duolingo использует Scala в качестве внутреннего модуля, который генерирует уроки. [135]
  • HMRC использует Scala для многих налоговых приложений правительства Великобритании. [136]

Критика [ править ]

В марте 2015 года бывший вице-президент группы разработки платформ в Twitter Раффи Крикориан заявил, что он не выбрал бы Scala в 2011 году из-за ее кривой обучения . [137] В том же месяце старший вице-президент LinkedIn Кевин Скотт заявил о своем решении «минимизировать [свою] зависимость от Scala». [138] В ноябре 2011 года Yammer отошел от Scala по причинам, которые включали в себя кривую обучения для новых членов команды и несовместимость от одной версии компилятора Scala к другой. [139]

См. Также [ править ]

  • sbt , широко используемый инструмент сборки для проектов Scala
  • Играть в! , платформа веб-приложений с открытым исходным кодом, поддерживающая Scala
  • Akka , набор инструментов с открытым исходным кодом для создания параллельных и распределенных приложений.
  • Chisel , язык с открытым исходным кодом, основанный на Scala, который используется для проектирования и генерации оборудования. [140]

Ссылки [ править ]

  1. ^ "Scala 2.13.4 теперь доступна!" . 2020-11-19 . Проверено 19 ноября 2020 .
  2. ^ "Файл УВЕДОМЛЕНИЯ" . 2019-01-24 . Проверено 4 декабря 2019 г. - через GitHub .
  3. ^ «Макросы Scala» .
  4. ^ Fogus, Майкл (6 августа 2010). «МартинОдерский возьми (5) в список» . Отправьте больше медработников . Проверено 9 февраля 2012 .
  5. ^ a b c d Одерский, Мартин (11 января 2006 г.). «Эксперимент Scala - можем ли мы обеспечить лучшую языковую поддержку для компонентных систем?» (PDF) . Проверено 22 июня 2016 .
  6. ^ a b c d Одерский, Мартин; и другие. (2006). «Обзор языка программирования Scala» (PDF) (2-е изд.). Федеральная политехническая школа Лозанны (EPFL). Архивировано (PDF) из оригинала на 2020-07-09.
  7. ^ Одерски, Martin (2008). Программирование на Scala . Маунтин-Вью, Калифорния: Артима. п. 3. ISBN 9780981531601. Проверено 12 июня 2014 .
  8. ^ Потвин, Паскаль; Бонха, Марио (24 сентября 2015 г.). IMS DSL, разработанный в Ericsson . Конспект лекций по информатике. 7916 . arXiv : 1509.07326 . DOI : 10.1007 / 978-3-642-38911-5 . ISBN 978-3-642-38910-8. S2CID  1214469 .
  9. ^ «Часто задаваемые вопросы - Java Interoperability» . scala-lang.org . Проверено 6 февраля 2015 .
  10. Friesen, Jeff (16 ноября 2016 г.). "Проверенные исключения хороши или плохи?" . JavaWorld . Проверено 28 августа 2018 .
  11. ^ Loverdo, Christos (2010). Шаги в Scala: введение в объектно-функциональное программирование . Издательство Кембриджского университета . п. xiii. ISBN 9781139490948. Проверено 31 июля 2014 года .
  12. ^ a b c d Мартин Одерски, «Краткая история Scala» , веб-журналы Artima.com, 9 июня 2006 г.
  13. ^ a b c d Одерский, М .; Ромпф, Т. (2014). «Объединение функционального и объектно-ориентированного программирования с помощью Scala» . Коммуникации ACM . 57 (4): 76. DOI : 10,1145 / 2591013 .
  14. ^ Мартин Одерски, "Спецификация языка Scala, версия 2.7"
  15. ^ "Команда Scala выигрывает грант ERC" . Дата обращения 4 июля 2015 .
  16. ^ «Коммерческая поддержка Scala» . 2011-05-12 . Проверено 18 августа 2011 .
  17. ^ «Почему мы инвестировали в Typafe: современные приложения требуют современных инструментов» . 2011-05-12 . Проверено 8 мая 2018 .
  18. ^ «Scala с открытым исходным кодом получает коммерческую поддержку» . 2011-05-12 . Проверено 9 октября 2011 .
  19. ^ «Пионер облачных вычислений Мартин Одерски закрывает глаза на свою новую компанию Typesafe» . 2011-05-12 . Проверено 24 августа 2011 .
  20. ^ «Scala на Android» . Проверено 8 июня +2016 .
  21. ^ "Scala 2.12.8 теперь доступна!" . 2018-12-04 . Проверено 9 декабря 2018 .
  22. ^ "Scala Js больше не экспериментальный | Язык программирования Scala" . Scala-lang.org . Проверено 28 октября 2015 года .
  23. ^ https://github.com/scala-js/scala-js/releases
  24. ^ Криль, Пол (15 марта 2017). «Уменьшенный вариант Scala сокращает связи с JVM» . InfoWorld . Проверено 21 марта 2017 года .
  25. ^ Крилл, Пол (2016-05-11). «Язык Scala приближается к голому металлу» . InfoWorld.
  26. ^ Удален сервер .net. автор: paulp · Запрос на извлечение # 1718 · scala / scala · GitHub . Github.com (05.12.2012). Проверено 2 ноября 2013.
  27. ^ «Начало работы со Scala» . scala-lang.org . 15 июля 2008 . Проверено 31 июля 2014 года .
  28. ^ "Дом" . Blog.lostlake.org. Архивировано из оригинального 31 августа 2010 года . Проверено 25 июня 2013 .
  29. ^ Встроенные управляющие структуры Scala, такие какifилиwhileне могут быть повторно реализованы. Существует исследовательский проект Scala-Virtualized, направленный на снятие этих ограничений: Адриан Мурс, Тиарк Ромпф, Филипп Галлер и Мартин Одерски. Scala-Virtualized . Материалы семинара ACM SIGPLAN 2012 по частичной оценке и манипулированию программами , 117–120. Июль 2012 г.
  30. ^ a b «Прокачай мою библиотеку» . Artima.com. 2006-10-09 . Проверено 25 июня 2013 .
  31. ^ «Изменяемые и неизменяемые коллекции - Документация Scala» . Проверено 30 апреля 2020 .
  32. ^ «Коллекции - Конкретные неизменяемые классы коллекций - Документация Scala» . Дата обращения 4 июля 2015 .
  33. ^ Догерти, Рич. «Блог Рича Догерти» . Дата обращения 4 июля 2015 .
  34. ^ "TailCalls - API стандартной библиотеки Scala (Scaladoc) 2.10.2 - scala.util.control.TailCalls" . Scala-lang.org . Проверено 25 июня 2013 .
  35. ^ a b «Системы типов Java и Scala не верны» (PDF) .
  36. ^ Джарруссо, Паоло Г. (2013). «Повторите запросы вашей коллекции для модульности и скорости!». Материалы 12-й ежегодной международной конференции по Аспектно-ориентированной разработке программного обеспечения . ACM. arXiv : 1210,6284 . Bibcode : 2012arXiv1210.6284G . Также известен как шаблон pimp-my-library
  37. ^ Гилберт, Клинт (2011-11-15). «Что является наивысшим приоритетом для успеха Scala в корпоративном мире (должно ли быть в scala-дискуссиях?)?» . scala-lang.org . Проверено 8 мая 2019 .
  38. ^ "Следует ли нам" обогащать "или" расширять "библиотеки Scala?" . stackexchange.com . 17 июня 2013 . Проверено 15 апреля 2016 года .
  39. ^ Неявные классы были введены в Scala 2.10, чтобы сделать расширения методов более краткими. Это эквивалентно добавлению методаimplicit def IntPredicate(i: Int) = new IntPredicate(i). Класс также можно определить какimplicit class IntPredicates(val i: Int) extends AnyVal { ... }создающий так называемый класс значений , также представленный в Scala 2.10. Затем компилятор исключит фактические экземпляры и вместо этого сгенерирует статические методы, позволяя методам расширения практически не иметь накладных расходов на производительность.
  40. ^ "Реактивная платформа Lightbend" . Lightbend . Проверено 15 июля 2016 .
  41. ^ Что такое Акка? , Онлайн-документация Akka
  42. ^ Связь с объектами Scala , Бернар Суфрин, Архитектуры процессов связи 2008
  43. ^ Ян, Кей. «Скала тур» . Дата обращения 4 июля 2015 .
  44. ^ «Параллельные сборы - Обзор - Документация Scala» . Docs.scala-lang.org . Проверено 25 июня 2013 .
  45. ^ Ян, Кей. «Скала тур» . Дата обращения 4 июля 2015 .
  46. ^ Learning Concurrent Programming in Scala , Александр Прокопец, Packt Publishing
  47. ^ Kops, Миха (2013-01-13). «Краткое введение в ScalaTest» . hascode.com . Проверено 7 ноября 2014 .
  48. ^ Нильссон, Рикард (2008-11-17). "ScalaCheck 1.5" . scala-lang.org . Проверено 7 ноября 2014 .
  49. ^ «Создавайте веб-приложения с использованием Scala и Play Framework» . workwithplay.com . 2013-05-22 . Проверено 7 ноября 2014 .
  50. ^ Мясник, Пол (2012-06-04). «Предварительный выпуск ScalaMock 3.0» . paulbutcher.com . Проверено 7 ноября 2014 .
  51. ^ a b c d e f g "История изменений Scala" . scala-lang.org . Архивировано из оригинала на 2007-10-09.
  52. ^ «Изменения в версии 2.0 (12 марта 2006 г.)» . scala-lang.org . 2006-03-12 . Проверено 7 ноября 2014 .
  53. ^ «Изменения в версии 2.1.8 (23 августа 2006 г.)» . scala-lang.org . 2006-08-23 . Проверено 7 ноября 2014 .
  54. ^ «Изменения в версии 2.3.0 (23 ноября 2006 г.)» . scala-lang.org . 2006-11-23 . Проверено 7 ноября 2014 .
  55. ^ «Изменения в версии 2.4.0 (09 марта 2007 г.)» . scala-lang.org . 2007-03-09 . Проверено 7 ноября 2014 .
  56. ^ "Изменения в версии 2.5 (2 мая 2007 г.)" . scala-lang.org . 2007-05-02 . Проверено 7 ноября 2014 .
  57. ^ «Изменения в версии 2.6 (27 июля 2007 г.)» . scala-lang.org . 2007-06-27 . Проверено 7 ноября 2014 .
  58. ^ «Изменения в версии 2.7.0 (7 февраля 2008 г.)» . scala-lang.org . 2008-02-07 . Проверено 7 ноября 2014 .
  59. ^ «Изменения в версии 2.8.0 (14 июля 2010 г.)» . scala-lang.org . 2010-07-10 . Проверено 7 ноября 2014 .
  60. ^ «Изменения в версии 2.9.0 (12 мая 2011 г.)» . scala-lang.org . 2011-05-12 . Проверено 7 ноября 2014 .
  61. ^ «Изменения в версии 2.10.0» . scala-lang.org . 2013-01-04 . Проверено 7 ноября 2014 .
  62. ^ Харра, Марк. «Ценностные классы и универсальные черты» . scala-lang.org . Проверено 7 ноября 2014 .
  63. ^ Суэрет, Джош. «SIP-13 - Неявные классы» . scala-lang.org . Проверено 7 ноября 2014 .
  64. ^ Суэрет, Джош. «Строчная интерполяция» . scala-lang.org . Проверено 7 ноября 2014 .
  65. ^ Халлер, Филипп; Прокопец, Александр. «Будущее и обещания» . scala-lang.org . Проверено 7 ноября 2014 .
  66. ^ «SIP-17 - Тип Динамический» . scala-lang.org . Проверено 7 ноября 2014 .
  67. ^ «SIP-18 - Модуляризация языковых функций» . scala-lang.org . Проверено 7 ноября 2014 .
  68. ^ Прокопец, Александар; Миллер, Хизер. «Параллельные коллекции» . scala-lang.org . Проверено 7 ноября 2014 .
  69. ^ Миллер, Хизер; Бурмако, Евгений. «Обзор отражения» . scala-lang.org . Проверено 7 ноября 2014 .
  70. ^ Burmako, Евгений. «Макросы деф» . scala-lang.org . Проверено 7 ноября 2014 .
  71. ^ "Scala 2.10.2 уже доступна!" . scala-lang.org . 2013-06-06. Архивировано из оригинала на 2014-11-08 . Проверено 7 ноября 2014 .
  72. ^ "Scala 2.10.3 уже доступна!" . scala-lang.org . 2013-10-01. Архивировано из оригинала на 2014-11-08 . Проверено 7 ноября 2014 .
  73. ^ "Scala 2.10.4 уже доступна!" . scala-lang.org . 2014-03-18 . Проверено 7 января 2015 .
  74. ^ "Scala 2.10.5 уже доступна!" . scala-lang.org . 2015-03-04 . Проверено 23 марта 2015 .
  75. ^ "Scala 2.11.0 теперь доступна!" . scala-lang.org . 2014-04-21 . Проверено 7 ноября 2014 .
  76. ^ "Scala 2.11.1 теперь доступна!" . scala-lang.org . 2014-05-20 . Проверено 7 ноября 2014 .
  77. ^ "Scala 2.11.2 уже доступна!" . scala-lang.org . 2014-07-22 . Проверено 7 ноября 2014 .
  78. ^ "Scala 2.11.4 уже доступна!" . scala-lang.org . 2014-10-30 . Проверено 7 ноября 2014 .
  79. ^ "Scala 2.11.5 уже доступна!" . scala-lang.org . 2015-01-08 . Проверено 22 января 2015 .
  80. ^ "Scala 2.11.6 уже доступна!" . scala-lang.org . 2015-03-05 . Проверено 12 марта 2015 .
  81. ^ "Scala 2.11.7 уже доступна!" . scala-lang.org . 2015-06-23 . Проверено 3 июля 2015 .
  82. ^ "Scala 2.11.8 теперь доступна!" . scala-lang.org . 2016-03-08 . Проверено 9 марта 2016 .
  83. ^ "Три новых релиза и больше добра от GitHub!" . scala-lang.org . 2017-04-18 . Проверено 19 апреля 2017 .
  84. ^ «Обновление безопасности: 2.12.4, 2.11.12, 2.10.7 (CVE-2017-15288)» . scala-lang.org . 2017-11-13 . Проверено 4 мая 2018 .
  85. ^ "Scala 2.12.0 теперь доступна!" . scala-lang.org . 2016-11-03 . Проверено 8 января 2017 .
  86. ^ "Scala 2.12.1 уже доступна!" . scala-lang.org . 2016-12-05 . Проверено 8 января 2017 .
  87. ^ "Три новых релиза и больше добра от GitHub!" . scala-lang.org . 2017-04-18 . Проверено 19 апреля 2017 .
  88. ^ "ТЕПЕРЬ ДОСТУПНА SCALA 2.12.3!" . scala-lang.org . 2017-07-26 . Проверено 16 августа 2017 .
  89. ^ "СЕЙЧАС ДОСТУПЕН SCALA 2.12.4!" . scala-lang.org . 2017-10-18 . Проверено 26 октября 2017 .
  90. ^ "ТЕПЕРЬ ДОСТУПЕН SCALA 2.12.5!" . scala-lang.org . 2018-03-15 . Проверено 20 марта 2018 .
  91. ^ "Scala 2.12.6 уже доступна!" . scala-lang.org . 2018-04-27 . Проверено 4 мая 2018 .
  92. ^ "Scala 2.12.7 уже доступна!" . scala-lang.org . 2018-09-27 . Проверено 9 октября 2018 .
  93. ^ "Scala 2.12.8 теперь доступна!" . scala-lang.org . 2018-12-04 . Проверено 9 декабря 2018 .
  94. ^ "Scala 2.12.9 уже доступна!" . scala-lang.org . 2019-08-05 . Источник 2021-01-20 .
  95. ^ "Scala 2.12.10 уже доступна!" . scala-lang.org . 2019-09-10 . Источник 2021-01-20 .
  96. ^ "Scala 2.12.11 уже доступна!" . scala-lang.org . 2020-03-16 . Источник 2021-01-20 .
  97. ^ "Scala 2.12.12 уже доступна!" . scala-lang.org . 2020-07-13 . Источник 2021-01-20 .
  98. ^ "Scala 2.12.13 уже доступна!" . scala-lang.org . 2021-01-12 . Источник 2021-01-20 .
  99. ^ "Scala 2.13.0 теперь доступна!" . scala-lang.org . 2019-06-11 . Проверено 17 июня 2018 .
  100. ^ "Scala 2.13.1 теперь доступна!" . scala-lang.org . 2019-09-18 . Источник 2021-01-20 .
  101. ^ "Scala 2.13.2 теперь доступна!" . scala-lang.org . 2020-04-22 . Источник 2021-01-20 .
  102. ^ "Scala 2.13.3 теперь доступна!" . scala-lang.org . 2020-06-25 . Источник 2021-01-20 .
  103. ^ "Scala 2.13.4 теперь доступна!" . scala-lang.org . 2020-11-19 . Источник 2021-01-20 .
  104. ^ a b c «Рейтинг языков программирования RedMonk: январь 2018 г.» .
  105. ^ a b «Индекс TIOBE за апрель 2018 года» .
  106. ^ "Индекс популярности языка программирования" .
  107. ^ "Часто задаваемые вопросы о радарах технологии ThoughtWorks" .
  108. ^ "Технологический радар ThoughtWorks МАЙ 2013" (PDF) .
  109. ^ «Рейтинг языков программирования RedMonk: январь 2018» .
  110. ^ «Состояние Java в 2018 году» .
  111. ^ Грин, Кейт (1 апреля 2009 г.). «Секрет роста Twitter. Как новый язык веб-программирования помогает компании справляться с растущей популярностью» . Обзор технологий . Массачусетский технологический институт . Проверено 6 апреля 2009 года .
  112. ^ «Play Framework, Akka и Scala в Gilt Groupe» . Lightbend. 15 июля 2013 . Проверено 16 июля 2016 .
  113. ^ «Скала, Лифт и будущее» . Архивировано из оригинального 13 января 2016 года . Дата обращения 4 июля 2015 .
  114. ^ «Почему мы любим Scala на Coursera» . Coursera Engineering . Дата обращения 4 июля 2015 .
  115. ^ «Технический директор Apple Джаррод Неттлз в Twitter» . Джаррод Крапива . Проверено 11 марта 2016 .
  116. ^ «30 вакансий Scala в Apple» . Элвин Александр . Проверено 11 марта 2016 .
  117. Дэвид Рид и Таня Тейшейра (26 февраля 2010 г.). «Готовы ли люди платить за новости в Интернете?» . BBC . Проверено 28 февраля 2010 .
  118. ^ «Guardian, переходящий с Java на Scala» . Heise Online . 2011-04-05 . Проверено 5 апреля 2011 .
  119. ^ «Guardian.co.uk Переход с Java на Scala» . InfoQ.com. 2011-04-04 . Проверено 5 апреля 2011 .
  120. ^ Рой, Суман & Sundaresan, Кришна (2014-05-13). «Создание Blackbeard: система синдикации на базе Play, Scala и Akka» . Проверено 20 июля 2014 .
  121. ^ Павли, Джон (2013-08-11). "Sneak Peek: HuffPost обеспечивает сотрудничество в режиме реального времени в отделе новостей" . Проверено 20 июля 2014 .
  122. ^ Бинсток, Andrew (2011-07-14). «Интервью с Мартином Одерским из Scala» . Журнал доктора Добба . Проверено 10 февраля 2012 .
  123. ^ Synodinos, Дионисий Г. (2010-10-11). «LinkedIn Signal: пример использования Scala, JRuby и Voldemort» . InfoQ .
  124. ^ «Встречи в реальной жизни заслуживают API в реальном времени» .
  125. ^ «Обновление в реальном времени поступает в веб-приложение Remember The Milk» .
  126. ^ "Старший инженер Scala" . Проверено 18 августа 2014 .
  127. ^ NOVET, Иордания (2015-06-04). «Airbnb анонсирует Aerosolve, программный пакет машинного обучения с открытым исходным кодом» . Проверено 9 марта 2016 .
  128. ^ Копс, Александр (2015-12-14). «Zalando Tech: от Java до Scala менее чем за три месяца» . Проверено 9 марта 2016 .
  129. ^ Calçado, Фил (2014-06-13). «Создание продуктов в SoundCloud - Часть III: Микросервисы в Scala и Finagle» . Проверено 9 марта 2016 .
  130. ^ Concurrent Inc. (2014-11-18). «Примеры использования клиентов: SoundCloud» . Проверено 9 марта 2016 .
  131. ^ Навыки имеют значение (2015-12-03). «Scala в Morgan Stanley (видео)» . Проверено 11 марта 2016 .
  132. ^ Грег Солтис. «SF Scala, Грег Солтис: высокопроизводительные услуги в Scala (видео)» . Проверено 11 марта 2016 .
  133. ^ Ли Мигдолл. «Работа Scala в Nest» . Проверено 11 марта 2016 .
  134. ^ Nurun. «Нурун запускает переработанную транзакционную платформу с Walmart Canada» . Проверено 11 декабря 2013 .
  135. ^ Андре К. Хори (2017-01-31). «Переписывание движка Duolingo на Scala» . Проверено 3 февраля 2017 .
  136. ^ "Репозиторий HMRC GitHub" .
  137. ^ Krikorian, Раффи (17 марта 2015). Конференция по архитектуре программного обеспечения O'Reilly 2015, Полный сборник видео: перестройка архитектуры на лету - Раффи Крикориан - Часть 3 (видео). O'Reilly Media. Событие происходит в 4:57 . Проверено 8 марта 2016 . Четыре года назад я бы сделал иначе, так это использовал бы Java, а не Scala как часть этого переписывания. [...] инженеру потребуется два месяца, прежде чем он станет полностью продуктивным и напишет код Scala.
  138. Скотт, Кевин (11 марта 2015 г.). «Избавится ли LinkedIn от Scala?» . quora.com . Проверено 25 января +2016 .
  139. Хейл, Кода (29 ноября 2011 г.). «Остальная часть рассказа» . codahale.com . Проверено 7 ноября 2013 года .
  140. ^ "Chisel: Создание оборудования на встроенном языке Scala | ASPIRE" . Калифорнийский университет в Беркли APSIRE . Дата обращения 27 мая 2020 .

Дальнейшее чтение [ править ]

  • Одерский, Мартин; Ложка, Лекс; Веннерс, Билл (15 декабря 2019 г.). Программирование на Scala: подробное пошаговое руководство (4-е изд.). Artima Inc . п. 896. ISBN 978-0-9815316-1-8.
  • Хорстманн, Кей (15 декабря 2016 г.). Scala для нетерпеливых (2-е изд.). Эддисон-Уэсли Профессионал . п. 384. ISBN 978-0-134-54056-6.
  • Wampler, декан; Пэйн, Алекс (14 декабря 2014 г.). Scala программирования: масштабируемость = функциональное программирование + объекты (2-е изд.). O'Reilly Media . п. 583. ISBN. 978-1-491-94985-6.
  • Суэрет, Джошуа Д. (весна 2011 г.). Scala в глубине . Публикации Мэннинга . п. 225 . ISBN 978-1-935182-70-2.
  • Мередит, Грегори (2011). Монадические шаблоны дизайна для Интернета (PDF) (1-е изд.). п. 300.
  • Одерский, Мартин; Ложка, Лекс; Веннерс, Билл (10 декабря 2008 г.). Программирование на Scala, первое издание, электронная книга (1-е изд.). Artima Inc .