Какое место занимает язык Scala в ИТ-индустрии — история создания и особенности

История

Язык был создан в 2001—2004 годах в Лаборатории методов программирования EPFL. Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного программного обеспечения. За основу при разработке языка были взяты две идеи:

  1. Язык программирования компонентного ПО должен быть масштабируемым в том смысле, что должна быть возможность с помощью одних и тех же концепций описать как маленькие, так и большие части. Поэтому внимание было сконцентрировано на механизмах абстракции, композиции и декомпозиции вместо введения большого количества примитивов, которые могут быть полезными только на каком-то одном уровне масштабирования.
  2. Масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование. Некоторые из основных технических новшеств Scala — это концепции, представляющие собой сплав этих парадигм программирования. В статически типизированных языках, к которым относится Scala, эти парадигмы до сих пор были почти полностью разделены.

Язык был выпущен для общего пользования на платформе JVM в январе 2004 года и на платформе .NET в июне 2004 года, в 2016 году создан LLVM-компилятор (Scala Native) [6] .

На дизайн языка оказали влияние многие языки и исследовательские работы.

Прежде всего, язык впитал значительное число концепций и синтаксических соглашений Java и C#. Способ выражения свойств во многом заимствован из Sather[en]. Из Smalltalk взята концепция унифицированной объектной модели. Из BETA пришла идея, что всё, включая классы, должно допускать вложенность. Абстрактные типы в Scala очень похожи на абстрактные типы сигнатур в SML и OCaml, обобщённые в контексте полноценных компонентов.

В некотором смысле Scala — это продолжение работы Pizza[en]. Как и Pizza, Scala компилируется под Java VM, добавляя функции высшего порядка, сопоставление с образцом, конструкции, которые исходно были созданы в сообществе функционального программирования. В то время как Pizza обратно совместима с Java, цель Scala — всего лишь возможность взаимодействия, так что у неё больше степеней свободы в дизайне. Ещё одна цель Scala — предоставить расширенные конструкции для абстракции и композиции компонентов — общая с несколькими недавними исследовательскими разработками.

Общая информация

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

Разработала Scala команда из Федеральной политехнической школы Лозанны под руководством Мартина Одерски. Он также занимался созданием Generic Java и компилятора Java фирмы Sun. В 2001 году Одерски решил создать типобезопасный язык для решения научных задач и улучшить языковую поддержку компонентного программного обеспечения.

В 2003 году создатели выпустили первый внутренний релиз, в январе 2004 года представили первую версию для общего пользования на платформе JVM (Java Virtual Machine – виртуальной машины Java). В 2006 году появилась Scala 2.0. В июне 2004 года Scala вышел на платформе .NET. С 2012 года поддержка этой платформы прекращена. Полноценный нативный LLVM-компилятор (Scala Native) был представлен лишь в 2016 году.

Разработчики преследовали две основные цели:

  • Масштабируемость языка: с помощью одних и тех же концепций можно было бы описывать и мелкие, и крупные части.
  • Масшабируемая поддержка компонентов: унификация и обобщение функционального и объектно-ориентированного программирования.

Scala реализован для платформ Java и JavaScript. Разработчики верят, что он станет преемником Java, обеспечив возможность быстрого создания компонентного программного обеспечения благодаря типобезопасности, лаконичности и высокой мощности.

Компиляторы и библиотеки Scala распространяются под лицензией BSD (Berkeley Software Distribution license – программная лицензия университета Беркли).

Особенности

В Scala используется единообразная объектная модель: значение представляет собой объект, а операция – вызов метода. При этом функции являются полноправными значениями – так реализуется парадигма функционального программирования. И каждая конструкция языка возвращает значение.

Но, в отличие от Java, в Scala объявляется не класс объекта, а сразу экземпляр объекта. Это естественная реализация шаблона проектирования Singleton («одиночка») – класса с единственным экземпляром.

