- Scala (язык программирования)
-
Scala Класс языка: Мультипарадигмальный: функциональный, объектно-ориентированный, императивный
Появился в: Автор(ы): Мартин Одерский
Релиз: 2.9.2 (14 апреля 2012)
Типизация данных: статическая, строгая, с автовыведением типов, структурная
Испытал влияние: Java, Pizza[1] , Haskell, Erlang, Standard ML, C#, Objective Caml, Smalltalk, Scheme
Сайт: Scala — мультипарадигмальный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности функционального и объектно-ориентированного программирования.
Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерского (англ. Martin Odersky), язык реализован для платформ Java и .Net. По мнению Джеймса Стрэчена (англ. James Strachan (programmer)), создателя языка программирования Groovy, Scala может стать преемником языка Java[2].
Содержание
История
Язык был создан в 2001—2004 годах в Лаборатории методов программирования EPFL. Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного ПО. За основу при разработке языка были взяты 2 идеи:
- Язык программирования компонентного ПО должен быть масштабируемым в том смысле, что должна быть возможность с помощью одних и тех же концепций описать как маленькие, так и большие части. Поэтому внимание было сконцентрировано на механизмах абстракции, композиции и декомпозиции вместо введения большого количества примитивов, которые могут быть полезными только на каком-то одном уровне масштабирования.
- Масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование. Некоторые из основных технических новшеств Scala — это концепции, представляющие собой сплав этих парадигм программирования. В статически типизированных языках, к которым относится Scala, эти парадигмы до сих пор были почти полностью разделены.
Scala была выпущена для общего пользования на платформе JVM в январе 2004 года и на платформе .NET в июне 2004 года. Планируется продолжить работу над формализацией ключевых аспектов языка и над разработкой оптимизаций, выполняемых компилятором.
Истоки дизайна
На дизайн Scala оказали влияние многие языки и исследовательские работы. Следующее перечисление включает часть работ.
Scala впитала значительное число концепций и синтаксических соглашений Java и C#. Способ выражения свойств во многом заимствован из Sather (англ.). Из Smalltalk взята концепция унифицированной объектной модели. Из BETA пришла идея, что всё, включая классы, должно допускать вложенность. Абстрактные типы в Scala очень похожи на абстрактные типы сигнатур в SML и OCaml, обобщённые в контексте полноценных компонентов. В некотором смысле Scala — это продолжение работы Pizza (англ.). Как и Pizza, Scala компилируется под Java VM, добавляя функции высшего порядка, сопоставление с образцом, конструкции, которые исходно были созданы в сообществе функционального программирования. В то время как Pizza обратно совместима с Java, цель Scala — всего лишь возможность взаимодействия, так что у неё больше степеней свободы в дизайне. Ещё одна цель Scala — предоставить расширенные конструкции для абстракции и композиции компонентов — общая с несколькими недавними исследовательскими разработками.
Ключевые аспекты языка
- Scala-программы во многом похожи на Java-программы, и могут свободно взаимодействовать с Java-кодом.
- Scala включает единообразную объектную модель — в том смысле, что любое значение является объектом, а любая операция — вызовом метода.
- Scala — это также функциональный язык в том смысле, что функции — это полноправные значения.
- В Scala включены мощные и единообразные концепции абстракций как для типов, так и для значений.
- Она содержит гибкие симметричные конструкции примесей для композиции классов и trait-ов.
- Она позволяет производить декомпозицию объектов путем сравнения с образцом.
- Образцы и выражения были обобщены для поддержки естественной обработки XML-документов.
- В целом, эти конструкции позволяют легко выражать самостоятельные компоненты, использующие библиотеки Scala, не пользуясь специальными языковыми конструкциями.
- Scala допускает внешние расширения компонентов с использованием видов (views)
- Есть поддержка структурных и экзистенциальных типов.
- На текущий момент Scala реализована на платформах Java и .NET.
Объектно-ориентированный язык
В Scala используется чистая объектно-ориентированная модель, похожая на применяемую в Smalltalk: каждое значение — это объект, и каждая операция — это отправка сообщения. Например, сложение x+y интерпретируется как x.+(y), то есть как вызов метода + с аргументом x в качестве объекта-приёмника и y в качестве аргумента метода. Рассмотрим другой пример: 1+2. Это выражение интерпретируется как (1).+(2).Обратите внимание, что скобки вокруг чисел обязательны, потому что лексический анализатор Scala разбивает выражение на лексемы по принципу самого длинного возможного сопоставления. Таким образом, выражение 1.+(2) разобьется на лексемы 1.,+ и 2, потому что лексема 1. длиннее лексемы 1 и первый аргумент сложения будет интерпретирован, как тип Double вместо Int.[3]
Функциональный язык
Каждая функция — это значение. Язык предоставляет легковесный синтаксис для определения анонимных и карринговых функций. Каждая конструкция возвращает значение. Сопоставление с образцом естественно расширяется к обработке XML c помощью регулярных выражений.
Повторное использование и адаптация
Каждая компонентная система с мощными конструкциями абстракции и композиции сталкивается с проблемой, когда дело доходит до интеграции подсистем, разработанных различными командами в разное время. Проблема состоит в том, что интерфейс компонентов, разработанных той или иной группой, часто не подходит клиентам, намеренным использовать этот компонент.
Scala представляет новую концепцию решения проблемы внешней расширяемости — виды (views). Они позволяют расширять класс новыми членами и trait-ами. Виды в Scala переводят в объектно-ориентированное представление используемые в Haskell классы типов. В отличие от классов типов, область видимости видов можно контролировать, причем в разных частях программы могут сосуществовать параллельные виды.
.Net и JVM
.Net и JVM во многом схожи — в том, что они оба поддерживают одиночное наследование классов, множественную реализацию интерфейсов, самоописываемые типы, ленивую загрузку типов. Хотя Scala и разрабатывалась с оглядкой на Java, ставилась также задача поддержки всех возможностей .NET.
Примеры программ
Программа, как и в Java, представляет собой объект. Это пример консольной программы, которая выводит строчку текста на экран.
object HelloWorld { def main(args: Array[String]) = Console.println("Привет, МИР!") }
Следующий простой пример программы написан на Java и Scala, демонстрирующий некоторые различия в синтаксисе (постфиксная запись типов переменных, отсутствие специального синтаксиса для доступа к массивам). В этом примере описывается консольная программа, которая выводит все опции, переданные через командную строку. Опции начинаются с символа «-» (минус).
class PrintOptions { public static void main(String[] args) { System.out.println("Выбраны опции:"); for (String arg: args) if (arg.startsWith("-")) System.out.println(" " + arg.substring(1)); } }
object PrintOptions { def main(args: Array[String]) : Unit = { println("Выбраны опции:") for (arg <- args if arg startsWith "-") println(" " + (arg substring 1)) } }
// Или в функциональном стиле: object PrintOptions { def main(args: Array[String]) : Unit = println("Выбраны опции:" +: (args withFilter (_ startsWith "-") map (" " + _.drop(1))) mkString "\n") }
Обратите внимание, что в Scala объявляется не класс объекта, а сразу экземпляр объекта. Так естественным способом реализуется шаблон проектирования, где в программе должен быть только один экземпляр класса («Одиночка» — «Singleton»).
Пример программы, которая суммирует все элементы списка, который передаётся через аргументы.
object Main { def main(args: Array[String]) { try { val elems = args map Integer.parseInt println("Сумма аргументов: " + elems.foldRight(0) (_ + _)) } catch { case e: NumberFormatException => println("Ошибка в аргументах. Использовать следует так: scala Main <число1> <число2> ... ") } } }
С помощью метода
map
перебираются все аргументы. Все они преобразовываются в целое число методомInteger.parseInt
и добавляются в список (массив)elems
. Затем с помощью метода свёртки спискаfoldRight
вычисляется сумма элементов.Интеграция с Java
Scala может взаимодействовать с кодом, написанным на Java. Все классы из пакета
java.lang
уже импортированы по умолчанию, в то же время другие должны быть импортированы явно.Пример
Задача: получить и отформатировать текущую дату в локализации определённой страны, например — Франции.
В библиотеке классов Java уже есть требующаяся нам функциональность в классах
Date
иDateFormat
. Для того, чтобы воспользоваться этим, достаточно просто импортировать эти классы из соответствующих Java-пакетов:import java.util.{Date, Locale} import java.text.DateFormat import java.text.DateFormat._ object FrenchDate { def main(args: Array[String]) { val now = new Date val df = getDateInstance(LONG, Locale.FRANCE) println(df format now) } }
См. также
Примечания
- ↑ Martin Odersky et al., Programming in Scala, 2nd Edition
- ↑ Strachan, James Scala as the long term replacement for java/javac? (6 июля 2009). Архивировано из первоисточника 10 февраля 2012. Проверено 7 января 2012.
- ↑ http://www.scala-lang.org/docu/files/ScalaTutorial.pdf#
Ссылки
- The Scala Programming Language (англ.) — веб-сайт языка программирования Scala.
- The Scala Language Specification (англ.) — спецификация языка программирования Scala.
- Руководство по Scala (рус.) перевод англоязычного руководства
- Scala Wiki (англ.) — вики для программистов.
- Путеводитель по Scala: серия статей на сайте IBM developerWorks
- Scala for Java programmers (англ.) — сравнение с Java.
- Обзор языка программирования Scala — перевод статьи, описывающей причину разработки, идеи, возможности языка.
Основные языки программирования (сравнение • IDE • история • хронология) Используемые
в разработкеАда • APL • Язык ассемблера • ActionScript • ABAP/4 • AutoIt • AWK • Бейсик • Си • Кобол • C++ • C# • Cω • Clarion • Clojure • ColdFusion • Common Lisp • D • dBase • Delphi • Eiffel • Erlang • Euphoria • F# • Форт • Фортран • Gambas • Go • Groovy • HAL/S • Haskell • Icon • Java • JavaScript • Limbo • Lua • Модула-3 • Object Pascal • Objective-C • OCaml • Oz • Parser • Паскаль • Компонентный Паскаль • Perl • PHP • PowerBASIC • Python • ПЛ/1 • Пролог • Ruby • Scala • Scheme • Smalltalk • SQL • PL/SQL • Tcl • Vala • Visual Basic (.NET)
Академические IEC 61131-3 Instruction List • ST • FBD • Ladder Diagram (LD) • SFC
Прочие Эзотерические Визуальные Категории:- Появились в 2003 году
- Языки программирования по алфавиту
- Объектно-ориентированные языки программирования
- Языки программирования платформы .NET
- Свободные компиляторы и интерпретаторы
- Языки программирования платформы Java
Wikimedia Foundation. 2010.