Scala (ծրագրավորման լեզու)

Scala, ծրագրավորման բազմաբնույթ պարադիգմային լեզու, որը նախատեսված է հակիրճ և տիպային անվտանգ լինելու համար՝ բաղադրիչ ծրագրային ապահովման հեշտ և արագ ստեղծման համար՝ համատեղելով ֆունկցիոնալ և օբյեկտին ուղղված ծրագրավորման հնարավորությունները։ Լեզվի առաջին տարբերակները ստեղծվել են 2003 թվականին Լոզանի դաշնային պոլիտեխնիկական դպրոցի ծրագրավորման մեթոդների լաբորատորիայի թիմի կողմից՝ Մարտին Օդերսկու ղեկավարությամբ, լեզուն ներդրված է Java և JavaScript հարթակների համար։ Ըստ Ջեյմս Ստրախանի ՝ Groovy ծրագրավորման լեզվի ստեղծողի, Scala-ն կարող է դառնալ Java լեզվի ժառանգորդը ։


== Պատմություն ==
Լեզուն ստեղծվել է 2001-2004 թվականներին EPFL ծրագրավորման մեթոդների լաբորատորիայում։ Այն հետազոտության արդյունք էր, որն ուղղված էր բաղադրիչ ծրագրային ապահովման համար բարելավված լեզվական աջակցության մշակմանը։ Լեզվի զարգացումը հիմնված էր երկու գաղափարի վրա։
1.Բաղադրիչ ծրագրային ապահովման ծրագրավորման լեզուն պետք է լինի մասշտաբային այն առումով, որ պետք է հնարավոր լինի նկարագրել ինչպես փոքր, այնպես էլ մեծ մասերը՝ օգտագործելով նույն հասկացությունները։ Հետևաբար, ուշադրությունը կենտրոնացվել է աբստրակցիայի, բաղադրության և տարրալուծման մեխանիզմների վրա՝ մեծ թվով պարզունակների ներդրման փոխարեն, որոնք կարող են օգտակար լինել միայն մեկ մակարդակի մասշտաբով։
2.Մասշտաբային բաղադրիչի աջակցությունը կարող է տրամադրվել ծրագրավորման լեզվով, որը միավորում և ընդհանրացնում է օբյեկտի վրա հիմնված և ֆունկցիոնալ ծրագրավորումը։ Scala- ի հիմնական տեխնիկական նորամուծությունները հասկացություններ են, որոնք միաձուլում են ծրագրավորման այս հարացույցները։ Ստատիկ տպագրված լեզուներում, ինչպիսին է Scala-ն, այս պարադիգմները մինչ այժմ գրեթե ամբողջությամբ առանձին են եղել։
Լեզուն ընդհանուր օգտագործման համար թողարկվել է JVM հարթակում 2004 թվականի հունվարին և .NET հարթակում ՝ 2004 թվականի հունիսին, 2016 թվականին ստեղծվել է LLVM կոմպիլյատորը (Scala Native):


== Դիզայնի ծագումը ==
Լեզվի ձևավորման վրա ազդել են բազմաթիվ լեզուներ և հետազոտական ​​աշխատանքներ:Առաջին հերթին լեզուն կլանել է Java և C # հասկացությունների և շարահյուսական կոնվենցիաների զգալի քանակություն։ Հատկությունների արտահայտման եղանակը հիմնականում փոխառված է Սաթերից։ Միասնական օբյեկտի մոդելի հայեցակարգը վերցված է Smalltalk-ից։ BETA-ից ծագեց այն գաղափարը, որ ամեն ինչ, ներառյալ դասերը, պետք է լինեն բույն։ Scala-ի վերացական տեսակները շատ նման են SML-ի և OCaml-ի աբստրակտ ստորագրության տեսակներին, որոնք ընդհանուր են ամբողջական բաղադրիչների համատեքստում։
Ինչ-որ առումով Scala-ն Pizza-ի աշխատանքի շարունակությունն է ։ Ինչպես Pizza-ն, Scala-ն էլ հավաքում է Java VM-ի համար՝ ավելացնելով ավելի բարձր կարգի ֆունկցիաներ, օրինաչափությունների համապատասխանեցում, կոնստրուկտներ, որոնք ի սկզբանե ստեղծվել են ֆունկցիոնալ ծրագրավորման համայնքում։ Թեև Pizza-ն հետամնաց համատեղելի է Java-ի հետ, Scala-ի նպատակը պարզապես փոխգործունակությունն է, ուստի այն դիզայնի մեջ ավելի շատ ազատություն ունի։ Scala-ի մեկ այլ նպատակն է ապահովել առաջադեմ կոնստրուկցիաներ բաղադրիչների աբստրակցիայի և բաղադրության համար՝ ի տարբերություն մի քանի վերջին հետազոտական ​​մշակումների։


