Scala (бағдарламалау тілі) - Scala (programming language)

Скала
Scala-full-color.svg
ПарадигмаМультипарадигма: қатарлас, функционалды, императивті, объектіге бағытталған
ЖобалағанМартин Одерский
ӘзірлеушіБағдарламалау әдістері зертханасы Лозаннадағы École политехникасы
Бірінші пайда болды20 қаңтар 2004 ж; 16 жыл бұрын (2004-01-20)
Тұрақты шығарылым
2.13.4 / 19 қараша 2020; 17 күн бұрын (2020-11-19)[1]
Пәнді теруҚорытынды, статикалық, күшті, құрылымдық
Іске асыру тіліСкала
Платформа
ЛицензияApache лицензиясы 2.0[2]
Файл атауының кеңейтімдері.scala, .sc
Веб-сайтwww.scala-lang.org
Әсер еткен
Жалпы Лисп,[3] Эйфель, Эрланг, Хаскелл,[4] Java,[5] OCaml,[5] Oz, Пицца,[6] Схема,[5] Smalltalk, Стандартты ML[5]
Әсер етті
Цейлон, Fantom, F #, Котлин, Лассо, Қызыл

Скала (/ˈскɑːлɑː/ SKAH-lah )[7] Бұл жалпы мақсаттағы бағдарламалау тілі екеуіне де қолдау көрсету объектіге бағытталған бағдарламалау және функционалды бағдарламалау. Тіл мықты статикалық типтік жүйе. Қысқа етіп жасалынған,[8] көптеген Scala жобалық шешімдерін шешуге бағытталған Java-ны сынау.[6]

Scala бастапқы коды компиляциялауға арналған Java байт коды, нәтижесінде орындалатын код а-да жұмыс істейді Java виртуалды машинасы. Scala қамтамасыз етеді тілдік өзара үйлесімділік бірге Java, сондықтан екі тілде де жазылған кітапханаларға тікелей Scala немесе Java кодтарында сілтеме жасалуы мүмкін.[9] Java сияқты, Scala да солай объектіге бағытталған және қолданады бұйра-брекет синтаксисі еске түсіреді C бағдарламалау тілі. Java-дан айырмашылығы, Scala көптеген ерекшеліктерге ие функционалды бағдарламалау сияқты тілдер Схема, Стандартты ML және Хаскелл, оның ішінде карри, өзгермейтіндігі, жалқау бағалау, және үлгілерді сәйкестендіру. Ол сондай-ақ қолдайтын жетілдірілген типті жүйеге ие мәліметтердің алгебралық түрлері, ковариация және қайшылық, жоғары ретті типтер (бірақ жоқ жоғары дәрежелі түрлері ), және белгісіз түрлері. Java-да жоқ Scala-ның басқа ерекшеліктеріне мыналар жатады оператордың шамадан тыс жүктелуі, қосымша параметрлер, көрсетілген параметрлер, және шикі жіптер. Керісінше, Java-ның Scala-да емес ерекшелігі тексерілген ерекшеліктер, бұл даулы болып шықты.[10]

Скала атауы - бұл портманто ауқымды және тіл, ол өз пайдаланушыларының сұраныстарымен өсуге арналғанын білдіреді.[11]

Тарих

Scala дизайны 2001 жылы басталды École Polytechnique Fédérale de Lozanne (EPFL) (дюйм) Лозанна, Швейцария ) арқылы Мартин Одерский. Функционалды бағдарламалау және. Идеяларын біріктіретін бағдарламалау тілі - шұңқырдағы жұмысынан кейін Петри торлары.[12] Одерский бұрын жұмыс істеді Жалпы Java, және javac, Sun-дің Java компиляторы.[12]

2003 жылдың соңында ішкі шығарылымнан кейін Scala 2004 жылдың басында көпшілікке жарияланды Java платформасы,[13][6][12][14] Екінші нұсқасы (v2.0) 2006 жылдың наурызында пайда болды.[6]

2011 жылдың 17 қаңтарында Scala командасы бесжылдық 2,3 миллион еуродан астам ғылыми грантты жеңіп алды Еуропалық зерттеу кеңесі.[15] 2011 жылы 12 мамырда Одерский және оның серіктестері Typesafe Inc. (кейінірек өзгертілді) іске қосты Lightbend Inc. ), Scala үшін коммерциялық қолдау, оқыту және қызмет көрсететін компания. Typesafe 2011 жылы 3 миллион доллар инвестиция алды Greylock серіктестері.[16][17][18][19]

Платформалар мен лицензия

Scala жүгіреді Java платформасы (Java виртуалды машинасы ) бармен үйлесімді Java бағдарламалар.[13] Қалай Android қосымшалар әдетте Java тілінде жазылады және Java байт-кодынан аударылады Дальвик оралған кезде байт коды (оны орнату кезінде жергілікті машиналық кодқа аударуға болады), Scala-дың Java үйлесімділігі оны Android-ті дамытуда жақсы үйлестіреді, сондықтан функционалды тәсілге басымдық берілген.[20]

Scala бағдарламалық жасақтаманың, оның ішінде компилятор мен кітапхананың тарату анықтамалық нұсқасы астында шығарылады Apache лицензиясы.[21]

Басқа компиляторлар мен мақсаттар

Scala.js - бұл веб-шолғыштарда жұмыс істей алатын Scala бағдарламаларын жазуға мүмкіндік беретін, JavaScript-ке жинақталатын Scala компиляторы. Node.js.[22] Компилятор 2013 жылдан бері дамып келеді, 2015 жылы эксперименттік емес деп жарияланды (v0.6). V1.0.0-M1 нұсқасы 2018 жылғы маусымда шығарылды. 2020 жылдың қыркүйегінде ол 1.1.1 нұсқасында.[23]

Scala Native - бұл Scala құрастырушы бағытталған LLVM пайдаланатын жеңіл басқарылатын жұмыс уақытын пайдаланатын орындалатын кодты құру үшін компилятор инфрақұрылымы Боем қоқыс жинаушы. Жобаны Денис Шабалин басқарады және алғашқы шығарылымы 0,1, 2017 жылғы 14 наурызда басталды. Scala Native-ді дамыту 2015 жылдан басталды, ол жылдамырақ дәл қазір жинау JVM үшін кодтың бастапқы жұмыс уақытының компиляциясын алып тастау, сонымен қатар жергілікті процедураларға тікелей қоңырау шалу мүмкіндігін беру.[24][25]

Бағытталған Scala компиляторы .NET Framework және оның Жалпы тілдік жұмыс уақыты 2004 жылдың маусымында шығарылды,[12] бірақ 2012 жылы ресми түрде тоқтатылды.[26]

Мысалдар

«Hello World» мысалы

The Сәлем әлем бағдарламасы Scala-да жазылған келесі түрге ие:

 объект Сәлем Әлем ұзарады Қолданба {   println(«Сәлем Әлем!») }

Айырмашылығы Java-ға арналған Hello World қосымшасы, сынып декларациясы жоқ және статикалық ештеңе де жарияланбаған; а синглтон нысаны бірге жасалған объект орнына кілт сөз қолданылады.

Бағдарлама файлда сақталған кезде HelloWorld.scala, пайдаланушы оны келесі пәрменмен құрастырады:

$ scalac HelloWorld.scala

және оны іске қосады

$ scala HelloWorld

Бұл Java кодын құру және іске қосу процесіне ұқсас. Шынында да, Scala құрастыру және орындау моделі Java-мен бірдей, оны Java құрастыру құралдарымен үйлесімді етеді. Apache Ant.

«Hello World» Scala бағдарламасының қысқаша нұсқасы:

println(«Сәлем Әлем!»)

Scala интерактивті қабықшаны және сценарийлерді қолдауды қамтиды.[27] Атты файлда сақталды HelloWorld2.scala, мұны сценарий ретінде іске қосуға болады:

$ scala HelloWorld2.scala

Пәрмендерді Scala интерпретаторына опцияны қолдану арқылы да енгізуге болады :

$ scala  'println («Сәлем, Әлем!»)'

Өрнектерді интерактивті түрде енгізуге болады REPL:

$ қабыршақScala 2.12.2-ке қош келдіңіз (Java HotSpot (TM) 64 биттік сервер VM, Java 1.8.0_131).Бағалау үшін өрнектерді теріп жазыңыз. Немесе көріңіз: көмектесіңіз.scala> Тізім (1, 2, 3) .map (x => x * x)res0: Тізім [Int] = Тізім (1, 4, 9)scala>

Негізгі мысал

Келесі мысал Java мен Scala синтаксисінің айырмашылықтарын көрсетеді:

// Java:int mathFunction(int сан) {    int numSquare = сан*сан;    қайту (int) (Математика.cbrt(numSquare) +      Математика.журнал(numSquare));}
// Scala: Java-дан тікелей түрлендіру// импорт қажет емес; scala.math// «математика» ретінде импортталғандеф mathFunction(сан: Int): Int = {  var numSquare: Int = сан*сан  қайту (математика.cbrt(numSquare) + математика.журнал(numSquare)).    asInstanceOf[Int]}
// Scala: көп идиомалық// типтік қорытынды қолданады, `return` операторынан шығады,// `toInt` әдісін қолданады, numSquare өзгермейтін деп жариялайдыимпорт математика._деф mathFunction(сан: Int) = {  вал numSquare = сан*сан  (cbrt(numSquare) + журнал(numSquare)).toInt}

