Язык программирования scala реферат

Обновлено: 02.07.2024

Содержание

История

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

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

Истоки дизайна

На дизайн Scala оказали влияние многие языки и исследовательские работы. Следующее перечисление включает часть работ.

Ключевые аспекты языка

Объектно-ориентированный язык

Функциональный язык

Каждая функция — это значение. Язык предоставляет легковесный синтаксис для определения анонимных и карринговых функций. Каждая конструкция возвращает значение. Сопоставление с образцом естественно расширяется к обработке XML c помощью регулярных выражений.

Повторное использование и адаптация

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

Scala представляет новую концепцию решения проблемы внешней расширяемости — виды (views). Они позволяют расширять класс новыми членами и trait-ами. Виды в Scala переводят в объектно-ориентированное представление используемые в Haskell классы типов. В отличие от классов типов, область видимости видов можно контролировать, причем в разных частях программы могут сосуществовать параллельные виды.

Примеры программ

Программа, как и в Java, представляет собой объект. Это пример консольной программы, которая выводит строчку текста на экран.

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

С помощью метода map перебираются все аргументы. Все они преобразовываются в целое число методом Integer.parseInt и добавляются в список (массив) elems . Затем с помощью метода свёртки списка foldRight вычисляется сумма элементов.

Интеграция с Java

Scala может взаимодействовать с кодом, написанным на Java. Все классы из пакета java.lang уже импортированы по умолчанию, в то же время другие должны быть импортированы явно.

Пример

Задача: получить и отформатировать текущую дату в локализации определённой страны, например — Франции.

В библиотеке классов Java уже есть требующаяся нам функциональность в классах Date и DateFormat . Для того, чтобы воспользоваться этим, достаточно просто импортировать эти классы из соответствующих Java-пакетов:

Введение 3
История 5
Истоки дизайна 5
Ключевые аспекты языка 5
Объектно-ориентированный язык 7
Функциональный язык 7
Java-подобный язык 7
Классы 9
Операции 11
Переменные и свойства 15
Операции – это объекты 15
Методы и функциональные значения 16
Функции – это объекты 17
Последовательности 18
For Comprehensions 18
Абстракции 19
Функциональная абстракция 20
Вариантность (Variance). 21
Абстрактные члены 23
Семейный полиморфизм (family polymorphism) и self-типы. 24
Моделирование обобщенных (generic) типов с помощью абстрактных типов 24
Композиция 27
Повторное использование классов 27
Наследование. 28
Trait 31
Декомпозиция 32
Объектно-ориентированная декомпозиция 32
Модель данных 32
Автономные компоненты 32
Адаптация компонентов 33
Виды (views) 33
Границы видов 34
Заключение 35
Список литературы 36

Файлы: 1 файл

Курсовая работа СКАЛА.docx

Это требование в Scala введено по причинам типобезопасности. Поскольку при составлении mixin-классов в другой класс копируются только различия, могло бы случиться так, что некоторые привнесенные члены ссылались бы на унаследованные члены, отсутствующие в новом контексте, порождая исключение “метод не найден”.

Неоднозначности. В Scala каждый класс наследуется только от одного суперкласса, и получает члены класса от нескольких других классов в процессе составления mixin-класса. Представьте, например, следующий подкласс класса Buffer, который вводит метод sameElements, а также внутренне используемый метод forall.class ComparableBuffer[T] extends Buffer[T]

def forall(p: T => Boolean) : Boolean =

val it = elements;

while (res && it.hasNext)

def sameElements(b: IterableBuffer[T]) : Boolean =

Можно создать новый класс стека MyStack, который содержит функциональность, предоставляемую как IterableBuffer, так и ComparableBuffer, используя оба класса как mixin-ы.class MyStack[T] extends Stack[T]

with ComparableBuffer[T]; // Ошибка!

В Scala методы, определенные в mixin-ах, либо представляют новые методы, либо переопределяют соответствующие методы суперкласса. Как показано в предыдущем примере, может случиться так, что два mixin-а определят один и тот же метод. Классу MyStack неясно, какой из методов forall использовать. Такая неоднозначность порождает ошибку времени компиляции, которая должна быть явно устранена программистом. Возможное решение – ввести новый метод forall, который перенаправляет вызовы нужной реализации. Следующий код использует примитив super[C], позволяющий ссылаться на конкретные определения в mixin-классе C:class MyStack[T] extends Stack[T]

override def forall(p: T => Boolean) =

Trait

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

