Метки: Scala википедия, scala сайт, scala 30x70, scala zombie.
Класс языка: |
Мультипарадигмальный: функциональный, объектно-ориентированный, императивный |
---|---|
Появился в: | |
Автор: | |
Выпуск: |
2.11.2 (21 апреля 2014[1]) |
Система типов: | |
Испытал влияние: |
Java, Pizza, Haskell, Erlang, Standard ML, Objective Caml, Smalltalk, Scheme, Algol68, Lisp |
Повлиял на: | |
Сайт: |
scala-lang.org |
Scala — мультипарадигмальный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности функционального и объектно-ориентированного программирования.
Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерски, язык реализован для платформ Java и .Net. По мнению Джеймса Стрэчена (англ. James Strachan), создателя языка программирования Groovy, Scala может стать преемником языка Java.[2]
Язык был создан в 2001—2004 годах в Лаборатории методов программирования EPFL. Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного ПО. За основу при разработке языка были взяты 2 идеи:
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 используется чистая объектно-ориентированная модель, похожая на применяемую в Smalltalk: каждое значение — это объект, и каждая операция — это отправка сообщения. Например, сложение x+y интерпретируется как x.+(y), то есть как вызов метода + с аргументом y и x в качестве объекта-приёмника. Рассмотрим другой пример: 1+2. Это выражение интерпретируется как (1).+(2).Обратите внимание, что скобки вокруг чисел обязательны, потому что лексический анализатор Scala разбивает выражение на лексемы по принципу самого длинного возможного сопоставления. Таким образом, выражение 1.+(2) разобьется на лексемы 1.,+ и 2, потому что лексема 1. длиннее лексемы 1 и первый аргумент сложения будет интерпретирован, как тип Double вместо Int.[3]
Каждая функция — это значение. Язык предоставляет легковесный синтаксис для определения анонимных и карринговых функций. Каждая конструкция возвращает значение. Сопоставление с образцом естественно расширяется к обработке XML c помощью регулярных выражений.
Каждая компонентная система с мощными конструкциями абстракции и композиции сталкивается с проблемой, когда дело доходит до интеграции подсистем, разработанных различными командами в разное время. Проблема состоит в том, что интерфейс компонентов, разработанных той или иной группой, часто не подходит клиентам, намеренным использовать этот компонент.
Scala представляет новую концепцию решения проблемы внешней расширяемости — виды (views). Они позволяют расширять класс новыми членами и trait-ами. Виды в Scala переводят в объектно-ориентированное представление используемые в Haskell классы типов. В отличие от классов типов, область видимости видов можно контролировать, причем в разных частях программы могут сосуществовать параллельные виды.
Программа, как и в Java, представляет собой объект. Это пример консольной программы, которая выводит строчку текста на экран.
object HelloWorld { def main(args: Array[String]) = println("Привет, МИР!") }
Следующий простой пример программы написан на Java, Scala и C#, демонстрирующий некоторые различия в синтаксисе (постфиксная запись типов переменных, отсутствие специального синтаксиса для доступа к массивам). В этом примере описывается консольная программа, которая выводит все опции, переданные через командную строку. Опции начинаются с символа «-» (минус).
// Java: class PrintOptions { public static void main(String[] args) { System.out.println("Выбраны опции:"); for (String arg: args) if (arg.startsWith("-")) System.out.println(" " + arg.substring(1)); } } // Scala: object PrintOptions { def main(args: Array[String]) : Unit = { println("Выбраны опции:") for (arg <- args if arg startsWith "-") println(" " + (arg substring 1)) } } // В функциональном стиле Scala: object PrintOptions { def main(args: Array[String]) : Unit = println("Выбраны опции:" +: (args withFilter (_ startsWith "-") map (" " + _.drop(1))) mkString "\n") } // В функциональном стиле C#: class PrintOptions { static void Main(String[] args) { System.Console.WriteLine("Выбраны опции:" + args.Where(x => x.StartsWith("-")).Aggregate((r, x) => r + " " + x.Substring(1))); } } |
Обратите внимание, что в 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
вычисляется сумма элементов.
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) } }
|
Tags: Scala википедия, scala сайт, scala 30x70, scala zombie.