Бұл кодтағы кейбір синтаксистік айырмашылықтар:

  • Scala операторына нүкте қоюды қажет етпейді.
  • Құнның түрлері бас әріппен жазылады: Int, Double, Boolean орнына int, қос, логикалық.
  • Параметр және қайтару түрлері келесідей болады Паскаль, орнына бұрынғыдай емес C.
  • Әдістердің алдында болуы керек деф.
  • Жергілікті немесе сыныптық айнымалылардың алдында тұруы керек вал (белгісін көрсетеді өзгермейтін айнымалы) немесе var (а көрсетеді өзгеретін айнымалы).
  • The қайту оператор функцияда қажет емес (рұқсат етілгенімен); соңғы орындалған оператордың немесе өрнектің мәні әдетте функцияның мәні болып табылады.
  • Java операторының орнына (Түр) foo, Scala қолданады foo.asInstanceOf [Түр], немесе сияқты мамандандырылған функция екі еселенген немесе toInt.
  • Java-ның орнына импорт foo. *;, Scala қолданады импорттау.
  • Функция немесе әдіс foo () деп те атауға болады ақымақ; әдіс thread.send (signo) деп те атауға болады жіп жіберу; және әдіс foo.toString () деп те атауға болады foo toString.

Бұл синтаксистік релаксациялар қолдау көрсетуге арналған арнайы домендерге арналған тілдер.

Басқа негізгі синтаксистік айырмашылықтар:

  • Массивтік сілтемелер функционалдық шақырулар сияқты жазылады, мысалы. массив (i) гөрі массив [i]. (Ішкі жағынан Scala-да біріншісі массивке кеңейеді.apply (i) сілтемені қайтарады)
  • Жалпы типтер мысалы жазылады. Тізім [жол] Java-дан гөрі <Жол> тізімі.
  • Жалған типтің орнына жарамсыз, Scala нақты бар синглтон класы Бірлік (төменде қараңыз).

Сыныптармен мысал

Келесі мысал Java мен Scala кластарының анықтамасын қарама-қарсы қояды.

// Java:қоғамдық сынып Нұсқа {  жеке ақтық екі есе х, ж;  қоғамдық Нұсқа(ақтық екі есе х, ақтық екі есе ж) {    бұл.х = х;    бұл.ж = ж;  }  қоғамдық Нұсқа(    ақтық екі есе х, ақтық екі есе ж,    ақтық логикалық addToGrid  ) {    бұл(х, ж);    егер (addToGrid)      тор.қосу(бұл);  }  қоғамдық Нұсқа() {    бұл(0.0, 0.0);  }  қоғамдық екі есе getX() {    қайту х;  }  қоғамдық екі есе getY() {    қайту ж;  }  екі есе қашықтықToPoint(ақтық Нұсқа басқа) {    қайту қашықтықBetweenNoints(х, ж,      басқа.х, басқа.ж);  }  жеке статикалық Тор тор = жаңа Тор();  статикалық екі есе қашықтықBetweenNoints(      ақтық екі есе x1, ақтық екі есе y1,      ақтық екі есе x2, ақтық екі есе y2  ) {    қайту Математика.гипот(x1 - x2, y1 - y2);  }}
// Scalaсынып Нұсқа(    вал х: Қосарланған, вал ж: Қосарланған,    addToGrid: Буль = жалған) {  импорт Нүкте._  егер (addToGrid)    тор.қосу(бұл)  деф бұл() = бұл(0.0, 0.0)  деф қашықтықToPoint(басқа: Нұсқа) =    қашықтықBetweenNoints(х, ж, басқа.х, басқа.ж)}объект Нұсқа {  жеке вал тор = жаңа Тор()  деф қашықтықBetweenNoints(x1: Қосарланған, y1: Қосарланған,      x2: Қосарланған, y2: Қосарланған) = {    математика.гипот(x1 - x2, y1 - y2)  }}

Жоғарыда келтірілген код Java мен Scala-ның кластармен жұмыс жасауының арасындағы кейбір тұжырымдамалық айырмашылықтарды көрсетеді:

  • Scala-да статикалық айнымалылар немесе әдістер жоқ. Оның орнына ол бар синглтон нысандары, бұл мәні тек бір данадан тұратын сыныптар. Singleton нысандары пайдалану туралы жарияланады объект орнына сынып. Статикалық айнымалылар мен әдістерді синглтон объектісіне класс атауымен бірдей атпен орналастыру кең таралған, ол кейіннен серіктес объект.[13] (Singleton объектісі үшін негізгі сыныпта a бар $ қосылды. Демек, үшін Foo класы серіктес объектімен объект Foo, сорғыштың астында сынып бар Foo $ құрамында серіктес объектінің коды бар және осы кластың бір объектісі құрылады синглтон үлгісі.)
  • Конструктор параметрлерінің орнына Scala ие класс параметрлері, олар функцияға ұқсас параметрлерге ұқсас классқа орналастырылады. Бірге жарияланған кезде вал немесе var модификатор, өрістер де сол атпен анықталады және класс параметрлерінен автоматты түрде инициализацияланады. (Сорғыштың астында ашық өрістерге сыртқы қол жетімділік әрқашан автоматты түрде жасалатын accessor (getter) және mutator (setter) әдістерінен өтеді. Accessor функциясы өріспен бірдей атқа ие, сондықтан жоғарыда келтірілген мысалда қажет емес Accessor әдістерін ашық түрде жариялаңыз.) Java-дағы сияқты балама конструкторларды да жариялауға болатындығын ескеріңіз. Кодына кіретін код әдепкі конструктор (мүшенің айнымалыларын инициалдаудан басқа) тікелей сынып деңгейінде жүреді.
  • Scala-дағы әдепкі көрініс қоғамдық.

Ерекшеліктер (Java сілтемесімен)

Scala-да дәл сол компиляция моделі бар Java және C #, атап айтқанда бөлек құрастыру және динамикалық класс жүктемесі, сондықтан Scala коды Java кітапханаларына қоңырау шала алады.

Scala-дың пайдалану сипаттамалары Java-мен бірдей. Scala компиляторы Java компиляторы құрғанмен бірдей болатын байт кодын жасайды.[13] Шын мәнінде, Scala коды болуы мүмкін ыдыратылған белгілі бір конструктор операцияларын қоспағанда, оқылатын Java кодына. Дейін Java виртуалды машинасы (JVM), Scala коды және Java коды ажыратылмайды. Жалғыз айырмашылық - жұмыс уақытының бір қосымша кітапханасы, scala-library.jar.[28]

Scala Java-мен салыстырғанда көптеген функцияларды қосады және оның негізгі өрнектері мен типтерінде айтарлықтай айырмашылықтар бар, олар тілді теориялық тұрғыдан таза етеді және бірнешеуін жояды бұрыштық істер Java-да. Scala тұрғысынан бұл іс жүзінде маңызды, өйткені Scala-да бірнеше қосымша мүмкіндіктер C # тілінде де бар. Мысалдарға мыналар жатады:

Синтаксистік икемділік

Жоғарыда айтылғандай, Scala Java-мен салыстырғанда синтаксистік икемділікке ие. Төменде бірнеше мысалдар келтірілген:

  • Нүктелі үтірлер қажет емес; желілер автоматты түрде қосылады, егер олар осы қалыпта келе алмайтын белгімен басталса немесе аяқталса немесе жабық жақшалар немесе жақшалар болса.
  • Инфикс операторы ретінде кез-келген әдісті қолдануға болады, мысалы. «% d алма» .format (num) және «% d алма» форматы нөмір баламалы болып табылады. Шын мәнінде, арифметикалық операторларға ұнайды + және << кез-келген басқа әдістер сияқты қарастырылады, өйткені функция атауларына ерікті шартты белгілердің тізбегінен тұруға рұқсат етіледі (пареньдер, жақшалар мен кронштейндер сияқты ерекше жағдайлар жасалуы керек); мұндай рәміздермен аталатын әдістер басымдылыққа қатысты жалғыз ерекше емдеу.
  • Әдістер қолдану және жаңарту синтаксистік қысқа формалары бар. foo ()- қайда ақымақ - бұл мән (singleton объектісі немесе сынып данасы) - бұл қысқаша foo.apply (), және foo () = 42 қысқа жаңарту (42). Сол сияқты, фу (42) қысқа қолдану (42), және foo (4) = 2 қысқа foo.update (4, 2). Бұл жинау сабақтары үшін қолданылады және көптеген басқа жағдайларға қолданылады, мысалы STM жасушалар.
  • Scala парендерлерді ажыратады (def foo = 42) және бос орындар (def foo () = 42) әдістері. Бос паренс әдісін шақырған кезде жақша алынып тасталуы мүмкін, бұл Java кітапханаларына осы айырмашылықты білмейтін кезде пайдалы, мысалы, foo.toString орнына foo.toString (). Әдетте, әдіс орындалған кезде бос парендермен анықталуы керек жанама әсерлері.
  • Қос нүктемен аяқталатын әдіс атаулары (:) дауысты сол жақта, ал ресиверді оң жақта күту керек. Мысалы, 4 :: 2 :: нөл сияқты Жоқ. ::(2).::(4), нәтижеге көзбен сәйкес келетін бірінші форма (бірінші элемент 4 және екінші элемент 2 бар тізім).
  • Класс корпусының айнымалылары бөлек алу және қою тәсілдері ретінде ашық түрде жүзеге асырылуы мүмкін. Үшін FooLike қасиеті {var bar: Int}, жүзеге асырылуы мүмкін объект Фу ұзарады FooLike { жеке var х = 0; деф бар = х; деф бар_ =(мәні: Int) { х = мәні }} } }. Қоңырау шалатын сайт әлі де қысқаша қолдана алады foo.bar = 42.
  • Әдістерді шақыруда жақшаның орнына бұйра жақшаларды қолдануға рұқсат етіледі. Бұл жаңа басқару құрылымдарының таза кітапханаға енуіне мүмкіндік береді.[29] Мысалға, сынғыш {... егер (...) үзіліс () ...} сияқты көрінеді сынғыш тілде анықталған кілт сөз болды, бірақ шын мәнінде а жіңішке дәлел. Кескіндерді немесе функцияларды қабылдайтын әдістер көбінесе жақшалар мен бұйра жақшалар синтаксисін араластыруға мүмкіндік беретін екінші параметрлер тізіміне орналастырады: Vector.fill (4) {math.random} сияқты Толтыру (4) (math.random). Бұйра жақшалардың нұсқасы өрнектің бірнеше жолды қамтуына мүмкіндік береді.
  • Фор-өрнектер (әрі қарай түсіндіріледі) сияқты монадалық әдістерді анықтайтын кез-келген типті қамтуы мүмкін карта, flatMap және сүзгі.

