Скала (язык программирования)
Парадигма | Мультипарадигмальность : параллельная , функциональная , императивная , объектно-ориентированная. |
---|---|
Разработано | Мартин Одерски |
Разработчик | Лаборатория методов программирования Федеральной политехнической школы Лозанны |
Впервые появился | 20 января 2004 г |
Стабильная версия | 3.4.0 [ 1 ]
/ 29 февраля 2024 г |
Дисциплина набора текста | Предполагаемый , статический , сильный , структурный. |
Язык реализации | Скала |
Платформа | Виртуальная машина Java (JVM) JavaScript ( Scala.js ) LLVM ( Scala Native ) (экспериментальный) |
Лицензия | Апач 2.0 [ 2 ] |
Расширения имен файлов | .скала, .sc |
Веб-сайт | www |
Под влиянием | |
Общий Лисп , [ 3 ] Эйфель , Эрланг , F# , Хаскелл , [ 4 ] Ява , [ 5 ] ОКамл , [ 5 ] Оз , Пицца , [ 6 ] Схема , [ 5 ] Smalltalk , стандартный ML [ 5 ] | |
Под влиянием | |
Ceylon , Chisel , Fantom , F# , C# , Kotlin , Lasso , Red , Flix | |
|
Скала ( / ˈ s k ɑː l ɑː / SKAH -lah ) [ 7 ] [ 8 ] — сильный статически типизированный высокого уровня язык программирования общего назначения , поддерживающий как объектно-ориентированное, так и функциональное программирование . Разработанный, чтобы быть кратким, [ 9 ] многие дизайнерские решения Scala направлены на устранение критики в адрес Java . [ 6 ]
Исходный код Scala можно скомпилировать в байт-код Java и запустить на виртуальной машине Java (JVM). Scala также можно транспилировать в JavaScript для запуска в браузере или скомпилировать непосредственно в собственный исполняемый файл. При работе на JVM Scala обеспечивает совместимость языков с Java , так что на библиотеки, написанные на любом языке, можно напрямую ссылаться в коде Scala или Java. [ 10 ] Как и Java, Scala является объектно-ориентированным и использует синтаксис, называемый фигурными скобками который похож на язык C. , также существует возможность использовать правило off-side (отступы) Начиная с Scala 3, для структурирования блоков , и его использование рекомендуется. Мартин Одерски сказал, что это оказалось самым продуктивным изменением, представленным в Scala 3. [ 11 ]
В отличие от Java, Scala имеет множество функций программирования функциональных языков (таких как Scheme , Standard ML и Haskell ), включая каррирование , неизменяемость , отложенное вычисление и сопоставление с образцом . Он также имеет расширенную систему типов, поддерживающую алгебраические типы данных , ковариацию и контравариантность , типы более высокого порядка (но не типы более высокого ранга ), анонимные типы , перегрузку операторов , необязательные параметры , именованные параметры , необработанные строки и экспериментальную версию только для исключений. версия алгебраических эффектов, которую можно рассматривать как более мощную версию проверяемых исключений Java . [ 12 ]
Название Scala представляет собой сочетание слов «масштабируемость» и «язык» , что означает, что оно предназначено для роста вместе с требованиями своих пользователей. [ 13 ]
История
[ редактировать ]Разработка Scala началась в 2001 году в Федеральной политехнической школе Лозанны (EPFL) (в Лозанне , Швейцария ) Мартином Одерски . Он стал продолжением работы над Funnel, языком программирования, сочетающим в себе идеи функционального программирования и сетей Петри . [ 14 ] Одерский ранее работал над Generic Java и javac , компилятором Java компании Sun. [ 14 ]
После внутреннего выпуска в конце 2003 года Scala была выпущена публично в начале 2004 года на платформе Java . [ 15 ] [ 6 ] [ 14 ] [ 16 ] Вторая версия (v2.0) появилась в марте 2006 года. [ 6 ]
17 января 2011 года команда Scala выиграла пятилетний исследовательский грант в размере более 2,3 миллиона евро от Европейского исследовательского совета . [ 17 ] 12 мая 2011 года Одерский и его коллеги запустили Typesafe Inc. (позже переименованную в Lightbend Inc. ), компанию, предоставляющую коммерческую поддержку, обучение и услуги для Scala. В 2011 году Typesafe получила инвестиции в размере 3 миллионов долларов от Greylock Partners . [ 18 ] [ 19 ] [ 20 ] [ 21 ]
По состоянию на июнь 2024 г. [update]Разработчики Scala планируют выпустить версию 3.6 к концу 2024 года. Они концентрируются на улучшении ряда функций, таких как сокращение времени сборки, достижение более тесной интеграции с инструментами, улучшение пользовательского опыта (UX), улучшение отчетности и совершенствование стабильность и точность компилятора. [ 22 ]
Платформы и лицензия
[ редактировать ]Scala работает на платформе Java ( виртуальная машина Java ) и совместима с существующими программами Java . [ 15 ] Поскольку приложения Android обычно пишутся на Java и при упаковке преобразуются из байт-кода Java в байт-код Dalvik (который может быть дополнительно преобразован в собственный машинный код во время установки), совместимость Scala с Java делает его хорошо подходящим для разработки под Android, тем более, когда функциональный подход является предпочтительным. [ 23 ]
Эталонный дистрибутив программного обеспечения Scala, включая компилятор и библиотеки, выпускается под лицензией Apache . [ 24 ]
Другие компиляторы и цели
[ редактировать ]Scala.js — это компилятор Scala, который компилируется в JavaScript, что позволяет писать программы Scala, которые могут работать в веб-браузерах Node.js. или [ 25 ] Компилятор, находящийся в разработке с 2013 года, был объявлен неэкспериментальным в 2015 году (версия 0.6). Версия v1.0.0-M1 была выпущена в июне 2018 года, а версия 1.1.1 — в сентябре 2020 года. [ 26 ]
Scala Scala Native — это компилятор , предназначенный для инфраструктуры компилятора LLVM для создания исполняемого кода, использующего облегченную управляемую среду выполнения, использующую сборщик мусора Boehm . Проект возглавляет Денис Шабалин, и его первый выпуск, 0.1, вышел 14 марта 2017 года. Разработка Scala Native началась в 2015 году с целью сделать быстрее, чем компиляция «точно в срок» компиляцию JVM , исключив начальную компиляцию во время выполнения. код, а также предоставляет возможность напрямую вызывать собственные процедуры. [ 27 ] [ 28 ]
Эталонный компилятор Scala, ориентированный на .NET Framework и его среду Common Language Runtime, был выпущен в июне 2004 года. [ 14 ] но официально от него отказались в 2012 году. [ 29 ]
Примеры
[ редактировать ]Пример «Привет, мир»
[ редактировать ]Программа Hello World, написанная на Scala 3, имеет следующую форму:
@main def main() = println("Hello, World!")
В отличие от автономного приложения Hello World для Java , здесь нет объявления класса и ничего не объявлено как статическое.
Когда программа сохраняется в файле HelloWorld.scala , пользователь компилирует ее командой:
$ scalac HelloWorld.scala
и запускает его с
$ scala HelloWorld
Это аналогично процессу компиляции и запуска кода Java. Действительно, модель компиляции и выполнения Scala идентична модели Java, что делает ее совместимой с инструментами сборки Java, такими как Apache Ant .
Укороченная версия программы «Hello World» на Scala:
println("Hello, World!")
Scala включает интерактивную оболочку и поддержку сценариев. [ 30 ] Сохранено в файле с именем HelloWorld2.scala
, это можно запустить как скрипт с помощью команды:
$ scala HelloWorld2.scala
Команды также можно вводить непосредственно в интерпретатор Scala, используя опцию -е :
$ scala -e 'println("Hello, World!")'
Выражения можно вводить в REPL интерактивно :
$ scala
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions for evaluation. Or try :help.
scala> List(1, 2, 3).map(x => x * x)
res0: List[Int] = List(1, 4, 9)
scala>
Базовый пример
[ редактировать ]В следующем примере показаны различия между синтаксисом Java и Scala. Функция mathFunction принимает целое число, возводит его в квадрат, а затем добавляет кубический корень этого числа к натуральному логарифму этого числа, возвращая результат (т. е. ):
// Java:
int mathFunction(int num) {
int numSquare = num*num;
return (int) (Math.cbrt(numSquare) +
Math.log(numSquare));
}
| |
// Scala: Direct conversion from Java
// no import needed; scala.math
// already imported as `math`
def mathFunction(num: Int): Int =
var numSquare: Int = num*num
return (math.cbrt(numSquare) + math.log(numSquare)).
asInstanceOf[Int]
|
// Scala: More idiomatic
// Uses type inference, omits `return` statement,
// uses `toInt` method, declares numSquare immutable
import math._
def mathFunction(num: Int) =
val numSquare = num*num
(cbrt(numSquare) + log(numSquare)).toInt
|
Некоторые синтаксические различия в этом коде:
- Scala не требует точки с запятой (;) для завершения операторов.
- Типы значений пишутся с заглавной буквы (регистр предложений):
Int, Double, Boolean
вместоint, double, boolean
. - Типы параметров и возвращаемых значений следуют, как в Pascal , а не предшествуют, как C. в
- Методам должно предшествовать
def
. - Локальным переменным или переменным класса должно предшествовать
val
(указывает неизменяемую переменную) илиvar
(указывает на изменяемую переменную). - The
return
оператор в функции не нужен (хотя и разрешен); значением последнего выполненного оператора или выражения обычно является значение функции. - Вместо оператора приведения Java
(Type) foo
, Scala использует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]
а не JavaList<String>
. - Вместо псевдотипа
void
, в Scala есть настоящий одноэлементный классUnit
(см. ниже).
Пример с классами
[ редактировать ]В следующем примере сравниваются определения классов в Java и Scala.
// Java:
public class Point {
private double x, y;
public Point(final double x, final double y) {
this.x = x;
this.y = y;
}
public Point(
double x, double y,
boolean addToGrid
) {
this(x, y);
if (addToGrid)
grid.addPoint(this);
}
public Point() {
this(0.0, 0.0);
}
private void addPoint(Point p) {
x += p.x;
y += p.y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
double distanceToPoint(final Point other) {
return distanceBetweenPoints(x, y,
other.x, other.y);
}
private static Point grid = new Point();
static double distanceBetweenPoints(
final double x1, final double y1,
final double x2, final double y2
) {
return Math.hypot(x1 - x2, y1 - y2);
}
}
|
// Scala
class Point(
var x: Double, var y: Double,
addToGrid: Boolean = false
):
import Point._
def += (p: Point) =
x += p.x
y += p.y
if (addToGrid)
grid += this
def this() = this(0.0, 0.0)
def distanceToPoint(other: Point) =
distanceBetweenPoints(x, y, other.x, other.y)
end Point
object Point:
private val grid = new Point()
def distanceBetweenPoints(x1: Double, y1: Double,
x2: Double, y2: Double) =
math.hypot(x1 - x2, y1 - y2)
|
В приведенном выше коде показаны некоторые концептуальные различия между обработкой классов в Java и Scala:
- В Scala нет статических переменных или методов. Вместо этого у него есть одноэлементные объекты , которые по сути являются классами только с одним экземпляром. Одиночные объекты объявляются с использованием
object
вместоclass
. Обычно статические переменные и методы размещаются в одноэлементном объекте с тем же именем, что и имя класса, который затем называется сопутствующим объектом . [ 15 ] (Базовый класс для одноэлементного объекта имеет$
добавлено. Следовательно, дляclass Foo
с сопутствующим объектомobject Foo
, под капотом классFoo$
содержащий код сопутствующего объекта, и создается один объект этого класса с использованием шаблона Singleton .) - Вместо параметров конструктора в Scala есть параметры класса , которые размещаются в классе, подобно параметрам функции. При объявлении с помощью
val
илиvar
модификатор, поля также определяются с тем же именем и автоматически инициализируются из параметров класса. (Под капотом внешний доступ к общедоступным полям всегда осуществляется через методы доступа (getter) и мутатора (setter), которые создаются автоматически. Функция доступа имеет то же имя, что и поле, поэтому в приведенном выше примере нет необходимости явно объявляйте методы доступа.) Обратите внимание, что альтернативные конструкторы также могут быть объявлены, как в Java. Код, который будет входить в конструктор по умолчанию (кроме инициализации переменных-членов), выполняется непосредственно на уровне класса. - В Scala можно определять операторы, используя символы в качестве имен методов. Вместо
addPoint
, пример Scala определяет+=
, который затем вызывается с инфиксной записью какgrid += this
. - Видимость по умолчанию в Scala:
public
.
Возможности (применительно к Java)
[ редактировать ]Scala имеет ту же модель компиляции, что и Java и C# , а именно раздельную компиляцию и динамическую загрузку классов , так что код Scala может вызывать библиотеки Java.
Рабочие характеристики Scala такие же, как у Java. Компилятор Scala генерирует байт-код, который почти идентичен тому, который генерирует компилятор Java. [ 15 ] Фактически, код Scala можно декомпилировать в читаемый код Java, за исключением некоторых операций конструктора. Для виртуальной машины Java (JVM) код Scala и код Java неотличимы. Единственное отличие — одна дополнительная библиотека времени выполнения. scala-library.jar
. [ 31 ]
Scala добавляет большое количество функций по сравнению с Java и имеет некоторые фундаментальные различия в базовой модели выражений и типов, которые делают язык теоретически более чистым и устраняют несколько крайних случаев в Java. С точки зрения Scala это практически важно, поскольку некоторые дополнительные функции Scala доступны и в C#.
Синтаксическая гибкость
[ редактировать ]Как упоминалось выше, Scala обладает большей синтаксической гибкостью по сравнению с Java. Ниже приведены некоторые примеры:
- Точки с запятой не нужны; строки автоматически соединяются, если они начинаются или заканчиваются токеном, который обычно не может находиться в этой позиции, или если есть незакрытые скобки или скобки.
- можно использовать любой метод В качестве инфиксного оператора , например
"%d apples".format(num)
и"%d apples" format num
эквивалентны. Фактически, арифметические операторы, такие как+
и<<
обрабатываются так же, как и любые другие методы, поскольку имена функций могут состоять из последовательностей произвольных символов (за некоторыми исключениями, сделанными для таких вещей, как круглые скобки и фигурные скобки, которые должны обрабатываться особым образом); единственная специальная обработка, которой подвергаются такие методы с символьными именами, касается обработки приоритета. - Методы
apply
иupdate
имеют синтаксические краткие формы.foo()
-гдеfoo
— это значение (одиночный объект или экземпляр класса) — сокращение отfoo.apply()
, иfoo() = 42
это сокращение отfoo.update(42)
. Сходным образом,foo(42)
это сокращение отfoo.apply(42)
, иfoo(4) = 2
это сокращение отfoo.update(4, 2)
. Это используется для классов коллекций и распространяется на многие другие случаи, например, на ячейки STM . - Шкала различает отсутствие родителей (
def foo = 42
) и пустые скобки (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
. - При вызове методов допускается использование фигурных скобок вместо круглых. Это позволяет реализовать чисто библиотечные реализации новых структур управления. [ 32 ] Например,
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 между примитивными типами и коробочными типами (например, int
против. Integer
) нет в Scala; упаковка и распаковка полностью прозрачны для пользователя. Scala 2.10 позволяет пользователю определять новые типы значений.
For-выражения
[ редактировать ]Вместо Java- циклов foreach для обхода итератора в Scala есть for
-выражения, которые похожи на генераторы списков в таких языках, как Haskell, или на комбинацию генераторов списков и выражений в Python . Для-выражений с использованием yield
Ключевое слово позволяет создать новую коллекцию путем итерации по существующей, возвращая новую коллекцию того же типа. Они переводятся компилятором в серию map
, flatMap
и filter
звонки. Где yield
не используется, код приближается к циклу императивного типа путем перевода в foreach
.
Простой пример:
val s = for (x <- 1 to 25 if x*x > 50) yield 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 как метод расширения целых чисел с использованием метода, известного как неявные преобразования. [ 33 ] что позволяет добавлять новые методы к существующим типам.)
Более сложный пример перебора карты:
// Given a map specifying Twitter users mentioned in a set of tweets,
// and number of times each user was mentioned, look up the users
// in a map of known politicians, and return a new map giving only the
// Democratic politicians (as objects, rather than strings).
val dem_mentions = for
(mention, times) <- mentions
account <- accounts.get(mention)
if account.party == "Democratic"
yield (account, times)
Выражение (mention, times) <- mentions
является примером сопоставления с образцом (см. ниже). Итерация по карте возвращает набор кортежей ключ-значение , а сопоставление с образцом позволяет легко деструктурировать кортежи на отдельные переменные для ключа и значения. Аналогичным образом, результат понимания также возвращает кортежи ключ-значение, которые автоматически встраиваются в карту, поскольку исходный объект (из переменной mentions
) — это карта. Обратите внимание, что если mentions
вместо того, чтобы содержать список, набор, массив или другую коллекцию кортежей, точно такой же код, указанный выше, приведет к созданию новой коллекции того же типа.
Функциональные тенденции
[ редактировать ]Поддерживая все объектно-ориентированные функции, доступные в Java (и фактически дополняя их различными способами), Scala также предоставляет большое количество возможностей, которые обычно встречаются только в функциональных языках программирования. В совокупности эти функции позволяют писать программы Scala почти полностью в функциональном стиле, а также позволяют смешивать функциональные и объектно-ориентированные стили.
Примеры:
- Нет различия между утверждениями и выражениями
- Вывод типа
- Анонимные функции с захватом семантики (т. е. замыканиями ).
- Неизменяемые переменные и объекты
- Ленивая оценка
- Продолжения с разделителями (начиная с версии 2.8)
- Функции высшего порядка
- Вложенные функции
- каррирование
- Сопоставление с образцом
- Алгебраические типы данных (через регистровые классы )
- Кортежи
Все есть выражение
[ редактировать ]В отличие от C или Java , но подобно таким языкам, как Lisp , Scala не делает различий между операторами и выражениями . Все операторы на самом деле являются выражениями, которые возвращают некоторое значение. Функции, которые будут объявлены как возвращающие void
в C или Java, а также такие операторы, как while
которые логически не возвращают значение, в Scala считаются возвращающими тип Unit
, который является одноэлементным типом и содержит только один объект этого типа. Функции и операторы, которые вообще никогда не возвращаются (например, throw
оператор или функция, которая всегда завершается нелокально с использованием исключения) логически имеют возвращаемый тип Nothing
, специальный тип, не содержащий объектов; то есть нижний тип , то есть подкласс всех возможных типов. (Это, в свою очередь, делает тип Nothing
совместим со всеми типами, что позволяет вывод типа .) правильно выполнять [ 34 ]
Аналогично, if-then-else
«оператор» на самом деле является выражением, которое выдает значение, то есть результат вычисления одной из двух ветвей. Это означает, что такой блок кода можно вставить туда, где требуется выражение, что устраняет необходимость в тернарном операторе в Scala:
// Java:
char hexDigit = (char)(x >= 10 ? x + 'A' - 10 : x + '0');
|
// Scala:
val hexDigit = (if x >= 10 then x + 'A' - 10 else x + '0').toChar
|
По тем же причинам, return
операторы не нужны в Scala и фактически не рекомендуются. Как и в Lisp , последнее выражение в блоке кода является значением этого блока кода, и если блок кода является телом функции, он будет возвращен функцией.
Чтобы было понятно, что все функции являются выражениями, даже методы, возвращающие Unit
пишутся со знаком равенства
def printValue(x: String): Unit =
println("I ate a %s".format(x))
или эквивалентно (с выводом типа и опусканием ненужной новой строки):
def printValue(x: String) = println("I ate a %s" format x)
Вывод типа
[ редактировать ]Из-за вывода типа тип переменных, возвращаемые значения функции и многие другие выражения обычно могут быть опущены, поскольку компилятор может их определить. Примеры: val x = "foo"
(для неизменяемой константы или неизменяемого объекта ) или var x = 1.5
(для переменной, значение которой впоследствии можно изменить). Вывод типа в Scala по существу является локальным, в отличие от более глобального алгоритма Хиндли-Милнера , используемого в Haskell , ML и других более чисто функциональных языках. Это сделано для облегчения объектно-ориентированного программирования. В результате некоторые типы по-прежнему необходимо объявлять (в первую очередь, параметры функций и типы возвращаемых рекурсивных функций ), например
def formatApples(x: Int) = "I ate %d apples".format(x)
или (с типом возвращаемого значения, объявленным для рекурсивной функции)
def factorial(x: Int): Int =
if x == 0 then 1
else x * factorial(x - 1)
Анонимные функции
[ редактировать ] существует удобный синтаксис В Scala функции являются объектами, и для указания анонимных функций . Примером может служить выражение x => x < 2
, который определяет функцию с одним параметром, которая сравнивает свой аргумент, чтобы убедиться, что он меньше 2. Это эквивалентно форме Lisp (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
s лишь поверхностно неизменяемы, то есть объект, на который ссылается val, не гарантирует, что он сам по себе будет неизменяемым.
Однако неизменяемые классы поощряются по соглашению, и стандартная библиотека Scala предоставляет богатый набор неизменяемых классов- коллекций . Scala предоставляет изменяемые и неизменяемые варианты большинства классов коллекций, и неизменяемая версия используется всегда, если изменяемая версия не импортируется явно. [ 35 ] Неизменяемые варианты — это постоянные структуры данных , которые всегда возвращают обновленную копию старого объекта вместо разрушительного обновления старого объекта на месте. Примером этого являются неизменяемые связанные списки , в которых добавление элемента в список осуществляется путем возврата нового узла списка, состоящего из элемента и ссылки на хвост списка. Добавление элемента в список можно выполнить только путем добавления всех элементов старого списка в новый список, содержащий только новый элемент. Точно так же вставка элемента в середину списка скопирует первую половину списка, но сохранит ссылку на вторую половину списка. Это называется структурным разделением. Это обеспечивает очень простой параллелизм — никаких блокировок не требуется, поскольку общие объекты никогда не изменяются. [ 36 ]
Ленивая (нестрогая) оценка
[ редактировать ]По умолчанию оценка строгая («нетерпеливая»). Другими словами, Scala оценивает выражения, как только они становятся доступными, а не по мере необходимости. Однако можно объявить переменную нестрогой («ленивой») с помощью lazy
Ключевое слово, означающее, что код для создания значения переменной не будет оцениваться до тех пор, пока на переменную не будет сделана первая ссылка. Также существуют нестрогие коллекции различных типов (например, типа Stream
, нестрогий связанный список), и любую коллекцию можно сделать нестрогой с помощью view
метод. Нестрогие коллекции обеспечивают хорошее семантическое соответствие таким вещам, как данные, создаваемые сервером, где оценка кода для создания последующих элементов списка (что, в свою очередь, запускает запрос на сервер, возможно, расположенный где-то еще в Интернете) только происходит, когда элементы действительно необходимы.
Хвостовая рекурсия
[ редактировать ]Языки функционального программирования обычно обеспечивают оптимизацию хвостовых вызовов , позволяющую широко использовать рекурсию без проблем переполнения стека . Ограничения в байт-коде Java усложняют оптимизацию хвостовых вызовов в JVM. В общем, функция, вызывающая сама себя хвостовым вызовом, может быть оптимизирована, а взаимно рекурсивные функции — нет. батуты . В качестве обходного пути были предложены [ 37 ] Поддержка батута реализована библиотекой Scala с объектом scala.util.control.TailCalls
начиная с Scala 2.8.0 (выпущенной 14 июля 2010 г.). Функция может быть дополнительно аннотирована с помощью @tailrec
, и в этом случае он не будет скомпилирован, если он не является хвостовой рекурсией. [ 38 ]
Пример этой оптимизации может быть реализован с использованием определения факториала . Например, рекурсивная версия факториала:
def factorial(n: Int): Int =
if n == 0 then 1
else n * factorial(n - 1)
Можно оптимизировать для хвостовой рекурсивной версии следующим образом:
@tailrec
def factorial(n: Int, accum: Int): Int =
if n == 0 then accum
else factorial(n - 1, n * accum)
обычно используются замыкания : Однако это может поставить под угрозу компонуемость с другими функциями из-за нового аргумента в ее определении, поэтому для сохранения исходной подписи
def factorial(n: Int): Int =
@tailrec
def loop(current: Int, accum: Int): Int =
if n == 0 then accum
else loop(current - 1, n * accum)
loop(n, 1) // Call to the closure using the base case
end factorial
Это обеспечивает оптимизацию хвостового вызова и, таким образом, предотвращает ошибку переполнения стека.
Классы случаев и сопоставление с образцом
[ редактировать ]Scala имеет встроенную поддержку сопоставления с образцом , которую можно рассматривать как более сложную, расширяемую версию оператора переключения , в которой могут сопоставляться произвольные типы данных (а не просто простые типы, такие как целые числа, логические значения и строки), включая произвольные типы. гнездование. специальный тип класса, известный как класс Case Предоставляется , который включает автоматическую поддержку сопоставления с образцом и может использоваться для моделирования алгебраических типов данных, используемых во многих языках функционального программирования. (С точки зрения Scala, кейс-класс — это просто обычный класс, для которого компилятор автоматически добавляет определенные варианты поведения, которые также можно обеспечить вручную, например, определения методов, обеспечивающих глубокие сравнения и хеширование, а также деструктуризацию кейс-класса в его конструкторе. параметры во время сопоставления с образцом.)
Пример определения алгоритма быстрой сортировки с использованием сопоставления с образцом:
def qsort(list: List[Int]): List[Int] = list match
case Nil => Nil
case pivot :: tail =>
val (smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)
Идея здесь состоит в том, что мы разделяем список на элементы меньше опорной точки и элементы не меньше, рекурсивно сортируем каждую часть и вставляем результаты вместе с опорной точкой между ними. При этом используется та же «разделяй и властвуй», стратегия что и в сортировке слиянием и других алгоритмах быстрой сортировки.
The 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
выражения, причем преобладает первое соответствующее выражение, аналогично телу оператора переключения . Частичные функции также используются в части обработки исключений. try
заявление:
try
...
catch
case nfe: NumberFormatException => { println(nfe); List(0) }
case _ => Nil
Наконец, частичную функцию можно использовать отдельно, и результат ее вызова эквивалентен выполнению match
над ним. Например, предыдущий код быстрой сортировки можно записать так:
val qsort: List[Int] => List[Int] =
case Nil => Nil
case pivot :: tail =>
val (smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)
Здесь объявляется доступная только для чтения переменная , тип которой является функцией от списков целых чисел к спискам целых чисел, и привязывается к частичной функции. (Обратите внимание, что единственный параметр частичной функции никогда не объявляется и не именуется явно.) Однако мы все равно можем вызывать эту переменную точно так же, как если бы это была обычная функция:
scala> qsort(List(6,2,5,9))
res32: List[Int] = List(2, 5, 6, 9)
Объектно-ориентированные расширения
[ редактировать ]Scala — чистый объектно-ориентированный язык в том смысле, что каждое значение является объектом . Типы данных и поведение объектов описываются классами и признаками . Абстракции классов расширяются за счет создания подклассов и гибкого механизма композиции на основе миксинов , позволяющего избежать проблем множественного наследования .
Java в Scala Traits — это замена интерфейсов . Интерфейсы в версиях Java до 8 сильно ограничены и могут содержать только объявления абстрактных функций. Это привело к критике за то, что предоставление удобных методов в интерфейсах неудобно (одни и те же методы должны быть переопределены в каждой реализации), а расширение опубликованного интерфейса обратно совместимым способом невозможно. Трейты похожи на классы- миксины в том, что они обладают почти всеми возможностями обычного абстрактного класса, у них отсутствуют только параметры класса (эквивалент параметров конструктора в Scala), поскольку трейты всегда смешиваются с классом. super
Оператор ведет себя особым образом в типажах, позволяя объединять признаки с помощью композиции в дополнение к наследованию. Следующий пример представляет собой простую оконную систему:
abstract class Window:
// abstract
def draw()
class SimpleWindow extends Window:
def draw()
println("in SimpleWindow")
// draw a basic window
trait WindowDecoration extends Window
trait HorizontalScrollbarDecoration extends WindowDecoration:
// "abstract override" is needed here for "super()" to work because the parent
// function is abstract. If it were concrete, regular "override" would be enough.
abstract override def draw()
println("in HorizontalScrollbarDecoration")
super.draw()
// now draw a horizontal scrollbar
trait VerticalScrollbarDecoration extends WindowDecoration:
abstract override def draw()
println("in VerticalScrollbarDecoration")
super.draw()
// now draw a vertical scrollbar
trait TitleDecoration extends WindowDecoration:
abstract override def draw()
println("in TitleDecoration")
super.draw()
// now draw the title bar
Переменную можно объявить следующим образом:
val mywin = new SimpleWindow with VerticalScrollbarDecoration with HorizontalScrollbarDecoration with TitleDecoration
Результат звонка mywin.draw()
является:
in TitleDecoration
in HorizontalScrollbarDecoration
in VerticalScrollbarDecoration
in SimpleWindow
Другими словами, вызов draw
сначала выполнил код в TitleDecoration
(примешивается последняя черта), затем (через super()
вызовы) передаются обратно через другие смешанные свойства и, в конечном итоге, в код Window
, хотя ни одна из черт не унаследована друг от друга . Это похоже на шаблон декоратора , но более лаконично и менее подвержено ошибкам, поскольку не требует явной инкапсуляции родительского окна, явной пересылки функций, реализация которых не изменяется, или использования инициализации отношений сущностей во время выполнения. . В других языках аналогичный эффект может быть достигнут во время компиляции с помощью длинной линейной цепочки наследования реализации , но с недостатком по сравнению со Scala, заключающимся в том, что для каждой возможной комбинации примесей придется объявлять одну линейную цепочку наследования.
Выразительная система шрифтов
[ редактировать ]Scala оснащена выразительной системой статических типов, которая в основном обеспечивает безопасное и последовательное использование абстракций. Однако система типов не является надежной . [ 39 ] В частности, система типов поддерживает:
- Классы и абстрактные типы как члены объектов
- Структурные типы
- Типы, зависящие от пути
- Сложные типы
- Явно типизированные ссылки на себя
- Общие классы
- Полиморфные методы
- Верхние и нижние границы типа
- Дисперсия
- Аннотация
- Просмотры
Scala может выводить типы по использованию. Это делает большинство объявлений статических типов необязательными. Статические типы не обязательно объявлять явно, если только ошибка компилятора не укажет на необходимость. На практике для ясности кода включены некоторые объявления статических типов.
Тип обогащения
[ редактировать ]Распространенный метод в Scala, известный как «обогатить мою библиотеку». [ 40 ] (первоначально « Прокачай мою библиотеку »; в 2006 году Мартин Одерски назвал его [ 33 ] по поводу этой формулировки были высказаны опасения из-за ее негативного подтекста. [ 41 ] и незрелость [ 42 ] ), позволяет использовать новые методы, как если бы они были добавлены к существующим типам. Это похоже на концепцию методов расширения C# , но более мощная, поскольку этот метод не ограничивается добавлением методов и может, например, использоваться для реализации новых интерфейсов. В Scala этот метод включает объявление неявного преобразования типа, «получающего» метод, в новый тип (обычно класс), который оборачивает исходный тип и предоставляет дополнительный метод. Если метод не может быть найден для данного типа, компилятор автоматически ищет любые применимые неявные преобразования к типам, которые предоставляют рассматриваемый метод.
Этот метод позволяет добавлять новые методы в существующий класс с использованием дополнительной библиотеки, так что только код, который импортирует дополнительную библиотеку, получает новые функциональные возможности, а весь остальной код не затрагивается.
В следующем примере показано обогащение типа Int
с методами isEven
и isOdd
:
object MyExtensions:
extension (i: Int)
def isEven = i % 2 == 0
def isOdd = !isEven
import MyExtensions._ // bring implicit enrichment into scope
4.isEven // -> true
Импорт членов MyExtensions
приводит к неявному преобразованию в класс расширения IntPredicates
в объем. [ 43 ]
Параллелизм
[ редактировать ]Стандартная библиотека Scala включает поддержку фьючерсов и промисов в дополнение к стандартным API параллелизма Java. Первоначально в него также была включена поддержка модели актора , которая теперь доступна как отдельный исходный код платформы Akka. [ 44 ] лицензируется Lightbend Inc. Акторы Akka могут распространяться или комбинироваться с программной транзакционной памятью ( транзакторы ). Альтернативными реализациями последовательных процессов связи (CSP) для передачи сообщений на основе каналов являются Communicating Scala Objects, [ 45 ] или просто через JCSP .
Актер подобен экземпляру потока с почтовым ящиком. Его можно создать system.actorOf
, переопределяя receive
метод получения сообщений и использование !
(восклицательный знак) метод отправки сообщения. [ 46 ]
В следующем примере показан EchoServer, который может получать сообщения, а затем распечатывать их.
val echoServer = actor(new Act:
become:
case msg => println("echo " + msg)
)
echoServer ! "hi"
Scala также поставляется со встроенной поддержкой параллельного программирования данных в форме параллельных коллекций. [ 47 ] интегрирован в стандартную библиотеку начиная с версии 2.9.0.
В следующем примере показано, как использовать параллельные коллекции для повышения производительности. [ 48 ]
val urls = List("https://scala-lang.org", "https://github.com/scala/scala")
def fromURL(url: String) = scala.io.Source.fromURL(url)
.getLines().mkString("\n")
val t = System.currentTimeMillis()
urls.par.map(fromURL(_)) // par returns parallel implementation of a collection
println("time: " + (System.currentTimeMillis - t) + "ms")
Помимо фьючерсов и обещаний, поддержки актеров и параллелизма данных , Scala также поддерживает асинхронное программирование с программной транзакционной памятью и потоками событий. [ 49 ]
Кластерные вычисления
[ редактировать ]Самым известным решением для кластерных вычислений с открытым исходным кодом, написанным на Scala, является Apache Spark . Кроме того, на Scala написана Apache Kafka , публикации и подписки, очередь сообщений популярная в Spark и других технологиях потоковой обработки.
Тестирование
[ редактировать ]Есть несколько способов тестирования кода в Scala. ScalaTest поддерживает несколько стилей тестирования и может интегрироваться со средами тестирования на основе Java. [ 50 ] ScalaCheck — это библиотека, похожая на QuickCheck в Haskell . [ 51 ] specs2 — это библиотека для написания спецификаций исполняемого программного обеспечения. [ 52 ] ScalaMock обеспечивает поддержку тестирования функций высокого порядка и каррированных функций. [ 53 ] JUnit и TestNG — популярные среды тестирования, написанные на Java.
Версии
[ редактировать ]Версия | Выпущенный | Функции |
---|---|---|
1.0.0-b2 [ 54 ] | 8 декабря 2003 г. | — |
1.1.0-b1 [ 54 ] | 19 февраля 2004 г. |
|
1.1.1 [ 54 ] | 23 марта 2004 г. |
|
1.2.0 [ 54 ] | 9 июня 2004 г. |
|
1.3.0 [ 54 ] | 16 сентября 2004 г. |
|
1.4.0 [ 54 ] | 20 июня 2005 г. |
|
2.0 [ 56 ] | 12 марта 2006 г. |
|
2.1.0 [ 54 ] | 17 марта 2006 г. |
|
2.1.8 [ 57 ] | 23 августа 2006 г. |
|
2.3.0 [ 58 ] | 23 ноября 2006 г. |
|
2.4.0 [ 59 ] | 9 марта 2007 г. |
|
2.5.0 [ 60 ] | 2 мая 2007 г. |
|
2.6.0 [ 61 ] | 27 июля 2007 г. |
|
2.7.0 [ 62 ] | 7 февраля 2008 г. |
|
2.8.0 [ 63 ] | 14 июля 2010 г. |
|
2.9.0 [ 64 ] | 12 мая 2011 г. |
|
2.10 [ 65 ] | 4 января 2013 г. |
Экспериментальные возможности |
2.10.2 [ 75 ] | 6 июня 2013 г. | — |
2.10.3 [ 76 ] | 1 октября 2013 г. | — |
2.10.4 [ 77 ] | 18 марта 2014 г. | — |
2.10.5 [ 78 ] | 5 марта 2015 г. | — |
2.11.0 [ 79 ] | 21 апреля 2014 г. |
|
2.11.1 [ 80 ] | 20 мая 2014 г. | — |
2.11.2 [ 81 ] | 22 июля 2014 г. | — |
2.11.4 [ 82 ] | 31 октября 2014 г. | — |
2.11.5 [ 83 ] | 8 января 2015 г. | — |
2.11.6 [ 84 ] | 5 марта 2015 г. | — |
2.11.7 [ 85 ] | 23 июня 2015 г. | — |
2.11.8 [ 86 ] | 8 марта 2016 г. | — |
2.11.11 [ 87 ] | 18 апреля 2017 г. | — |
2.11.12 [ 88 ] | 13 ноября 2017 г. | — |
2.12.0 [ 89 ] | 3 ноября 2016 г. |
|
2.12.1 [ 90 ] | 5 декабря 2016 г. | — |
2.12.2 [ 87 ] | 18 апреля 2017 г. | — |
2.12.3 [ 91 ] | 26 июля 2017 г. | — |
2.12.4 [ 92 ] | 17 октября 2017 г. | — |
2.12.5 [ 93 ] | 15 марта 2018 г. | — |
2.12.6 [ 94 ] | 27 апреля 2018 г. | — |
2.12.7 [ 95 ] | 27 сентября 2018 г. | — |
2.12.8 [ 96 ] | 4 декабря 2018 г. |
|
2.12.9 [ 97 ] | 5 августа 2019 г. | — |
2.12.10 [ 98 ] | 10 сентября 2019 г. | — |
2.12.11 [ 99 ] | 16 марта 2020 г. | — |
2.12.12 [ 100 ] | 13 июля 2020 г. | — |
2.12.13 [ 101 ] | 12 января 2021 г. | — |
2.12.14 [ 102 ] | 28 мая 2021 г. | — |
2.12.15 [ 103 ] | 14 сен 2021 г. | — |
2.12.16 [ 104 ] | 10 июня 2022 г. | — |
2.12.17 [ 105 ] | 16 сентября 2022 г. | — |
2.12.18 [ 106 ] | 7 июня 2023 г. | — |
2.12.19 [ 107 ] | 25 февраля 2024 г. | — |
2.13.0 [ 108 ] | 11 июня 2019 г. |
|
2.13.1 [ 109 ] | 18 сентября 2019 г. | — |
2.13.2 [ 110 ] | 22 апреля 2020 г. | — |
2.13.3 [ 111 ] | 25 июня 2020 г. | — |
2.13.4 [ 112 ] | 19 ноября 2020 г. | — |
2.13.5 [ 113 ] | 22 февраля 2021 г. | — |
2.13.6 [ 114 ] | 17 мая 2021 г. | — |
2.13.7 [ 115 ] | 1 ноября 2021 г. | — |
2.13.8 [ 116 ] | 12 января 2022 г. | — |
2.13.9 [ 117 ] | 21 сентября 2022 г. | — |
2.13.10 [ 118 ] | 13 октября 2022 г. | — |
2.13.11 [ 119 ] | 7 июня 2023 г. | — |
2.13.12 [ 120 ] | 11 сентября 2023 г. | — |
2.13.13 [ 121 ] | 26 февраля 2024 г. | — |
2.13.14 [ 122 ] | 1 мая 2024 г. | — |
3.0.0 [ 123 ] | 13 мая 2021 г. | — |
3.0.1 [ 124 ] | 31 июля 2021 г. | — |
3.0.2 [ 125 ] | 7 сентября 2021 г. | — |
3.1.0 [ 126 ] | 21 октября 2021 г. | — |
3.1.1 [ 127 ] | 1 февраля 2022 г. | — |
3.1.2 [ 128 ] | 12 апреля 2022 г. | — |
3.1.3 [ 129 ] | 21 июня 2022 г. | — |
3.2.0 [ 130 ] | 5 сентября 2022 г. | — |
3.2.1 [ 131 ] | 7 ноября 2022 г. | — |
3.2.2 [ 132 ] | 30 января 2023 г. | — |
3.3.0 [ 133 ] | 30 мая 2023 г. | — |
3.3.1 [ 134 ] | 7 сентября 2023 г. | — |
3.3.2 [ 135 ] | 29 февраля 2024 г. | — |
3.3.3 [ 136 ] | 29 февраля 2024 г. | — |
3.4.0 [ 137 ] | 29 февраля 2024 г. | — |
3.4.1 [ 138 ] | 29 марта 2024 г. | — |
3.4.2 [ 139 ] | 16 мая 2024 г. | — |
Сравнение с другими языками JVM
[ редактировать ]Scala часто сравнивают с Groovy и Clojure , двумя другими языками программирования, также использующими JVM. Существенные различия между этими языками существуют в системе типов, в степени поддержки каждым языком объектно-ориентированного и функционального программирования, а также в сходстве их синтаксиса с синтаксисом Java.
Scala типизирован статически , тогда как Groovy и Clojure типизированы динамически . Это делает систему типов более сложной и трудной для понимания, но позволяет практически все [ 39 ] ошибки типа должны быть обнаружены во время компиляции и могут привести к значительному ускорению выполнения. Напротив, динамическая типизация требует большего тестирования для обеспечения корректности программы и, следовательно, обычно медленнее, что обеспечивает большую гибкость и простоту программирования. Что касается различий в скорости, текущие версии Groovy и Clojure допускают дополнительные аннотации типов, чтобы помочь программам избежать накладных расходов на динамическую типизацию в тех случаях, когда типы практически статичны. Эти накладные расходы еще больше сокращаются при использовании последних версий JVM, которые были расширены за счет динамической инструкции вызова для методов, определенных с динамически типизированными аргументами. Эти достижения сокращают разрыв в скорости между статической и динамической типизацией, хотя статически типизированный язык, такой как Scala, по-прежнему является предпочтительным выбором, когда эффективность выполнения очень важна.
Что касается парадигм программирования, Scala наследует объектно-ориентированную модель Java и расширяет ее различными способами. Несмотря на то, что Groovy также сильно объектно-ориентирован, он больше ориентирован на снижение многословия. В Clojure объектно-ориентированному программированию уделяется меньше внимания, а функциональное программирование является основной сильной стороной языка. Scala также имеет множество средств функционального программирования, включая функции, имеющиеся в продвинутых функциональных языках, таких как Haskell , и пытается быть независимым между двумя парадигмами, позволяя разработчику выбирать между двумя парадигмами или, что чаще, некоторой их комбинацией.
Что касается сходства синтаксиса с Java, Scala наследует большую часть синтаксиса Java, как и в случае с Groovy. Clojure, с другой стороны, следует синтаксису Lisp , который отличается как по внешнему виду, так и по философии. [ нужна ссылка ]
Принятие
[ редактировать ]Языковые рейтинги
[ редактировать ]Еще в 2013 году, когда Scala была в версии 2.10, Технологический радар ThoughtWorks , представляющий собой основанный на мнениях двухгодичный отчет группы старших технологов, [ 140 ] рекомендовал использовать Scala в своей категории языков и фреймворков. [ 141 ]
В июле 2014 года эта оценка стала более конкретной и теперь относится к «Scala, хорошие части», которая описывается так: «Чтобы успешно использовать Scala, вам необходимо изучить язык и иметь очень твердое мнение о том, какие части являются правильными». для вас, создающих собственное определение Scala, хорошие стороны». [ 142 ]
В обзоре Java за 2018 год состояния [ 143 ] который собрал данные от 5160 разработчиков по различным темам, связанным с Java, Scala занимает третье место по использованию альтернативных языков на JVM . По сравнению с предыдущим годом опроса, использование Scala среди альтернативных языков JVM упало с 28,4% до 21,5%, обогнав Kotlin , доля которого выросла с 11,4% в 2017 году до 28,8% в 2018 году. Индекс популярности языков программирования, [ 144 ] который отслеживает поиск учебных пособий по языку, занял Scala 15-е место в апреле 2018 года с небольшой тенденцией к снижению и 17-е место в январе 2021 года. Это делает Scala третьим по популярности языком на основе JVM после Java и Kotlin , занявших 12-е место.
Рейтинг языков программирования RedMonk , который составляет рейтинг на основе количества проектов GitHub и вопросов, заданных на Stack Overflow , в январе 2021 года поставил Scala на 14-е место. [ 145 ] Scala был помещен в группу языков второго уровня — впереди Go , PowerShell и Haskell и позади Swift , Objective-C , Typescript и R. Здесь
Индекс ТИОБЕ [ 146 ] Для определения популярности языка программирования используются рейтинги поисковых систем в Интернете и аналогичный подсчет публикаций для определения популярности языка. В сентябре 2021 года он показал Scala на 31-м месте. В этом рейтинге Scala опередила Haskell (38-е место) и Erlang , но уступила Go (14-е место), Swift (15-е место) и Perl (19-е место).
По состоянию на 2022 год [update]Языки на основе JVM, такие как Clojure, Groovy и Scala, имеют высокие рейтинги, но все же значительно менее популярны, чем исходный язык Java , который обычно занимает три первых места. [ 145 ] [ 146 ]
Компании
[ редактировать ]- В апреле 2009 года Twitter объявил, что перевел большую часть своей серверной части с Ruby на Scala и намерен преобразовать остальную часть. [ 147 ]
- Tesla, Inc. использует Akka со Scala в серверной части виртуальной электростанции Tesla. Таким образом, модель Actor используется для представления и управления устройствами, которые вместе с другими компонентами составляют экземпляр виртуальной электростанции, а Reactive Streams используются для сбора и обработки данных. [ 148 ]
- Apache Kafka реализован в Scala в отношении большей части своего ядра и других важных частей. Он поддерживается и расширяется посредством проекта с открытым исходным кодом и компанией Confluent. [ 149 ]
- Gilt использует Scala и Play Framework . [ 150 ]
- Foursquare использует Scala и Lift . [ 151 ]
- Coursera использует Scala и Play Framework . [ 152 ]
- Apple Inc. использует Scala в некоторых командах наряду с Java и платформой Play. [ 153 ] [ 154 ]
- The Guardian. с высокой посещаемостью газеты Веб-сайт Guardian.co.uk [ 155 ] объявила в апреле 2011 года о переходе с Java на Scala. [ 156 ] [ 157 ]
- В 2014 году газета New York Times сообщила, что ее внутренняя система управления контентом Blackbeard построена с использованием Scala, Akka и Play. [ 158 ]
- Газета Huffington Post начала использовать Scala как часть своей системы доставки контента Athena в 2013 году. [ 159 ]
- Швейцарский банк UBS одобрил Scala для общего производственного использования. [ 160 ]
- LinkedIn использует Scalatra микрофреймворк для реализации своего Signal API. [ 161 ]
- Meetup использует набор инструментов Unfiltered для API реального времени. [ 162 ]
- Помните, что Milk использует набор инструментов Unfiltered, Scala и Akka для общедоступного API и обновлений в реальном времени. [ 163 ]
- Verizon стремится создать «фреймворк следующего поколения» с использованием Scala. [ 164 ]
- Airbnb разрабатывает программное обеспечение для машинного обучения с открытым исходным кодом Aerosolve, написанное на Java и Scala. [ 165 ]
- Zalando перенесла свой технологический стек с Java на Scala и Play. [ 166 ]
- SoundCloud использует Scala для своей серверной части, применяя такие технологии, как Finagle (микросервисы), [ 167 ] Ошпаривание и искра (обработка данных). [ 168 ]
- Databricks использует Scala для платформы больших данных Apache Spark .
- Morgan Stanley широко использует Scala в своих проектах, связанных с финансами и активами. [ 169 ]
- есть команды В Google и Alphabet Inc. , которые используют Scala, в основном благодаря приобретениям, таким как Firebase. [ 170 ] и Гнездо. [ 171 ]
- Walmart Canada использует Scala в качестве внутренней платформы. [ 172 ]
- Duolingo использует Scala для своего внутреннего модуля, генерирующего уроки. [ 173 ]
- HMRC использует Scala для многих налоговых заявок правительства Великобритании. [ 174 ]
- M1 Finance использует Scala в качестве внутренней платформы. [ 175 ]
Критика
[ редактировать ]В ноябре 2011 года Yammer отошла от Scala по причинам, включающим кривую обучения новых членов команды и несовместимость одной версии компилятора Scala с другой. [ 176 ] В марте 2015 года бывший вице-президент группы разработки платформ в Twitter Раффи Крикорян заявил, что не выбрал бы Scala в 2011 году из-за ее кривой обучения . [ 177 ] В том же месяце LinkedIn старший вице-президент Кевин Скотт заявил о своем решении «минимизировать [свою] зависимость от Scala». [ 178 ]
См. также
[ редактировать ]- sbt — широко используемый инструмент сборки проектов Scala.
- Spark Framework предназначен для обработки больших данных и поддерживает исключительно Scala.
- Neo4j — это среда Java Spring, поддерживаемая Scala, с функциональностью, зависящей от предметной области, аналитическими возможностями, графовыми алгоритмами и многим другим.
- Играть! , платформа веб-приложений с открытым исходным кодом, поддерживающая Scala.
- Akka — набор инструментов с открытым исходным кодом для создания параллельных и распределенных приложений.
- Chisel — язык с открытым исходным кодом, созданный на основе Scala и используемый для проектирования и создания аппаратного обеспечения. [ 179 ]
Ссылки
[ редактировать ]- ^ «Скала 3.4.0» .
- ^ «Файл уведомления» . Гитхаб . 24 января 2019 г. Проверено 4 декабря 2019 г.
- ^ «Скала Макросы» .
- ^ Фогус, Майкл (6 августа 2010 г.). «Мартин Одерский возьми(5) в список» . Отправьте больше парамедиков . Проверено 9 февраля 2012 г.
- ^ Jump up to: а б с д Одерский, Мартин (11 января 2006 г.). «Эксперимент Scala: можем ли мы обеспечить лучшую языковую поддержку для компонентных систем?» (PDF) . Проверено 22 июня 2016 г.
- ^ Jump up to: а б с д Одерский, Мартин; и др. (2006). «Обзор языка программирования Scala» (PDF) (2-е изд.). Федеральная политехническая школа Лозанны (EPFL). Архивировано (PDF) из оригинала 9 июля 2020 г.
- ^ Одерский, Мартин (2008). Программирование на Scala . Маунтин-Вью, Калифорния: Артима. п. 3. ISBN 9780981531601 . Проверено 12 июня 2014 г.
- ^ Уэмплер, Дин; Пейн, Алекс (15 сентября 2009 г.). Программирование на Scala: Масштабируемость = Функциональное программирование + Объекты . О'Рейли Медиа, Инк. с. 7. ISBN 978-1-4493-7926-1 . Проверено 13 мая 2024 г.
Создатели Scala на самом деле произносят это слово scah-lah , как итальянское слово, означающее «лестница». Две буквы «а» произносятся одинаково.
- ^ Потвин, Паскаль; Бонха, Марио (24 сентября 2015 г.). SDL 2013: Проектирование надежности на основе моделей . Конспекты лекций по информатике. Том. 7916. arXiv : 1509.07326 . дои : 10.1007/978-3-642-38911-5 . ISBN 978-3-642-38910-8 . S2CID 1214469 .
- ^ «Часто задаваемые вопросы: совместимость Java» . Scala-lang.org . Проверено 6 февраля 2015 г.
- ^ Мартин Одерский (17 июня 2020 г.). Мартин Одерски: Обновление Scala 3 (видео). Ютуб. Событие происходит в 36:35–45:08. Архивировано из оригинала 21 декабря 2021 г. Проверено 24 апреля 2021 г.
- ^ «Эффект эксп» . скала . Проверено 31 июля 2022 г.
- ^ Ловердо, Христос (2010). Шаги в Scala: введение в объектно-функциональное программирование . Издательство Кембриджского университета . п. xiii. ISBN 9781139490948 . Проверено 31 июля 2014 г.
- ^ Jump up to: а б с д Одерский, Мартин (9 июня 2006 г.). «Краткая история Scala» . Artima.com .
- ^ Jump up to: а б с д Одерский, М.; Ромпф, Т. (2014). «Объединение функционального и объектно-ориентированного программирования со Scala» . Коммуникации АКМ . 57 (4): 76. дои : 10.1145/2591013 .
- ^ Мартин Одерски, «Спецификация языка Scala, версия 2.7»
- ^ «Команда Scala выиграла грант ERC» . Проверено 4 июля 2015 г.
- ^ «Коммерческая поддержка Scala» . 12 мая 2011 г. Проверено 18 августа 2011 г.
- ^ «Почему мы инвестировали в Typesafe: современные приложения требуют современных инструментов» . 12 мая 2011 г. Проверено 8 мая 2018 г.
- ^ «Scala с открытым исходным кодом получает коммерческую поддержку» . 12 мая 2011 г. Проверено 9 октября 2011 г.
- ^ «Пионер облачных вычислений Мартин Одерски представляет свою новую компанию Typesafe» . 12 мая 2011 г. Проверено 24 августа 2011 г.
- ^ «Дорожная карта Scala 3 на 2024 год» . виртуальлаб . Проверено 13 июня 2024 г.
- ^ «Скала на Android» . Архивировано из оригинала 20 июня 2016 года . Проверено 8 июня 2016 г.
- ^ «Scala 2.12.8 теперь доступна!» . 04.12.2018 . Проверено 9 декабря 2018 г.
- ^ «Scala Js больше не является экспериментальным | Язык программирования Scala» . Scala-lang.org . Проверено 28 октября 2015 г.
- ^ «Релизы · scala-js/Scala-js» . Гитхаб .
- ^ Криль, Пол (15 марта 2017 г.). «Уменьшенный вариант Scala разрывает связь с JVM» . Инфомир . Проверено 21 марта 2017 г.
- ^ Криль, Пол (11 мая 2016 г.). «Язык Scala приближается к голому железу» . Инфомир .
- ^ Удалена серверная часть .net. от paulp · Запрос на извлечение № 1718 · scala/scala · GitHub . Github.com (5 декабря 2012 г.). Проверено 2 ноября 2013 г.
- ^ «Начало работы со Scala» . Scala-lang.org . 15 июля 2008 года . Проверено 31 июля 2014 г.
- ^ "Дом" . Блог.lostlake.org. Архивировано из оригинала 31 августа 2010 года . Проверено 25 июня 2013 г.
- ^ Встроенные структуры управления Scala, такие как
if
илиwhile
не может быть реализован повторно. Существует исследовательский проект Scala-Virtualized, направленный на устранение этих ограничений: Адриан Мурс, Тиарк Ромпф, Филипп Халлер и Мартин Одерски. Scala-виртуализация . Материалы семинара ACM SIGPLAN 2012 по частичной оценке и манипуляциям с программой , 117–120. Июль 2012. - ^ Jump up to: а б «Прокачай мою библиотеку» . Артима.com. 09.10.2006 . Проверено 25 июня 2013 г.
- ^ «Выражения | Scala 2.13» . scala-lang.org . Проверено 24 мая 2021 г.
- ^ «Изменяемые и неизменяемые коллекции — документация Scala» . Проверено 30 апреля 2020 г.
- ^ «Коллекции — Конкретные неизменяемые классы коллекций — Документация Scala» . Проверено 4 июля 2015 г.
- ^ Догерти, Рич. «Блог Рича Догерти» . Проверено 4 июля 2015 г.
- ^ «TailCalls — API стандартной библиотеки Scala (Scaladoc) 2.10.2 — scala.util.control.TailCalls» . Scala-lang.org . Проверено 25 июня 2013 г.
- ^ Jump up to: а б «Системы типов Java и Scala ненадежны» (PDF) .
- ^ Джарруссо, Паоло Г. (2013). «Уточните свои запросы коллекции для обеспечения модульности и скорости!». Материалы 12-й ежегодной международной конференции по аспектно-ориентированной разработке программного обеспечения . АКМ. arXiv : 1210.6284 . Бибкод : 2012arXiv1210.6284G .
Также известен как шаблон «Прокачай мою библиотеку».
- ^ Гилберт, Клинт (15 ноября 2011 г.). «Что является наивысшим приоритетом для успеха Scala в корпоративном мире (должно быть в дебатах по Scala?)?» . Scala-lang.org . Проверено 8 мая 2019 г.
- ^ «Должны ли мы «обогащать» или «прокачивать» библиотеки Scala?» . stackexchange.com . 17 июня 2013 года . Проверено 15 апреля 2016 г.
- ^ Неявные классы были введены в Scala 2.10, чтобы сделать расширения методов более краткими. Это эквивалентно добавлению метода
implicit def IntPredicate(i: Int) = new IntPredicate(i)
. Класс также можно определить какimplicit class IntPredicates(val i: Int) extends AnyVal { ... }
, создающий так называемый класс значений , также представленный в Scala 2.10. Затем компилятор исключит фактические экземпляры и вместо этого создаст статические методы, что позволит методам расширения практически не нагружать производительность. - ^ Что такое? , Согласно онлайн-документации
- ^ Суфрин, Бернар (2008). «Взаимодействие с объектами Scala». В Уэлче, штат Пенсильвания; Степни, С.; Поляк, КВС; Барнс, ФРМ; Макьюэн, А.А.; Стайлз, GS; Броэнинк, Дж. Ф.; Сэмпсон, AT (ред.). Архитектуры процессов связи 2008: WoTUG-31 (PDF) . ИОС Пресс. ISBN 978-1586039073 .
- ^ Ян, Кей. «Скала Тур» . Проверено 4 июля 2015 г.
- ^ «Parallelcollections — Обзор — Документация Scala» . Docs.scala-lang.org . Проверено 25 июня 2013 г.
- ^ Ян, Кей. «Скала Тур» . Проверено 4 июля 2015 г.
- ^ Изучение параллельного программирования в Scala , Александр Прокопец, Packt Publishing
- ^ Копс, Миша (13 января 2013 г.). «Краткое введение в ScalaTest» . hascode.com . Проверено 7 ноября 2014 г.
- ^ Нильссон, Рикард (17 ноября 2008 г.). «СкалаЧек 1.5» . Scala-lang.org . Проверено 7 ноября 2014 г.
- ^ «Создание веб-приложений с использованием Scala и Play Framework» . www.workwithplay.com . 22 мая 2013 г. Проверено 7 ноября 2014 г.
- ^ Мясник, Пол (4 июня 2012 г.). «Предварительный выпуск ScalaMock 3.0» . paulbutcher.com . Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
- ^ Jump up to: а б с д и ж г «История изменений Scala» . Scala-lang.org . Архивировано из оригинала 9 октября 2007 г.
- ^ «Удален: XML-литералы» . dotty.epfl.ch . Проверено 05 марта 2021 г.
- ^ «Изменения в версии 2.0 (12 марта 2006 г.)» . Scala-lang.org . 12 марта 2006 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.1.8 (23 августа 2006 г.)» . Scala-lang.org . 23 августа 2006 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.3.0 (23 ноября 2006 г.)» . Scala-lang.org . 23 ноября 2006 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.4.0 (09 марта 2007 г.)» . Scala-lang.org . 9 марта 2007 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.5 (02 мая 2007 г.)» . Scala-lang.org . 2 мая 2007 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.6 (27 июля 2007 г.)» . Scala-lang.org . 27 июня 2007 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.7.0 (07 февраля 2008 г.)» . Scala-lang.org . 07 февраля 2008 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.8.0 (14 июля 2010 г.)» . Scala-lang.org . 10 июля 2010 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.9.0 (12 мая 2011 г.)» . Scala-lang.org . 12 мая 2011 г. Проверено 7 ноября 2014 г.
- ^ «Изменения в версии 2.10.0» . Scala-lang.org . 04.01.2013 . Проверено 7 ноября 2014 г.
- ^ Харра, Марк. «Ценностные классы и универсальные черты» . Scala-lang.org . Проверено 7 ноября 2014 г.
- ^ Суэрет, Джош. «SIP-13 — Неявные классы» . Scala-lang.org . Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
- ^ Суэрет, Джош. «Строковая интерполяция» . Scala-lang.org . Проверено 7 ноября 2014 г.
- ^ Халлер, Филипп; Прокопец, Александр. «Будущее и обещания» . Scala-lang.org . Проверено 7 ноября 2014 г.
- ^ «СИП-17 – Тип Динамический» . Scala-lang.org . Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
- ^ «SIP-18 — Модуляция возможностей языка» . Scala-lang.org . Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
- ^ Прокопец, Александр; Миллер, Хизер. «Параллельные коллекции» . Scala-lang.org . Проверено 7 ноября 2014 г.
- ^ Миллер, Хизер; Бурмако, Евгений. «Обзор отражений» . Scala-lang.org . Проверено 7 ноября 2014 г.
- ^ Бурмако, Евгений. «Макросы определения» . Scala-lang.org . Проверено 7 ноября 2014 г.
- ^ «Scala 2.10.2 теперь доступна!» . Scala-lang.org . 06.06.2013. Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
- ^ «Scala 2.10.3 теперь доступна!» . Scala-lang.org . 01.10.2013. Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
- ^ «Scala 2.10.4 теперь доступна!» . Scala-lang.org . 18 марта 2014 г. Проверено 7 января 2015 г.
- ^ «Scala 2.10.5 теперь доступна!» . Scala-lang.org . 04.03.2015 . Проверено 23 марта 2015 г.
- ^ «Scala 2.11.0 теперь доступна!» . Scala-lang.org . 21 апреля 2014 г. Проверено 7 ноября 2014 г.
- ^ «Scala 2.11.1 теперь доступна!» . Scala-lang.org . 20 мая 2014 г. Проверено 7 ноября 2014 г.
- ^ «Scala 2.11.2 теперь доступна!» . Scala-lang.org . 22 июля 2014 г. Проверено 7 ноября 2014 г.
- ^ «Scala 2.11.4 теперь доступна!» . Scala-lang.org . 30 октября 2014 г. Проверено 7 ноября 2014 г.
- ^ «Scala 2.11.5 теперь доступна!» . Scala-lang.org . 08.01.2015 . Проверено 22 января 2015 г.
- ^ «Scala 2.11.6 теперь доступна!» . Scala-lang.org . 05.03.2015 . Проверено 12 марта 2015 г.
- ^ «Scala 2.11.7 теперь доступна!» . Scala-lang.org . 23 июня 2015 г. Проверено 3 июля 2015 г.
- ^ «Scala 2.11.8 теперь доступна!» . Scala-lang.org . 08.03.2016 . Проверено 9 марта 2016 г.
- ^ Jump up to: а б «Три новых релиза и еще больше GitHub добра!» . Scala-lang.org . 18 апреля 2017 г. Проверено 19 апреля 2017 г.
- ^ «Обновление безопасности: 2.12.4, 2.11.12, 2.10.7 (CVE-2017-15288)» . Scala-lang.org . 13.11.2017 . Проверено 4 мая 2018 г.
- ^ «Scala 2.12.0 теперь доступна!» . Scala-lang.org . 03.11.2016 . Проверено 8 января 2017 г.
- ^ «Scala 2.12.1 теперь доступна!» . Scala-lang.org . 05.12.2016 . Проверено 8 января 2017 г.
- ^ «Scala 2.12.3 теперь доступна!» . Scala-lang.org . 26 июля 2017 г. Проверено 16 августа 2017 г.
- ^ «Scala 2.12.4 теперь доступна!» . Scala-lang.org . 18 октября 2017 г. Проверено 26 октября 2017 г.
- ^ «Scala 2.12.5 теперь доступна!» . Scala-lang.org . 15 марта 2018 г. Проверено 20 марта 2018 г.
- ^ «Scala 2.12.6 теперь доступна!» . Scala-lang.org . 27 апреля 2018 г. Проверено 4 мая 2018 г.
- ^ «Scala 2.12.7 теперь доступна!» . Scala-lang.org . 27 сентября 2018 г. Проверено 9 октября 2018 г.
- ^ «Scala 2.12.8 теперь доступна!» . Scala-lang.org . 04.12.2018 . Проверено 9 декабря 2018 г.
- ^ «Scala 2.12.9 теперь доступна!» . Scala-lang.org . 05.08.2019 . Проверено 20 января 2021 г.
- ^ «Scala 2.12.10 теперь доступна!» . Scala-lang.org . 10 сентября 2019 г. Проверено 20 января 2021 г.
- ^ «Scala 2.12.11 теперь доступна!» . Scala-lang.org . 16 марта 2020 г. Проверено 20 января 2021 г.
- ^ «Scala 2.12.12 теперь доступна!» . Scala-lang.org . 13 июля 2020 г. Проверено 20 января 2021 г.
- ^ «Scala 2.12.13 теперь доступна!» . Scala-lang.org . 12 января 2021 г. Проверено 20 января 2021 г.
- ^ «Scala 2.12.14 теперь доступна!» . Scala-lang.org . 28 мая 2021 г. Проверено 15 апреля 2022 г.
- ^ «Scala 2.12.15 теперь доступна!» . Scala-lang.org . 14 сентября 2021 г. Проверено 19 июня 2022 г.
- ^ «Scala 2.12.16 теперь доступна!» . Scala-lang.org . 10 июня 2022 г. Проверено 19 июня 2022 г.
- ^ «Scala 2.12.17 теперь доступна!» . Scala-lang.org . 10 июня 2022 г. Проверено 16 сентября 2022 г.
- ^ «Scala 2.12.18 теперь доступна!» . Scala-lang.org . 10 июня 2022 г. Проверено 7 июня 2023 г.
- ^ «Scala 2.12.19 теперь доступна!» . Scala-lang.org . 25 февраля 2024 г. Проверено 12 августа 2024 г.
- ^ «Scala 2.13.0 теперь доступна!» . Scala-lang.org . 11.06.2019 . Проверено 17 июня 2018 г.
- ^ «Scala 2.13.1 теперь доступна!» . Scala-lang.org . 18 сентября 2019 г. Проверено 20 января 2021 г.
- ^ «Scala 2.13.2 теперь доступна!» . Scala-lang.org . 22 апреля 2020 г. Проверено 20 января 2021 г.
- ^ «Scala 2.13.3 теперь доступна!» . Scala-lang.org . 25 июня 2020 г. Проверено 20 января 2021 г.
- ^ «Scala 2.13.4 теперь доступна!» . Scala-lang.org . 19.11.2020 . Проверено 20 января 2021 г.
- ^ «Scala 2.13.5 теперь доступна!» . Scala-lang.org . 2021-02-22 . Проверено 26 февраля 2021 г.
- ^ «Scala 2.13.6 теперь доступна!» . Scala-lang.org . 17 мая 2021 г. Проверено 15 апреля 2022 г.
- ^ «Scala 2.13.7 теперь доступна!» . Scala-lang.org . 01.11.2021 . Проверено 15 апреля 2022 г.
- ^ «Scala 2.13.8 теперь доступна!» . Scala-lang.org . 12 января 2022 г. Проверено 15 апреля 2022 г.
- ^ «Scala 2.13.9 теперь доступна!» . Scala-lang.org . 21 сентября 2022 г. Проверено 28 августа 2023 г.
- ^ «Scala 2.13.10 теперь доступна!» . Scala-lang.org . 13 октября 2022 г. Проверено 28 августа 2023 г.
- ^ «Scala 2.13.11 теперь доступна!» . Scala-lang.org . 07.06.2023 . Проверено 28 августа 2023 г.
- ^ «Scala 2.13.12 теперь доступна!» . Scala-lang.org . 11 сентября 2023 г. Проверено 12 августа 2024 г.
- ^ «Scala 2.13.13 теперь доступна!» . Scala-lang.org . 26 февраля 2024 г. Проверено 12 августа 2024 г.
- ^ «Scala 2.13.14 теперь доступна!» . Scala-lang.org . 01.05.2024 . Проверено 12 августа 2024 г.
- ^ «Скала 3 уже здесь!» . Scala-lang.org . 14 мая 2021 г. Проверено 26 мая 2021 г.
- ^ «Scala 3.0.1 и 3.0.2-RC1 уже здесь!» . Scala-lang.org . 31 июля 2021 г. Проверено 12 августа 2024 г.
- ^ «Выпущена Scala 3.0.2!» . Scala-lang.org . 07.09.2021 . Проверено 12 августа 2024 г.
- ^ «Выпущена Scala 3.1.0!» . Scala-lang.org . 21 октября 2021 г. Проверено 12 августа 2024 г.
- ^ «Scala 3.1.1 и новости о будущей совместимости» . Scala-lang.org . 01.02.2022 . Проверено 12 августа 2024 г.
- ^ «Выпущена Scala 3.1.2!» . Scala-lang.org . 12 апреля 2022 г. Проверено 12 августа 2024 г.
- ^ «Выпущена Scala 3.1.3!» . Scala-lang.org . 21 июня 2022 г. Проверено 12 августа 2024 г.
- ^ «Выпущена Scala 3.2.0!» . Scala-lang.org . 05.09.2022 . Проверено 12 августа 2024 г.
- ^ «Выпущена Scala 3.2.1!» . Scala-lang.org . 07.11.2022 . Проверено 12 августа 2024 г.
- ^ «Scala 3.2.2 теперь доступна!» . Scala-lang.org . 30 января 2023 г. Проверено 12 августа 2024 г.
- ^ «Выпущена Scala 3.3.0!» . Scala-lang.org . 30 мая 2023 г. Проверено 12 августа 2024 г.
- ^ «Scala 3.3.1 LTS теперь доступна!» . Scala-lang.org . 07.09.2023 . Проверено 12 августа 2024 г.
- ^ «Скала 3.3.2» . github.com . 29 февраля 2024 г. Проверено 12 августа 2024 г.
- ^ «Выпущены Scala 3.4.0 и 3.3.3 LTS!» . Scala-lang.org . 29 февраля 2024 г. Проверено 12 августа 2024 г.
- ^ «Выпущены Scala 3.4.0 и 3.3.3 LTS!» . Scala-lang.org . 29 февраля 2024 г. Проверено 12 августа 2024 г.
- ^ «Scala 3.4.1 теперь доступна!» . Scala-lang.org . 2024-03-29 . Проверено 12 августа 2024 г.
- ^ «Scala 3.4.2 теперь доступна!» . Scala-lang.org . 16 мая 2024 г. Проверено 12 августа 2024 г.
- ^ «Часто задаваемые вопросы о технологических радарах ThinkWorks» .
- ^ «ThoughtWorks Technology Radar, МАЙ 2013 г.» (PDF) .
- ^ «Скала, хорошие стороны» .
- ^ «Состояние Явы в 2018 году» .
- ^ «Индекс популярности языков программирования» .
- ^ Jump up to: а б О'Грэйди, Стивен (1 марта 2021 г.). «Рейтинг языков программирования RedMonk: январь 2021 г.» . РедМонк .
- ^ Jump up to: а б «Индекс TIOBE за май 2021 года» .
- ^ Грин, Кейт (1 апреля 2009 г.). «Секрет роста Twitter: как новый язык веб-программирования помогает компании справиться с растущей популярностью» . Обзор технологий . Массачусетский технологический институт . Проверено 6 апреля 2009 г.
- ^ Брек, Колин; Линк, Перси (23 марта 2020 г.). «Виртуальная электростанция Тесла (архитектура и дизайн)» . Проверено 28 марта 2023 г.
- ^ «Исходный код Apache Kafka на GitHub» . Фонд программного обеспечения Apache . Проверено 29 марта 2023 г.
- ^ «Играйте в Framework, Akka и Scala в Gilt Groupe» . Изгиб света. 15 июля 2013 года . Проверено 16 июля 2016 г.
- ^ «Скала, лифт и будущее» . Архивировано из оригинала 13 января 2016 года . Проверено 4 июля 2015 г.
- ^ Саэта, Бреннан (17 февраля 2014 г.). «Почему мы в Coursera любим Scala» . Курсера Инжиниринг . Проверено 21 сентября 2023 г.
- ^ «Премьер-министр Apple по инженерным вопросам Джаррод Неттлс в Твиттере» . Джаррод Неттлз . Проверено 11 марта 2016 г.
- ^ «30 вакансий Scala в Apple» . Элвин Александр . Проверено 11 марта 2016 г.
- ^ Дэвид Рид и Таня Тейшейра (26 февраля 2010 г.). «Готовы ли люди платить за онлайн-новости?» . Би-би-си . Проверено 28 февраля 2010 г.
- ^ «Переход Guardian с Java на Scala» . Хейзе онлайн . 05 апреля 2011 г. Проверено 5 апреля 2011 г.
- ^ «Guardian.co.uk Переход с Java на Scala» . InfoQ.com. 04.04.2011 . Проверено 5 апреля 2011 г.
- ^ Рой, Суман; Сундаресан, Кришна (13 мая 2014 г.). «Создание Blackbeard: система синдикации на базе Play, Scala и Akka» . Нью-Йорк Таймс . Проверено 20 июля 2014 г.
- ^ Павли, Джон (11 августа 2013 г.). «Краткий обзор: HuffPost обеспечивает совместную работу в отделе новостей в режиме реального времени» . Хаффингтон Пост . Проверено 20 июля 2014 г.
- ^ Бинсток, Эндрю (14 июля 2011 г.). «Интервью с Мартином Одерски из Scala» . Журнал доктора Добба . Проверено 10 февраля 2012 г.
- ^ Синодинос, Дионисий Г. (11 октября 2010 г.). «Сигнал LinkedIn: пример использования Scala, JRuby и Voldemort» . ИнфоQ .
- ^ «Реальные встречи заслуживают API, работающих в реальном времени» .
- ^ «В веб-приложении Remember The Milk появляется обновление в режиме реального времени» .
- ^ «ЧТО ТАКОЕ СКАЛА» . 8 марта 2023 г. Проверено 17 марта 2023 г.
- ^ Новет, Иордания (04 июня 2015 г.). «Airbnb анонсирует Aerosolve, пакет программного обеспечения для машинного обучения с открытым исходным кодом» . Проверено 9 марта 2016 г.
- ^ Копс, Александр (14 декабря 2015 г.). «Zalando Tech: от Java до Scala менее чем за три месяца» . Проверено 9 марта 2016 г.
- ^ Кальсадо, Фил (13 июня 2014 г.). «Создание продуктов в SoundCloud — Часть III: Микросервисы в Scala и Finagle» . Проверено 9 марта 2016 г.
- ^ «Исследование примеров клиентов: SoundCloud» . Компания Concurrent Inc. 18 ноября 2014 г. Проверено 9 марта 2016 г.
- ^ Scala в Morgan Stanley (видео). Навыки имеют значение. 03.12.2015 . Проверено 11 марта 2016 г.
- ^ Грег Солтис (3 декабря 2015 г.). SF Scala, Грег Солтис: Высокопроизводительные сервисы в Scala (видео). Навыки имеют значение. Архивировано из оригинала 21 декабря 2021 г. Проверено 11 марта 2016 г.
- ^ Ли Майдолл. «Вакансии Scala в Nest» . Проверено 11 марта 2016 г.
- ^ Нурун. «Нурун запускает обновленную транзакционную платформу совместно с Walmart Canada» . Проверено 11 декабря 2013 г.
- ^ Хори, Андре К. (31 января 2017 г.). «Переписывание движка Duolingo на Scala» . Проверено 3 февраля 2017 г.
- ^ «Репозиторий HMRC GitHub» . Гитхаб .
- ^ «Знакомьтесь: M1 Finance, золотой спонсор ScalaCon» . СкалаКон . Проверено 2 сентября 2023 г.
- ^ Хейл, Кода (29 ноября 2011 г.). «Остальная часть истории» . codahale.com . Проверено 7 ноября 2013 г.
- ^ Крикорян, Раффи (17 марта 2015 г.). Конференция O'Reilly по архитектуре программного обеспечения 2015. Полный сборник видео: Ре-архитектура на лету - Раффи Крикорян - Часть 3 (видео). О'Рейли Медиа. Событие происходит в 4:57 . Проверено 8 марта 2016 г.
Что я бы сделал по-другому четыре года назад, так это использовал бы Java, а не Scala в рамках этой переписывания. [...] инженеру потребуется два месяца, прежде чем он сможет полностью продуктивно начать писать код Scala.
[ постоянная мертвая ссылка ] - ^ Скотт, Кевин (11 марта 2015 г.). «Избавляется ли LinkedIn от Scala?» . quora.com . Проверено 25 января 2016 г.
- ^ «Chisel: создание оборудования на встроенном языке Scala» . APSIRE Калифорнийского университета в Беркли . Проверено 27 мая 2020 г.
Дальнейшее чтение
[ редактировать ]- Одерский, Мартин; Ложка, Лекс; Веннерс, Билл (15 декабря 2019 г.). Программирование на Scala: подробное пошаговое руководство (4-е изд.). Артима Инк . п. 896. ИСБН 978-0-9815316-1-8 .
- Хорстманн, Кей (15 декабря 2016 г.). Скала для нетерпеливых (2-е изд.). Аддисон-Уэсли Профессионал . п. 384. ИСБН 978-0-134-54056-6 .
- Уэмплер, Дин; Пейн, Алекс (14 декабря 2014 г.). Программирование на Scala: масштабируемость = функциональное программирование + объекты (2-е изд.). О'Рейли Медиа . п. 583. ИСБН 978-1-491-94985-6 .
- Суэрет, Джошуа Д. (весна 2011 г.). Скала в глубине . Публикации Мэннинга . п. 225 . ISBN 978-1-935182-70-2 .
- Мередит, Грегори (2011). Монадические шаблоны проектирования для Интернета (PDF) (1-е изд.). п. 300.
- Одерский, Мартин; Ложка, Лекс; Веннерс, Билл (10 декабря 2008 г.). Программирование на Scala, электронная книга (1-е изд.). Артима Инк .
- Скала (язык программирования)
- Языки программирования
- Параллельные языки программирования
- Бесплатное программное обеспечение, написанное на Scala.
- Функциональные языки
- Семейство языков программирования Java
- Языки программирования JVM
- Объектно-ориентированные языки программирования
- Языки программирования сопоставления шаблонов
- Языки программирования, созданные в 2003 году.
- Языки сценариев
- Программное обеспечение, использующее лицензию Apache
- Статически типизированные языки программирования
- Кроссплатформенное бесплатное программное обеспечение
- Бесплатные компиляторы и интерпретаторы
- Компиляторы исходного кода