Язык поддерживает абстракции типов и значений. К примеру, здесь есть гибкие симметричные конструкции примесей для композиции классов и типажей. Кроме того, доступны представления для внешних расширений компонентов (views) и поддержка обобщенных функций (generics), в частности, дженериков высшего типажа (generics of a higher kind). Views – очень мощный инструмент, полезный для интеграции. Он позволяет расширять класс новыми членами и типажами. Лаконичность кода на Scala можно продемонстрировать так:

Чистые функции

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

def sin(value: Double): Double

Нечистые функции

Нечистые функции позволяют влиять на внешний и/или внутренний контекст.

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

def writeToFile(fileName: String, text: String): Unit def insertToDB(user: User): User

Функции высшего порядка

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

  • принять функцию, вернуть значение
  • принять значение, вернуть функцию
  • принять функцию, вернуть функцию

class List[T] { // This Function takes anoter Function called «fn» as a parameter // that it’s applied to each of the elements within the List // and filters them if fn returns false for that element. def filter[T](fn: T => Boolean): List[T] } val list: List[Int] = // … initialized with [1, 2, 3, 4, 5, 6, 7, 8, 9] val odds: List[Int] = list.filter(v => v % 2 != 0) // returns: [1, 3, 5, 7, 9]

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

def isOdd(valor: Int): Boolean = { valor % 2 != 0 } // let’s define how we’re going to filter // this list using isOdd Function val odds: List[Int] = list.filter(v => isOdd(v)) // returns: [1, 3, 5, 7, 9]

Монады в Scala

Монада — это интерфейс, который просто определяет единый формат для составления данных.

Монады должны подчиняться определенным правилам. Scala не столь строга с этими законами, а ее ориентированность более практична. С точки зрения языка единственными чертами, которые должна иметь Монада, являются функции высокого порядка flatMap и map. Они предоставляют инструмент для составления данных, которые в них содержатся, с помощью применения функции.

Вероятно, проще объяснить это на примере,

class Monad[A](value: A) { // receives a Function ‘f’ that transforms any ‘A’ value into ‘B’ value def map[B](f: A => B): Monad[B] = new Monad(f(value)) // receives a Function ‘f’ that transforms any ‘A’ value into another ‘Monad[B]’ def flatMap[B](f: A => Monad[B]): Monad[B] = f(value) } val firstMonad = new Monad(4) val secondMonad = new Monad(6) val resultingMonad = firstMonad.flatMap { x => secondMonad.map { y => y + x } } // returns: Monad[Int] = 10

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

def plus2(value: Int): Int = { value * 2 } val lista = Seq( 1, 2, 4, 5, 6, 7, 8, 9, /*…*/ 100, 101 ) val listaX2 = lista.map { v => plus2(v) } // results: Seq(2, 4, 6, 10, 12, 14, 16, 18, /*…*/ 200, 202)

Что можно сделать

  • Веб-разработка веб-интерфейса с ScalaJS
  • Разработка мобильных приложений под Android и IOS — с Scala Native
  • Серверные библиотеки, такие как HTTP4S, Akka-Http, Play Framework
  • Интернет вещей, использующих
  • Разработка игр
  • НЛП — обработка естественного языка с использованием набора библиотек ScalaNLP
  • Тестирование передовых методов программирования, таких как функциональное программирование и объектно-ориентированное программирование
  • Создайте высококонкурентное коммуникационное приложение, используя актеры, библиотеку для JVM, вдохновленную Erlang.
  • Используйте его для машинного обучения с использованием таких библиотек, как Figaro, которая занимается вероятностным программированием, и Apache Spark, которая

Зачем учить Скала

Вот основные причины изучения Scala:

  • Scala легко изучить для объектно-ориентированных программистов, разработчиков Java. Это становится одним из популярных языков в последние годы.
  • Scala предлагает первоклассные функции для пользователей
  • Scala может выполняться на JVM, что открывает путь к взаимодействию с другими языками.
  • Он предназначен для приложений, которые работают одновременно, распределены и устойчивы к сообщениям. Это один из самых требовательных языков этого десятилетия.
  • Это сжатый, мощный язык и может быстро расти в соответствии с потребностями своих пользователей.
  • Он является объектно-ориентированным и обладает множеством функциональных функций программирования, которые предоставляют разработчикам большую гибкость при кодировании так, как они хотят.
  • Scala предлагает много типов утки
  • Он имеет меньший шаблон, если вы приехали с Java
  • Фреймворки Lift и Play, написанные на Scala, находятся на кривой роста.

Для кого предназначена эта книга

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

Целевая аудитория

Преимущества Scala оценили многие крупные компании – Twitter, LinkedIn, Foursquare, Novell, Siemens, GridGain. Однако в академических кругах это язык пока популярен больше.
Пользователь @platoff в статье достаточно подробно изложил свой взгляд по поводу целевой аудитории языка.

Я прекрасно понимаю, чем Scala привлекает неопытную молодежь (а она в основном и хочет Scala):
• Ореолом элитности: действительно прогресс в Scala делают умнейшие ребята, типа, дураки на Scala не пишут, и если ты пишешь на Scala, то ты умный. Оп, ребята, программирование — это не учеба в университете, ты не будешь более «умным» программистом, чем сложнее заморочку ты решишь.
• Сложностью: наверно многие из Scala-фанатов и любителей не осознают, да и не способны сформулировать, что их привлекает в сложности. Подсознательно кто-то думает, что сложность == мощь. Типа чем сложнее, тем мощнее.
Очень сложную задачу можно просто решить, переиспользуя сложные решения. В нашем случае компилятор должен брать на себя как можно больше сложности, упрощая решение. Компилятор Scala безусловно сложен, но есть проблема — язык, в котором эта сложность выражается. Пользоваться таким языком безумно сложно.

Ngoc Dao, создатель Xitrum Scala web framework, Ngoc-Dao смотрит на ситуацию с точки зрения функционального подхода:

Говоря о функциональном подходе в принципе, безотносительно Scala, на ум обычно приходит Haskell. Однако, рассуждая с практической точки зрения, лучше выучить Erlang. Не зря все-таки Facebook потратил $19 миллиардов на покупку WhatsApp, который написан как раз на нем.
Erlang сдвинет ваше мышление в сторону функционального подхода сильнее, чем Scala. Кроме того, Erlang намного проще и быстрее учить. Вы можете освоить его за неделю и сэкономить свое время.

Так что, мнение на счет универсальности Scala может быть и скептическим – ни два, ни полтора: функциональная парадигма реализована непросто, да и в плане «объектноориентированности» он тоже слишком сложен.
Однако, если «пересаживаться» на этот язык с бэкграундом Java-разработчика, сложностей будет меньше.

Начало работы с Scala

Scala — это очень совместимый язык, поэтому его можно очень легко установить в операционные системы Windows и Unix.
Так как Scala очень похож на другие широко используемые языки синтаксически, в Scala проще кодировать и изучать. Scala-программы могут быть написаны в любом текстовом редакторе, таком как блокнот, notepad ++ или что-либо в этом роде. Можно также использовать онлайновую IDE для написания кодов Scala или даже установить ее в своей системе, чтобы сделать эти коды более удобными для написания, потому что IDE предоставляют множество функций, таких как интуитивно понятный редактор кода, отладчик, компилятор и т. Д.
Для начала, написание кодов Scala и выполнение различных интригующих и полезных операций, необходимо установить Scala в своей системе. Это можно сделать, следуя пошаговым инструкциям, приведенным ниже:

  1. Проверка пакетов Java
    Первое, что нам нужно, это установить на компьютер Java Software Development Kit (SDK). Нам нужно проверить эти пакеты SDK и, если они не установлены, установить их.
  2. Теперь установите Scala
    Мы закончили установку java, теперь давайте установим пакеты scala. Лучший вариант скачать эти пакеты — это загрузить только с официального сайта: https://www.scala-lang.org/download/ Пакеты, указанные в приведенной выше ссылке, занимают примерно 100 МБ хранилища. После загрузки пакетов откройте загруженный MSI-файл.
  3. Тестирование и запуск команд Scala
    Откройте командную строку и введите следующие коды.C:UsersYour_PC_username>scalaМы получим вывод, как показано ниже:

    Вывод команды.

Как установить Scala

Чтобы начать писать программы Scala, вам нужно установить его на свой компьютер. Для этого вам необходимо посетить их сайт https://www.scala-lang.org/download/ , чтобы загрузить последнюю версию Scala.

Перейдя по ссылке, мы получили два варианта установки Scala на наши машины. Для этого урока мы загрузим интегрированную среду IntelliJ.


Перейдя по ссылке для скачивания, вы найдете две версии IntelliJ IDE.

Для этого урока мы загрузим Community Edition, которая является бесплатной и содержит все необходимое для написания программ Scala.


Шаг 1) на странице щелкните раскрывающийся список на Community Edition.

Он предоставляет нам возможность загрузить IntelliJ IDE вместе с JBR, который содержит реализацию JDK (Java Development Kit) OpenJDK, которая необходима Scala для компиляции и запуска кода.


Шаг 2) После загрузки IntelliJ дважды щелкните его, чтобы запустить мастер установки и следовать диалоговому окну.


Шаг 3) Выберите место для установки IDE.


Если случайно вы не загрузили один с JDK, мы все равно получим приглашение, где мы можем проверить, чтобы загрузить его, установив флажок.


Шаг 4) Оставьте остальные значения по умолчанию и нажмите «Далее».


Шаг 5) После завершения установки запустите IntelliJ IDE, щелкнув его значок запуска в меню запуска, как обычное приложение.


Вам все еще нужно пройти дополнительный шаг добавления плагина Scala в IntelliJ; Вы можете сделать это, щелкнув раскрывающееся меню настройки в правом нижнем углу экрана и выбрав опцию плагина.



На вкладке Marketplace поиск по Scala представит плагин в качестве первого результата под тегом Languages.

Шаг 6) Нажмите «Установить», после чего плагин начнет загрузку.


Шаг 7) После завершения загрузки вам будет предложено перезапустить IDE, чтобы установленный плагин начал работать.


После перезапуска вы окажетесь на той же странице, что и раньше, когда мы запускали IDE, но на этот раз мы уже установили плагин Scala.

Программа Scala Hello World

Шаг 1) Выберите опцию «Создать проект», которая приведет нас к странице, где мы сможем выбрать язык, который будет использовать наш проект.


Шаг 2) выберите Scala, установив флажок Scala и нажмите «Далее».


Шаг 3) Выберите место для сохранения файла наших проектов и дайте нашему проекту имя.


Если каталог не существует, IntelliJ предложит нам запросить разрешение на создание папки. Примите и нажмите Готово. Вы попадете в свой проект Scala, в котором в настоящее время нет кода Scala.

It will take some time to load some indexes so don’t worry if you’re not able to immediately do anything while there’s a progress bar at the bottom of your IDE, it simply means your IDE is loading some files necessary to run Scala and help with IDE autocompletion.

Step 4) Next, we’ll click on the projects tab on the left of the IDE and expand so we can see the contents of our project.


At the moment the project is empty and only contains a .idea folder and hello-world.iml file generated by the IDE. Our point of interest is the src folder. Src is where we store the source code for our project. It’s where we’ll create our first Scala file.

Step 5) Right-click on src to open a menu to create a new Scala file.


Затем мы создадим имя для файла, в этом уроке мы будем использовать привет, а затем выберем из выпадающего списка, что поместить в качестве содержимого файла Scala. Выберите «Объект»