Бұл өздігінен күмәнді таңдау болып көрінуі мүмкін, бірақ жиынтықта олар жол беру мақсатына қызмет етеді арнайы домендерге арналған тілдер Scala-да компиляторды кеңейтудің қажеті жоқ. Мысалға, Эрланг актерге хабарлама жіберуге арналған арнайы синтаксис, т. актер! хабар тілдік кеңейтімдерді қажет етпестен Scala кітапханасында жүзеге асырылуы мүмкін (және).

Бірыңғай типті жүйе

Java қарабайыр типтерді (мысалы: int және логикалық) және анықтамалық түрлері (кез келген сынып ). Тек сілтеме түрлері мұрагерлік схемасының бөлігі болып табылады java.lang.Object. Scala-да барлық типтер жоғарғы деңгейдегі сыныптан мұра алады Кез келген, оның жақын балалары AnyVal (мән түрлері, мысалы Int және Буль) және AnyRef (анықтамалық типтер, Java сияқты). Бұл Java-ны қарабайыр типтер мен қорапты типтер арасындағы айырмашылықты білдіреді (мысалы. int қарсы Бүтін) Scala-да жоқ; бокс және қораптан шығару пайдаланушы үшін толық мөлдір. Scala 2.10 жаңа мән түрлерін пайдаланушы анықтауға мүмкіндік береді.

Өрнектер

Java орнына «әрқайсысы үшін «итальян арқылы өтуге арналған циклдар, Scala бар үшін- ұқсас өрнектер түсіну тізімі Хаскелл сияқты тілдерде немесе тізімді түсіну және генератордың өрнектері жылы Python. Көмегімен өрнектер Өткізіп жібер кілт сөз жаңа мүмкіндік береді коллекция бұрыннан бар қайталау, сол типтегі жаңа жинақты қайтару арқылы жасалуы керек. Оларды құрастырушы серияға аударады карта, flatMap және сүзгі қоңыраулар. Қайда Өткізіп жібер қолданылмайды, код императивті стильге, аудару арқылы жуықтайды әрқайсысы үшін.

Қарапайым мысал:

вал с = үшін (х <- 1 дейін 25 егер х*х > 50) Өткізіп жібер 2*х

Оны іске қосудың нәтижесі келесі вектор:

Векторлық (16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50)

(Өрнекке назар аударыңыз 1-ден 25-ке дейін арнайы синтаксис емес. Әдіс дейін стандартты Scala кітапханасында бүтін сандарға кеңейту әдісі ретінде анықталған, бұл жасырын конверсия деп аталады[30] бұл қолданыстағы түрлерге жаңа әдістерді қосуға мүмкіндік береді.)

Картаны қайталаудың күрделі мысалы:

// Твиттер жиынтығында көрсетілген Twitter қолданушыларын көрсететін карта берілген,// және әр пайдаланушы туралы бірнеше рет айтылған, пайдаланушыларды іздеңіз// белгілі саясаткерлердің картасында және жаңа картаны қайтарыңыз// Демократиялық саясаткерлер (нысандар ретінде, жіптер емес).вал dem_mentions = үшін {    (еске алу, рет) <- еске түсіреді    шот          <- шоттар.алу(еске алу)    егер шот.кеш == «Демократиялық»  } Өткізіп жібер (шот, рет)

Өрнек (еске түсіру, уақыт) <- еске түсіреді мысал болып табылады үлгілерді сәйкестендіру (төменде қараңыз). Карта бойынша қайталау кілт-мән жиынтығын қайтарады кортеждер және шаблондарды сәйкестендіру кортеждерді кілт пен мән үшін бөлек айнымалыларға оңай өзгертуге мүмкіндік береді. Сол сияқты, түсіну нәтижесі автоматты түрде картаға сақтық көшірмеге салынған кілт мәнінің кортеждерін қайтарады, себебі бастапқы объект (айнымалыдан) еске түсіреді) карта болып табылады. Егер болса еске түсіреді оның орнына тізімді, жиынтықты, массивті немесе басқа кортеждер жиынтығын ұстады, жоғарыда дәл сол код жаңа типтегі жаңа жинақ шығарады.

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

Java-да бар барлық нысанға бағытталған мүмкіндіктерді қолдай отырып (және шын мәнінде оларды әртүрлі тәсілдермен кеңейту), Scala сонымен қатар көптеген мүмкіндіктерді ұсынады, олар әдетте тек функционалды бағдарламалау тілдер. Бұл ерекшеліктер Scala бағдарламаларын толықтай дерлік функционалды стильде жазуға мүмкіндік береді, сонымен қатар функционалды және объектілі стильдерді араластыруға мүмкіндік береді.

Мысалдар:

Барлығы өрнек

C немесе Java-дан айырмашылығы, бірақ сияқты тілдерге ұқсас Лисп, Scala тұжырымдар мен өрнектер арасында ешқандай айырмашылық жасамайды. Барлық мәлімдемелер шын мәнінде белгілі бір мәнге жететін өрнектер. Оралу деп жарияланатын функциялар жарамсыз C немесе Java-да және осыған ұқсас мәлімдемелерде уақыт логикалық тұрғыдан мәнді қайтармайтын, Scala-да типті қайтаратын болып саналады Бірлік, бұл а синглтон түрі, тек осы типтегі бір объектімен. Ешқашан қайтып келмейтін функциялар мен операторлар (мысалы лақтыру оператор немесе әрқашан жұмыс істейтін функция жергілікті емес ерекшелікті қолдану) логикалық түрде қайтару түрі бар Ештеңе жоқ, құрамында ешқандай нысандар жоқ арнайы түр; яғни а төменгі түрі, яғни ықтимал типтің ішкі класы. (Бұл өз кезегінде түр жасайды Ештеңе жоқ барлық түрлерімен үйлесімді, мүмкіндік береді қорытынды шығару дұрыс жұмыс істеу үшін.)

Сол сияқты егер олай болса «мәлімдеме» - бұл шын мәнінде өрнек, ол мәнді шығарады, яғни екі тармақтың бірін бағалау нәтижесі. Демек, мұндай код блогын а-ның қажеттілігінен арылтып, өрнек қалаған жерге енгізуге болады үштік оператор Скалада:

// Java:int hexDigit = х >= 10 ? х + 'A' - 10 : х + '0';
// Scala:вал hexDigit = егер (х >= 10) х + 'A' - 10 басқа х + '0'

Осыған ұқсас себептер бойынша, қайту мәлімдемелер Scala-да қажет емес, ал шын мәнінде көңілсіз. Лисптегідей, кодтар блогындағы соңғы өрнек сол код блогының мәні болып табылады, ал егер код блогы функцияның денесі болса, оны функция қайтарады.

Барлық функциялар өрнектер, тіпті қайтарылатын әдістер екенін түсіндіру үшін Бірлік теңдік белгісімен жазылады

деф printValue(х: Жол): Бірлік = {  println(«Мен% s жедім».формат(х))}

немесе эквивалентті (типті шығарумен және қажет емес брекенттерді алып тастаумен):

деф printValue(х: Жол) = println(«Мен% s жедім» формат х)

Қорытынды

Байланысты қорытынды шығару, айнымалылар типі, функцияны қайтаратын мәндер және көптеген басқа өрнектер әдетте алынып тасталуы мүмкін, өйткені компилятор оны шығара алады. Мысалдар val x = «foo» (өзгермейтін үшін) тұрақты немесе өзгермейтін нысан ) немесе var x = 1,5 (мәнін кейін өзгертуге болатын айнымалы үшін). Scala-дағы типтік тұжырым, глобалдыдан айырмашылығы, жергілікті болып табылады Хинди-Милнер қолданылған алгоритм Хаскелл, ML және басқа да функционалды тілдер. Бұл объектіге бағытталған бағдарламалауды жеңілдету үшін жасалады. Нәтижесінде белгілі бір типтерді әлі де жариялау қажет (ең бастысы, функция параметрлері және қайтарылатын түрлері) рекурсивті функциялар ), мысалы.

деф формат Алма(х: Int) = «Мен% d алма жедім».формат(х)

немесе (рекурсивті функция үшін қайтарылатын түрімен)

деф факторлық(х: Int): Int =  егер (х == 0)    1  басқа    х*факторлық(х - 1)

Анонимді функциялар

Scala-да функциялар объект болып табылады және нақтылау үшін ыңғайлы синтаксис бар жасырын функциялар. Мысал ретінде өрнек келтіруге болады x => x <2, ол функцияны бір параметрмен анықтайды, оның аргументін 2-ден кем екенін салыстырады, ол Lisp формасына тең (лямбда (х) (<х 2)). Түрінің де емес екенін ескеріңіз х және қайтару түрі нақты көрсетілуге ​​мұқтаж емес, әдетте оны шығаруға болады қорытынды шығару; бірақ олар айқын көрсетілуі мүмкін, мысалы. сияқты (x: Int) => x <2 немесе тіпті (x: Int) => (x <2): логикалық.

Белгісіз функциялар шындық сияқты әрекет етеді жабылу олар қоршау функциясы ортасында лексикалық қол жетімді кез-келген айнымалыларды автоматты түрде алады. Бұл айнымалылар қоршау функциясы оралғаннан кейін де қол жетімді болады, ал Java-ға қарағанда анонимді ішкі сыныптар түпкілікті деп жариялаудың қажеті жоқ. (Мұндай айнымалыларды өзгертуге болады, егер олар өзгеретін болса, өзгертілген мән келесіде анонимді функция шақырылғанда қол жетімді болады.)

