~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ C678692287FF29C074E1EC8015132E35__1717439820 ✰
Заголовок документа оригинал.:
✰ Scala (programming language) - Wikipedia ✰
Заголовок документа перевод.:
✰ Scala (язык программирования) — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Scala_(programming_language) ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/c6/35/c678692287ff29c074e1ec8015132e35.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/c6/35/c678692287ff29c074e1ec8015132e35__translat.html ✰
Дата и время сохранения документа:
✰ 11.06.2024 06:02:46 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 3 June 2024, at 21:37 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Scala (язык программирования) — Википедия Jump to content

Скала (язык программирования)

Из Википедии, бесплатной энциклопедии
Скала
Парадигма Мультипарадигмальность : параллельная , функциональная , императивная , объектно-ориентированная.
Разработано Мартин Одерски
Разработчик Лаборатория методов программирования Федеральной политехнической школы Лозанны
Впервые появился 20 января 2004 г .; 20 лет назад ( 20 января 2004 г. )
Стабильная версия
3.4.0 [1]  Отредактируйте это в Викиданных/ 29 февраля 2024 г .; 3 месяца назад ( 29 февраля 2024 г. )
Дисциплина набора текста Предполагаемый , статический , сильный , структурный.
Язык реализации Скала
Платформа Виртуальная машина Java (JVM)
JavaScript ( Scala.js )
LLVM ( Scala Native ) (экспериментальный)
Лицензия Апач 2.0 [2]
Расширения имен файлов .скала, .sc
Веб-сайт www только .скала .org
Под влиянием
Общий Лисп , [3] Эйфель , Эрланг , F# , Хаскелл , [4] Джава , [5] ОКамл , [5] Оз , Пицца , [6] Схема , [5] Smalltalk , стандартный ML [5]
Под влиянием
Ceylon , Chisel , Fantom , F# , C# , Kotlin , Lasso , Red , Flix

Скала ( / ˈ sk ɑː 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]

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

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

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

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

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

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

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

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

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

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

@main   def   main  ()   =   println  (  «Привет, мир!»  ) 

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

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

$ scalac HelloWorld.scala
 

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

$ скала HelloWorld
 

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

Укороченная версия программы «Hello World» на Scala:

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

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

$ scala HelloWorld2.scala
 

Команды также можно вводить непосредственно в интерпретатор Scala, используя опцию -Это :

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

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

$  скала 
  Добро пожаловать в Scala 2.12.2 (64-битная серверная виртуальная машина Java HotSpot(TM), Java 1.8.0_131). 
  Введите выражения для оценки.   Или попробуйте :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: прямое преобразование из Java 

 // импорт не требуется;   scala.math 
 // уже импортирован как `math` 
 def   mathFunction  (  num  :   Int  ):   Int   =  
   var   numSquare  :   Int   =   num  *  num 
   return   (  math  .  cbrt  (  numSquare  )   +   math  .  log  (  numSquare  )). 
      asInstanceOf  [  Int  ] 
// Scala: более идиоматично 
 // Использует вывод типа, опускает оператор return, 
 // использует метод toInt, объявляет неизменяемую 

 импорта   математику  numSquare .   _ 
 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] а не Java List<String>.
  • Вместо псевдотипа void, в Scala есть настоящий одноэлементный класс Unit (см. ниже).

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

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

// Java: 
 публичный   класс   Point   { 
   private   double   x  ,   y  ; 
    public   Point  (  последний   двойной   x  ,   последний   двойной   y  )   { 
     this  .   х   =   х  ; 
      этот  .   у   =   у  ; 
    } 

   Public   Point  ( 
     double   x  ,   double   y  , 
     boolean   addToGrid 
   )   { 
     this  (  x  ,   y  ); 

      if   (  addToGrid  ) 
       сетка  .   addPoint  (  это  ); 
    } 

   Public   Point  ()   { 
     это  (  0.0  ,   0.0  ); 
    } 

   Private   void   addPoint  (  Point   p  )   { 
       x   +=   p  .   Икс  ; 
        у   +=   п  .   й  ; 
    } 

   Общественный   двойной   getX  ()   { 
     возврат   х  ; 
    } 

   Общественный   двойной   getY  ()   { 
     возвращение   y  ; 
    } 

   Double   distanceToPoint  (  конечная   точка   другое  )   { 
     return   distanceBetweenPoints  (  x  ,   y  , 
       other.x  ,  other.y   ;  ) 
    } 

   Частная   статическая   точек   сетка   =   новая   точка  (); 

    static   double   distanceBetweenPoints  ( 
       последний   двойной   x1  ,   последний   двойной   y1  , 
       последний   двойной   x2  ,   последний   двойной   y2 
   )   { 
     return   Math  .   гипот  (  x1   -   x2  ,   y1   -   y2  ); 
    } 
 } 
 Scala 
// Класс   Point  ( 
     var   x  :   Double  ,   var   y  :   Double  , 
     addToGrid  :   Boolean   =   false 
 ): 
   импортировать   Point  .   _ 
  
   def   +=   (  p  :   Точка  )   = 
      x   +=   p  .   Икс 
      у   +=   п  .   y 

   if   (  addToGrid  ) 
     сетка   =   this 

   def   this  (   =   this  (  0.0  ,   0.0  ) 

   def   distanceToPoint  (  other  :   Point  )   = 
     distanceBetweenPoints  (  x  ,   y  ,   other.x  ,  other.y  )   +  val  )  : 

 end   Point 

 object   Point 
   частная   сетка    =   новая   точка  () 

   def   distanceBetweenPoints  (  x1  :   Double  ,   y1  :   Double  , 
       x2  :   Double  ,   y2  :   Double  )   = 
     math  .   гипот  (  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. [30]

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.
  • При вызове методов допускается использование фигурных скобок вместо круглых. Это позволяет реализовать чисто библиотечные реализации новых структур управления. [31] Например, 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   до   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 как метод расширения целых чисел с использованием метода, известного как неявные преобразования. [32] что позволяет добавлять новые методы к существующим типам.)

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

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

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

Функциональные тенденции

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

Примеры:

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

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

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

// Java: 
 char   hexDigit   =   (  char  )(  x   >=   10   ?   x   +   'A'   -   10   :   x   +   '0'  ); 
// Scala: 
 val   hexDigit   =   (  если   x   >=   10   , то   x   +   'A'   -   10   , иначе   x   +   '0'  ).   toChar 

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

Чтобы было понятно, что все функции являются выражениями, даже методы, возвращающие 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 яблок"  .   формат  (  х  ) 

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