== Լեզվի հիմնական ասպեկտները ==
Scala ծրագրերը շատ նման են Java ծրագրերին, և նրանք ազատ են փոխազդելու Java կոդի հետ։ Լեզուն ներառում է միատեսակ օբյեկտի մոդել՝ այն իմաստով, որ ցանկացած արժեք օբյեկտ է, իսկ ցանկացած գործողություն՝ մեթոդի կանչ։ Միևնույն ժամանակ, այն նաև ֆունկցիոնալ լեզու է այն առումով, որ գործառույթները լիարժեք արժեքներ են։
Scala-ն ներառում է հզոր և հետևողական աբստրակցիոն հասկացություններ ինչպես տեսակների, այնպես էլ արժեքների համար։ Մասնավորապես, լեզուն պարունակում է ճկուն սիմետրիկ միքսին կոնստրուկտներ դասի և հատկանիշի կազմի համար։ Հնարավոր է թույլ է տալիս տարրալուծել առարկաները՝ համեմատելով օրինաչափության հետ; Կաղապարներն ու արտահայտությունները ընդհանրացվել են՝ աջակցելու XML փաստաթղթերի բնական մշակմանը։ Ընդհանուր առմամբ, այս կոնստրուկցիաները հեշտացնում են ինքնուրույն բաղադրիչների արտահայտումը Scala գրադարանների միջոցով՝ առանց հատուկ լեզվական կոնստրուկտների օգտագործման։
Լեզուն թույլ է տալիս բաղադրիչների արտաքին ընդլայնումներ՝ օգտագործելով դիտումները։ Ընդհանուր ծրագրավորման հնարավորություններն իրականացվում են ջեներիկների աջակցությամբ, ներառյալ ավելի բարձր տեսակի ջեներիկները։ Ի լրումն դասական կառուցվածքային տվյալների տարբեր տեսակների, լեզուն ներառում է էկզիստենցիալ տեսակների աջակցություն։


== Ֆունկցիոնալ լեզու ==
Յուրաքանչյուր ֆունկցիա արժեք է։ Լեզուն ապահովում է թեթև շարահյուսություն՝ անանուն և որոշակի գործառույթներ սահմանելու համար։ Յուրաքանչյուր կառուցվածք վերադարձնում է արժեք։ Կաղապարների համընկնումը բնականաբար կիրառվում է XML մշակման համար կանոնավոր արտահայտություններով։


== Օգտագործում ==
Scala-ում գրված հիմնական վեբ շրջանակներն են - Play, Lift: Դրանց թվում նշվում են մի շարք խոշոր ծառայություններ, մասնավորապես, Play-ն օգտագործում է Gilt-ը և Coursera-ն , իսկ Foursquare-ը՝ Lift-ը ։
Սոցիալական LinkedIn-ը օգտագործում է Scalatra միկրոշրջանակը՝ աջակցելու իր Signal API-ին։
2009 թվականի ապրիլին Twitter-ը հայտարարեց, որ ինքը թարգմանել է իր սերվերի կոդի մեծ մասը Ruby-ից Scala, իսկ մնացածը պատրաստվում է թարգմանել ։ 2011 թվականի ապրիլին The Guardian-ի առցանց տարբերակը Java-ից թարգմանվեց Scala:
Apache Spark-ը, Apache Ignite-ը (GridGain-ի հիմնական արտադրանքի անվճար տարբերակը) և Apache Kafka-ն հիմնականում գրված են Scala-ում։
Լեզվի ակտիվ օգտագործողներից է նաև UBS բանկը ։
Scala-ի զարգացման ենթակառուցվածքի կարևոր մասը՝ Sbt-ի ավտոմատ կառուցման գործիքը, նույնպես գրված է Scala-ում։


== Գրականություն ==


=== Անգլերեն ===
Joshua D. Suereth. Scala in Depth. — Manning Publications , 2012. — С. 225. — ISBN 978-1-935182-70-2.
Gregory Meredith. Monadic Design Patterns for the Web . — 1st. — 2011. — С. 300.
Nilanjan Raychaudhuri. Scala in Action . — 1st. — Manning. — С. 525. — ISBN 978-1-935182-75-7.
Dean Wampler, Alex Payne. Programming Scala: Scalability = Functional Programming + Objects . — 1st. — O’Reilly Media, 2009. — P. 448. — ISBN 0-596-15595-6.
Martin Odersky, Lex Spoon, Bill Venners. Programming in Scala: A Comprehensive Step-by-step Guide . — 2nd. — Artima Inc, 2010. — P. 883/852. — ISBN 978-0-9815316-4-9.
David Pollak. Beginning Scala . — 1st. — Apress, 2009. — С. 776. — ISBN 1-4302-1989-0. Архивная копия от 5 декабря 2010 на Wayback Machine
Perrett, Tim. Lift in Action . — 1st. — Manning, 2011. — С. 450. — ISBN 978-1-935182-80-1.
Christos Loverdos, Apostolos Syropoulos. Steps in Scala: An Introduction to Object-Functional Programming. — 1st. — Cambridge University Press, 2010. — P. xviii + 485. — ISBN 978-0-521-74758-5.
Venkat Subramaniam. Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine. — 1st. — Pragmatic Bookshelf ., 2009. — P. 250. — ISBN 1-934356-31-X.
Cay Horstmann. Scala for the Impatient . — 1st. — Addison-Wesley Professional, 2012. — С. 360. — ISBN 0-321-77409-4.


=== Ռուսերեն ===
Хорстман К. Scala для нетерпеливых. — ДМК пресс, 2013. — 408 с. — ISBN 978-5-94074-920-2, 978-0-321-77409-5.
Одерски М., Спун Л., Веннерс Б. Scala. Профессиональное программирование = Programming in Scala: Updated for Scala 2.12. — Питер, 2018. — 688 с. — ISBN 978-5-496-02951-3.
Прокопец А. Конкурентное программирование на SCALA. — ДМК пресс, 2017. — 342 с. — ISBN 978-5-97060-572-1.
Scala в примерах, перевод руководства Мартина Одерски в викиучебнике
Scala Школа! и Эффективная Scala — русские версии открытых учебников от Twitter
Путеводитель по Scala: серия статей на сайте IBM developerWorks


== Ծանոթագրություններ ==


== Արտաքին հղումներ ==
https://github.com/lampepfl/dotty/releases/tag/3.0.2
https://www.scala-lang.org/news/2.12.8
http://www.scala-js.org/
http://www.scala-native.org/
Strachan, James
Scala as the long term replacement for java/javac?(6 июля 2009)․