Анонимді функцияның одан да қысқа түрі қолданылады толтырғыш айнымалылар: мысалы, келесі:

тізім картасы {x => sqrt (x)}

ретінде нақтырақ жазуға болады

тізім картасы {sqrt (_)}

немесе тіпті

тізімнің картасы sqrt

Өзгермейтіндігі

Scala өзгермейтін және өзгеретін айнымалылар арасындағы айырмашылықты қолдайды. Өзгермелі айнымалылар var кілт сөзі және өзгермейтін мәндер вал кілт сөзі вал кілт сөзін тағайындау мүмкін емес ақтық Java-да кілт сөзді қайта тағайындау мүмкін емес. Алайда бұл туралы айта кету керек валтек таяз өзгермейтін болып табылады, яғни вал сілтеме жасаған объект өзгермейтініне кепілдік берілмейді.

Ауыстырылмайтын сыныптар конвенциямен шақырылады, ал Scala стандартты кітапханасы өзгермейтін бай жиынтық ұсынады коллекция Scala көптеген коллекциялық кластардың өзгермелі және өзгермейтін нұсқаларын ұсынады, егер өзгертілмейтін нұсқасы нақты импортталмаса, өзгермейтін нұсқа әрқашан қолданылады.[31]Өзгермейтін нұсқалары болып табылады деректердің тұрақты құрылымдары ескі нысанды орнына жаңартудың орнына әрдайым ескі нысанның жаңартылған көшірмесін қайтарады, мысалы өзгермейтін байланыстырылған тізімдер Мұнда элементті тізімге алдын-ала қою элементтен тұратын тізімнің жаңа түйінін және тізім тізбегіне сілтемені қайтару арқылы жасалады.Элементті тізімге қосу тек ескі тізімдегі барлық элементтерді жаңа тізімге қосу арқылы жасалуы мүмкін. Тек жаңа элемент.Дәл сол сияқты тізімнің ортасына элементті енгізу тізімнің бірінші жартысын көшіреді, бірақ тізімнің екінші жартысына сілтеме жасайды. Бұл құрылымдық бөлісу деп аталады, бұл өте оңай параллельділікке мүмкіндік береді - бұғаттау қажет емес, өйткені ортақ объектілер ешқашан өзгертілмейді.[32]

Жалқау (қатаң емес) бағалау

Бағалау әдепкі бойынша қатаң («ынтызар»). Басқаша айтқанда, Scala өрнектерді қажетіне қарай емес, қол жетімді болған кезде тез арада бағалайды. Алайда, айнымалысын қатаң емес («жалқау») деп жариялауға болады жалқау кілт сөз, яғни айнымалының мәнін шығаратын код ауыспалыға бірінші рет сілтеме жасалғанға дейін бағаланбайды. Әр түрлі типтегі қатаң емес коллекциялар да бар (мысалы, түрі) Ағын, қатаң емес байланыстырылған тізім), және кез келген коллекцияны қатаң емес етіп жасауға болады көрініс әдіс. Қатаң емес жиынтықтар тізімнің кейінгі элементтерін жасау үшін кодты бағалау (бұл өз кезегінде, веб-сайттың басқа жерінде орналасқан серверге сұранысты тудыратын) серверде өндірілген мәліметтер сияқты нәрселерге жақсы семантикалық сәйкес келеді. элементтер шынымен қажет болған кезде болады.

Құйрық рекурсиясы

Функционалды бағдарламалау тілдері әдетте қамтамасыз етеді қоңырау кеңінен пайдалануға мүмкіндік беретін оңтайландыру рекурсия жоқ толып кету мәселелер. Java байт-кодындағы шектеулер JVM жүйесінде қоңырау шалуды оңтайландыруды қиындатады. Жалпы, өзін құйрық қоңырауымен шақыратын функцияны оңтайландыруға болады, бірақ өзара рекурсивті функциялар мүмкін емес. Батуттар уақытша шешім ретінде ұсынылды.[33] Батутты Scala кітапханасы объектімен қамтамасыз етті scala.util.control.TailCalls бастап Scala 2.8.0 (2010 жылғы 14 шілдеде шығарылды). Функцияға қосымша түсініктеме берілуі мүмкін @tailrec, бұл жағдайда ол жинақталмайды, егер ол құйрық рекурсивті болмаса.[34]

Кейстер сыныптары мен үлгілерді сәйкестендіру

Scala үшін кіріктірілген қолдау бар үлгілерді сәйкестендіру, а-ның неғұрлым жетілдірілген, кеңейтілетін нұсқасы деп санауға болады ауысу мәлімдемесі, мұнда ерікті деректер типтерін сәйкестендіруге болады (қарапайым сандар сияқты, бүтін сандар, бульдер және жолдар сияқты), соның ішінде ерікті ұялау. А ретінде белгілі сыныптың ерекше түрі кейс класы қамтамасыз етілген, ол үлгіні сәйкестендіру үшін автоматты қолдауды қамтиды және оны модельдеу үшін қолдануға болады мәліметтердің алгебралық түрлері көптеген функционалды бағдарламалау тілдерінде қолданылады. (Скала тұрғысынан жағдай класы - бұл қарапайым класс, ол үшін компилятор автоматты түрде қолмен қамтамасыз етілуі мүмкін белгілі бір әрекеттерді қосады, мысалы, терең салыстыру мен хэширлеуді қамтамасыз ететін әдістердің анықтамалары және оның конструкторы бойынша кейс класын жою. үлгілерді сәйкестендіру кезіндегі параметрлер.)

Анықтамасының мысалы жылдамдық өрнектерді сәйкестендіру алгоритмі:

деф qsort(тізім: Тізім[Int]): Тізім[Int] = тізім матч {  іс Жоқ => Жоқ  іс бұрылыс :: құйрық =>    вал (кішірек, демалу) = құйрық.бөлім(_ < бұрылыс)    qsort(кішірек) ::: бұрылыс :: qsort(демалу)}

Мұндағы идея біз тізбекті бұрылыстардан аз элементтерге бөлеміз, ал элементтер кем емес, әр бөлікті рекурсивті түрде сұрыптап, нәтижелерді ортаға бұрылыспен бірге қоямыз. Бұл бірдей қолданады бөлу және жеңу стратегиясы mergesort және басқа жылдам сұрыптау алгоритмдері.

The матч операторы сақталған объектіде шаблондарды сәйкестендіру үшін қолданылады тізім. Әрқайсысы іс өрнек сәйкес келетіндігін тексеру үшін кезекпен тексеріліп, бірінші сәйкестік нәтижені анықтайды. Бұл жағдайда, Жоқ тек тура мағынадағы объектімен сәйкес келеді Жоқ, бірақ бұрылыс :: құйрық бос емес тізімге сәйкес келеді және бір уақытта құрылымдар берілген үлгі бойынша тізім. Бұл жағдайда байланыстырылған код жергілікті айнымалы атауына ие болады бұрылыс тізімнің басын және басқа айнымалыны ұстап тұру құйрық тізімнің құйрығын ұстап тұру. Бұл айнымалылар тек оқуға болатындығын және мағыналық жағынан айнымалыға өте ұқсас екенін ескеріңіз байланыстыру көмегімен орнатылған рұқсат етіңіз Лисп пен схемадағы оператор.

Үлгінің сәйкестігі жергілікті айнымалы декларациясында да болады. Бұл жағдайда қоңыраудың қайтарылатын мәні құйрық Бұл кортеж - бұл жағдайда екі тізім. (Құбырлар контейнерлердің басқа түрлерінен, мысалы тізімдерден ерекшеленеді, өйткені олар әрдайым бекітілген мөлшерде болады және элементтер әр түрлі типте болуы мүмкін - дегенмен, мұнда олардың екеуі де бірдей.) Үлгілерді сәйкестендіру - бұл екі бөлікті алудың ең оңай тәсілі кортеж.

Пішін _ <бұрылыс декларациясы болып табылады жасырын функция толтырғыш айнымалысы бар; анонимді функциялар туралы жоғарыдағы бөлімді қараңыз.

Операторлар тізімі :: (тізімнің басына ұқсас элемент қосады минус Лисп пен схемада) және ::: (ұқсас екі тізімді қосады, ұқсас қосу Лисп пен Схемада) екеуі де пайда болады. Сыртқы түріне қарамастан, бұл операторлардың екеуінде де «кіріктірілген» ештеңе жоқ. Жоғарыда көрсетілгендей, кез-келген символдар тізбегі функция атауы ретінде қызмет ете алады және объектіге қолданылатын әдіс жазылуы мүмкін «инфикс «-style нүктесіз немесе жақшасыз. Жоғарыда көрсетілген жол:

qsort (кішірек) ::: pivot :: qsort (демалыс)

осылай жазуға болады:

qsort (демалыс) .: :( бұрылыс). :: :( qsort (кішірек))

шақырудың стандартты белгісінде. (Көп нүктемен аяқталатын әдістер оң ассоциативті және объектіге оңға байланысты).

Ішінара функциялар

Жоғарыдағы үлгіге сәйкес мысалда дененің матч оператор - бұл ішінара функция қатарынан тұрады іс а денесіне ұқсас бірінші сәйкес өрнек басым болатын өрнектер ауысу мәлімдемесі. Жартылай функциялар а-ның ерекше жағдайларды өңдеу бөлігінде де қолданылады тырысу мәлімдеме:

тырысу {  ...} аулау {  іс nfe:NumberFormatException => { println(nfe); Тізім(0) }  іс _ => Жоқ}

Сонымен, ішінара функцияны жалғыз қолдануға болады, және оны шақырудың нәтижесі a-ға тең матч оның үстінде. Мысалы, үшін алдыңғы код жылдамдық былай жазуға болады:

вал qsort: Тізім[Int] => Тізім[Int] = {  іс Жоқ => Жоқ  іс бұрылыс :: құйрық =>    вал (кішірек, демалу) = құйрық.бөлім(_ < бұрылыс)    qsort(кішірек) ::: бұрылыс :: qsort(демалу)}

