Scala (язык программирования)
Материал из Википедии — свободной энциклопедии
Scala — мультипарадигменный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого программирования. В нем органично сочетаются возможности функционального и объектно ориентированного программирования. Основной целью разработки был язык, обладающий хорошей поддержкой компонентного ПО.
Содержание |
[править] История
Язык был создан в 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 в качестве аргумента метода.
[править] Функциональный язык
Каждая функция – это значение. Язык предоставляет легковесный синтаксис для определения анонимных и карринговых функций. Каждая конструкция возвращает значение. Сопоставление с образцом естественно расширяется к обработке XML c помощью регулярных выражений.
[править] Повторное использование и адаптация
Каждая компонентная система с мощными конструкциями абстракции и композиции сталкивается с проблемой, когда дело доходит до интеграции подсистем, разработанных различными командами в разное время. Проблема состоит в том, что интерфейс компонентов, разработанных той или иной группой, часто не подходит клиентам, намеренным использовать этот компонент.
Scala представляет новую концепцию решения проблемы внешней расширяемости – виды (views). Они позволяют расширять класс новыми членами и trait-ами. Виды в Scala переводят в объектно-ориентированное представление используемые в Haskell классы типов. В отличие от классов типов, область видимости видов можно контролировать, причем в разных частях программы могут сосуществовать параллельные виды.
[править] .Net и JVM
.Net и JVM во многом схожи – в том, что они оба поддерживают одиночное наследование классов, множественное наследование интерфейсов, самоописываемые типы, ленивую загрузку типов. Кроме того, .Net Framework предоставляет поддержку свойств, атрибутов, типов-значений (структур), перечислений и событий. Хотя Scala и разрабатывалась с оглядкой на Java, ставилась также задача поддержки всех возможностей .NET.
[править] Примеры программ
Программа как и в Java представляет собой объект. Этот пример консольной программы которая выводит строчку текста на экран.
object SveikasPasauli {
def main(args: Array[String]) =
Console.println("Привет МИР!")
}
Следующий простой пример программы написан на Java и Scala, демонстрирующий некоторые различия в синтаксисе (постфиксная запись) типов переменных, отсутствие специального синтаксиса для доступа к массивам). В этом примере описывается консольная программа которая выводит все опции переданные через командную строку. Опции начинаются с символа "-" (минус).
| 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 =
{
System.out.println("Выбраны опции:");
for (val arg <- args)
if (arg.startsWith("-"))
System.out.println(" "+arg.substring(1));
}
}
|
Обратите внимание что в Scala объявляется не класс объекта, а сразу экземпляр объекта. Так естественным способом реализуется шаблон проектирования, где в программе должен быть только один экземпляр класса.
Пример программы которая суммирует все элементы списка который передаётся через аргументы.
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. Поскольку Scala плотно взаимодействует с Java, то нет нужды реализовывать эквивалентные классы в библиотеке классов Scala — мы можем просто импортировать их из соответсвующих 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)
}
}
Предложение импорта Scala выглядит очень похожим на Ява эквивалент, тем не менее, оно более мощное.
[править] См. также
- Groovy
- Boo
- F#
- Nemerle
- Сравнение возможностей Scala с другими языками см. в статье Сравнение языков программирования
[править] Ссылки
- The Scala Programming Language(англ.) — веб-сайт языка программирования Scala.
- The Scala Language Specification(англ.) — спецификация языка программирования Scala.
- Scala Wiki(англ.) — вики для программистов.
- Scala for Java programmers(англ.) - сравнение с Java.
- Обзор языка программирования Scala — перевод cтатьи, описывающей причину разработки, идеи, возможности языка.
|
|
|
|---|---|
| Используемые в разработке | ABAP/4 | Ада | ActionScript | Ассемблеры | AutoIt | Awk | BASIC | C | КОБОЛ | C++ | C# | ColdFusion | D | Delphi | Erlang | Eiffel | Forth | FoxPro | DataFlex | Фортран | Groovy | Haskell | Java | JavaScript | J++ | J# | Icon | Limbo | Лисп | Lua | Object Pascal | Objective-C | Оберон | Oz | Паскаль | Perl | PHP | PL/I | Пролог | Руби | Python | Tcl | Scheme | Smalltalk | SQL | Vala | Visual DataFlex | Visual Basic | VB.NET | Visual FoxPro |
| Академические | АПЛ | Clean | Curry | Gambas | Лого | MATLAB | ML | Scala |
| IEC61131-3 | Instruction List | ST | FBD | Ladder Diagram | SFC |
| Прочие | Алгол | Алгол 68 | Модула-2 | Miranda | Hope |
| Эзотерические | INTERCAL | Brainfuck | Befunge | Malbolge | Unlambda |
| список всех языков | |