Чтобы избежать этого, Scala позволяет подмешивать класс в другой класс, только если он не использовался ранее в этом другом классе как суперкласс или mixin. К сожалению, это правило накладывает сильные ограничения, исключая множество случаев, когда двойное наследование от одного класса не является проблемой – в частности, для классов без инкапсулированного состояния (в эту категорию попадают интерфейсы Java). По этой причине в Scala введено понятие trait-ов. Trait-ы – это абстрактные классы, не инкапсулирующие состояния ни в виде определений переменных, ни в виде предоставления конструкторов с параметрами. Однако, в противоположность Java-интерфейсам, они могут реализовать конкретные методы.

Поскольку trait-ы не инкапсулируют состояния, двойное наследование от них в Scala разрешено. Таким образом, в иерархии суперклассов класса можно использовать один trait несколько раз.

Декомпозиция

Объектно-ориентированная декомпозиция

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

Модель данных

Модель данных для XML в Scala – это неизменяемое представление упорядоченного неранжированного дерева. В таком дереве у каждого узла есть метка, последовательность дочерних узлов и ассоциативный список атрибутов и их значений. Все это описано в trait-е scala.xml.Node, который, кроме того, содержит эквиваленты XPath-операторов child и descendant-or-self, записываемые как \ и \\. Для элементов, текстовых узлов, комментариев, инструкций по обработке и ссылок на сущности существуют конкретные подклассы.

Автономные компоненты

Язык Scala как таковой не предоставляет никаких примитивов для параллельного программирования. Вместо этого ядро языка создавалось так, чтобы упростить создание библиотек, предоставляющих различные модели параллелизма, строящиеся поверх поточной модели языка-основы. В этом разделе будет продемонстрирована мощь Scala на примере реализации небольшой библиотеки для отказоустойчивых активных объектов, подобных акторам Erlang (Erlang – функциональный язык, предназначенный для конкурентного (многопоточного) программирования, разработанный фирмой Ericsson, и используемый в телекоммуникационных системах этой фирмы – прим.ред.).

Адаптация компонентов

Каждая компонентная система с мощными конструкциями абстракции и композиции сталкивается с проблемой, когда дело доходит до интеграции подсистем, разработанных различными командами в разное время. Проблема состоит в том, что интерфейс компонентов, разработанных той или иной группой, часто не подходит клиентам, намеренным использовать этот компонент. Рассмотрим, например, библиотеку с классом наподобие GenList, обсуждавшегося выше. Клиент этой библиотеки может захотеть рассматривать такие списки как множества (sets), поддерживающие операции включения членов или проверки вхождения элемента во множество. Однако поставщик класса не предполагал такого сценария использования, и, следовательно, не включил эти методы в интерфейс класса GenList.

Виды (views)

Scala представляет новую концепцию решения проблемы внешней расширяемости – виды (views). Они позволяют расширять класс новыми членами и trait-ами. Виды в Scala переводят в объектно- ориентированное представление используемые в Haskell классы типов (type classes). В отличие от классов типов, область видимости видов можно контролировать, причем в разных частях программы могут сосуществовать параллельные виды.

Какие виды доступны для вставки? Scala рассматривает в качестве кандидатов все виды, к которым имеется доступ из точки вставки без префиксного выражения. Это включает как виды, определенные локально или в некоторой области видимости, так и виды, унаследованные от базовых классов или импортированные из других объектов выражением import. Локальный вид не прячет виды, определенные в прилегающей области видимости. Вид применим, если он может быть применен к выражению, и он позволяет отобразить это выражение на желаемый тип. Из всех кандидатов Scala выбирает наиболее точно подходящий вид. В данном случае точность интерпретируется так же, как при разрешении перегрузки в Java и Scala. Если применимого вида нет, или среди применимых не удается выбрать подходящий – генерируется ошибка.

Локальность обеспечивается тем ограничением, что в качестве кандидатов рассматриваются только те виды, которые доступны без префикса. Клиенты могут приспосабливать под свои нужды набор доступных видов, выборочно импортируя объекты, определяющие виды.

Виды часто используются в библиотеке Scala, чтобы дать возможность Java-типам поддерживать trait-ы Scala. Примером может служить Scala-trait Ordered, определяющий набор операций сравнения. Виды на этот тип от всех базовых типов и класса String определены в модуле scala.Predef. Поскольку члены этого модуля неявно импортируются в каждую Scala-программу, эти виды всегда доступны. С точки зрения пользователя, это похоже на расширение Java-классов новыми trait-ами.

Границы видов

До сих пор методы видов должны были быть видимы статически в точке вставки. Виды становятся еще более полезными, если можно абстрагироваться от конкретного вставляемого метода.