Мұнда тек оқуға болады айнымалы типі бүтін сандар тізімінен бүтін сандар тізіміне дейінгі функция және оны ішінара функцияға байланыстыратын функция деп жарияланды. (Парциалды функцияның жалғыз параметрі ешқашан ашық жарияланбайды немесе аталмайды.) Алайда, біз бұл айнымалыны әдеттегідей дәл шақыра аламыз:

қабыршақ> qsort(Тізім(6,2,5,9))res32: Тізім[Int] = Тізім(2, 5, 6, 9)

Нысанға бағытталған кеңейтулер

Scala - таза объектіге бағытталған тіл мағынасы әрбір мәні an объект. Мәліметтер түрлері және объектілердің мінез-құлқы сипатталады сыныптар және қасиеттер. Сынып абстракциялары ұзартылады ішкі сыныптау және икемді миксин - проблемаларды болдырмауға негізделген композиция механизмі бірнеше мұрагерлік.

Қасиеттер - бұл Scala-дың Java-ны алмастыруы интерфейстер. 8 жасқа дейінгі Java нұсқаларындағы интерфейстер өте шектеулі, тек абстрактілі функция декларациясын қамтуы мүмкін. Бұл интерфейстерде ыңғайлы әдістерді ұсынудың ыңғайсыз екендігі туралы сынға алып келді (сол әдістер әр іске асыруда жаңартылуы керек) және жарияланған интерфейсті артқа үйлесімді түрде кеңейту мүмкін емес. Белгілері ұқсас миксин сыныптар, олар жүйелік абстракты кластың барлық дерлік күшіне ие, тек класс параметрлері жоқ (Scala-ның Java конструкторының параметрлеріне баламасы), өйткені белгілер әрдайым класспен араласады. The тамаша оператор мұрагерлікке қосымша композицияны қолдана отырып, тізбек құруға мүмкіндік беретін белгілері бойынша ерекше әрекет етеді. Келесі мысал қарапайым терезе жүйесі:

реферат сынып Терезе {  // реферат  деф сурет салу()}сынып SimpleWindow ұзарады Терезе {  деф сурет салу() {    println(«in SimpleWindow»)    // негізгі терезені салу  }}қасиет WindowDecoration ұзарады Терезе { }қасиет Көлденең айналдыру тақтасының декорациясы ұзарады WindowDecoration {  // «супер ()» жұмыс істеуі үшін мұнда «абстрактілі қайта анықтау» қажет, себебі ата-ана  // функциясы абстрактілі. Егер бұл нақты болса, үнемі «жоққа шығару» жеткілікті болар еді.  реферат жоққа шығару деф сурет салу() {    println(«in HorizontalScrollbarDecoration»)    тамаша.сурет салу()    // енді көлденең айналдыру тақтасын салыңыз  }}қасиет VerticalScrollbarDecoration ұзарады WindowDecoration {  реферат жоққа шығару деф сурет салу() {    println(«in VerticalScrollbarDecoration»)    тамаша.сурет салу()    // енді тік айналдыру тақтасын салыңыз  }}қасиет Тақырып декорациясы ұзарады WindowDecoration {  реферат жоққа шығару деф сурет салу() {    println(«in TitleDecoration»)    тамаша.сурет салу()    // енді тақырып жолағын салыңыз  }}

Айнымалы былай жариялануы мүмкін:

вал mywin = жаңа SimpleWindow бірге VerticalScrollbarDecoration бірге Көлденең айналдыру тақтасының декорациясы бірге Тақырып декорациясы

Қоңыраудың нәтижесі mywin.draw () бұл:

жылы Тақырып декорациясыжылы Көлденең айналдыру тақтасының декорациясыжылы VerticalScrollbarDecorationжылы SimpleWindow

Басқаша айтқанда, шақыру сурет салу алдымен кодты орындады Тақырып декорациясы (араласқан соңғы қасиет), содан кейін (арқылы тамаша() қоңыраулар) басқа араласқан белгілер арқылы және ақыр соңында кодқа енеді Терезе, бірде-біреуі бір-біріне мұра болып қалмаса да. Бұл ұқсас декоративті өрнек, бірақ анағұрлым қысқа және қателіктер аз, өйткені ол ата-аналық терезені нақты қоршап алуды, іске асырылуы өзгертілмеген функцияларды бағыттауды немесе субъект қатынастарын инициализациялау уақытына сүйенуді қажет етпейді. Басқа тілдерде осындай нәтижеге ұзын сызықтық тізбегі бар компиляция кезінде қол жеткізуге болады мұрагерлікті жүзеге асыру, бірақ Scala-мен салыстырғанда кемістігі бар, мик-индердің әрбір мүмкін тіркесімі үшін бір сызықтық мұрагерлік тізбегін жариялау керек еді.

Экспрессивті типтік жүйе

Scala экспрессивті статикалық типтегі жүйемен жабдықталған, ол абстракцияларды негізінен қауіпсіз және келісімді қолдануды қамтамасыз етеді. Алайда типтік жүйе олай емес дыбыс.[35] Атап айтқанда, типтік жүйе мыналарды қолдайды:

Scala қабілетті қорытынды түрлері пайдалану бойынша. Бұл статикалық типтегі декларациялардың көпшілігін міндетті емес етеді. Егер компилятор қателігі қажеттілікті көрсетпесе, статикалық типтерді нақты жариялаудың қажеті жоқ. Іс жүзінде кейбір статикалық типтегі декларациялар кодтың анықтығы үшін енгізілген.

Түрді байыту

«Менің кітапханамды байыту» деп аталатын Скалада кең таралған әдіс[36] (бастапқыда 2006 жылы Мартин Одерскийдің «pimp my library» деп атаған;[30] теріс тіркеске байланысты бұл фразаға қатысты алаңдаушылық туды[37] және жетілмегендік[38]), жаңа әдістерді қолданыстағы түрлерге қосылғандай қолдануға мүмкіндік береді. Бұл C # тұжырымдамасына ұқсас кеңейту әдістері бірақ анағұрлым күшті, өйткені техника тек әдістерді қосумен шектелмейді және, мысалы, жаңа интерфейстерді енгізу үшін қолданыла алады. Scala-да бұл әдіс an жасырын түрлендіру әдісті «қабылдау» түрінен бастапқы түрді орап, қосымша әдісті қамтамасыз ететін жаңа түрге (әдетте класс). Егер берілген типке әдіс табылмаса, компилятор қарастырылып отырған әдісті ұсынатын типтерге кез-келген қолданылатын жасырын түрлендірулерді автоматты түрде іздейді.

Бұл әдістеме бар кітапханаға жаңа әдістерді қосымшалар кітапханасын пайдаланып қосуға мүмкіндік береді, мысалы, тек код импорт қондырма кітапханасы жаңа функцияны алады, ал қалған кодқа әсер етпейді.

Келесі мысалда типтің байытылуы көрсетілген Int әдістерімен isEven және isOdd:

объект MyExtensions {  жасырын сынып IntPredicates(мен: Int) {    деф isEven = мен % 2 == 0    деф isOdd  = !isEven  }}импорт MyExtensions._  // жасырын байытуды ауқымға енгізу4.isEven  // -> шын

Мүшелерін импорттау MyExtensions жасырын түрлендіруді кеңейту класына жеткізеді IntPredicates қолдану аясына.[39]

Параллельдік

Scala стандартты кітапханасында кітапханаға қолдау көрсетіледі актер моделі, стандартты Java параллельді API-леріне қосымша. Lightbend Inc. платформаны ұсынады[40] оның құрамына кіреді Акка,[41] актерлік параллельділікті қамтамасыз ететін бөлек ашық қайнар көз. Акка актерлері болуы мүмкін таратылды немесе бірге бағдарламалық жад (транзакторлар). Балама бірізді процестерді байланыстыру Арналық хабарлама жіберуге арналған (CSP) бағдарламалар - бұл Scala нысандарымен байланыс,[42] немесе жай JCSP.

Актер пошта жәшігі бар ағын данасына ұқсайды. Ол арқылы жасалуы мүмкін system.actorOf, алу хабарламаларды қабылдау әдісі және ! (леп белгісі) хабарлама жіберу әдісі.[43]Келесі мысалда хабарламаларды қабылдауға, содан кейін оларды басып шығаруға болатын EchoServer көрсетілген.

вал echoServer = актер(жаңа Акт {  болу {    іс msg => println(«жаңғырық» + msg)  }})echoServer ! «сәлем»

Scala параллельді коллекциялар түрінде мәліметтерге параллельді бағдарламалауды кіріктірілген қолдауымен бірге жеткізіледі[44] 2.9.0 нұсқасынан бастап өзінің стандартты кітапханасына енгізілген.

Келесі мысалда өнімділікті жақсарту үшін параллельді коллекцияларды пайдалану әдісі көрсетілген.[45]

вал url = Тізім(«https://scala-lang.org», «https://github.com/scala/scala»)деф fromURL(url: Жол) = қабыршақ.io.Дереккөз.fromURL(url)  .getLines().mkString(« n»)вал т = Жүйе.currentTimeMillis()url.абз.карта(fromURL(_)) // par жиынның параллель орындалуын қайтарадыprintln(«уақыт:» + (Жүйе.currentTimeMillis - т) + «Ханым»)

Актерлік қолдау мен параллельдік параллелизмнен басқа, Scala Фьючерстер мен уәделермен асинхронды бағдарламалауды, бағдарламалық жасақтама жадын және оқиғалар ағындарын қолдайды.[46]

Кластерлік есептеу

Scala-да жазылған кластерлерді есептеудің ең танымал ашық шешімі Apache Spark. Қосымша, Апачи Кафка, жариялау – жазылу хабарлама кезегі Spala-да және ағынды өңдеудің басқа технологияларымен танымал, Scala-да жазылған.

Тестілеу

Scala-да кодты тексерудің бірнеше әдісі бар. ScalaTest көптеген тестілеу стильдерін қолдайды және Java негізіндегі тестілеу шеңберлерімен біріктіре алады.[47] ScalaCheck - Хаскеллге ұқсас кітапхана Жылдам тексеру.[48] сипаттамалар2 is a library for writing executable software specifications.[49] ScalaMock provides support for testing high-order and curried functions.[50] JUnit және TestNG are popular testing frameworks written in Java.

Нұсқалар

НұсқаБосатылғанЕрекшеліктерКүй
1.0.0-b2[51]8-Dec-2003__
1.1.0-b1[51]19-Feb-2004
  • scala.Enumeration
  • Scala license was changed to the revised BSD license
_
1.1.1[51]23-Mar-2004
  • Support for Java static inner classes
  • Library class improvements to Iterable, Array, xml.Elem, Buffer
_
1.2.0[51]9-Jun-2004
  • Көрулер
  • XML Literals
_
1.3.0[51]16-Sep-2004
  • Support for Microsoft .NET
  • Method closures
  • Type syntax for parameterless methods changed from [] T дейін => T
_
1.4.0[51]20-Jun-2005
  • Атрибуттар
  • матч keyword replaces матч әдіс
  • Experimental support for runtime types
_
2.0[52]12-Mar-2006
  • Compiler completely rewritten in Scala
  • Experimental support for Java generics
  • жасырын және талап етеді keywords
  • матч keyword only allowed infix
  • бірге connective is only allowed following an ұзарады тармақ
  • Newlines can be used as statement separators in place of semicolons
  • Regular expression match patterns restricted to sequence patterns only
  • For-comprehensions admit value and pattern definitions
  • Class parameters may be prefixed by val or var
  • Private visibility has qualifiers
_
2.1.0[51]17-Mar-2006
  • sbaz tool integrated in the Scala distribution
  • матч keyword replaces матч әдіс
  • Experimental support for runtime types
_
2.1.8[53]23-Aug-2006
  • Protected visibility has qualifiers
  • Private members of a class can be referenced from the companion module of the class and vice versa
  • Implicit lookup generalised
  • Typed pattern match tightened for singleton types
_
2.3.0[54]23-Nov-2006
  • Functions returning Бірлік don't have to explicitly state a return type
  • Type variables and types are distinguished between in pattern matching
  • Барлық және AllRef атауын өзгертті Ештеңе жоқ және Жоқ
_
2.4.0[55]09-Mar-2007
  • жеке және қорғалған modifiers accept a [this] іріктеу
  • Tuples can be written with round brackets
  • Primary constructor of a class can now be marked private or protected
  • Attributes changed to annotations with new syntax
  • Self aliases
  • Operators can be combined with assignment
_
2.5.0[56]02-May-2007
  • Type parameters and abstract type members can also abstract over type constructors
  • Fields of an object can be initialized before parent constructors are called
  • Syntax change for-comprehensions
  • Implicit anonymous functions (with underscores for parameters)
  • Pattern matching of anonymous functions extended to support any arty
_
2.6.0[57]27-Jul-2007
  • Existential types
  • Lazy values
  • Құрылымдық түрлері
_
2.7.0[58]07-Feb-2008
  • Java generic types supported by default
  • Case classes functionality extended
_
2.8.0[59]14-Jul-2010
  • Revision the common, uniform, and all-encompassing framework for collection types.
  • Type specialisation
  • Named and әдепкі аргументтер
  • Package objects
  • Improved annotations
_
2.9.0[60]12-May-2011
  • Parallel collections
  • Жіп қауіпсіз Қолданба trait replaces Қолдану қасиет
  • DelayedInit қасиет
  • Java Interop improvements
_
2.10[61]04-Jan-2013
  • Value Classes[62]
  • Implicit Classes[63]
  • String Interpolation[64]
  • Futures and Promises[65]
  • Dynamic and applyDynamic[66]
  • Dependent method types:
    • деф жеке басын куәландыратын(х: AnyRef): х.түрі = х // the return type says we return exactly what we got
  • New ByteCode emitter based on ASM:
    • Can target JDK 1.5, 1.6 and 1.7
    • Emits 1.6 bytecode by default
    • Old 1.5 backend is deprecated
  • A new Pattern Matcher: rewritten from scratch to generate more robust code (no more exponential blow-up!)
    • code generation and analyses are now independent (the latter can be turned off with -Xno-patmat-analysis)
  • Scaladoc Improvements
    • Implicits (-implicits flag)
    • Diagrams (-diagrams flag, requires graphviz)
    • Groups (-groups)
  • Modularized Language features[67]
  • Parallel Collections[68] are now configurable with custom thread pools
  • Akka Actors now part of the distribution
    • scala.actors have been deprecated and the akka implementation is now included in the distribution.
  • Performance Improvements
    • Faster inliner
    • Range#sum is now O(1)
  • Update of ForkJoin library
  • Fixes in immutable TreeSet/TreeMap
  • Improvements to PartialFunctions
  • Addition of ??? and NotImplementedError
  • Addition of IsTraversableOnce + IsTraversableLike type classes for extension methods
  • Deprecations and cleanup
  • Floating point and octal literal syntax deprecation
  • Removed scala.dbc

Тәжірибелік ерекшеліктер

  • Scala Reflection[69]
  • Макростар[70]
_
2.10.2[71]06-Jun-2013__
2.10.3[72]01-Oct-2013__
2.10.4[73]18-Mar-2014__
2.10.5[74]05-Mar-2015__
2.11.0[75]21-сәуір-2014
  • Collection performance improvements
  • Compiler performance improvements
_
2.11.1[76]20-May-2014__
2.11.2[77]22-Jul-2014__
2.11.4[78]31-Oct-2014__
2.11.5[79]08-Jan-2015__
2.11.6[80]05-Mar-2015__
2.11.7[81]23-Jun-2015__
2.11.8[82]08-Mar-2016__
2.11.11[83]18-Apr-2017__
2.11.12[84]13-Nov-2017__
2.12.0[85]03-Nov-2016_
2.12.1[86]05-Dec-2016__
2.12.2[87]18-Apr-2017__
2.12.3[88]26-Jul-2017__
2.12.4[89]17-Oct-2017__
2.12.5[90]15-Mar-2018__
2.12.6[91]27-сәуір-2018__
2.12.7[92]27 қыркүйек-2018__
2.12.8[93]04-желтоқсан-2018First Scala 2.12 release with the license changed to Apache v2.0_
2.13.0[94]11-Jun-2019_Ағымдағы

Comparison with other JVM languages

Scala is often compared with Groovy және Clojure, two other programming languages also using the JVM. Substantial differences between these languages are found in the type system, in the extent to which each language supports object-oriented and functional programming, and in the similarity of their syntax to the syntax of Java.

Scala is statically typed, while both Groovy and Clojure are dynamically typed. This makes the type system more complex and difficult to understand but allows almost all[35] type errors to be caught at compile-time and can result in significantly faster execution. By contrast, dynamic typing requires more testing to ensure program correctness and is generally slower in order to allow greater programming flexibility and simplicity. Regarding speed differences, current versions of Groovy and Clojure allow for optional type annotations to help programs avoid the overhead of dynamic typing in cases where types are practically static. This overhead is further reduced when using recent versions of the JVM, which has been enhanced with an invoke dynamic instruction for methods that are defined with dynamically typed arguments. These advances reduce the speed gap between static and dynamic typing, although a statically typed language, like Scala, is still the preferred choice when execution efficiency is very important.

Regarding programming paradigms, Scala inherits the object-oriented model of Java and extends it in various ways. Groovy, while also strongly object-oriented, is more focused in reducing verbosity. In Clojure, object-oriented programming is deemphasised with functional programming being the main strength of the language. Scala also has many functional programming facilities, including features found in advanced functional languages like Хаскелл, and tries to be agnostic between the two paradigms, letting the developer choose between the two paradigms or, more frequently, some combination thereof.

Regarding syntax similarity with Java, Scala inherits much of Java's syntax, as is the case with Groovy. Clojure on the other hand follows the Лисп syntax, which is different in both appearance and philosophy. However, learning Scala is also considered difficult because of its many advanced features. This is not the case with Groovy, despite its also being a feature-rich language, mainly because it was designed to be mainly a scripting language.[дәйексөз қажет ]

Бала асырап алу

Language rankings

2013 жылғы жағдай бойынша, all JVM-based languages (Clojure, Groovy, Kotlin, Scala) are significantly less popular than the original Java language, which is usually ranked first or second,[95][96] and which is also simultaneously evolving over time.

The Popularity of Programming Language Index,[97] which tracks searches for language tutorials, ranked Scala 15th in April 2018 with a small downward trend. This makes Scala the most popular JVM-based language after Java, although immediately followed by Котлин, a JVM-based language with a strong upward trend ranked 16th.

The TIOBE index[96] of programming language popularity employs internet search engine rankings and similar publication-counting to determine language popularity. As of April 2018, it shows Scala in 34th place, having dropped four places over the last two years, but–as mentioned under "Bugs & Change Requests"–TIOBE is aware of issues with its methodology of using search terms which might not be commonly used in some programming language communities. In this ranking Scala is ahead of some functional languages like Хаскелл (42nd), Эрланг, but below other languages like Свифт (15-ші), Перл (16-шы), Барыңыз (19th) and Clojure (30th).

The ThoughtWorks Technology Radar, which is an opinion based biannual report of a group of senior technologists,[98] recommended Scala adoption in its languages and frameworks category in 2013.[99] In July 2014, this assessment was made more specific and now refers to a "Scala, the good parts", which is described as "To successfully use Scala, you need to research the language and have a very strong opinion on which parts are right for you, creating your own definition of Scala, the good parts.".[100]

The RedMonk Programming Language Rankings, which establishes rankings based on the number of GitHub projects and questions asked on Stack overflow, ranks Scala 14th.[95] Here, Scala is placed inside a second-tier group of languages–ahead of Барыңыз, PowerShell және Хаскелл, және артында Свифт, Мақсат-С, Typescript және R. However, in its 2018 report, the Rankings noted a drop of Scala's rank for the third time in a row, questioning "how much of the available oxygen for Scala is consumed by Kotlin as the latter continues to rocket up these rankings".[95]

In the 2018 edition of the "State of Java" survey,[101] which collected data from 5160 developers on various Java-related topics, Scala places third in terms of usage of alternative languages on the JVM. Compared to the last year's edition of the survey, Scala's usage among alternative JVM languages fell by almost a quarter (from 28.4% to 21.5%), overtaken by Kotlin, which rose from 11.4% in 2017 to 28.8% in 2018.

Компаниялар

Сын

In March 2015, former VP of the Platform Engineering group at Twitter Raffi Krikorian, stated that he would not have chosen Scala in 2011 due to its оқу қисығы.[128] The same month, LinkedIn SVP Кевин Скотт stated their decision to "minimize [their] dependence on Scala".[129] 2011 жылдың қараша айында, Яммер moved away from Scala for reasons that included the learning curve for new team members and incompatibility from one version of the Scala compiler to the next.[130]

Сондай-ақ қараңыз

  • sbt, a widely used build tool for Scala projects
  • Ойнаңыз!, an open-source Web application framework that supports Scala
  • Акка, an open-source toolkit for building concurrent and distributed applications
  • Қашау, an open-source language built upon Scala that is used for hardware design and generation.[131]

Әдебиеттер тізімі

  1. ^ "Scala 2.13.4 is now available!". 2020-11-19. Алынған 2020-11-19.
  2. ^ "NOTICE file". 2019-01-24. Алынған 2019-12-04 - арқылы GitHub.
  3. ^ "Scala Macros".
  4. ^ Fogus, Michael (6 August 2010). "MartinOdersky take(5) toList". Қосымша парамедиктер жіберіңіз. Алынған 2012-02-09.
  5. ^ а б c г. Odersky, Martin (11 January 2006). "The Scala Experiment - Can We Provide Better Language Support for Component Systems?" (PDF). Алынған 2016-06-22.
  6. ^ а б c г. Odersky, Martin; т.б. (2006). "An Overview of the Scala Programming Language" (PDF) (2-ші басылым). École Polytechnique Fédérale de Lausanne (EPFL). Мұрағатталды (PDF) from the original on 2020-07-09.
  7. ^ Odersky, Martin (2008). Programming in Scala. Mountain View, California: Artima. б. 3. ISBN  9780981531601. Алынған 12 маусым 2014.
  8. ^ Potvin, Pascal; Bonja, Mario (24 September 2015). An IMS DSL Developed at Ericsson. Информатика пәнінен дәрістер. 7916. arXiv:1509.07326. дои:10.1007/978-3-642-38911-5. ISBN  978-3-642-38910-8. S2CID  1214469.
  9. ^ "Frequently Asked Questions - Java Interoperability". scala-lang.org. Алынған 2015-02-06.
  10. ^ Friesen, Jeff (16 November 2016). "Are checked exceptions good or bad?". JavaWorld. Алынған 28 тамыз 2018.
  11. ^ Loverdo, Christos (2010). Steps in Scala: An Introduction to Object-Functional Programming. Кембридж университетінің баспасы. б. xiii. ISBN  9781139490948. Алынған 31 шілде 2014.
  12. ^ а б c г. Martin Odersky, "A Brief History of Scala", Artima.com weblogs, 9 June 2006
  13. ^ а б c г. Odersky, M.; Rompf, T. (2014). "Unifying functional and object-oriented programming with Scala". ACM байланысы. 57 (4): 76. дои:10.1145/2591013.
  14. ^ Martin Odersky, "The Scala Language Specification Version 2.7"
  15. ^ "Scala Team Wins ERC Grant". Алынған 4 шілде 2015.
  16. ^ "Commercial Support for Scala". 2011-05-12. Алынған 2011-08-18.
  17. ^ "Why We Invested in Typesafe: Modern Applications Demand Modern Tools". 2011-05-12. Алынған 2018-05-08.
  18. ^ "Open-source Scala gains commercial backing". 2011-05-12. Алынған 2011-10-09.
  19. ^ "Cloud computing pioneer Martin Odersky takes wraps off his new company Typesafe". 2011-05-12. Алынған 2011-08-24.
  20. ^ "Scala on Android". Алынған 8 маусым 2016.
  21. ^ "Scala 2.12.8 is now available!". 2018-12-04. Алынған 2018-12-09.
  22. ^ "Scala Js Is No Longer Experimental | The Scala Programming Language". Scala-lang.org. Алынған 28 қазан 2015.
  23. ^ https://github.com/scala-js/scala-js/releases
  24. ^ Krill, Paul (15 March 2017). "Scaled-down Scala variant cuts ties to the JVM". InfoWorld. Алынған 21 наурыз 2017.
  25. ^ Krill, Paul (2016-05-11). "Scala language moves closer to bare metal". InfoWorld.
  26. ^ Expunged the .net backend. by paulp · Pull Request #1718 · scala/scala · GitHub. Github.com (2012-12-05). Retrieved on 2013-11-02.
  27. ^ "Getting Started with Scala". scala-lang.org. 15 шілде 2008 ж. Алынған 31 шілде 2014.
  28. ^ «Үй». Blog.lostlake.org. Архивтелген түпнұсқа 2010 жылғы 31 тамызда. Алынған 2013-06-25.
  29. ^ Scala's built-in control structures such as егер немесе уақыт cannot be re-implemented. There is a research project, Scala-Virtualized, that aimed at removing these restrictions: Adriaan Moors, Tiark Rompf, Philipp Haller and Martin Odersky. Scala-Virtualized. Proceedings of the ACM SIGPLAN 2012 workshop on Partial evaluation and program manipulation, 117–120. Шілде 2012.
  30. ^ а б "Pimp my Library". Artima.com. 2006-10-09. Алынған 2013-06-25.
  31. ^ "Mutable and Immutable Collections - Scala Documentation". Алынған 30 сәуір 2020.
  32. ^ "Collections - Concrete Immutable Collection Classes - Scala Documentation". Алынған 4 шілде 2015.
  33. ^ Dougherty, Rich. "Rich Dougherty's blog". Алынған 4 шілде 2015.
  34. ^ "TailCalls - Scala Standard Library API (Scaladoc) 2.10.2 - scala.util.control.TailCalls". Scala-lang.org. Алынған 2013-06-25.
  35. ^ а б "Java and Scala's Type Systems are Unsound" (PDF).
  36. ^ Giarrusso, Paolo G. (2013). "Reify your collection queries for modularity and speed!". Proceedings of the 12th annual international conference on Aspect-oriented software development. ACM. arXiv:1210.6284. Бибкод:2012arXiv1210.6284G. Also known as pimp-my-library pattern
  37. ^ Gilbert, Clint (2011-11-15). "What is highest priority for Scala to succeed in corporate world (Should be in scala-debate?) ?". scala-lang.org. Алынған 2019-05-08.
  38. ^ "Should we "enrich" or "pimp" Scala libraries?". stackexchange.com. 17 маусым 2013. Алынған 15 сәуір 2016.
  39. ^ Implicit classes were introduced in Scala 2.10 to make method extensions more concise. This is equivalent to adding a method implicit def IntPredicate(i: Int) = new IntPredicate(i). The class can also be defined as implicit class IntPredicates(val i: Int) extends AnyVal { ... }, producing a so-called value class, also introduced in Scala 2.10. The compiler will then eliminate actual instantiations and generate static methods instead, allowing extension methods to have virtually no performance overhead.
  40. ^ "Lightbend Reactive Platform". Lightbend. Алынған 2016-07-15.
  41. ^ What is Akka?, Akka online documentation
  42. ^ Communicating Scala Objects, Bernard Sufrin, Communicating Process Architectures 2008
  43. ^ Yan, Kay. "Scala Tour". Алынған 4 шілде 2015.
  44. ^ "Parallelcollections - Overview - Scala Documentation". Docs.scala-lang.org. Алынған 2013-06-25.
  45. ^ Yan, Kay. "Scala Tour". Алынған 4 шілде 2015.
  46. ^ Learning Concurrent Programming in Scala, Aleksandar Prokopec, Packt Publishing
  47. ^ Kops, Micha (2013-01-13). "A short Introduction to ScalaTest". hascode.com. Алынған 2014-11-07.
  48. ^ Nilsson, Rickard (2008-11-17). "ScalaCheck 1.5". scala-lang.org. Алынған 2014-11-07.
  49. ^ "Build web applications using Scala and the Play Framework". workwithplay.com. 2013-05-22. Алынған 2014-11-07.
  50. ^ Butcher, Paul (2012-06-04). "ScalaMock 3.0 Preview Release". paulbutcher.com. Алынған 2014-11-07.
  51. ^ а б c г. e f ж "Scala Change History". scala-lang.org. Архивтелген түпнұсқа 2007-10-09 ж.
  52. ^ "Changes in Version 2.0 (12-Mar-2006)". scala-lang.org. 2006-03-12. Алынған 2014-11-07.
  53. ^ "Changes in Version 2.1.8 (23-Aug-2006)". scala-lang.org. 2006-08-23. Алынған 2014-11-07.
  54. ^ "Changes in Version 2.3.0 (23-Nov-2006)". scala-lang.org. 2006-11-23. Алынған 2014-11-07.
  55. ^ "Changes in Version 2.4.0 (09-Mar-2007)". scala-lang.org. 2007-03-09. Алынған 2014-11-07.
  56. ^ "Changes in Version 2.5 (02-May-2007)". scala-lang.org. 2007-05-02. Алынған 2014-11-07.
  57. ^ "Changes in Version 2.6 (27-Jul-2007)". scala-lang.org. 2007-06-27. Алынған 2014-11-07.
  58. ^ "Changes in Version 2.7.0 (07-Feb-2008)". scala-lang.org. 2008-02-07. Алынған 2014-11-07.
  59. ^ "Changes in Version 2.8.0 (14-Jul-2010)". scala-lang.org. 2010-07-10. Алынған 2014-11-07.
  60. ^ "Changes in Version 2.9.0 (12-May-2011)". scala-lang.org. 2011-05-12. Алынған 2014-11-07.
  61. ^ "Changes in Version 2.10.0". scala-lang.org. 2013-01-04. Алынған 2014-11-07.
  62. ^ Harrah, Mark. "Value Classes and Universal Traits". scala-lang.org. Алынған 2014-11-07.
  63. ^ Suereth, Josh. "SIP-13 - Implicit classes". scala-lang.org. Алынған 2014-11-07.
  64. ^ Suereth, Josh. "String Interpolation". scala-lang.org. Алынған 2014-11-07.
  65. ^ Haller, Philipp; Prokopec, Aleksandar. "Futures and Promises". scala-lang.org. Алынған 2014-11-07.
  66. ^ "SIP-17 - Type Dynamic". scala-lang.org. Алынған 2014-11-07.
  67. ^ "SIP-18 - Modularizing Language Features". scala-lang.org. Алынған 2014-11-07.
  68. ^ Prokopec, Aleksandar; Miller, Heather. "Parallel Collections". scala-lang.org. Алынған 2014-11-07.
  69. ^ Miller, Heather; Burmako, Eugene. "Reflection Overview". scala-lang.org. Алынған 2014-11-07.
  70. ^ Burmako, Eugene. "Def Macros". scala-lang.org. Алынған 2014-11-07.
  71. ^ "Scala 2.10.2 is now available!". scala-lang.org. 2013-06-06. Архивтелген түпнұсқа 2014-11-08. Алынған 2014-11-07.
  72. ^ "Scala 2.10.3 is now available!". scala-lang.org. 2013-10-01. Архивтелген түпнұсқа 2014-11-08. Алынған 2014-11-07.
  73. ^ "Scala 2.10.4 is now available!". scala-lang.org. 2014-03-18. Алынған 2015-01-07.
  74. ^ "Scala 2.10.5 is now available!". scala-lang.org. 2015-03-04. Алынған 2015-03-23.
  75. ^ "Scala 2.11.0 is now available!". scala-lang.org. 2014-04-21. Алынған 2014-11-07.
  76. ^ "Scala 2.11.1 is now available!". scala-lang.org. 2014-05-20. Алынған 2014-11-07.
  77. ^ "Scala 2.11.2 is now available!". scala-lang.org. 2014-07-22. Алынған 2014-11-07.
  78. ^ "Scala 2.11.4 is now available!". scala-lang.org. 2014-10-30. Алынған 2014-11-07.
  79. ^ "Scala 2.11.5 is now available!". scala-lang.org. 2015-01-08. Алынған 2015-01-22.
  80. ^ "Scala 2.11.6 is now available!". scala-lang.org. 2015-03-05. Алынған 2015-03-12.
  81. ^ "Scala 2.11.7 is now available!". scala-lang.org. 2015-06-23. Алынған 2015-07-03.
  82. ^ "Scala 2.11.8 is now available!". scala-lang.org. 2016-03-08. Алынған 2016-03-09.
  83. ^ "Three new releases and more GitHub goodness!". scala-lang.org. 2017-04-18. Алынған 2017-04-19.
  84. ^ "Security update: 2.12.4, 2.11.12, 2.10.7 (CVE-2017-15288)". scala-lang.org. 2017-11-13. Алынған 2018-05-04.
  85. ^ "Scala 2.12.0 is now available!". scala-lang.org. 2016-11-03. Алынған 2017-01-08.
  86. ^ "Scala 2.12.1 is now available!". scala-lang.org. 2016-12-05. Алынған 2017-01-08.
  87. ^ "Three new releases and more GitHub goodness!". scala-lang.org. 2017-04-18. Алынған 2017-04-19.
  88. ^ "SCALA 2.12.3 IS NOW AVAILABLE!". scala-lang.org. 2017-07-26. Алынған 2017-08-16.
  89. ^ "SCALA 2.12.4 IS NOW AVAILABLE!". scala-lang.org. 2017-10-18. Алынған 2017-10-26.
  90. ^ "SCALA 2.12.5 IS NOW AVAILABLE!". scala-lang.org. 2018-03-15. Алынған 2018-03-20.
  91. ^ "Scala 2.12.6 is now available!". scala-lang.org. 2018-04-27. Алынған 2018-05-04.
  92. ^ "Scala 2.12.7 is now available!". scala-lang.org. 2018-09-27. Алынған 2018-10-09.
  93. ^ "Scala 2.12.8 is now available!". scala-lang.org. 2018-12-04. Алынған 2018-12-09.
  94. ^ "Scala 2.13.0 is now available!". scala-lang.org. 2019-06-11. Алынған 2018-06-17.
  95. ^ а б c "The RedMonk Programming Language Rankings: January 2018".
  96. ^ а б "TIOBE Index for April 2018".
  97. ^ "Popularity of Programming Language Index".
  98. ^ "ThoughtWorks Technology Radar FAQ".
  99. ^ "ThoughtWorks Technology Radar MAY 2013" (PDF).
  100. ^ "The RedMonk Programming Language Rankings: January 2018".
  101. ^ "The State of Java in 2018".
  102. ^ Greene, Kate (1 April 2009). "The Secret Behind Twitter's Growth, How a new Web programming language is helping the company handle its increasing popularity". Технологиялық шолу. MIT. Алынған 6 сәуір 2009.
  103. ^ "Play Framework, Akka and Scala at Gilt Groupe". Lightbend. 15 шілде 2013 ж. Алынған 16 шілде 2016.
  104. ^ "Scala, Lift, and the Future". Архивтелген түпнұсқа 2016 жылғы 13 қаңтарда. Алынған 4 шілде 2015.
  105. ^ "Why we love Scala at Coursera". Coursera Engineering. Алынған 4 шілде 2015.
  106. ^ "Apple Engineering PM Jarrod Nettles on Twitter". Jarrod Nettles. Алынған 2016-03-11.
  107. ^ "30 Scala job openings at Apple". Элвин Александр. Алынған 2016-03-11.
  108. ^ David Reid & Tania Teixeira (26 February 2010). "Are people ready to pay for online news?". BBC. Алынған 2010-02-28.
  109. ^ "Guardian switching from Java to Scala". Heise Online. 2011-04-05. Алынған 2011-04-05.
  110. ^ "Guardian.co.uk Switching from Java to Scala". InfoQ.com. 2011-04-04. Алынған 2011-04-05.
  111. ^ Roy, Suman & Sundaresan, Krishna (2014-05-13). "Building Blackbeard: A Syndication System Powered By Play, Scala and Akka". Алынған 2014-07-20.
  112. ^ Pavley, John (2013-08-11). "Sneak Peek: HuffPost Brings Real Time Collaboration to the Newsroom". Алынған 2014-07-20.
  113. ^ Binstock, Andrew (2011-07-14). "Interview with Scala's Martin Odersky". Доктор Доббтың журналы. Алынған 2012-02-10.
  114. ^ Синодинос, Дионисиос Г. (2010-10-11). «LinkedIn сигналы: Scala, JRuby және Voldemort үшін іс-тәжірибе». InfoQ.
  115. ^ "Real-life Meetups Deserve Real-time APIs".
  116. ^ "Real time updating comes to the Remember The Milk web app".
  117. ^ "Senior Scala Engineer". Алынған 2014-08-18.
  118. ^ Novet, Jordan (2015-06-04). "Airbnb announces Aerosolve, an open-source machine learning software package". Алынған 2016-03-09.
  119. ^ Kops, Alexander (2015-12-14). "Zalando Tech: From Java to Scala in Less Than Three Months". Алынған 2016-03-09.
  120. ^ Calçado, Phil (2014-06-13). "Building Products at SoundCloud—Part III: Microservices in Scala and Finagle". Алынған 2016-03-09.
  121. ^ Concurrent Inc. (2014-11-18). "Customer Case Studies: SoundCloud". Алынған 2016-03-09.
  122. ^ Skills Matter (2015-12-03). "Scala at Morgan Stanley (Video)". Алынған 2016-03-11.
  123. ^ Greg Soltis. "SF Scala, Greg Soltis: High Performance Services in Scala (Video)". Алынған 2016-03-11.
  124. ^ Lee Mighdoll. "Scala jobs at Nest". Алынған 2016-03-11.
  125. ^ Nurun. "Nurun Launches Redesigned Transactional Platform With Walmart Canada". Алынған 2013-12-11.
  126. ^ André K. Horie (2017-01-31). "Rewriting Duolingo's engine in Scala". Алынған 2017-02-03.
  127. ^ "HMRC GitHub repository".
  128. ^ Krikorian, Raffi (17 March 2015). O'Reilly Software Architecture Conference 2015 Complete Video Compilation: Re-Architecting on the Fly - Raffi Krikorian - Part 3 (видео). O'Reilly Media. Event occurs at 4:57. Алынған 8 наурыз 2016. What I would have done differently four years ago is use Java and not used Scala as part of this rewrite. [...] it would take an engineer two months before they're fully productive and writing Scala code.
  129. ^ Scott, Kevin (11 Mar 2015). "Is LinkedIn getting rid of Scala?". quora.com. Алынған 25 қаңтар 2016.
  130. ^ Hale, Coda (29 November 2011). "The Rest of the Story". codahale.com. Алынған 7 қараша 2013.
  131. ^ "Chisel: Constructing Hardware in a Scala Embedded Language | ASPIRE". UC Berkeley APSIRE. Алынған 27 мамыр 2020.

Әрі қарай оқу