Как только мы сделаем это, у нас будет файл Scala с объектом Singleton, который мы будем использовать для запуска нашего кода.


Теперь у вас есть файл Scala с объектом Hello. Вы напишите свою первую программу, расширив созданный вами объект с помощью ключевого слова App.

Расширяя наш объект с помощью App, сообщите компилятору, какой код запускать при запуске вашей программы. Сразу после расширения приложения зеленая стрелка появляется слева, указывая, что теперь вы можете запускать свою программу.



Внутри объекта Hello мы пишем одну функцию println (), которая используется для печати текста внутри него на консоли. Мы запустим наш код, нажав на зеленую стрелку.

Нажатие на стрелку предоставляет нам опцию Run, hello, после нажатия на нее наш код начнет компилироваться, и через несколько секунд мы увидим результаты нашей программы, напечатанные из консоли, встроенной в IntelliJ IDE.


И вот, мы успешно установили Scala и запустили нашу первую программу.

Плюсы Scala и минусы

Scala, как и Java, рабо­та­ет под JVM — вир­ту­аль­ной маши­ной Java (Java Virtual Machine). JVM — это такая про­слой­ка меж­ду про­грам­мой и желе­зом. Бла­го­да­ря этой про­слой­ке один и тот же код мож­но испол­нить на чём угод­но, для чего есть JVM: и на ком­пью­те­ре, и на тер­ми­на­ле опла­ты, и на умном холо­диль­ни­ке. Не нуж­но каж­дый раз думать: «А какие там драй­ве­ры экра­на?» или «С какой ско­ро­стью рабо­та­ет сете­вой шлюз?» — всё это берёт на себя JVM, а мы пишем толь­ко логи­ку и интерфейс.

Что это нам даёт.

  • Scala сов­ме­стим с Java-командами, поэто­му если вы зна­е­те Java, то смо­же­те перей­ти и на Scala.
  • Scala может рабо­тать с любым кодом на Java, неза­ви­си­мо от его сложности.
  • Чистей­шая, неза­мут­нён­ная объектно-ориентированность: даже сама про­грам­ма — это один боль­шой объект.
  • Силь­ные меха­низ­мы абстрак­ции поз­во­ля­ют оди­на­ко­во про­сто про­грам­ми­ро­вать боль­шие и малень­кие систе­мы и лег­ко мас­шта­би­ро­вать их.
  • Объ­еди­не­ны объектно-ориентированный и функ­ци­о­наль­ный под­хо­ды — в тео­рии это долж­но спо­соб­ство­вать рас­про­стра­не­нию языка.

Но если всё было бы так про­сто, про Java все дав­но бы забы­ли, но это­го не про­изо­шло. Более того, сей­час не так мно­го Scala-вакансий на рын­ке, что­бы гово­рить о попу­ляр­но­сти это­го язы­ка. На это есть несколь­ко причин:

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

Рейтинги и индексы

Индекс TIOBE по итогам октября 2016 года показывает, что Java является самым популярным языком программирования. Он уверенно лидирует уже 15 лет подряд и был на втором месте только в 2001 году.

Между Java и Scala в этом рейтинге наблюдается большой разрыв. Впрочем, последний уступает также языкам Lua, Fortran, Lisp, Transact-SQL, Ada и F#, расположившись на 33 месте. Однако в рейтинге 50 мест, и Scala все-таки сумел обойти функционально-логические языки Haskell и Prologue.

В другом рейтинге у Scala дела не так плохи. Согласно данным IEEE Spectrum за 2016 год, он занимает 15 место. Java тоже находится в лидерах, но на этот раз на почетном втором месте. Составители рейтинга указывают, что область применения Scala у них ограничена только веб- и мобильной разработкой. Разработка для ПК во внимание не принимается. В то время как Java они воспринимают как язык разработки для всех трех платформ.

По данным опроса Github на начало 2016 года, у Scala дела идут еще лучше: он занимает 11 место. Java опять возглавляет рейтинг. Причем, здесь он идет с большим отрывом от C#.

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