MultiJava – это консервативное расширение Java, которое добавляет симметричную множественную диспетчеризацию и открытые классы. Оно предоставляет альтернативное решение многих проблем, которыми занимается и Scala. Например, множественная диспетчеризация дает решение проблемы бинарных методов, которая в Scala решается абстрактными типами. Открытые классы предоставляют решение проблемы внешней расширяемости, которая в Scala решается с помощью видов. Только в MultiJava встречается возможность динамического добавления новых методов в класс, так как открытые классы интегрированы с обычным процессом динамической загрузки в Java. Напротив, только Scala позволяет определять область видимости внешних расширений класса в программе.

Заключение

Scala – это также и относительно маленький язык в том смысле, что он построен на скромном наборе весьма общих концепций. Многие конструкции являются синтаксическим сахаром, который может быть удален с помощью трансформации. Такие обобщения, как унифицированная объектная модель, позволяют абстрагироваться от многих примитивных типов и операций, перекладывая работу с ними на плечи библиотеки Scala. Спецификация и реализация Scala также показывают, что ее сложность управляема. Современный frontend компилятора Scala имеет размер, сравнимый с frontend-ом Sun Java 1.4. Текущая спецификация Scala [9] (около 100 страниц) значительно меньше текущей спецификации Java 1.4 [18] (около 400 страниц). Эти числа трудно сравнивать, однако, поскольку спецификации Scala все еще недостает зрелости спецификации Java, и она использует краткие формулы во многих местах, где спецификация Java использует словесное описание.

Магистр ДонНТУ Лащенко Андрей Владимирович

Лащенко Андрей Владимирович

Есть два способа создания дизайна программы. Один из них, это сделать его настолько простым, что в нем, очевидно, не будет недостатков. Другой способ — сделать его настолько запутанным, что в нем не будет очевидных недостатков.

Чарльз Энтони Ричард Хоар

На данный момент я серьезно занимаюсь программированием более 6 лет. Я хотел бы расказать о том, с какими технологиями и проектами мне приходилось работать.

Язык программирования C++ и Qt

C++ был моим основным языком программирования с 2005 года. Еще во время учебы я заинтересовался Qt.

Мой серьезный опыт в программировании начинается с весны 2008 года, когда мне предложили поработать в отделе распознавания речевых образов научно-исследовательского института проблем искусственного интеллекта. Как раз в то время в отделе начинали задумываться о переходе на Linux, в связи с этим необходимо было использовать библиотеки, позволяющие писать кросплатформенные приложения. В отделе была популярна WxWidgets, однако симпатии у меня эта библиотека не вызывала, поэтому я продолжил использовать свою любимую связку C++ и Qt, а для работы со звуком использовалась OpenAL. Проект, над которым я работал, носил название "Разработка автоматизированной компьютерной системы фоноскопической экспертизы цифровых фонограмм". Мной были разработаны, модифицированы и реализованы различные алгоритмы цифровой обработки речи. Проводились исследования в области автоматической сегментации речевого сигнала. Велись работы над обнаружением монтажа в цифровом сигнале. Много внимания было уделено выделению фонем из спектра речевого сигнала.







Примерно в это же время у меня появился первый телефон с ОС Symbian, а вместе с ним и опыт написания приложений для мобильных устройств с использованием Qt и C++. Мне было просто интересно писать приложения для взаимодействия с пользователем посредством сенсорного экрана.


В данное время я продолжаю использовать Qt/C++, но в гораздо меньшей степени, например, для создания приложений, позволяющих более наглядно и красиво отобразить файлы в некоторых специфических текстовых форматах.

Язык программирования Python

В продолжение повествования об исследовательской деятельности, хочется отметить Python. Это очень простой и выразительный язык, для которого существует множество исследовательских библиотек. Я использую в свободное время scikit-learn, scikit-image, scikit-audiolabs, scipy, numpy, matplotlib. В настоящее время доступно множество замечательных книг, описывающих работу с этими библиотеками. Стоит отметить, что в данное время уровень языка и наличие таких библиотек позволяет рассматривать это все как замену Matlab, о чем ведется много дискуссий.


Язык программирования Java

Впервые интерес к Java у меня появился где-то в 2009 году. В 2011 году я получил сертификат "Oracle Certified Professional, Java SE 6 Programmer".


Коммерческий опыт начался с 2010 года в Exadel, где я занимался написанием web UI (с использованием GWT), валидаторов и заглушек для серверной части в рамках глобального проекта MaxTrad Online Trade Services.


