Scala
Общие сведения
Scala — это мультипарадигменный язык программирования, спроектированный с целью объединения свойств объектно-ориентированного и функционального программирования. Название языка является сокращением, подчеркивающим его масштабируемость (от английского «scalable»): концептуально язык спроектирован таким образом, чтобы одни и те же архитектурные концепции одинаково эффективно описывали как небольшие фрагменты кода, так и масштабные компоненты программного обеспечения. Несмотря на то, что Scala часто рассматривается в профессиональной среде как потенциальный преемник языка Java, он занимает собственную нишу благодаря уникальному синтаксису и гибридному парадигмальному подходу.
История создания
Язык был разработан в Федеральной политехнической школе Лозанны (Швейцария), представляя собой крупный европейский академический проект. Первая версия языка датируется 2003 годом, а в 2004 году состоялся его выпуск и базовая реализация на платформе .NET.
При проектировании языка разработчики опирались на богатое историческое наследие информатики. На архитектуру Scala оказали сильное влияние многие классические языки. Концепция того, что «все сущности являются объектами», была напрямую заимствована из языка Smalltalk. Абстрактные типы данных опираются на теоретические идеи языков OCaml и SML. Инструменты функционального программирования (такие как анонимные функции и работа с функциями как с полноправными значениями) имеют глубокие корни в языках Lisp и Scheme. Синтаксическая и структурная база во многом схожа с языком C# и, в особенности, с языком Java, с которым Scala делит общую вычислительную среду исполнения.
Парадигмы программирования
Исторически, в 1970-е и 1980-е годы, объектно-ориентированная и функциональная парадигмы рассматривались как противоположные подходы к разработке (причем функциональное программирование зачастую ассоциировалось исключительно с разработкой систем искусственного интеллекта). Scala, следуя синкретическому подходу языков программирования 2000-х годов, постулирует полное объединение этих двух концепций вплоть до их неразличимости.
В рамках чистой объектно-ориентированной модели Scala абсолютно любые типы данных рассматриваются как объекты. Даже примитивные числовые значения (целочисленные форматы или числа с плавающей запятой) являются полноценными объектами, а стандартные арифметические операции, такие как сложение или умножение, представляют собой вызов метода соответствующего объекта. Для композиции классов и обеспечения гибкости структуры объектов активно применяется концепция типажей (traits) и примесей (mixins). Уменьшение количества базовых примитивов компенсируется развитыми механизмами абстракции, композиции и декомпозиции.
С точки зрения функционального программирования, язык поддерживает анонимные и каррированные функции, обобщенное программирование (дженерики), а также мощный механизм сопоставления с образцом (pattern matching). Декомпозиция сложных объектов часто производится именно путем сопоставления с образцом. Поскольку в 2000-е годы стандартом разметки веб-документов выступал формат XML, механизмы сопоставления с образцом в Scala были специально обобщены и адаптированы для нативной и эффективной обработки XML-документов.
Для решения классической проблемы внешней расширяемости программных компонентов в языке реализована концепция представлений (views). Этот механизм позволяет расширять существующие классы новыми членами и типажами, органично интегрируя внешние объектные подсистемы. Отмечается, что данная концепция концептуально соответствует абстракциям классов типов, применяемым в академическом языке Haskell.
Синтаксис и взаимодействие с Java
Синтаксис Scala имеет заметные отличия от классической Java, стремясь к большей лаконичности и выразительности, что делает его визуально более похожим на синтаксис языка C#. Код, написанный в функциональном стиле на Scala, практически идентичен аналогичному коду на C#. В то время как классический императивный подход требует написания многострочных циклов, функциональный стиль Scala позволяет сократить выполнение сложных итеративных операций (например, обработку списка параметров) до одной строки выразительного кода.
В архитектуре Scala любая исполняемая программа фактически представляет собой класс. Язык обладает глубочайшей интеграцией с экосистемой Java. Учитывая высокое проникновение Java в корпоративный сектор, в Scala по умолчанию подключены все фундаментальные классы из стандартного пакета java.lang. Компилятор Scala позволяет без дополнительных усилий напрямую вставлять код, написанный на Java, в исходные тексты программ, обеспечивая бесшовное взаимодействие между компонентами двух языков.
Концептуальный пример лаконичности синтаксиса при консольном выводе данных:
// Функциональный подход к итерации позволяет избежать создания явных счетчиков args.foreach(arg => println(arg))
Сферы применения
Несмотря на мощную теоретическую базу и технические возможности, применение языка носит ограниченный характер. Массовому распространению Scala препятствует доминирование традиционных инструментов веб-разработки и специфическая ниша, которую язык занимает на рынке.
Тем не менее, Scala успешно применяется при разработке крупных высоконагруженных систем, распределенных приложений и профильных фреймворков. На данном языке частично написана серверная архитектура всемирно известного образовательного проекта Coursera, а также деловой социальной сети LinkedIn. В 2009 году на язык Scala с языка Ruby была переведена значительная часть вычислительной инфраструктуры социальной сети Twitter. Также язык находит уверенное применение в банковском и финансовом секторе для обработки сложных транзакций и создания отказоустойчивых бизнес-компонентов.