В первой группе мы видим Swift и Scala, которые делят между собой звание «идеального языка»; еще можно отметить довольно высокую оценку Go. Java здесь занимает только четвертую строчку. Это первый показатель, по которому Scala смог обойти своих родственников – C# и Java.

Перспективы

Свое мнение о будущем Scala уже высказывал Барух Садогурский — Developer advocate в компании JFrog:

Меня несколько пугает то, что сейчас происходит со Scala, потому что есть тренд ухода от него: например, компания TypeSafe, которая пыталась зарабатывать деньги на библиотеках, связанных со Scala. Некоторое время назад было объявлено об уходе TypeSafe с сильного акцента на Scala на гораздо больший акцент в Java, потому что большая часть enterprise-разработки на Java, где собственно находятся деньги. Поэтому они наняли много новых людей, которые подтягивают какие-то Java-интерфейсы, которых раньше у них не было.
Мы также видим другие библиотеки, которые были очень ориентированы на Scala. Например, Spark, где в новом релизе Java API подтянуты до уровня Scala, и, похоже на то, что дальше они будут развиваться не хуже API Scala, если даже не лучше. Я бы сказал, что в глобальной картине мы видим некоторый разворот в сторону Java.
И я абсолютно не удивлен этому, потому что Scala, как академический язык, совершенно прекрасное творение, но для Enterprise-хардкора, чтобы гнать код в продакшн, он не подходит, потому что сложен для разработчиков, которые решают реальные бизнес-проблемы, которым нужен мощный, но, в тоже время, не очень сложный инструмент, у которых в жизни есть вещи важнее, чем разбираться в системе типов Scala.
Именно поэтому я никогда не был большим фанатом Scala, и тенденция ухода от Scala меня не удивляет. Безусловно Scala никуда не денется и продолжит развиваться, но в гораздо более нишевом формате.

Намного оптимистичнее смотрит на это Ashesh Ambasta, Lead backend engineer в CentralApp:

Я верю, что у Scala все-таки хорошие перпективы. Недаром многие крупные компании выбрали его. Несмотря на то, что путь, сочетающий ООП и ФП может показаться опасным и сбить с толку «пуритан», при аккуратном использовании, программирование на Scala может доставлять удовольствие.
Я не согласен с тем, что Scala в освоении труднее других языков программирования. Есть, конечно, определенный «барьер», связанный с необходимостью думать одновременно в разных парадигмах. Хотя на большинстве форумов этот язык почему-то обсуждают в контексте функционального программирования.
Мне приходилось слышать высказывания по типу: «Scala больше подходит для крупномасштабных систем, а не каких-то там Твиттеров». Но будет ошибкой полагать, что он создан только для этого. Я не думаю, что реализовать MVP (Minimum Viable Product) на Scala сложнее, чем на каком-то другом языке.
Я никогда не был особенно увлечен объектно-ориентированным программированием. С тех пор, как познакомился с Erlang, я к нему не возвращался. Затем я выбрал Scala для бэкэнд-разработки в новой компании и получил положительные отзывы. Это вселило в меня уверенность, что я сделал правильный выбор.

 

Источники
  • https://wiki2.org/ru/Scala_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
  • https://infostart.ru/journal/news/tekhnologii/yazyk-programmirovaniya-scala-skala-kotoruyu-stoit-pokorit_890229/
  • https://nuancesprog.ru/p/763/
  • https://coderlessons.com/tutorials/kompiuternoe-programmirovanie/uchebnik-scala/uchebnik-scala
  • https://habr.com/ru/company/piter/blog/341808/
  • https://habr.com/ru/post/314308/
  • http://espressocode.top/scala-tutorial-learn-scala-with-step-by-step-guide/
  • https://thecode.media/scala/

tett
Зарплатто.ру - сайт о зарплатах и доходах, деньгах и финансах