Затем я был вовлечен в разработку ПО для ресиверов цифрового телевидения компании DirecTV. Java действительно работает везде, даже на встраиваемых системах. Попробую описать различные уровни приложений и их взаимодействие в случае встраиваемых систем. На низком уровне используется C/C++ и bash script, далее, через JNI, все передается на уровень, на котором начинается использование Java, вплоть до верхнего уровня UI. Использование Bash Script оправдано во многих случаях при работе с UNIX-подобными системами. В моем случае была необходимость проводить различные манипуляции с файлами и дисковым пространством еще на этапе загрузки ОС, в то время, когда JVM еще не загружена. Это были основные инструменты при разработке системы плагинов, обработки медиа-данных и написания UI. Кроме того было много рефакторинга.






Весной 2012 года я начал работать в компании Luxoft над серверной частью одного из проектов Deutche Bank, связанного с проведением сделок на финансовых рынках.
В этом проекте мы начали понемногу использовать Scala, вместо JBoss Drools flow и Drools rules, а затем появились еще несколько проектов, в которых Scala стала основным языком.

Язык программирования Scala


Так получилось, что практически весь последний год я использовал Scala в 90% случаев. Впечатления исключительно положительные. Мне бы хотелось кратко, насколько это возможно, написать про этот замечательный язык программирования.

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

Области применения Scala

  • web-приложений;
  • скриптов;
  • интеграционных приложений;
  • масштабируемых и высокопроизводительных серверных приложений;
  • мобильных приложений;
  • собственных предметно-ориентированных языков (DSL).

Выразительность Scala

Рассмотрим типичный пример кода, написанного на Java. Напишем несколько строк, показывающих, как использовать этот класс:
А теперь перепишем класс Person, используя Scala. Это все. Мы можем использовать этот класс так же как в Java, даже более компактно:

Если необходимо иметь JavaBeans методы доступа к полям firstName и lastName - можно сгенерировать их автоматически, используя аннотацию @BeanProperty, как показано ниже:

Императивная и функциональная парадигма программирования в Scala

  1. Обработка списков:
  2. Параллельная обработка данных:
  3. Проверка вхождения подстрок в строке:
  4. Чтение текста из файла:
  5. Получение и разбор XML от web-сервиса:

Что еще есть в Scala

Параллельные вычисления в Scala

Акторы представляют собой механизм параллельных вычислений, альтернативный традиционным механизмам на основе блокировок. Отсутствие блокировок и совместно используемых данных в акторах упрощает разработку программ и позволяет не опасаться взаимоблокировок и состояний гонки за ресурсами.
Ранее Scala предоставляла простейшую реализацию акторов. Более совершенные реализации акторов доступны на сторонних ресурсах, самым известным из которых является проект Akka. Начиная с версии 2.10, в Scala была включена поддержка акторов Akka Actors.
Приведем классический HelloWorld, написанный на Scala с использованием акторов, с сайта akka.io. Более серьезный пример параллельного вычисления числа π можно посмотреть в разделе Getting Started Tutorial, а также почитать про Dataflow Concurrency, Parallel collections и Futures and Promises.

Динамика изменения количества вакансий на Scala

Scala Job Trends

Стоит отметить, что в последнее время интерес к Scala сильно возрос и продолжает расти, причем не только в академических кругах.

Здесь вы увидите вводное описание наиболее часто используемых возможностей Scala. Этот обзор предназначен для новичков в изучении языка.

Это лишь небольшая экскурсия, а не полный курс освоения языка. Для глубокого погружения рекомендуем почитать книги или воспользоваться курсами на других ресурсах.

Что такое Scala?

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

Scala объектно ориентированный

Scala - это чистый объектно-ориентированный язык в том смысле, что каждое значение - это объект. Типы и поведение объектов описаны в классах и трейтах(характеристиках объектов). Классы расширяются за счет механизма наследования и гибкого смешивания классов, который используется для замены множественного наследования.

Scala функциональный

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

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

Scala статически типизированный

Scala оснащен выразительной системой типов, которая обеспечивает безопасное и гармоничное использование абстракций. В частности, система типов поддерживает:

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

Scala расширяемый

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

Во многих случаях такое можно сделать без использования средств мета-программирования, таких как макросы. Например:

    позволяют добавлять новые методы к уже существующим. позволяет добавлять обработку строк (расширяется разработчиком с помощью интерполяторов).

Scala совместимый

Scala полностью совместим с популярной средой Java Runtime Environment (JRE). Взаимодействие с основным объектно-ориентированным языком программирования Java происходит максимально гладко. Новые функции Java, такие как SAM, лямбды, аннотации и дженерики, имеют прямые аналоги в Scala.

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

Наслаждайтесь туром!

Для продолжения знакомства предлагаю перейти на следующую страницу нашего тура.

Читайте также: