Scala () е език за обобщено програмиране. Scala има пълен потенциал за функционално програмиране и много силна статичен тип система. Много от проекторешенията на Scala са вдъхновени от недостатъците на Java. Те са мотив да бъде проектиран по-рационален, кратък и ясен език като Scala. Изходният код на Scala е правен опит да може да се компилира с байткода на Java, за да може кодът да върви Java virtual machine (JVM). Java библиотеките могат да бъдат използвани директно в Scala кода и обратното (езикова приложимост). Като Java, Scala е обектно ориентиран език, и използва синтаксис с къдрави скоби напомнящ на програмния език C. За разлика от Java, Scala има много черти на езици за нефункционално програмиране като Scheme, Standard ML и Haskell, включително обработване, тип подразбиране, непроменливост, lazy (нестриктна оценка), и съвпадение на моделите. Освен това има напреднал тип системна поддържайки алгебричен тип данни, променлив и непроменлив, висок ред тип (но не от висок ранг) и анонимен тип данни. Други характерни черти за Scala са, че не присъства в Java include operator overloading, изборни параметри, именувани параметри, необработени низове и проверени изключения. Името Scala is идва от Scalable (по който може да се катери човек) и language (език), означавайки, че е създаден с идеята да расте заедно с изискванията на своите потребители.