def   факториал  (  x  :   Int  ):   Int   = 
   если   x   ==   0   , то   1 
   иначе   x   *   факториал  (  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. vals лишь поверхностно неизменяемы, то есть объект, на который ссылается val, не гарантирует, что он сам по себе будет неизменяемым.

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

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

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

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

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


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

def   факториал  (  n  :   Int  ):   Int   = 
   если   n   ==   0,   то   1 
   иначе   n   *   факториал  (  n   -   1  ) 

Можно оптимизировать для хвостовой рекурсивной версии следующим образом:

@tailrec 
 def   факториал  (  n  :   Int  ,   accum  :   Int  ):   Int   =  
   если   n   ==   0   , то   накапливается 
   иначе   факториал  (  n   -   1  ,   n   *   accum  ) 

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

def   факториал  (  n  :   Int  ):   Int   =  

   @tailrec 
   def   цикл  (  current  :   Int  ,   accum  :   Int  ):   Int   =  
  
     if   n   ==   0   then   accum 
     else   цикл  (  current   -   1  ,   n   *   accum  ) 
  
   цикл  (  n  ,   1  )   // Вызов замыкания с использованием 
  
 конечного   факториала базового случая 

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

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

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

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

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

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

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 заявление:

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

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

val   qsort  :   List  [  Int  ]   =>   List  [  Int  ]   =  
   case   Nil   =>   Nil 
   case   Pivot   ::   Tail   => 
     val   (  меньше  ,   остальное  )   =   Tail  .   раздел  (  _   <   центр  ) 
     qsort  (  меньше  )   :::   центр   ::   qsort  (  отдых  ) 

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

scala  >   qsort  (  Список  (  6  ,  2  ,  5  ,  9  )) 
 res32  :   Список  [  Int  ]   =   Список  (  2  ,   5  ,   6  ,   9  ) 

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

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

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

абстрактный   класс   Window  : 
   // абстрактное 
   определение   draw  () 


 class   SimpleWindow   расширяет   окно  : 
   def   draw  ()  
     println  (  "in SimpleWindow"  ) 
     // рисование базового 
  

 свойства   окна WindowDecoration   расширяет   Window 


 свойство   HorizontalScrollbarDecoration   расширяет   WindowDecoration  : 
   // требуется "абстрактное переопределение" здесь для работы "super()", потому что родительская 
   // функция является абстрактной.   Если бы это было конкретно, обычного «переопределения» было бы достаточно. 
    абстрактное   переопределение   def   draw  ()  
     println  (  «in HorizontalScrollbarDecoration»  ) 
     super  .   draw  ) 
     горизонтальную 
  

 прокрутки   .   теперь   полосу  ( 
   //   рисуем    
    
      draw  () 
     // теперь рисуем вертикальную полосу прокрутки. 
  

 TitleDecoration   расширяет   WindowDecoration   :  абстрактное 
   переопределение   def   draw   (  )  
     println  (  «in TitleDecoration»  ) 
     super  .   draw  () 
     // теперь рисуем строку заголовка 

Переменную можно объявить следующим образом:

val   mywin   =   новое   SimpleWindow   с   вертикальным скроллбаром   с   горизонтальным скроллбаром   с   тайтломдекоратион 

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

в   TitleDecoration 
 в   горизонтальной полосе прокруткиDecoration 
 в   вертикальной полосе прокруткиDecoration 
 в   SimpleWindow 

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

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

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

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

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

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

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

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

объект   MyExtensions  : 
   расширение   (  i  :   Int  ) 
     def   isEven   =   i   %   2   ==   0 
     def   isOdd    =   !   isEven 
 

 импортировать   MyExtensions  .   _    // переносим неявное обогащение в область 
 4  .   isEven    // -> правда 

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

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

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

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

val   echoServer   =   актер  (  новый   акт  : 
   стать  : 
     случай   msg   =>   println  (  «echo»   +   msg  ) 
 ) 

 echoServer   !    "привет" 

Scala также имеет встроенную поддержку параллельного программирования данных в форме параллельных коллекций. [46] интегрирован в стандартную библиотеку начиная с версии 2.9.0.

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

val   urls   =   List  (  "https://scala-lang.org"  ,   "https://github.com/scala/scala"  ) 

 def   fromURL  (  url  :   String  )   =   scala  .   ио  .   Источник  .   fromURL  (  URL  ) 
   .   получитьлинии  ().   mkString  (  "\n"  ) 

 val   t   =   System  .  currentTimeMillis  () 
  URL-адреса  .   пар  .   map  (  fromURL  (  _  ))   // par возвращает параллельную реализацию коллекции 
 println  (  "time: "   +   (  System  .  currentTimeMillis   -   t  )   +   "ms"  ) 

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

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

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

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

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

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

Версия Выпущенный Функции
1.0.0-b2 [53] 8 декабря 2003 г.
1.1.0-b1 [53] 19 февраля 2004 г.
  • scala.Перечисление
  • Лицензия Scala была заменена на пересмотренную лицензию BSD.
1.1.1 [53] 23 марта 2004 г.
  • Поддержка статических внутренних классов Java.
  • Улучшения классов библиотеки для Iterable, Array, xml.Elem, Buffer
1.2.0 [53] 9 июня 2004 г.
  • Взгляды
  • Литералы XML (будут «отброшены в ближайшем будущем и заменены интерполяцией строк XML» [54] )
1.3.0 [53] 16 сентября 2004 г.
  • Поддержка Microsoft .NET
  • Закрытие метода
  • Синтаксис типов для методов без параметров изменен с [] T к => T
1.4.0 [53] 20 июня 2005 г.
  • Атрибуты
  • match ключевое слово заменяет match метод
  • Экспериментальная поддержка типов среды выполнения
2.0 [55] 12 марта 2006 г.
  • Компилятор полностью переписан на Scala.
  • Экспериментальная поддержка дженериков Java
  • implicit и requires ключевые слова
  • match ключевое слово разрешено только инфиксным оператором
  • with соединение допускается только после extends пункт
  • Новые строки могут использоваться в качестве разделителей операторов вместо точек с запятой.
  • Шаблоны соответствия регулярных выражений ограничены только шаблонами последовательностей.
  • For-comprehension допускает определения значений и шаблонов.
  • Параметры класса могут иметь префикс val или var.
  • Частная видимость имеет квалификаторы
2.1.0 [53] 17 марта 2006 г.
  • инструмент sbaz, интегрированный в дистрибутив Scala
  • match ключевое слово заменяет match метод
  • Экспериментальная поддержка типов среды выполнения
2.1.8 [56] 23 августа 2006 г.
  • Защищенная видимость имеет квалификаторы
  • На частные члены класса можно ссылаться из сопутствующего модуля класса и наоборот.
  • Обобщенный неявный поиск
  • Соответствие типизированному шаблону ужесточено для одноэлементных типов.
2.3.0 [57] 23 ноября 2006 г.
  • Функции, возвращающие Unit не нужно явно указывать тип возвращаемого значения
  • Переменные типа и типы различаются при сопоставлении с образцом.
  • All и AllRef переименован в Nothing и Null
2.4.0 [58] 9 марта 2007 г.
  • private и protected модификаторы принимают [this] квалификатор
  • Кортежи можно записать с помощью круглых скобок.
  • Первичный конструктор класса теперь может быть помечен как частный или защищенный.
  • Атрибуты заменены аннотациями с новым синтаксисом.
  • Собственные псевдонимы
  • Операторы можно комбинировать с присваиванием
2.5.0 [59] 2 мая 2007 г.
  • Параметры типа и члены абстрактного типа также могут абстрагироваться от конструкторов типов.
  • Поля объекта могут быть инициализированы до вызова родительских конструкторов.
  • Изменение синтаксиса для понимания
  • Неявные анонимные функции (с подчеркиванием параметров)
  • Сопоставление шаблонов анонимных функций расширено для поддержки любого искусства.
2.6.0 [60] 27 июля 2007 г.
  • Экзистенциальные типы
  • Ленивые значения
  • Структурные типы
2.7.0 [61] 7 февраля 2008 г.
  • Универсальные типы Java, поддерживаемые по умолчанию
  • Расширен функционал кейс-классов
2.8.0 [62] 14 июля 2010 г.
  • Пересмотреть общую, унифицированную и всеобъемлющую структуру для типов коллекций.
  • Тип специализации
  • Именованные аргументы и аргументы по умолчанию
  • Объекты пакета
  • Улучшенные аннотации
2.9.0 [63] 12 мая 2011 г.
  • Параллельные коллекции
  • Потокобезопасный App черта заменяет Application черта
  • DelayedInit черта
  • Улучшения взаимодействия с Java
2.10 [64] 4 января 2013 г.
  • Классы значений [65]
  • Неявные классы [66]
  • Строковая интерполяция [67]
  • Фьючерсы и обещания [68]
  • Динамический и применитьDynamic [69]
  • Зависимые типы методов:
    • def identity(x: AnyRef): x.type = x // the return type says we return exactly what we got
  • Новый эмиттер байт-кода на основе ASM:
    • Может быть нацелен на JDK 1.5, 1.6 и 1.7.
    • По умолчанию генерирует байт-код 1,6.
    • Старый бэкэнд версии 1.5 устарел.
  • Новое средство сопоставления с образцом: переписано с нуля для создания более надежного кода (больше никаких экспоненциальных раздутий).
    • генерация кода и анализ теперь независимы (последний можно отключить с помощью -Xno-patmat-analysis)
  • Улучшения Скаладока
    • Неявные значения (флаг -implicits)
    • Диаграммы (флаг -diagrams, требуется графвиз)
    • Группы (-группы)
  • Модульные возможности языка [70]
  • Параллельные коллекции [71] теперь настраиваются с помощью пользовательских пулов потоков
  • Актёры Akka теперь являются частью дистрибутива
    • scala.actors устарела, и реализация akka теперь включена в дистрибутив.
  • Улучшения производительности
    • Более быстрые вкладыши
    • Сумма диапазона# теперь равна O(1)
  • Обновление библиотеки ForkJoin.
  • Исправления в неизменяемом TreeSet/TreeMap.
  • Улучшения в частичных функциях
  • Добавление ??? и NotImplementedError
  • Добавление классов типов IsTraversableOnce + IsTraversableLike для методов расширения.
  • Устаревания и очистка
  • Устаревший синтаксис чисел с плавающей запятой и восьмеричных литералов
  • Удален scala.dbc.

Экспериментальные возможности

  • Скала-отражение [72]
  • Макросы [73]
2.10.2 [74] 6 июня 2013 г.
2.10.3 [75] 1 октября 2013 г.
2.10.4 [76] 18 марта 2014 г.
2.10.5 [77] 5 марта 2015 г.
2.11.0 [78] 21 апреля 2014 г.
  • Улучшения производительности коллекции
  • Улучшения производительности компилятора
2.11.1 [79] 20 мая 2014 г.
2.11.2 [80] 22 июля 2014 г.
2.11.4 [81] 31 октября 2014 г.
2.11.5 [82] 8 января 2015 г.
2.11.6 [83] 5 марта 2015 г.
2.11.7 [84] 23 июня 2015 г.
2.11.8 [85] 8 марта 2016 г.
2.11.11 [86] 18 апреля 2017 г.
2.11.12 [87] 13 ноября 2017 г.
2.12.0 [88] 3 ноября 2016 г.
2.12.1 [89] 5 декабря 2016 г.
2.12.2 [86] 18 апреля 2017 г.
2.12.3 [90] 26 июля 2017 г.
2.12.4 [91] 17 октября 2017 г.
2.12.5 [92] 15 марта 2018 г.
2.12.6 [93] 27 апреля 2018 г.
2.12.7 [94] 27 сентября 2018 г.
2.12.8 [95] 4 декабря 2018 г.
  • Первый выпуск Scala 2.12 с измененной лицензией на Apache v2.0.
2.12.9 [96] 5 августа 2019 г.
2.12.10 [97] 10 сентября 2019 г.
2.12.11 [98] 16 марта 2020 г.
2.12.12 [99] 13 июля 2020 г.
2.12.13 [100] 12 января 2021 г.
2.12.14 [101] 28 мая 2021 г.
2.12.15 [102] 14 сен 2021 г.
2.12.16 [103] 10 июня 2022 г.
2.12.17 [104] 16 сен 2022 г.
2.12.18 [105] 7 июня 2023 г.
2.13.0 [106] 11 июня 2019 г.
  • Переработана стандартная библиотека коллекций.
  • Литеральные типы
  • Частичная унификация типов
  • Неявное имя
  • Оптимизация компилятора
2.13.1 [107] 18 сентября 2019 г.
2.13.2 [108] 22 апреля 2020 г.
2.13.3 [109] 25 июня 2020 г.
2.13.4 [110] 19 ноября 2020 г.
2.13.5 [111] 22 февраля 2021 г.
2.13.6 [112] 17 мая 2021 г.
2.13.7 [113] 1 ноября 2021 г.
2.13.8 [114] 12 января 2022 г.
2.13.9 [115] 21 сентября 2022 г.
2.13.10 [116] 13 октября 2022 г.
2.13.11 [117] 7 июня 2023 г.
3.0.0 [118] 13 мая 2021 г.
3.1.2 [119] 12 апреля 2022 г.
3.2.2 [120] 30 января 2023 г.
3.3.0 [121] 30 мая 2023 г.

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

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

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

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

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

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

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

Еще в 2013 году, когда Scala существовала в версии 2.10, Технологический радар ThoughtWorks , представляющий собой основанный на мнениях двухгодичный отчет группы старших технологов, [122] рекомендовал использовать Scala в своей категории языков и фреймворков. [123]

В июле 2014 года эта оценка стала более конкретной и теперь относится к «Scala, хорошие части», которая описывается так: «Чтобы успешно использовать Scala, вам необходимо изучить язык и иметь очень четкое мнение о том, какие части являются правильными». для вас, создающих собственное определение Scala, хорошие стороны». [124]

В обзоре Java за 2018 год состояния [125] который собрал данные от 5160 разработчиков по различным темам, связанным с Java, Scala занимает третье место по использованию альтернативных языков на JVM . По сравнению с предыдущим годом опроса, использование Scala среди альтернативных языков JVM упало с 28,4% до 21,5%, обогнав Kotlin , доля которого выросла с 11,4% в 2017 году до 28,8% в 2018 году. Индекс популярности языков программирования, [126] который отслеживает поиск учебных пособий по языку, занял Scala 15-е место в апреле 2018 года с небольшой тенденцией к снижению и 17-е место в январе 2021 года. Это делает Scala третьим по популярности языком на основе JVM после Java и Kotlin , занявших 12-е место.

Рейтинг языков программирования RedMonk , который составляет рейтинг на основе количества проектов GitHub и вопросов, заданных на Stack Overflow , в январе 2021 года поставил Scala на 14-е место. [127] языков второго уровня — впереди Go , PowerShell и Haskell и позади Swift , Objective-C , Typescript и R. Здесь Scala был помещен в группу

ТИОБЕ Индекс [128] Для определения популярности языка программирования используются рейтинги поисковых систем в Интернете и аналогичный подсчет публикаций для определения популярности языка. В сентябре 2021 года он показал Scala на 31-м месте. В этом рейтинге Scala опередила Haskell (38-е место) и Erlang , но уступила Go (14-е место), Swift (15-е место) и Perl (19-е место).

По состоянию на 2022 год Языки на основе JVM, такие как Clojure, Groovy и Scala, имеют высокие рейтинги, но все же значительно менее популярны, чем исходный язык Java , который обычно занимает три первых места. [127] [128]

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

  • В апреле 2009 года Twitter объявил, что перевел большую часть своей серверной части с Ruby на Scala и намерен преобразовать остальную часть. [129]
  • Tesla, Inc. использует Akka со Scala в серверной части виртуальной электростанции Tesla. Таким образом, модель Actor используется для представления и управления устройствами, которые вместе с другими компонентами составляют экземпляр виртуальной электростанции, а Reactive Streams используются для сбора и обработки данных. [130]
  • Apache Kafka реализован в Scala в отношении большей части своего ядра и других важных частей. Он поддерживается и расширяется посредством проекта с открытым исходным кодом и компанией Confluent. [131]
  • Gilt использует Scala и Play Framework . [132]
  • Foursquare использует Scala и Lift . [133]
  • Coursera использует Scala и Play Framework . [134]
  • Apple Inc. использует Scala в некоторых командах наряду с Java и платформой Play. [135] [136]
  • The Guardian . с высокой посещаемостью газеты Веб-сайт Guardian.co.uk [137] объявила в апреле 2011 года о переходе с Java на Scala. [138] [139]
  • В 2014 году газета New York Times сообщила, что ее внутренняя система управления контентом Blackbeard построена с использованием Scala, Akka и Play. [140]
  • Газета Huffington Post начала использовать Scala как часть своей системы доставки контента Athena в 2013 году. [141]
  • Швейцарский банк UBS одобрил Scala для общего производственного использования. [142]
  • LinkedIn использует Scalatra микрофреймворк для реализации своего Signal API. [143]
  • Meetup использует набор инструментов Unfiltered для API реального времени. [144]
  • Помните, что Milk использует набор инструментов Unfiltered, Scala и Akka для общедоступного API и обновлений в реальном времени. [145]
  • Verizon стремится создать «фреймворк следующего поколения» с использованием Scala. [146]
  • Airbnb разрабатывает программное обеспечение для машинного обучения с открытым исходным кодом Aerosolve, написанное на Java и Scala. [147]
  • Zalando перенесла свой технологический стек с Java на Scala и Play. [148]
  • SoundCloud использует Scala для своей серверной части, применяя такие технологии, как Finagle (микросервисы), [149] Ошпаривание и искра (обработка данных). [150]
  • Databricks использует Scala для Apache Spark . платформы больших данных
  • Morgan Stanley широко использует Scala в своих проектах, связанных с финансами и активами. [151]
  • есть команды В Google и Alphabet Inc. , которые используют Scala, в основном благодаря приобретениям, таким как Firebase. [152] и Гнездо. [153]
  • Walmart Canada использует Scala в качестве внутренней платформы. [154]
  • Duolingo использует Scala для своего внутреннего модуля, генерирующего уроки. [155]
  • HMRC использует Scala для многих налоговых заявок правительства Великобритании. [156]
  • M1 Finance использует Scala в качестве внутренней платформы. [157]

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

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

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

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

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

  1. ^ «Скала 3.4.0» .
  2. ^ «Файл уведомления» . Гитхаб . 24 января 2019 г. Проверено 4 декабря 2019 г.
  3. ^ «Скала Макросы» .
  4. ^ Фогус, Майкл (6 августа 2010 г.). «Мартин Одерский возьми(5) в список» . Отправьте больше парамедиков . Проверено 9 февраля 2012 г.
  5. ^ Перейти обратно: а б с д Одерский, Мартин (11 января 2006 г.). «Эксперимент Scala: можем ли мы обеспечить лучшую языковую поддержку для компонентных систем?» (PDF) . Проверено 22 июня 2016 г.
  6. ^ Перейти обратно: а б с д Одерский, Мартин; и другие. (2006). «Обзор языка программирования Scala» (PDF) (2-е изд.). Федеральная политехническая школа Лозанны (EPFL). Архивировано (PDF) из оригинала 9 июля 2020 г.
  7. ^ Одерский, Мартин (2008). Программирование на Scala . Маунтин-Вью, Калифорния: Артима. п. 3. ISBN  9780981531601 . Проверено 12 июня 2014 г.
  8. ^ Уэмплер, Дин; Пейн, Алекс (15 сентября 2009 г.). Программирование на Scala: Масштабируемость = Функциональное программирование + Объекты . О'Рейли Медиа, Инк. с. 7. ISBN  978-1-4493-7926-1 . Проверено 13 мая 2024 г. Создатели Scala на самом деле произносят это слово scah-lah , как итальянское слово, означающее «лестница». Две буквы «а» произносятся одинаково.
  9. ^ Потвин, Паскаль; Бонха, Марио (24 сентября 2015 г.). SDL 2013: Проектирование надежности на основе моделей . Конспекты лекций по информатике. Том. 7916. arXiv : 1509.07326 . дои : 10.1007/978-3-642-38911-5 . ISBN  978-3-642-38910-8 . S2CID   1214469 .
  10. ^ «Часто задаваемые вопросы: совместимость Java» . Scala-lang.org . Проверено 6 февраля 2015 г.
  11. ^ Мартин Одерский (17 июня 2020 г.). Мартин Одерски: Обновление Scala 3 (видео). YouTube. Событие происходит в 36:35–45:08. Архивировано из оригинала 21 декабря 2021 г. Проверено 24 апреля 2021 г.
  12. ^ «Эффект эксп» . скала . Проверено 31 июля 2022 г.
  13. ^ Ловердо, Христос (2010). Шаги в Scala: введение в объектно-функциональное программирование . Издательство Кембриджского университета . п. xiii. ISBN  9781139490948 . Проверено 31 июля 2014 г.
  14. ^ Перейти обратно: а б с д Одерский, Мартин (9 июня 2006 г.). «Краткая история Scala» . Artima.com .
  15. ^ Перейти обратно: а б с д Одерский, М.; Ромпф, Т. (2014). «Объединение функционального и объектно-ориентированного программирования с помощью Scala» . Коммуникации АКМ . 57 (4): 76. дои : 10.1145/2591013 .
  16. ^ Мартин Одерски, «Спецификация языка Scala, версия 2.7»
  17. ^ «Команда Scala выиграла грант ERC» . Проверено 4 июля 2015 г.
  18. ^ «Коммерческая поддержка Scala» . 12 мая 2011 г. Проверено 18 августа 2011 г.
  19. ^ «Почему мы инвестировали в Typesafe: современные приложения требуют современных инструментов» . 12 мая 2011 г. Проверено 8 мая 2018 г.
  20. ^ «Scala с открытым исходным кодом получает коммерческую поддержку» . 12 мая 2011 г. Проверено 9 октября 2011 г.
  21. ^ «Пионер облачных вычислений Мартин Одерски представляет свою новую компанию Typesafe» . 12 мая 2011 г. Проверено 24 августа 2011 г.
  22. ^ «Скала на Android» . Архивировано из оригинала 20 июня 2016 года . Проверено 8 июня 2016 г.
  23. ^ «Scala 2.12.8 теперь доступна!» . 04.12.2018 . Проверено 9 декабря 2018 г.
  24. ^ «Scala Js больше не является экспериментальным | Язык программирования Scala» . Scala-lang.org . Проверено 28 октября 2015 г.
  25. ^ «Релизы · scala-js/Scala-js» . Гитхаб .
  26. ^ Криль, Пол (15 марта 2017 г.). «Уменьшенный вариант Scala разрывает связь с JVM» . Инфомир . Проверено 21 марта 2017 г.
  27. ^ Криль, Пол (11 мая 2016 г.). «Язык Scala приближается к голому железу» . Инфомир .
  28. ^ Удалена серверная часть .net. от paulp · Запрос на извлечение № 1718 · scala/scala · GitHub . Github.com (5 декабря 2012 г.). Проверено 2 ноября 2013 г.
  29. ^ «Начало работы со Scala» . Scala-lang.org . 15 июля 2008 года . Проверено 31 июля 2014 г.
  30. ^ "Дом" . Блог.lostlake.org. Архивировано из оригинала 31 августа 2010 года . Проверено 25 июня 2013 г.
  31. ^ Встроенные структуры управления Scala, такие как if или whileне может быть реализован повторно. Существует исследовательский проект Scala-Virtualized, направленный на снятие этих ограничений: Адриан Мурс, Тиарк Ромпф, Филипп Халлер и Мартин Одерски. Scala-виртуализация . Материалы семинара ACM SIGPLAN 2012 по частичной оценке и манипуляциям с программой , 117–120. Июль 2012.
  32. ^ Перейти обратно: а б «Прокачай мою библиотеку» . Артима.com. 09.10.2006 . Проверено 25 июня 2013 г.
  33. ^ «Выражения | Scala 2.13» . scala-lang.org . Проверено 24 мая 2021 г.
  34. ^ «Изменяемые и неизменяемые коллекции — документация Scala» . Проверено 30 апреля 2020 г.
  35. ^ «Коллекции — Конкретные неизменяемые классы коллекций — Документация Scala» . Проверено 4 июля 2015 г.
  36. ^ Догерти, Рич. «Блог Рича Догерти» . Проверено 4 июля 2015 г.
  37. ^ «TailCalls — API стандартной библиотеки Scala (Scaladoc) 2.10.2 — scala.util.control.TailCalls» . Scala-lang.org . Проверено 25 июня 2013 г.
  38. ^ Перейти обратно: а б «Системы типов Java и Scala ненадежны» (PDF) .
  39. ^ Джарруссо, Паоло Г. (2013). «Уточните свои запросы коллекции для обеспечения модульности и скорости!». Материалы 12-й ежегодной международной конференции по аспектно-ориентированной разработке программного обеспечения . АКМ. arXiv : 1210.6284 . Бибкод : 2012arXiv1210.6284G . Также известен как шаблон «Прокачай мою библиотеку».
  40. ^ Гилберт, Клинт (15 ноября 2011 г.). «Что является наивысшим приоритетом для успеха Scala в корпоративном мире (должно быть в дебатах по Scala?)?» . Scala-lang.org . Проверено 8 мая 2019 г.
  41. ^ «Должны ли мы «обогащать» или «прокачивать» библиотеки Scala?» . stackexchange.com . 17 июня 2013 года . Проверено 15 апреля 2016 г.
  42. ^ Неявные классы были введены в Scala 2.10, чтобы сделать расширения методов более краткими. Это эквивалентно добавлению метода implicit def IntPredicate(i: Int) = new IntPredicate(i). Класс также можно определить как implicit class IntPredicates(val i: Int) extends AnyVal { ... }, создающий так называемый класс значений , также представленный в Scala 2.10. Затем компилятор исключит фактические экземпляры и вместо этого создаст статические методы, что позволит методам расширения практически не нагружать производительность.
  43. ^ Что такое? , Согласно онлайн-документации
  44. ^ Суфрин, Бернар (2008). «Взаимодействие с объектами Scala». В Уэлче, штат Пенсильвания; Степни, С.; Поляк, КВС; Барнс, ФРМ; Макьюэн, А.А.; Стайлз, GS; Броэнинк, Дж. Ф.; Сэмпсон, AT (ред.). Архитектуры процессов связи 2008: WoTUG-31 (PDF) . ИОС Пресс. ISBN  978-1586039073 .
  45. ^ Ян, Кей. «Скала Тур» . Проверено 4 июля 2015 г.
  46. ^ «Parallelcollections — Обзор — Документация Scala» . Docs.scala-lang.org . Проверено 25 июня 2013 г.
  47. ^ Ян, Кей. «Скала Тур» . Проверено 4 июля 2015 г.
  48. ^ Изучение параллельного программирования в Scala , Александр Прокопец, Packt Publishing
  49. ^ Копс, Миша (13 января 2013 г.). «Краткое введение в ScalaTest» . hascode.com . Проверено 7 ноября 2014 г.
  50. ^ Нильссон, Рикард (17 ноября 2008 г.). «СкалаЧек 1.5» . Scala-lang.org . Проверено 7 ноября 2014 г.
  51. ^ «Создание веб-приложений с использованием Scala и Play Framework» . www.workwithplay.com . 22 мая 2013 г. Проверено 7 ноября 2014 г.
  52. ^ Мясник, Пол (4 июня 2012 г.). «Предварительный выпуск ScalaMock 3.0» . paulbutcher.com . Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
  53. ^ Перейти обратно: а б с д Это ж г «История изменений Scala» . Scala-lang.org . Архивировано из оригинала 9 октября 2007 г.
  54. ^ «Удален: XML-литералы» . dotty.epfl.ch . Проверено 05 марта 2021 г.
  55. ^ «Изменения в версии 2.0 (12 марта 2006 г.)» . Scala-lang.org . 12 марта 2006 г. Проверено 7 ноября 2014 г.
  56. ^ «Изменения в версии 2.1.8 (23 августа 2006 г.)» . Scala-lang.org . 23 августа 2006 г. Проверено 7 ноября 2014 г.
  57. ^ «Изменения в версии 2.3.0 (23 ноября 2006 г.)» . Scala-lang.org . 23 ноября 2006 г. Проверено 7 ноября 2014 г.
  58. ^ «Изменения в версии 2.4.0 (09 марта 2007 г.)» . Scala-lang.org . 9 марта 2007 г. Проверено 7 ноября 2014 г.
  59. ^ «Изменения в версии 2.5 (02 мая 2007 г.)» . Scala-lang.org . 2 мая 2007 г. Проверено 7 ноября 2014 г.
  60. ^ «Изменения в версии 2.6 (27 июля 2007 г.)» . Scala-lang.org . 27 июня 2007 г. Проверено 7 ноября 2014 г.
  61. ^ «Изменения в версии 2.7.0 (07 февраля 2008 г.)» . Scala-lang.org . 07 февраля 2008 г. Проверено 7 ноября 2014 г.
  62. ^ «Изменения в версии 2.8.0 (14 июля 2010 г.)» . Scala-lang.org . 10 июля 2010 г. Проверено 7 ноября 2014 г.
  63. ^ «Изменения в версии 2.9.0 (12 мая 2011 г.)» . Scala-lang.org . 12 мая 2011 г. Проверено 7 ноября 2014 г.
  64. ^ «Изменения в версии 2.10.0» . Scala-lang.org . 04.01.2013 . Проверено 7 ноября 2014 г.
  65. ^ Харра, Марк. «Классы ценностей и универсальные черты» . Scala-lang.org . Проверено 7 ноября 2014 г.
  66. ^ Суэрет, Джош. «SIP-13 — Неявные классы» . Scala-lang.org . Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
  67. ^ Суэрет, Джош. «Строковая интерполяция» . Scala-lang.org . Проверено 7 ноября 2014 г.
  68. ^ Халлер, Филипп; Прокопец, Александр. «Будущее и обещания» . Scala-lang.org . Проверено 7 ноября 2014 г.
  69. ^ «СИП-17 – Тип Динамический» . Scala-lang.org . Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
  70. ^ «SIP-18 — Модуляция возможностей языка» . Scala-lang.org . Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
  71. ^ Прокопец, Александр; Миллер, Хизер. «Параллельные коллекции» . Scala-lang.org . Проверено 7 ноября 2014 г.
  72. ^ Миллер, Хизер; Бурмако, Евгений. «Обзор отражений» . Scala-lang.org . Проверено 7 ноября 2014 г.
  73. ^ Бурмако, Евгений. «Макросы определения» . Scala-lang.org . Проверено 7 ноября 2014 г.
  74. ^ «Scala 2.10.2 теперь доступна!» . Scala-lang.org . 06.06.2013. Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
  75. ^ «Scala 2.10.3 теперь доступна!» . Scala-lang.org . 01.10.2013. Архивировано из оригинала 08.11.2014 . Проверено 7 ноября 2014 г.
  76. ^ «Scala 2.10.4 теперь доступна!» . Scala-lang.org . 18 марта 2014 г. Проверено 7 января 2015 г.
  77. ^ «Scala 2.10.5 теперь доступна!» . Scala-lang.org . 04.03.2015 . Проверено 23 марта 2015 г.
  78. ^ «Scala 2.11.0 теперь доступна!» . Scala-lang.org . 21 апреля 2014 г. Проверено 7 ноября 2014 г.
  79. ^ «Scala 2.11.1 теперь доступна!» . Scala-lang.org . 20 мая 2014 г. Проверено 7 ноября 2014 г.
  80. ^ «Scala 2.11.2 теперь доступна!» . Scala-lang.org . 22 июля 2014 г. Проверено 7 ноября 2014 г.
  81. ^ «Scala 2.11.4 теперь доступна!» . Scala-lang.org . 30 октября 2014 г. Проверено 7 ноября 2014 г.
  82. ^ «Scala 2.11.5 теперь доступна!» . Scala-lang.org . 08.01.2015 . Проверено 22 января 2015 г.
  83. ^ «Scala 2.11.6 теперь доступна!» . Scala-lang.org . 05.03.2015 . Проверено 12 марта 2015 г.
  84. ^ «Scala 2.11.7 теперь доступна!» . Scala-lang.org . 23 июня 2015 г. Проверено 3 июля 2015 г.
  85. ^ «Scala 2.11.8 теперь доступна!» . Scala-lang.org . 08.03.2016 . Проверено 9 марта 2016 г.
  86. ^ Перейти обратно: а б «Три новых релиза и еще больше GitHub добра!» . Scala-lang.org . 18 апреля 2017 г. Проверено 19 апреля 2017 г.
  87. ^ «Обновление безопасности: 2.12.4, 2.11.12, 2.10.7 (CVE-2017-15288)» . Scala-lang.org . 13.11.2017 . Проверено 4 мая 2018 г.
  88. ^ «Scala 2.12.0 теперь доступна!» . Scala-lang.org . 03.11.2016 . Проверено 8 января 2017 г.
  89. ^ «Scala 2.12.1 теперь доступна!» . Scala-lang.org . 05.12.2016 . Проверено 8 января 2017 г.
  90. ^ «Scala 2.12.3 теперь доступна!» . Scala-lang.org . 26 июля 2017 г. Проверено 16 августа 2017 г.
  91. ^ «Scala 2.12.4 теперь доступна!» . Scala-lang.org . 18 октября 2017 г. Проверено 26 октября 2017 г.
  92. ^ «Scala 2.12.5 теперь доступна!» . Scala-lang.org . 15 марта 2018 г. Проверено 20 марта 2018 г.
  93. ^ «Scala 2.12.6 теперь доступна!» . Scala-lang.org . 27 апреля 2018 г. Проверено 4 мая 2018 г.
  94. ^ «Scala 2.12.7 теперь доступна!» . Scala-lang.org . 27 сентября 2018 г. Проверено 9 октября 2018 г.
  95. ^ «Scala 2.12.8 теперь доступна!» . Scala-lang.org . 04.12.2018 . Проверено 9 декабря 2018 г.
  96. ^ «Scala 2.12.9 теперь доступна!» . Scala-lang.org . 05.08.2019 . Проверено 20 января 2021 г.
  97. ^ «Scala 2.12.10 теперь доступна!» . Scala-lang.org . 10 сентября 2019 г. Проверено 20 января 2021 г.
  98. ^ «Scala 2.12.11 теперь доступна!» . Scala-lang.org . 16 марта 2020 г. Проверено 20 января 2021 г.
  99. ^ «Scala 2.12.12 теперь доступна!» . Scala-lang.org . 13 июля 2020 г. Проверено 20 января 2021 г.
  100. ^ «Scala 2.12.13 теперь доступна!» . Scala-lang.org . 12 января 2021 г. Проверено 20 января 2021 г.
  101. ^ «Scala 2.12.14 теперь доступна!» . Scala-lang.org . 28 мая 2021 г. Проверено 15 апреля 2022 г.
  102. ^ «Scala 2.12.15 теперь доступна!» . Scala-lang.org . 14 сентября 2021 г. Проверено 19 июня 2022 г.
  103. ^ «Scala 2.12.16 теперь доступна!» . Scala-lang.org . 10 июня 2022 г. Проверено 19 июня 2022 г.
  104. ^ «Scala 2.12.17 теперь доступна!» . Scala-lang.org . 10 июня 2022 г. Проверено 16 сентября 2022 г.
  105. ^ «Scala 2.12.18 теперь доступна!» . Scala-lang.org . 10 июня 2022 г. Проверено 7 июня 2023 г.
  106. ^ «Scala 2.13.0 теперь доступна!» . Scala-lang.org . 11.06.2019 . Проверено 17 июня 2018 г.
  107. ^ «Scala 2.13.1 теперь доступна!» . Scala-lang.org . 18 сентября 2019 г. Проверено 20 января 2021 г.
  108. ^ «Scala 2.13.2 теперь доступна!» . Scala-lang.org . 22 апреля 2020 г. Проверено 20 января 2021 г.
  109. ^ «Scala 2.13.3 теперь доступна!» . Scala-lang.org . 25 июня 2020 г. Проверено 20 января 2021 г.
  110. ^ «Scala 2.13.4 теперь доступна!» . Scala-lang.org . 19.11.2020 . Проверено 20 января 2021 г.
  111. ^ «Scala 2.13.5 теперь доступна!» . Scala-lang.org . 2021-02-22 . Проверено 26 февраля 2021 г.
  112. ^ «Scala 2.13.6 теперь доступна!» . Scala-lang.org . 17 мая 2021 г. Проверено 15 апреля 2022 г.
  113. ^ «Scala 2.13.7 теперь доступна!» . Scala-lang.org . 01.11.2021 . Проверено 15 апреля 2022 г.
  114. ^ «Scala 2.13.8 теперь доступна!» . Scala-lang.org . 12 января 2022 г. Проверено 15 апреля 2022 г.
  115. ^ «Scala 2.13.9 теперь доступна!» . Scala-lang.org . 21 сентября 2022 г. Проверено 28 августа 2023 г.
  116. ^ «Scala 2.13.10 теперь доступна!» . Scala-lang.org . 13 октября 2022 г. Проверено 28 августа 2023 г.
  117. ^ «Scala 2.13.11 теперь доступна!» . Scala-lang.org . 07.06.2023 . Проверено 28 августа 2023 г.
  118. ^ «Скала 3 уже здесь!» . Scala-lang.org . 14 мая 2021 г. Проверено 26 мая 2021 г.
  119. ^ «Скала 3.1.2» . Scala-lang.org . 12 апреля 2022 г. Проверено 19 июня 2022 г.
  120. ^ «Скала 3.2.2» . Scala-lang.org . 30 января 2023 г. Проверено 28 августа 2023 г.
  121. ^ «Скала 3.3.0» . Scala-lang.org . 30 мая 2023 г. Проверено 28 августа 2023 г.
  122. ^ «Часто задаваемые вопросы о технологических радарах ThinkWorks» .
  123. ^ «ThoughtWorks Technology Radar, МАЙ 2013 г.» (PDF) .
  124. ^ «Скала, хорошие стороны» .
  125. ^ «Состояние Явы в 2018 году» .
  126. ^ «Индекс популярности языков программирования» .
  127. ^ Перейти обратно: а б О'Грейди, Стивен (1 марта 2021 г.). «Рейтинг языков программирования RedMonk: январь 2021 г.» . РедМонк .
  128. ^ Перейти обратно: а б «Индекс TIOBE за май 2021 года» .
  129. ^ Грин, Кейт (1 апреля 2009 г.). «Секрет роста Twitter: как новый язык веб-программирования помогает компании справиться с растущей популярностью» . Обзор технологий . Массачусетский технологический институт . Проверено 6 апреля 2009 г.
  130. ^ Брек, Колин; Линк, Перси (23 марта 2020 г.). «Виртуальная электростанция Тесла (архитектура и дизайн)» . Проверено 28 марта 2023 г.
  131. ^ «Исходный код Apache Kafka на GitHub» . Фонд программного обеспечения Apache . Проверено 29 марта 2023 г.
  132. ^ «Играйте в Framework, Akka и Scala в Gilt Groupe» . Изгиб света. 15 июля 2013 года . Проверено 16 июля 2016 г.
  133. ^ «Скала, лифт и будущее» . Архивировано из оригинала 13 января 2016 года . Проверено 4 июля 2015 г.
  134. ^ Саэта, Бреннан (17 февраля 2014 г.). «Почему мы любим Scala на Coursera» . Курсера Инжиниринг . Проверено 21 сентября 2023 г.
  135. ^ «Премьер-министр Apple по инженерным вопросам Джаррод Неттлс в Твиттере» . Джаррод Неттлз . Проверено 11 марта 2016 г.
  136. ^ «30 вакансий Scala в Apple» . Элвин Александр . Проверено 11 марта 2016 г.
  137. ^ Дэвид Рид и Таня Тейшейра (26 февраля 2010 г.). «Готовы ли люди платить за онлайн-новости?» . Би-би-си . Проверено 28 февраля 2010 г.
  138. ^ «Переход Guardian с Java на Scala» . Хейзе онлайн . 05 апреля 2011 г. Проверено 5 апреля 2011 г.
  139. ^ «Guardian.co.uk Переход с Java на Scala» . InfoQ.com. 04.04.2011 . Проверено 5 апреля 2011 г.
  140. ^ Рой, Суман; Сундаресан, Кришна (13 мая 2014 г.). «Создание Blackbeard: система синдикации на базе Play, Scala и Akka» . Нью-Йорк Таймс . Проверено 20 июля 2014 г.
  141. ^ Павли, Джон (11 августа 2013 г.). «Краткий обзор: HuffPost обеспечивает совместную работу в отделе новостей в режиме реального времени» . Хаффингтон Пост . Проверено 20 июля 2014 г.
  142. ^ Бинсток, Эндрю (14 июля 2011 г.). «Интервью с Мартином Одерски из Scala» . Журнал доктора Добба . Проверено 10 февраля 2012 г.
  143. ^ Синодинос, Дионисий Г. (11 октября 2010 г.). «Сигнал LinkedIn: пример использования Scala, JRuby и Voldemort» . ИнфоQ .
  144. ^ «Реальные встречи заслуживают API, работающих в реальном времени» .
  145. ^ «В веб-приложении Remember The Milk появляется обновление в режиме реального времени» .
  146. ^ «ЧТО ТАКОЕ СКАЛА» . 8 марта 2023 г. Проверено 17 марта 2023 г.
  147. ^ Новет, Иордания (04 июня 2015 г.). «Airbnb анонсирует Aerosolve, пакет программного обеспечения для машинного обучения с открытым исходным кодом» . Проверено 9 марта 2016 г.
  148. ^ Копс, Александр (14 декабря 2015 г.). «Zalando Tech: от Java до Scala менее чем за три месяца» . Проверено 9 марта 2016 г.
  149. ^ Кальсадо, Фил (13 июня 2014 г.). «Создание продуктов в SoundCloud — Часть III: Микросервисы в Scala и Finagle» . Проверено 9 марта 2016 г.
  150. ^ «Исследование примеров клиентов: SoundCloud» . Компания Concurrent Inc. 18 ноября 2014 г. Проверено 9 марта 2016 г.
  151. ^ Scala в Morgan Stanley (видео). Навыки имеют значение. 03.12.2015 . Проверено 11 марта 2016 г.
  152. ^ Грег Солтис (3 декабря 2015 г.). SF Scala, Грег Солтис: Высокопроизводительные сервисы в Scala (видео). Навыки имеют значение. Архивировано из оригинала 21 декабря 2021 г. Проверено 11 марта 2016 г.
  153. ^ Ли Майдолл. «Вакансии Scala в Nest» . Проверено 11 марта 2016 г.
  154. ^ Нурун. «Нурун запускает обновленную транзакционную платформу совместно с Walmart Canada» . Проверено 11 декабря 2013 г.
  155. ^ Хори, Андре К. (31 января 2017 г.). «Переписывание движка Duolingo на Scala» . Проверено 03 февраля 2017 г.
  156. ^ «Репозиторий HMRC GitHub» . Гитхаб .
  157. ^ «Знакомьтесь: M1 Finance, золотой спонсор ScalaCon» . СкалаКон . Проверено 2 сентября 2023 г.
  158. ^ Хейл, Кода (29 ноября 2011 г.). «Остальная часть истории» . codahale.com . Проверено 7 ноября 2013 г.
  159. ^ Крикорян, Раффи (17 марта 2015 г.). Конференция O'Reilly по архитектуре программного обеспечения 2015. Полный сборник видео: Реструктуризация архитектуры на лету - Раффи Крикорян - Часть 3 (видео). О'Рейли Медиа. Событие происходит в 4:57 . Проверено 8 марта 2016 г. Что я бы сделал по-другому четыре года назад, так это использовал бы Java, а не Scala в рамках этой переписывания. [...] инженеру потребуется два месяца, прежде чем он сможет полностью продуктивно начать писать код Scala. [ постоянная мертвая ссылка ]
  160. ^ Скотт, Кевин (11 марта 2015 г.). «Избавляется ли LinkedIn от Scala?» . quora.com . Проверено 25 января 2016 г.
  161. ^ «Chisel: создание оборудования на встроенном языке Scala» . APSIRE Калифорнийского университета в Беркли . Проверено 27 мая 2020 г.

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

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: C678692287FF29C074E1EC8015132E35__1717439820
URL1:https://en.wikipedia.org/wiki/Scala_(programming_language)
Заголовок, (Title) документа по адресу, URL1:
Scala (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)