История Проектът Scala е започнал през 2001 в института École Polytechnique Fédérale de Lausanne (EPFL) от Мартин Одерски. Последван е от труда върху Фунел (програмен език, който комбинира идеи от функционалното програмиране и Petri nets. Одерски преди това работил върху Generic Java и javac, компилаторът на Sun. След вътрешното издание в края на 2003 г., Scala излиза в началото на 2004 на Java платформата и на .NET платформа през юни 2004. Последвана от втора версия през 2006 г., .NET платформата официално спира да поддържа езика. Също така Scala е имала широка поддръжка за функционално програмиране от самото и начало. Java е останал чисто обектно ориентиран език до въвеждането на ламбда изразите с Java 8 през 2014. На 17 януари 2011 the Scala екипът е спечелил финансиране за 5-годишно проучване на стойност над 2,3 милиона евро от Европейското изследователско консулство. На 12 май 2011, Одерски и сътрудниците му създали Typesafe Inc., компания, която предоставя масова поддръжка, обучение и услуги, свързани със Scala. Typesafe Inc. получили 3 милиона щ.д. инвестиции през 2011 от Greylock Partners.

Платформи и лицензи Scala върви на Java платформата (Java Virtual Machine) и е съвместим със съществуващите Java програми. Както Android приложенията са типично предоставени като Java байткод, който да бъде преведен върху инсталацията, това прави Scala добре съвместим с Android разработването. Scala също може да се компилира с JavaScript, правейки го възможно да пише Scala програми, които могат да тръгнат на браузъра.

Софтуерното разпределение на Scala, включително компилатор и библиотеки са издадени под BSD лиценз.

Примери „Hello World“ пример object HelloWorld extends App { println("Hello, World!") } За разлика от Java, тук не се декларира клас и не е декларирано нищо статично; единствено е използван обект, създаден с ключовата дума “object“. Със запазването на програмата в името HelloWorld.scala, вече може да се компилира: $ scalac HelloWorld.scala За да тръгне: $ scala HelloWorld (Може да се наложи да използвате „-cp“ опцията за да поставите classpath като в Java).

Този процес е аналогичен с компилирането и пускането на Java code. Наистина, компилацията и използването на модела на Scala е идентичен на Java, правейки го съвместим с Java инструментите като as Ant.

По-кратка версия на „Hello World“ Scala програма е:

println("Hello, World!")

Scala включва интерактивна защита и скриптова поддръжка. Запазен с името HelloWorld2.scala, може да тръгне като скрипт без използването на предварителна компилация.

$ scala HelloWorld2.Scala

Командите също могат да бъдат въвеждани директно в Scala интерпретатора, чрез използването на опцията -e:

$ scala -e 'println("Hello, World!")'

Вече могат да се въвеждат команди интерактивно в REPL: $ scala

Welcome to Scala version 2.10.3 (OpenJDK 64-Bit Server VM, Java 1.7.0_51).

Type in expressions to have them evaluated.

Type :help for more information.

scala> println("Hello, World!")

Hello, World!

scala>

Основен пример В следващия пример се вижда разликата между синтаксиса на Java и Scala: // Java: int mathFunction(int num) { int numSquare = num*num; return (int) (Math.cbrt(numSquare) + Math.log(numSquare)); }// Scala: Direct conversion from Java // no import needed; scala.math // already imported as `math` def mathFunction(num: Int): Int = { var numSquare: Int = num*num return (math.cbrt(numSquare) + math.log(numSquare)). asInstanceOf[Int] }// Scala: More idiomatic // Uses type inference, omits `return` statement, // uses `toInt` method, declares numSquare immutable import math._ def intRoot23(num: Int) = { val numSquare = num*num (cbrt(numSquare) + log(numSquare)).toInt }

Някои съществени разлики: Scala не изисква точка и запетая накрая на стейтмънта. Стойностните типове: Int, Double, Boolean започват с главна буква, вместо: int, double, boolean. Параметричните и връщащите типове са по-скоро както в Pascal, отколкото в C. Методите трябва да бъдат предвождани от def. Пред локалните или класовите променливи трябва да се пише val (декларира неизменима променлива) or var (декларира изменима променлива). return операторът е излишен във функция (както и забранен); стойността на последното изпълнено условие или израз е обикновено стойността на функцията. Вместо Java cast оператора (Type) foo, Scala използва foo.asInstanceOf[Type], или специалната функция toDouble или toInt. Вместо функцията в Java import foo.*;, Scala използва import foo._. Функцията или метода foo() може да бъде наречена просто foo; метод thread.send(signo) може да бъде наречена thread send signo; и метод foo.toString() може да бъде наречен foo toString.

Синтактичните облекчения са създадени да позволяват да поддържа специфични езици. Масивните референции се пишат както функциите. Например: array(i) вместо array[i]. (Вътре в Scala, двата масива са функции са концептуализирани като вид математическо картографиране от един обект към друг) Общите типове са написани като например List[String] вместо List<String> както е в Java. Вместо псевдотипа void, Scala има собствен обособен клас Unit (погледнете отдолу примера).

Пример с класове Този пример показва контраста в определението за клас в Java и Scala. // Java: public class Point { private final double x, y; public Point(final double x, final double y) { this.x = x; this.y = y;

public Point( final double x, final double y, final boolean addToGrid ) { this(x, y); if (addToGrid) grid.add(this);

public Point() { this(0.0, 0.0);

public double getX() { return x;

public double getY() { return y;

double distanceToPoint(final Point other) { return distanceBetweenPoints(x, y, other.x, other.y);

private static Grid grid = new Grid(); static double distanceBetweenPoints( final double x1, final double y1, final double x2, final double y2 ) { return Math.hypot(x1 – x2, y1 – y2);

}// Scala class Point( val x: Double, val y: Double, addToGrid: Boolean = false ) { import Point._ if (addToGrid) grid.add(this) def this() = this(0.0, 0.0) def distanceToPoint(other: Point) = distanceBetweenPoints(x, y, other.x, other.y) } object Point { private val grid = new Grid() def distanceBetweenPoints(x1: Double, y1: Double, x2: Double, y2: Double) = { math.hypot(x1 – x2, y1 – y2)

Горепосоченият код показва някои основни разлики в боравенето на класове между Java и Scala

• Scala статични променливи или методи. Вместо това, има уникални по рода си обекти в класа. Обектите са декларирани, чрез използване наobject вместо class. Нормално е да се слагат статични променливи и методи в обект със същото име като на класа, което е познато като придружаващ обект (Подчертаващият клас за обекта има $ appended. Оттук, за class Foo с придружаващ обект object Foo, в себе си има Foo$ съдържащ кода на придружаващия обект, и самостоятелен обект от този клас е създаден чрез уникален по рода си

• На мястото на параметрите на параметрите на конструктора, Scala има класови параметри, поставени в самия клас, подобно на параметри на функция. Когато са декларирани с val или var, полетата също са със същото име и автоматично инициализирани от класовите параметри. (Под обвивката, външен достъп до публичните полета винаги преминава през accessor (getter) и mutator (setter) методи, които са автоматично създадени. Accessor функцията има същото име като полето, което обяснява защо не е необходимо в горния пример изрично да се декларират accessor методи.) Забележете, че алтернативните конструктори могат също да бъдат декларирани, както в Java. Кода, който може да премине в отсъстващ конструктор (друг, който да инициализира променливите) отива директно на нивото на класа Отсъстваща видимост в Scala е public.

Характеристики (в сравнение с Java) Scala има същия начин на компилиране като Java и C#, поименно отделен компилатор и динамичен клас зареждане, за да може Scala кода да използва Java библиотеките или .NET библиотеките в . NET платформата.

Оперативните характеристики на Scala са същите като на Java. Scala компилатора генерира байткод, което е много подобно с този на Java. Всъщност, Scala кодът може да бъде декомпилиран в Java код, с изключение на някои конструкторни операции. За JVM, Scala Java кодовете нямат разлика. Единствената разлика е във времето необходимо на библиотеките да заредят, Scala-library.jar.

Scala добавя голям брой отличителни разлики, в сравнение с Java, и има някои основни разминавания в съществения модел на изразите и типовете, което прави езика теоретично по-чист и елиминира много пречки в Java. От гледна точка на Scala, това е на практика много важно, защото големия брой разлики са възможни и в C#.

Синтактична гъвкавост Както споменахме по-горе, Scala има добра синтактична гъвкавост, в сравнение с Java. Ето и следните примери: Точката и запетаята не са необходими; редовете автоматично се свързват, ако започват или завършват със символ, който не може да дойде на тази позицията, или ако има незатворени скоби или кавички. Всеки метод може да бъде използван като вмъкнат оператор, например "%d apples".format(num) и "%d apples" format num са еднакви. Всъщност, аритметичните оператори като + и <<са третирани като всички останали методи, откакто имената на функциите могат да съдържат последователности от произволни символи (с малки изключения като обикновените, къдравите и квадратни скоби, които трябва да бъдат въведени по специфичен начин). Методите apply и update имат синтактични кратки форми. foo()—където foo е стойност (обект или отделен клас)—е кратък вариант за foo.apply(), и foo() = 42 е кратък вариант за foo.update(42). Подобно, foo(42) е кратък вариант за foo.apply(42), и foo(4) = 2 е кратък вариант за foo.update(4, 2). Това се използва за колекции класове и се среща в много други случаи. Scala се различава по методите с отсъстващи скоби (def foo = 42) и празни скоби (def foo() = 42). Когато декларираме метод с празни скоби, скобите могат да бъдат пропуснати, което е практично, когато използваме Java библиотеките, които не разпознават тази разлика. Като например използването на foo.toString вместо foo.toString(). На практика метода трябва да бъде дефиниран с празни скоби в случай, че дава странични ефекти Имената на методите, завършващи с две точки (:) изискват аргумент в лявата страна и приемник от дясната.. Като например 4 :: 2 :: Nil е същото като Nil.::(2).::(4), първата форма отговаря визуално на резултата (списък с първи елемент 4 и втори елемент 2).