Scala(프로그래밍 언어)

Scala (programming language)
스칼라
Scala-full-color.svg
패러다임멀티패러다임:동시,기능,필수,객체지향
설계자마틴 오더스키
개발자에콜 폴리테크니크 페데랄로잔 프로그래밍 방법 연구소
처음 등장한2004년 1월 20일; 18년 전(2004-01-20)
안정된 릴리스
3.1.1[1] / 2022년 1월 21일; 6개월 전 (2022년 1월 21일)
프리뷰 릴리즈
3.1.1-RC1[2] / 2021년 10월 18일; 9개월 전 (2021년 10월 18일)
타이핑 분야추정, 정적, 강력, 구조
구현 언어스칼라
플랫폼Java 가상 머신(JVM)
JavaScript (Scala.js)
LLVM(Scala 네이티브) (실험용)
면허증.아파치 2[3].0
파일 이름 확장자.seca, .sc
웹 사이트www.scala-lang.org
영향을 받다
공통 리스프,[4] 에펠, Erlang, F#, [5]Haskell,[6] Java, [6]OCaml, Oz,[7] 피자, 스킴,[6] Smalltalk, 표준[6] ML
영향받은
실론, 치젤, Fantom, F#, 코틀린, 라소, 레드, 플릭스

Scala(/skɑllah/SKAH-lah)[8]는 객체 지향 프로그래밍과 함수 프로그래밍을 모두 지원하는 강력정적 유형의 범용 프로그래밍 언어입니다.간결하게 [9]설계된 Scala의 디자인 결정의 대부분은 [7]Java에 대한 비판에 대처하기 위한 것입니다.

Scala 소스 코드는 Java 바이트 코드로 컴파일하여 Java Virtual Machine(JVM; Java 가상 머신)에서 실행할 수 있습니다.Scala를 JavaScript로 컴파일하여 브라우저에서 실행하거나 네이티브 실행 파일로 직접 실행할 수도 있습니다.JVM Scala는 Java와의 언어 상호 운용성을 제공하므로 어느 하나의 언어로 작성된 라이브러리를 Scala 또는 Java 코드로 [10]직접 참조할 수 있습니다.Java와 마찬가지로 Scala는 객체 지향적이며 C 언어와 유사한 colly-brace라는 구문을 사용합니다.Scala 3 이후로는 오프사이드 규칙을 사용하여 블록을 구조화하는 옵션도 있으므로 사용을 권장합니다.Martin Odersky는 이것이 Scala [11]3에서 도입된 가장 생산적인 변화라고 말했다.

Java와 달리 Scala는 기능 프로그래밍 언어(Scheme, Standard ML, Haskell )의 많은 특징을 가지고 있으며, 여기에는 커리잉, 불변성, 느린 평가, 패턴 매칭 등이 포함됩니다.그것은 또한 대수적 데이터 유형, 공분산역행, 고차적 유형(그러나 고순위 유형은 아님), 익명 유형, 연산자 오버로드, 선택적 매개변수, 명명된 매개변수, 원시 문자열, 그리고 보다 강력한 버전으로 볼 수 있는 대수적 효과의 실험적인 예외적 버전을 지원합니다.Java가 예외[12]확인했습니다.

Scala라는 이름은 확장성과 언어합성어로,[13] 사용자의 요구에 따라 확장할 수 있도록 설계되었음을 나타냅니다.

역사

스칼라의 디자인은 2001년 마르틴 오데르스키에 의해 스위스 로잔에 있는 에콜 폴리테크니크 페데랄 드 로잔(EPFL)에서 시작되었다.Functional Programming과 Petri [14]nets의 아이디어를 결합한 프로그래밍 언어인 Fannel에 대한 작업이 이어졌다.Odersky는 이전에 Generic Java와 javac Sun의 Java [14]컴파일러에서 일했다.

2003년 말 내부 릴리스 후 Scala는 2004년 초에 Java [15][7][14][16]플랫폼에서 공개 출시되었으며, 2006년 [7]3월에 두 번째 버전(v2.0)이 출시되었습니다.

2011년 1월 17일, Scala 팀은 유럽 연구 [17]위원회로부터 230만 유로 이상의 5년 연구 보조금을 받았습니다.2011년 5월 12일, Odersky와 공동작업자들은 Scala에 대한 상업적 지원, 교육 및 서비스를 제공하는 회사인 Typesafe Inc(나중에 Lightbend Inc.로 개명)를 출범시켰습니다.Typesafe는 2011년에 Greylock [18][19][20][21]Partners로부터 300만달러의 투자를 받았습니다.

플랫폼 및 라이선스

Scala는 Java 플랫폼(Java 가상 머신)에서 실행되며 기존 Java [15]프로그램과 호환됩니다.Android 어플리케이션은 일반적으로 Java로 작성되며 패키지화 시 Java 바이트코드에서 Dalvik 바이트코드(설치 시 네이티브 머신코드로 번역될 수 있음)로 변환되므로 Scala의 Java 호환성은 Android 개발에 적합하며 기능적 접근 방식이 선호될 [22]때 더욱 적합합니다.

컴파일러 및 라이브러리를 포함한 참조 Scala 소프트웨어 배포는 Apache 라이센스로 [23]릴리스됩니다.

기타 컴파일러 및 타깃

Scala.js는 JavaScript로 컴파일하는 Scala 컴파일러로 웹 브라우저 또는 Node.[24]js에서 실행할 수 있는 Scala 프로그램을 작성할 수 있습니다.2013년부터 개발 중인 컴파일러는 2015년에 더 이상 실험적이지 않다고 발표되었습니다(v0.6).버전 v1.0.0-M1은 2018년 6월에, 버전 1.1.1은 2020년 [25]9월에 출시되었습니다.

Scala Native는 LLVM 컴파일러 인프라스트럭처를 대상으로 하는 Scala 컴파일러로 Boehm 가비지 컬렉터를 사용하는 경량 관리 런타임에 사용되는 실행 코드를 만듭니다.이 프로젝트는 Denys Shabalin이 주도하며 2017년 3월 14일 첫 출시 0.1을 했다.Scala Native의 개발은 코드의 초기 런타임 컴파일을 없애고 네이티브 루틴을 [26][27]직접 호출할 수 있는 기능을 제공함으로써 JVM의 Just In Time 컴파일보다 빠른 속도를 목표로 2015년에 시작되었습니다.

대상으로 하는 레퍼런스 Scala 컴파일러.NET Framework와 그 공통 언어 런타임은 2004년 [14]6월에 출시되었지만 [28]2012년에 공식적으로 폐기되었습니다.

"Hello World"의 예

Scala 3으로 작성된 Hello World 프로그램의 형식은 다음과 같습니다.

@main 방어하다 주된() = {   인쇄("안녕, 월드!") } 

Java용 스탠드아론의 Hello World 응용 프로그램과 달리 클래스 선언은 없으며 스태틱한 것으로 선언된 것은 없습니다.오브젝트 키워드로 작성된 싱글톤오브젝트가 대신 사용됩니다.

프로그램이 HelloWorld.scala 파일에 저장되면 사용자는 다음 명령을 사용하여 프로그램을 컴파일합니다.

$scalac HelloWorld.scala

를 사용하여 실행하다

$scala Hello World

이는 Java 코드를 컴파일 및 실행하는 프로세스와 유사합니다.실제로 Scala의 컴파일 및 실행 모델은 Java와 동일하여 Apache Ant와 같은 Java 빌드 도구와 호환됩니다.

"Hello World" Scala 프로그램의 단축 버전은 다음과 같습니다.

인쇄("안녕, 월드!") 

Scala에는 대화형 셸과 스크립팅 [29]지원이 포함되어 있습니다.다음 파일에 저장됨HelloWorld2.scala다음 명령을 사용하여 스크립트로 실행할 수 있습니다.

$scala HelloWorld 2.scala

또한 -e 옵션을 사용하여 Scala 인터프리터에 직접 명령을 입력할 수도 있습니다.

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

표현식은 대화식으로 REP에 입력할 수 있습니다.

$scala Scala 2.12.2 (Java HotSpot(TM) 64비트 서버 VM, Java 1.8.0_131)에 오신 것을 환영합니다.평가할 식을 입력합니다. 또는:help. scala> List(1, 2, 3.map(x => x * x) res0: List[Int] = 리스트(1, 4, 9) 스칼라>

기본적인 예

다음 예시는 Java 구문과 Scala 구문의 차이를 보여 줍니다.함수 mathFunction은 정수를 취하여 제곱한 다음 해당 숫자의 세제곱근을 해당 숫자의 로그에 추가하여 결과( 2)(\ n를 반환합니다.

// Java: 인트 산술 함수(인트 숫자) {     인트 num Square(정사각형) = 숫자*숫자;     돌아가다 (인트) (수학.cbrt(num Square(정사각형)) +       수학.로그.(num Square(정사각형))); } 
// 스칼라: Java에서 직접 변환  // Import 불필요, scala.math // 'math'로 이미 Import되었습니다. 방어하다 산술 함수(숫자: 내부): 내부 = {   변화하다 num Square(정사각형): 내부 = 숫자*숫자   돌아가다 (수학.cbrt(num Square(정사각형)) + 수학.로그.(num Square(정사각형))).     인스턴스[내부] } 
// 스칼라: 보다 관용적인 // 유형 추론을 사용하고 'return' 문을 생략합니다. // "toInt" 메서드를 사용하여 numSquare 불변임을 선언합니다.  수입품 수학._ 방어하다 산술 함수(숫자: 내부) = {    num Square(정사각형) = 숫자*숫자   (cbrt(num Square(정사각형)) + 로그.(num Square(정사각형))).입력 } 

이 코드의 구문 차이는 다음과 같습니다.

  • Scala는 세미콜론을 필요로 하지 않습니다.
  • 값 유형은 대문자로 표시됩니다.Int, Double, Boolean대신int, double, boolean.
  • 파라미터와 반환유형은 Pascal과 같이 C와 같이 선행하는 것이 아니라 다음과 같습니다.
  • 메서드 앞에는 다음이 필요합니다.def.
  • 로컬 또는 클래스 변수 앞에 다음 문자가 와야 합니다.val(불변수 포함) 또는var(변수 변수 포함).
  • return연산자는 함수에서 불필요합니다(허용되지만). 마지막으로 실행된 문 또는 식 값은 일반적으로 함수의 값입니다.
  • Java 캐스트 연산자 대신(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에서는 전자가 array.apply(i)로 확장되어 참조가 반환됩니다.)
  • 범용 유형은 다음과 같이 기술됩니다.List[String]자바가 아닌List<String>.
  • 의사형 대신voidScala에는 실제 싱글톤 클래스가 있습니다. Unit(아래 참조).

클래스를 사용한 예

다음[clarification needed (see talk)] 예제에서는 Java 및 Scala에서의 클래스 정의를 비교합니다.

// Java: 일반의 학급 포인트 {   사적인 최종 이중으로 하다 x, y;    일반의 포인트(최종 이중으로 하다 x, 최종 이중으로 하다 y) {     이것..x = x;     이것..y = y;   }    일반의 포인트(     최종 이중으로 하다 x, 최종 이중으로 하다 y,     최종 부울 add To Grid(그리드 추가)   ) {     이것.(x, y);      한다면 (add To Grid(그리드 추가))       격자무늬.add To Grid(그리드 추가)(이것.);   }    일반의 포인트() {     이것.(0.0, 0.0);   }    일반의 이중으로 하다 X를 취득하다() {     돌아가다 x;   }    일반의 이중으로 하다 움직이다() {     돌아가다 y;   }    이중으로 하다 디스턴스(최종 포인트 다른.) {     돌아가다 점 사이의 거리(x, y,       다른..x, 다른..y);   }    사적인 정적인 포인트 격자무늬 = 신규 포인트();    정적인 이중으로 하다 점 사이의 거리(       최종 이중으로 하다 x1, 최종 이중으로 하다 y1,       최종 이중으로 하다 x2, 최종 이중으로 하다 y2   ) {     돌아가다 수학.저울(x1 - x2, y1 - y2);   } } 
// 스칼라 학급 포인트(      x: 이중,  y: 이중,     add To Grid(그리드 추가): 부울 = 거짓의 ) {   수입품 포인트._    한다면 (add To Grid(그리드 추가))     격자무늬.add To Grid(그리드 추가)(이것.)    방어하다 이것.() = 이것.(0.0, 0.0)    방어하다 디스턴스(다른.: 포인트) =     점 사이의 거리(x, y, 다른..x, 다른..y) }  물건 포인트 {   사적인  격자무늬 = 신규 포인트()    방어하다 점 사이의 거리(x1: 이중, y1: 이중,       x2: 이중, y2: 이중) = {     수학.저울(x1 - x2, y1 - y2)   } } 

위의 코드는 Java와 Scala의 클래스 처리 간의 개념적인 차이를 보여줍니다.

  • Scala에는 정적 변수나 메서드가 없습니다.대신 기본적으로 인스턴스가 1개뿐인 클래스인 싱글톤 오브젝트가 있습니다.싱글톤 오브젝트는 다음과 같이 선언됩니다.object대신class. 클래스 이름과 같은 이름의 싱글톤 객체에 정적 변수와 메서드를 배치하는 것이 일반적이며, 이 객체는 이후 컴패니언 [15]객체로 알려져 있습니다.(싱글톤 객체의 기본 클래스에는$첨부했습니다.그 때문에,class Foo동반 목적과 함께object Foo후드 아래에는 클래스가 있다.Foo$singleton 패턴을 사용하여 이 클래스의 하나의 개체가 생성됩니다.)
  • Scala에는 생성자 매개 변수 대신 함수에 대한 매개 변수와 유사한 클래스 매개 변수가 있습니다.에서 선언된 경우val또는var수식자, 필드도 같은 이름으로 정의되어 클래스 파라미터에서 자동으로 초기화됩니다.(후드에서 퍼블릭필드에 대한 외부 액세스는 항상 액세스자(getter) 및 뮤테이터(setter) 메서드를 통해 자동으로 생성됩니다.accessor 함수는 필드와 이름이 같기 때문에 위의 예에서는 accessor 메서드를 명시적으로 선언할 필요가 없습니다.)Java와 같이 대체 컨스트럭터도 선언할 수 있습니다.기본 생성자에 들어가는 코드(멤버 변수 초기화 제외)는 클래스 레벨로 직접 이동합니다.
  • Scala의 기본 가시성은 다음과 같습니다.public.

기능(Java 참조)

Scala는 Java 및 C#과 동일한 컴파일 모델을 가지고 있습니다.즉, Scala 코드가 Java 라이브러리를 호출할 수 있도록 별도의 컴파일 및 동적 클래스 로딩입니다.

Scala의 운영 특성은 Java와 동일합니다.Scala 컴파일러는 Java [15]컴파일러에 의해 생성된 것과 거의 동일한 바이트 코드를 생성합니다.실제로 Scala 코드는 특정 생성자 작업을 제외하고 읽을 수 있는 Java 코드로 디컴파일할 수 있습니다.Java Virtual Machine(JVM; Java 가상 머신)에서는 Scala 코드와 Java 코드를 구분할 수 없습니다.유일한 차이점은 런타임 라이브러리가 하나 더 추가된다는 것입니다.scala-library.jar를 클릭합니다.[30]

Scala는 Java에 비해 많은 기능을 추가하며 기본 표현식 및 유형 모델에 몇 가지 근본적인 차이가 있어 이론적으로 언어를 더 깔끔하게 만들고 Java에서 몇 가지 구석진 경우를 제거합니다.Scala의 관점에서 보면 Scala에 추가된 몇 가지 기능은 C#에서도 사용할 수 있기 때문에 이 기능은 실질적으로 중요합니다.

★★★

앞서 말한 바와 같이 Scala는 Java에 비해 구문 유연성이 매우 높습니다.들면 과 같습니다.

  • 이치노일반적으로 이 위치에 들어갈 수 없는 토큰으로 시작하거나 끝날 경우 또는 닫히지 않은 괄호 또는 괄호가 있으면 행이 자동으로 결합됩니다.
  • 를 들어 할 수 "%d apples".format(num) ★★★★★★★★★★★★★★★★★」"%d apples" format num, 예를 들면 산술연산자, 를 들면 산술연산자, 산술연산자, 산술연산자, 산술연산자, 산술연산자.+ ★★★★★★★★★★★★★★★★★」<<함수명은 임의의 기호의 시퀀스로 구성될 수 있기 때문에(패렌, 괄호 및 가새 등의 특수한 취급은 제외), 이러한 기호명이 붙은 방법의 취급에 관한 특수한 취급은, 다른 방법과 동일하게 취급됩니다.
  • 「」apply ★★★★★★★★★★★★★★★★★」update이치노 foo()서 : syslogsfoo는 값 "(singleton 또는 class instance)"의입니다.foo.apply() , , , , 입니다.foo() = 42 말하다foo.update(42).유사하게,foo(42) 말하다foo.apply(42) , , , , 입니다.foo(4) = 2 말하다foo.update(4, 2)이는 수집 클래스에 사용되며 STM 셀 등 다른 많은 경우로 확장됩니다.
  • no-paren)을 한다.def foo = 42 empty-parens 패런) 및 empty-parens(빈 패런)def foo() = 42 할 때 할 수 은, 를 들면, 빈 패런을 사용하는 등, 이 합니다.이것은 예를 들어 를 사용하여 이 구별을 모르는 Java 라이브러리를 호출할 때 유용합니다.foo.toStringfoo.toString()관례상 부작용 발생 시 빈 패런을 사용하여 방법을 정의해야 한다.
  • ( 「 「」 「 」:는, 하고 있습니다를 들면, 「」는,4 :: 2 :: Nil is is is is is와 Nil.::(2).::(4)결과에 시각적으로 대응하는 첫 번째 형태(첫 번째 요소 4와 두 번째 요소 2가 있는 목록).
  • 클래스 본문 변수는 개별 getter 메서드와 setter 메서드로 투과적으로 구현할 수 있습니다.★★★의 trait FooLike { var bar: Int }구현은 다음과 같습니다.object Foo extends FooLike { private var x = 0; def bar = x; def bar_=(value: Int) { x = value }} } }에서는, 한 「간결한」을할 수 있습니다foo.bar = 42.
  • 메서드 호출에서는 괄호 대신 중괄호를 사용할 수 있습니다.이것에 의해, 새로운 [31]제어 구조의 완전한 라이브러리 실장이 가능하게 됩니다.예를들면,breakable { ... if (...) break() ... }breakable언어 정의 키워드였지만 실제로는 thunk 인수를 사용하는 메서드에 불과합니다.thunks 또는 함수를 사용하는 메서드에서는 괄호와 중괄호 구문을 혼재시킬 수 있도록 두 번째 파라미터 목록에 이러한 명령어를 배치하는 경우가 많습니다.Vector.fill(4) { math.random } is is is is is와 Vector.fill(4)(math.random). 줄에 할 수 중괄호 배리언트에서는 식을 여러 줄에 걸쳐 사용할 수 있습니다.
  • for-expressions(상세 설명)는 다음과 같은 단일 메서드를 정의하는 모든 유형에 대응할 수 있습니다.map,flatMap ★★★★★★★★★★★★★★★★★」filter.

그 자체로는 의심스러운 선택처럼 보일 수 있지만, 집합적으로 컴파일러를 확장하지 않고도 도메인 고유의 언어를 Scala에서 정의할 수 있도록 하는 목적에 도움이 됩니다.예를 들어 배우에게 메시지를 보내기 위한 Erlang의 특수 구문입니다.actor ! message는 언어 확장자를 사용하지 않고 Scala 라이브러리에 구현할 수 있습니다.

유형 Java)을합니다.int ★★★★★★★★★★★★★★★★★」boolean참조 타입(임의의 클래스).참조 유형만 상속 체계의 일부로, 에서 파생됩니다.java.lang.Object로부터 상속됩니다. Scala는 최상위 입니다.Any그 , , , , , , , , , 。AnyVal 유형: (예: ))Int ★★★★★★★★★★★★★★★★★」Boolean 및 )의 개요AnyRef(Java), 과 박스 )을 합니다.int ★★Integer)는 Scala에는 없습니다.상자와 언박스는 사용자에게 완전히 투과적입니다.Scala 2.10에서는 사용자가 새로운 값 유형을 정의할 수 있습니다.

에 대한 표현식

scala는 반복기를 통해 루프하기 위한 Java "foreach" 루프 대신for- expressions - Haskell과 같은 언어의 목록 압축이나 Python의 목록 압축 및 생성조합과 유사합니다.를 사용한 표현식yield키워드를 지정하면 기존 컬렉션을 반복하여 동일한 유형의 새로운 컬렉션을 반환함으로써 새로운 컬렉션을 생성할 수 있습니다.컴파일러에 의해 일련의 컴파일러로 변환됩니다.map,flatMap ★★★★★★★★★★★★★★★★★」filter전화. 어디 콜.어디서yield, 코드imperative-style 루프에 가깝, 않습니다 사용되지에서 번역에 의해 사용되지 않나.코드는명령형 루프에 가깝습니다.foreach..

간단한 예는:간단한예는 다음과 같습니다.

val값 s == for위해서  )x <>-<, ->. 1 to로. 25 if한다면 x**x >> 50) yield산출하다 2**x 

경영 결과는 다음과 같은 벡터:실행 결과는다음과 같습니다.

Vector(16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50)

(식(이습니다 표현은1 to 25없을까 특별한 구문.A특별한 구문이 아닙니다.메서드 방법to는 표준 Scala 라이브러리에서 새로운 방식을 기존 유형에 추가할 수 있는 암묵적[32] 변환이라고 불리는 기술을 사용하여 정수 확장 방식으로 정의됩니다.)

지도를 반복하기의 더 복잡한:상에서 반복하는 보다 복잡한 예는 다음과 같습니다 맵 있다.

끓여지도 Twitter 사용자 tweets,// 일련의 트윗에 언급된 트위터 사용자를 지정하는 맵이 주어지면,의 집합으로 언급된를 지정하다. 끓여서 각 사용자 위에서 언급한 횟수,users// 싱크사용자가 언급된 횟수,사용자 검색 각 위를 보세요. 알려진 정치인들의 지도에 끓였고, 새로운 지도만the//알려진 정치인의를 주고 돌아오새 지도만 반환한다 지도에서. ( 물체로서,보다는 문자열)민주당 정치인들//.끓여민주당 정치인(문자열이 아닌 객체) val값 dem_mentionsdem_module(dem_module) == for위해서       ) , ) <-<-<->       표시          <-<-<-> . ))     할 수 있다  표시. ==    }   ) 표시 , ) 

(mention, times) <- mentions패턴 매칭의 입니다(아래 참조).맵 상에서 반복하면 키 값 튜플 세트가 반환됩니다.패턴 매칭을 사용하면 튜플을 키와 값의 다른 변수로 쉽게 구조화할 수 있습니다.마찬가지로 이해 결과에서도 키 값 탭이 반환됩니다.키 값 탭은 소스 객체가 (변수로부터) 맵에 자동으로 구축됩니다.mentions주의: 다 note 、 : : 、 : 、 : 、 주 、 if :mentions대신 목록, 세트, 배열 또는 기타 튜플 컬렉션을 보유하고 있습니다.위의 코드와 정확히 동일한 유형의 새로운 컬렉션이 생성됩니다.

경향

Scala는 Java에서 사용할 수 있는 모든 객체 지향 기능(그리고 실제로 다양한 방식으로 확장)을 지원하는 한편, 일반적으로 기능성 프로그래밍 언어에서만 볼 수 있는 많은 기능을 제공합니다.이러한 기능을 함께 사용하면 Scala 프로그램을 거의 완전히 기능적인 스타일로 작성할 수 있으며 기능성 스타일과 객체 지향 스타일을 혼합할 수도 있습니다.

예를 들면 다음과 같습니다.

것은 이다.

C나 Java와 달리 Lisp와 같은 언어와 비슷하지만 Scala는 문장과 식을 구분하지 않습니다.모든 문장은 사실 어느 정도의 가치를 평가하는 표현입니다.반환된 것으로 선언되는 함수voidC 또 Java 음음 c c c c c c c c c c c c c c c c in in in in in in 。while하지 않는 은 타입을 .Unit이것은 싱글톤 타입이며, 그 타입의 오브젝트는 1개뿐입니다.돌아오지 않는 함수 및 연산자(예:throw연산자 또는 항상 예외를 사용하여 비선택을 종료하는 함수) 논리적으로 반환 유형을 갖는다.Nothing오브젝트를 포함하지 않는 특수한 타입, 즉 바닥 타입, 즉 가능한 모든 타입의 서브 클래스입니다.(이렇게 하면 활자가 됩니다).Nothing모든 타입과 호환되므로 타입 추론이 올바르게 기능합니다.)[33]

「」라고 하는 은,if-then-else"statement"는 실제로 두 가지 분기 중 하나를 평가한 결과 값을 생성하는 표현입니다.즉, 이러한 코드 블록은 식을 원하는 위치에 삽입할 수 있으므로 Scala에서 3진 연산자가 필요하지 않습니다.

// Java:   진수 = x  10  x + ' - 10 : x + ; 
// :// 스칼라:   진수 = 할 수 있다  )x  10) x + ' - 10  않으면 x +  

이유로 「 」를 참조해 주세요.returnScala에서는 문장이 불필요하며 실제로는 권장되지 않습니다.Lisp에서와 같이 코드 블록의 마지막 식은 해당 코드 블록의 값이며, 코드 블록이 함수의 본문일 경우 함수에 의해 반환된다.

을 명확히 위해, 「」을 .Unit로 있다

디폴트  Value print 값( 「 」 ) )x:   =     )"%s 먹었어요". 변경 )x } 

"Manager" (Manager)는 다음과 같이 입력합니다.Man.Manager:

디폴트  Value print 값( 「 」 ) )x: ) =  )"%s 먹었어요"  변경 x) 

추론

유형 추론에 의해, 변수 유형, 함수 반환값 및 다른 많은 식들은 컴파일러가 추론할 수 있기 때문에 일반적으로 생략될 수 있습니다.예를 들면 다음과 같습니다.val x = "foo"(불변의 상수 또는 불변의 객체에 대하여) 또는var x = 1.5(나중에 값을 변경할 수 있는 변수의 경우).Haskell, ML 및 기타 순수하게 기능하는 언어에서 사용되는 보다 글로벌한 힌들리 밀너 알고리즘과는 대조적으로 Scala의 유형 추론은 기본적으로 로컬입니다.이는 객체 지향 프로그래밍을 용이하게 하기 위해 수행됩니다.그 결과 특정 유형(특히 함수 매개 변수 및 재귀 함수의 반환 유형)을 선언해야 합니다.

디폴트  Apples format format format format 。 )x: ) = . 변경 )x) 

경우) (재귀함수)

디폴트  분석 )x:   =   할 수 있다  )x == 0)     1    않으면     x* 분석 )x - 1) 

Scala에서는 함수는 객체이며 익명 함수를 지정하기 위한 편리한 구문이 존재합니다.예를 들어 다음과 같은 식입니다.x => x < 2하여 파라미터가 21 인지 여부를 형태와 .(lambda (x) (< x 2)) 「 「 」의 은, 어느 쪽」의 어느 쪽도 입니다.x반환 유형을 명시적으로 지정할 필요도 없고 일반적으로 유형 추론을 통해 추론할 수 있지만, 예를 들어 다음과 같이 명시적으로 지정할 수 있다.(x: Int) => x < 2또는 심지어(x: Int) => (x < 2): Boolean

익명 함수는 주변 함수의 환경에서 사전적으로 사용 가능한 변수를 자동으로 캡처한다는 점에서 진정한 폐쇄로 작동합니다.이러한 변수는 둘러싸인 함수가 반환된 후에도 사용할 수 있으며, Java의 익명 내부 클래스의 경우와는 달리 final로 선언할 필요가 없습니다.(변환가능할 경우 이러한 변수를 수정할 수도 있으며, 변경된 값은 익명의 함수가 다음에 호출될 때 사용할 수 있습니다.)

더 짧은 형식의 익명 함수는 자리 표시자 변수를 사용합니다.예를 들어 다음과 같습니다.

list map { x => sqrt(x) }

, 「하다」라고 할 수 .

list map { sqrt(_) }

또는 심지어

list map sqrt

스칼라 가능한 는 변이하다를 됩니다.var 및 은 '불변의 값'을 됩니다.val키워드를 지정합니다.를 사용하여 val할 수 .finalJava ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」 vals는 얕게 불변합니다.즉, val에 의해 참조되는 오브젝트 자체가 불변임을 보증하지 않습니다.

그러나 관습에 따라 불변의 클래스가 권장되며 Scala 표준 라이브러리는 풍부한 불변의 컬렉션 클래스를 제공합니다.Scala는 대부분의 컬렉션 클래스의 가변 및 불변의 변형을 제공하며, 가변 버전을 명시적으로 [34]Import하지 않는 한 불변의 버전이 항상 사용됩니다.불변의 변형은 오래된 개체를 파괴적으로 업데이트하는 대신 항상 오래된 개체의 업데이트된 복사본을 반환하는 영구 데이터 구조입니다.예를 들어, 요소 및 참조로 구성된 새 목록 노드를 목록 꼬리에 반환함으로써 목록에 요소를 추가하는 불변의 링크 목록이 있습니다.요소를 목록에 추가하려면 이전 목록의 모든 요소를 새 요소만 있는 새 목록에 추가해야 합니다.마찬가지로 목록 중간에 요소를 삽입하면 목록의 전반부가 복사되지만 목록의 후반부에 대한 참조는 유지됩니다.이것은 구조 공유라고 불립니다.이것에 의해, 공유 오브젝트는 [35]변경되지 않기 때문에, 락은 불필요합니다.

을 사용하다에 따라 하는 것이 사용합니다. 가변 을 ,, az, az, az'('lazy')로할 수 있다.lazy키워드: 변수 값을 생성하는 코드가 변수가 처음 참조될 때까지 평가되지 않음을 의미합니다.예: : 형식Stream및은, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」를 사용해 할 수 .view하지 않은 은 서버에서 등의 에서는 코드의 필요한 에 대한 ).엄격하지 않은 컬렉션은 서버에서 생성된 데이터 등의 의미에 적합한 데이터를 제공합니다.이 데이터에서는 코드가 나중에 목록의 요소를 생성하기 위한 평가(서버에 대한 요구가 트리거되고 웹상의 다른 장소에 있을 수 있음)가 실제로 필요한 경우에만 실행됩니다.

기능 프로그래밍 언어는 일반적으로 테일콜 최적화를 제공하여 스택오버플로우 문제 없이 재귀의 광범위한 사용을 가능하게 합니다.Java 바이트 코드의 제한으로 인해 JVM에서의 테일콜 최적화가 복잡해집니다.일반적으로 테일콜을 사용하여 자신을 호출하는 함수는 최적화할 수 있지만 상호 재귀 함수는 최적화할 수 없습니다.트램폴린[36]회피책으로 제안되어 왔다.트램펄린 지원은 Scala 라이브러리에서 개체와 함께 제공되었습니다.scala.util.control.TailCallsScala 2.8.0 (2010년 7월 ) 으로 "Scala"라는 주석.@tailrec이 경우 tail [37]recursive가 아닌 한 컴파일되지 않습니다.

Scala에는 패턴 매칭이 내장되어 있습니다.이것은 스위치 문의 보다 정교하고 확장 가능한 버전으로 생각할 수 있습니다.여기서 임의의 데이터 타입(정수, 부란, 문자열 등 단순한 타입이 아닌)을 매칭할 수 있습니다.임의적인 네스팅도 포함됩니다.케이스 클래스로 알려진 특별한 타입의 클래스가 제공됩니다.이것은 패턴 매칭에 대한 자동 지원을 포함하고 많은 함수형 프로그래밍 언어에서 사용되는 대수적 데이터 타입을 모델링하는데 사용될 수 있습니다.(Scala의 관점에서 케이스 클래스는 컴파일러가 자동으로 쿨링하는 특정 동작을 추가하는 단순한 일반 클래스입니다.d 또한 패턴 매칭 중에 상세한 비교와 해시를 제공하고 생성자 매개변수에 대한 사례 클래스를 파괴하는 등의 방법에 대한 정의를 수동으로 제공한다.

패턴 매칭을 사용한 Quicksort 알고리즘 정의의 예를 다음에 나타냅니다.

디폴트  ) 표시:  ] )  =  표시 match경기    case사례. Nil제로 =>, =>. Nil제로   case사례. pivot피벗 :::: tail꼬리 =>, =>.       )smaller더 작은 , rest쉬다) = tail꼬리.partition칸막이 ) <><> )      ))     )) } 

여기서의 아이디어는 목록을 피벗보다 작은 요소와 그 이상의 요소로 분할하고 각 부분을 반복적으로 정렬하여 결과를 피벗과 함께 붙여 넣는 것입니다.이 방법에서는 동일한 병합 및 기타 빠른 정렬 알고리즘의 분할 및 정복 전략이 사용됩니다.

match 는 operator 에 되어 있는 합니다.list. 각각case식이 일치하는지 여부를 확인하기 위해 차례로 시행되며 첫 번째 일치에 따라 결과가 결정됩니다. 「」는,Nil 오브젝트인 '만 합니다.Nilpivot :: tail는 빈 목록이 아닌 목록과 일치하며 지정된 패턴에 따라 목록을 동시에 구축합니다.이 경우 연관된 코드는 다음과 같은 이름의 로컬 변수에 액세스할 수 있습니다.pivot, 또 변수를 잡습니다.tail리스트의 맨 끝을 잡고 있습니다.이러한 변수는 읽기 전용이며 의미적으로는 Lisp 및 Scheme 연산자를 사용하여 확립된 변수 바인딩과 매우 유사합니다.

패턴 매칭은 로컬 변수 선언에서도 발생합니다. 「」, 「」에의.tail.partition튜플입니다(이 경우 2개의 리스트). (테이플은 항상 크기가 고정되어 있고 요소가 다른 타입으로 되어 있다는 점에서 리스트 등 다른 타입의 컨테이너와 다릅니다만, 여기서도 같은 타입입니다).패턴 매칭은 태플의 두 부분을 가져오는 가장 쉬운 방법입니다.

»_ < pivot는 플레이스 홀더 변수를 사용한 어나니머스 함수의 선언입니다.어나니머스 함수에 대해서는 위의 항을 참조해 주십시오.

연산자 " " "::합니다.)와.cons및 Scheme)및 Lisp "Scheme")의 2개의 명령어를 합니다.:::함께 하는데, 는 (마지막으로 하다)와 합니다.append둘 다 표시됩니다.외관상으로는 이러한 연산자에 대해 "빌트인"된 것은 없습니다.위에서 지정한 바와 같이 기호 문자열은 함수 이름으로 사용할 수 있으며 객체에 적용되는 메서드는 마침표나 괄호 없이 "infix" 스타일로 쓸 수 있습니다.위의 행은 다음과 같습니다.

qsort(smaller) ::: pivot :: qsort(rest)

도 쓸 수

qsort(rest).::(pivot).:::(qsort(smaller))

결장으로 이 있고 오른쪽결합합니다.

★★★★

에서는 " " "의 본문,match연산자는 부분 함수이며, 일련의 함수로 구성됩니다.case스위치 문의 본문과 마찬가지로 첫 번째 일치하는 표현이 우세합니다.부분 함수는 의 예외 처리 부분에서도 사용됩니다.try " statement트트 statement statement statement:

     }     를 구별하다  n n: Format Exception NumberFormat Exception(번호)Format Exception) =   ) n n  )0) }   를 구별하다 _ =  } 

할 수 , 는 '부정함수', '부정함수', '부정함수', '부정함수', '부정함수', '부정함수'를 것과 .match그 위로.예를 들어 다음과 같이 QuickSort의 이전 코드를 작성할 수 있습니다.

 :  =  =    를 구별하다  =    를 구별하다    =       ) , ) = . )_ < > )      ))     )) } 

여기서 읽기 전용 변수는 정수 리스트에서 정수 리스트까지의 함수 타입으로 선언되어 부분 함수에 바인드됩니다.(부분 함수의 단일 파라미터는 명시적으로 선언되거나 이름이 지정되지 않습니다).단, 이 변수를 일반 함수인 것처럼 정확하게 호출할 수 있습니다.

>  ) )6 ,2 ,5 ,9 res32:  =  )2 , 5 , 6 , 9) 

지향 기능

스칼라는 모든 값이 객체라는 의미에서 순수한 객체 지향 언어입니다.객체의 데이터 유형과 동작클래스특성으로 설명됩니다.클래스 추상화는 서브클래싱 및 유연한 믹스인 기반의 구성 메커니즘에 의해 확장되어 다중 상속의 문제를 회피한다.

특징은 자바 인터페이스를 대체하는 스칼라입니다.8 이하 버전의 Java 인터페이스는 매우 제한적이며 추상 함수 선언만 포함할 수 있습니다.이 때문에, 인터페이스에 편의 방식을 제공하는 것은 곤란하고(모든 실장에서는 같은 방식을 재실장할 필요가 있다), 퍼블리시된 인터페이스를 역호환 방식으로 확장하는 것은 불가능하다는 지적이 나오고 있습니다.특성은 클래스와 항상 혼합되기 때문에 일반 추상 클래스의 거의 모든 힘을 가지며 클래스 매개 변수(자바의 생성자 매개 변수와 동등한 Scala)만 없다는 점에서 mixin 클래스와 유사합니다.super연산자는 특히 특성에서 동작하며 상속 외에 구성을 사용하여 특성을 연결할 수 있습니다.하다

  표시  window     // abstract   디폴트  ) }   표시 Simple Window  simple simple simple   window    디폴트  )       ) Window "Simple Window 서" """)     // 기본창 그리기   } }   분석  © 장장   window  }   분석  데코레이션   © 장장    서 "super()"가가 "super()"이기 입니다.부모가   // 입니다.// 함수는 추상입니다.구체적이면 일반적인 "덮어쓰기"로도 충분할 것입니다.     디폴트  )       ) 스크롤바 장식" " 스크롤바 장식)     . )     //  바를 .// 가로 스크롤 바를 그립니다.   } }   분석 Vertical  Decoration Vertical Scrollbar »   © 장장      디폴트  )       )Vertical Decoration 'Vertical Scrollbar Decoration(수직 스크롤바 데코레이션)'에서)     . )      바를 .// 가로 스크롤 바를 그립니다.   } }   분석  Decoration (타이틀 장식)   © 장장      디폴트  )       )' 데코레이션 ★★★★★★★★★★★★★★★★★」)     . )     // 이제 제목 표시줄을 그립니다.   } } 

는 다음과 같이 할 수 .

  =  Simple Window  simple simple simple  함께 Vertical  Decoration Vertical Scrollbar »  함께  데코레이션  함께  Decoration (타이틀 장식) 

mywin.draw() 말합니다.

  Decoration (타이틀 장식)   데코레이션  Vertical  Decoration Vertical Scrollbar »  Simple Window  simple simple simple 

「」, 「」에의 입니다.draw했습니다.TitleDecoration), )super()calls는 다른 으로 >>>>>>>> 른 른 、 른 、 른 、 른 、 른 、 calls 、 calls calls の calls calls calls calls calls calls 。Window비록 서로에게서 물려받은 특성은 없지만요.이것은 데코레이터 패턴과 비슷하지만 부모 창을 명시적으로 캡슐화하거나 구현이 변경되지 않은 함수를 명시적으로 전송하거나 엔티티 관계의 런타임 초기화에 의존할 필요가 없기 때문에 보다 간결하고 오류 발생률이 낮습니다.다른 언어에서는 구현 상속의 긴 선형 체인을 사용하여 컴파일 시에도 유사한 효과를 얻을 수 있지만, 믹스인의 각 가능한 조합에 대해 하나의 선형 상속 체인을 선언해야 한다는 단점이 있습니다.

Scala는 추상화의 안전하고 일관된 사용을 대부분 강제하는 표현형 정적 시스템을 갖추고 있습니다.그러나 타입 시스템은 건전하지 [38]않다.특히 유형 시스템은 다음을 지원합니다.

스칼라는 사용으로 유형을 추론할 수 있다.이것에 의해, 대부분의 정적 타입 선언은 옵션입니다.정적 유형은 컴파일러 오류로 인해 필요한 경우가 아니면 명시적으로 선언할 필요가 없습니다.실제로는 코드 명확성을 위해 일부 정적 유형 선언이 포함되어 있습니다.

농축

스칼라에서 흔히 볼 수 있는 기술인 "내 라이브러리 [39]풍부" (Martin Odersky가 2006년에 "[32] 라이브러리"라고 불렀는데, 부정적인 함축과[40][41] 미성숙함으로 인해 이 표현에 대한 우려가 제기되었습니다)는 새로운 방법을 기존 형식에 추가하는 것처럼 사용할 수 있게 합니다.이는 확장 방식의 C# 개념과 비슷하지만 이 기술이 메서드의 추가에 한정되지 않고 예를 들어 새로운 인터페이스를 구현하기 위해 사용할 수 있기 때문에 더욱 강력합니다.Scala에서 이 기술은 메서드를 수신하는 유형에서 원래 유형을 랩하고 추가 메서드를 제공하는 새로운 유형(일반적으로 클래스)으로 암묵적인 변환을 선언하는 것을 포함합니다.특정 유형에 대해 메서드를 찾을 수 없는 경우 컴파일러는 해당 메서드를 제공하는 유형에 대한 적용 가능한 암묵적 변환을 자동으로 검색합니다.

이 기술을 사용하면 애드온라이브러리를 사용하여 기존 클래스에 새로운 메서드를 추가할 수 있으므로 애드온라이브러리를 Import하는 코드만 새로운 기능을 얻을 수 있으며 다른 모든 코드는 영향을 받지 않습니다.

는 '다음에 있다'라는 줍니다.Int 「」로isEven ★★★★★★★★★★★★★★★★★」isOdd

 표시  익스텐션      표시  )i: )      디폴트  = i  % 2 == 0     디폴트   = !   } }    익스텐션._  // 암묵적인 강화 기능을 범위에 포함 4.   -> // -> true 

MyExtensions는, 내선 클래스 「 번호」에.IntPredicates범위로 [42]합니다.

Scala의 표준 라이브러리는 표준 Java 동시성 API와 더불어 미래와 약속에 대한 지원을 포함합니다.원래는 Lightbend Inc.가 만든 별도의 오픈 소스 플랫폼[43] Akka로 제공되는 Actor 모델도 지원했습니다.Akka 액터는 배포되거나 소프트웨어 트랜잭션 메모리(트랜잭터)와 결합될 수 있습니다.채널 기반 메시지 전달을 위한 Communicating Sequential Process(CSP; 통신 시퀀셜프로세스) 구현의 대안으로는 Communicating Scala [44]Objects 또는 단순히 JCSP를 통한 구현이 있습니다.

배우. 낼 수 .system.actorOf를 ,receive!([45]감정점) 메시지 전송 방법.다음으로 메시지를 수신하여 인쇄할 수 있는EchoServer의 예를 나타냅니다.

  Server 」 = 의 연기 ) 액트    가 되다      를 구별하다  =  )"이러한" + )   }   Server 」 ! " 

Scala는 또한 버전 2.9.0 이후 표준 라이브러리에 통합된 병렬 컬렉션[46] 형태로 데이터 병렬 프로그래밍을 기본적으로 지원합니다.

다음 [47]예시는 병렬 컬렉션을 사용하여 성능을 향상시키는 방법을 보여 줍니다.

  =  )https.org "https://scala-lang.org" , https://.com/scala/scala "https://github.com/scala/scala")  디폴트  URL 서서 from ): ) = .. ★★★. URL 서서 from ))   . 의 get get ). ( ).mkString ) "\n")   t = . TimeMilliscurrent TimeMillis ) .. 표시 ) URL 서서 from )_ // 를 반환합니다.  ) "시간: " +  ). TimeMilliscurrent TimeMillis - t) +  "ms") 

Scala는 미래와 약속, 행위자 지원 및 데이터 병렬 처리 외에도 소프트웨어 트랜잭션 메모리 및 이벤트 [48]스트림을 사용한 비동기 프로그래밍도 지원합니다.

Scala로 작성된 가장 유명한 오픈 소스 클러스터 컴퓨팅 솔루션은 Apache Spark입니다.또한 Apache Kafka는 Spark 및 기타 스트림 처리 기술에서 널리 사용되는 게시-구독 메시지 큐로 Scala로 작성됩니다.

★★★★★

Scala에서 코드를 테스트하는 방법은 여러 가지가 있습니다.ScalaTest는 여러 테스트 스타일을 지원하며 Java 기반 테스트 [49]프레임워크와 통합할 수 있습니다.ScalaCheck는 Haskell의 QuickCheck[50]유사한 라이브러리입니다.specs 2는 실행 가능한 소프트웨어 [51]사양을 기술하기 위한 라이브러리입니다.ScalaMock은 상위 및 큐레이션 [52]기능 테스트에 대한 지원을 제공합니다.JUnitTestNG는 Java로 작성된 일반적인 테스트 프레임워크입니다.

★★

된 ★★★ ★★
1.0.0-b2[53] © 12 † 8 †
1.1.0-b1[53] , 2월 19일
  • .열거
  • 된 BSD 되었습니다.
1.1.1[53] , 3월 23일
  • inner 자바
  • Itable, Array, xml 로로로 。, 퍼퍼 ele
1.2.0[53] © 6 † 9 †
  • ★★★
  • XML 리터럴 ("조만간 삭제될 예정,[54] XML 문자열 보간으로 대체될 예정"
1.3.0[53] , 9월 16일
  • Microsoft
  • 합니다.[] T로로 합니다.=> T
1.4.0[53] , 6시 20분
  • attrib
  • match가 「이행하다」를 대체합니다.match
  • 지원
2.0[55] © 3 † 12 ★
  • 되었습니다.
  • implicit ★★★★★★★★★★★★★★★★★」requires(키워드)
  • match는 infix만 됩니다.
  • with됩니다.extends 삭제
  • 할 수 .
  • 으로만 제한됩니다.
  • 는 값 및 합니다.
  • 또는 var를 수.
  • 가 있다.
2.1.0[53] © 3 † 17 ★
  • 되어 있습니다.
  • match가 「이행하다」를 대체합니다.match
  • 지원
2.1.8[56] 88 23 23 。
  • 가시성에는 가 있습니다.
  • 할 수 또, 그 의 경우도 입니다.
  • 룩업이 .
  • type에 match가 되었습니다.
2.3.0[57] © 11 † 23 †
  • 되는 함수Unit
  • 은 패턴 됩니다.
  • All그리고.AllRef로 이름을 변경했다.Nothing그리고.Null
2.4.0[58] 2007년 3월 9일
  • private그리고.protected수식자는[this]한정자
  • 둥근 괄호로 튜플을 쓸 수 있습니다.
  • 이제 클래스의 기본 생성자를 개인 또는 보호로 표시할 수 있습니다.
  • 특성이 새 구문을 사용하여 주석으로 변경됨
  • 셀프 에일리어스
  • 연산자를 할당과 결합할 수 있습니다.
2.5.0[59] 2007년 5월 2일
  • 유형 매개 변수 및 추상 유형 구성원은 유형 생성자를 통해 추상화할 수도 있습니다.
  • 상위 생성자를 호출하기 전에 개체의 필드를 초기화할 수 있습니다.
  • 통합 구문 변경
  • 암묵적 익명 함수(파라미터에 밑줄 포함)
  • 모든 아티를 지원하도록 확장된 익명 함수의 패턴 일치
2.6.0[60] 2007년 7월 27일
  • 실존형
  • 게으른 값
  • 구조형
2.7.0[61] 2008년 2월 7일
  • 기본적으로 지원되는 Java 범용 유형
  • 케이스 클래스 기능 확장
2.8.0[62] 2010년 7월 14일
  • 컬렉션 유형에 대한 공통, 통일 및 포괄적 프레임워크를 개정합니다.
  • 유형 전문화
  • named 인수와 default 인수
  • 패키지 객체
  • 개선된 주석
2.9.0[63] 2011년 5월 12일
  • 병렬 컬렉션
  • 스레드 세이프App특성이 대체되다Application특성
  • DelayedInit특성
  • Java interop 개선
2.10[64] 2013년 1월 4일
  • [65] 클래스
  • 암묵적[66] 클래스
  • 문자열 보간[67]
  • 선물과[68] 약속
  • 다이내믹 및[69] applyDynamic
  • 종속 메서드 유형:
    • def identity(x: AnyRef): x.type = x // the return type says we return exactly what we got
  • ASM에 기반한 새로운 바이트 코드 이미터:
    • JDK 1.5, 1.6 및 1.7을 타겟으로 할 수 있습니다.
    • 디폴트로는 1.6바이트 코드를 출력합니다.
    • 이전 1.5 백엔드는 사용되지 않습니다.
  • 새로운 패턴 매처: 보다 견고한 코드를 생성하기 위해 처음부터 다시 작성(더 이상 기하급수적으로 확대하지 않음)
    • 코드 생성 및 분석은 이제 독립적입니다(후자는 -Xno-patmat-analysis로 끌 수 있습니다).
  • 스칼라독 개선
    • 함축성(-implicits 플래그)
    • 다이어그램(-다이어그램 플래그, graphviz 필요)
    • 그룹(-groups)
  • 모듈화된 언어[70] 기능
  • 커스텀 스레드 풀을 사용하여 병렬 컬렉션을[71] 구성할 수 있게 되었습니다.
  • 아카 배우들은 이제 배급의 일부가 되었다.
    • scala.timeout은 폐지되어 현재 배포에 akka 구현이 포함되어 있습니다.
  • 퍼포먼스 향상
    • 고속 인라이너
    • 범위 #sum이 O(1)가 되었습니다.
  • ForkJoin 라이브러리 업데이트
  • TreeSet/TreeMap의 불변 수정
  • 부분 기능 개선
  • ?의 추가--및 구현되지 않은 오류
  • IsTraversableOnce + IsTraversable 추가확장 메서드의 유형 클래스 유사
  • 폐지 및 청소
  • 부동소수점 및 8진수 리터럴 구문 폐지
  • scala.dbc 삭제

실험 기능

2.10.2[74] 2013년 6월 6일
2.10.3[75] 2013년 10월 1일
2.10.4[76] 2014년 3월 18일
2.10.5[77] 2015년 3월 5일
2.11.0[78] 2014년 4월 21일
  • 수집 성능 향상
  • 컴파일러 성능 향상
2.11.1[79] 2014년 5월 20일
2.11.2[80] 2014년 7월 22일
2.11.4[81] 2014년 10월 31일
2.11.5[82] 2015년 1월 8일
2.11.6[83] 2015년 3월 5일
2.11.7[84] 2015년 6월 23일
2.11.8[85] 2016년 3월 8일
2.11.11[86] 2017년 4월 18일
2.11.12[87] 2017년 11월 13일
2.12.0[88] 2016년 11월 3일
2.12.1[89] 2016년 12월 5일
2.12.2[90] 2017년 4월 18일
2.12.3[91] 2017년 7월 26일
2.12.4[92] 2017년 10월 17일
2.12.5[93] 2018년 3월 15일
2.12.6[94] 2018년 4월 27일
2.12.7[95] 2018년 9월 27일
2.12.8[96] 2018년 12월 4일
  • 라이선스가 Apache v2.0으로 변경된 첫 번째 Scala 2.12 릴리즈
2.12.9[97] 2019년 8월 5일
2.12.10[98] 2019년 9월 10일
2.12.11[99] 2020년 3월 16일
2.12.12[100] 2020년 7월 13일
2.12.13[101] 2021년 1월 12일
2.12.14[102] 2021년 5월 28일
2.12.15[103] 2021년 9월 14일
2.12.16[104] 2022년 6월 10일
2.13.0[105] 2019년 6월 11일
  • 표준 컬렉션 라이브러리 재설계
  • 리터럴 타입
  • 부분형 통일
  • 이름별 함축소
  • 컴파일러 최적화
2.13.1[106] 2019년 9월 18일
2.13.2[107] 2020년 4월 22일
2.13.3[108] 2020년 6월 25일
2.13.4[109] 2020년 11월 19일
2.13.5[110] 2021년 2월 22일
2.13.6[111] 2021년 5월 17일
2.13.7[112] 2021년 11월 1일
2.13.8[113] 2022년 1월 12일
3.0.0[114] 2021년 5월 13일
3.1.2[115] 2022년 4월 12일

다른 JVM 언어와의 비교

Scala는 GroovyClojure와 자주 비교되는데, Groovy 및 Clojure는 JVM을 사용하는 다른 두 프로그래밍 언어입니다.각 언어가 객체 지향 및 기능적 프로그래밍을 지원하는 범위와 자바 구문과의 유사성에 있어 이들 언어 사이의 상당한 차이가 존재한다.

Scala는 정적으로 입력되며, Groovy와 Clojure는 모두 동적으로 입력됩니다.이로 인해 타입 시스템이 더 복잡하고 이해하기 어렵지만 컴파일 시 거의 모든[38] 타입 오류를 검출할 수 있어 실행 속도가 훨씬 빨라질 수 있습니다.반면 동적 타이핑은 프로그램 정확성을 보장하기 위해 더 많은 테스트가 필요하며, 따라서 프로그래밍의 유연성과 단순성을 높이기 위해 일반적으로 더 느립니다.속도 차이와 관련하여, Groovy 및 Clojure의 현재 버전에서는 선택적 유형 주석을 허용하여 유형이 거의 고정된 경우 프로그램이 동적 타이핑의 오버헤드를 피할 수 있도록 지원합니다.이 오버헤드는 JVM의 최신 버전을 사용하면 더욱 감소합니다.JVM은 동적으로 입력된 인수를 사용하여 정의된 메서드에 대한 동적 명령을 호출하여 향상되었습니다.실행 효율이 매우 중요할 때는 Scala와 같은 정적 입력 언어가 여전히 선호되지만 이러한 진보로 인해 정적 입력과 동적 입력 사이의 속도 차이가 감소합니다.

프로그래밍 패러다임과 관련하여 Scala는 Java의 객체 지향 모델을 계승하여 다양한 방식으로 확장합니다.그루비는 객체 지향적이기도 하지만 장황함을 줄이는데 더 초점을 맞추고 있다.Clojure에서는 객체 지향 프로그래밍이 언어의 주요 강점으로 강조됩니다.Scala는 또한 Haskell과 같은 고급 기능 언어에서 볼 수 있는 기능을 포함하여 많은 기능 프로그래밍 기능을 갖추고 있으며, 두 패러다임 사이에서 독립성을 유지하려고 노력하고 있으며, 개발자가 두 패러다임 또는 더 많은 경우 두 패러다임 중 하나를 선택할 수 있도록 합니다.

Java와의 구문 유사성에 관해서, Scala는 Groovy의 경우와 같이 Java의 구문 대부분을 계승하고 있습니다.반면 Clojure는 Lisp 구문을 따르는데, 이는 외관이나 철학에서 모두 다릅니다.그러나 스칼라를 배우는 것도 많은 고급 기능 때문에 어려운 것으로 여겨진다.이는 Groovy가 기능이 풍부한 언어임에도 불구하고 주로 스크립트 [citation needed]언어로 설계되었기 때문에 해당되지 않았다.

도입

언어 순위

2022년 현재 JVM 기반 언어인 Clojure, Groovy, Kotlin, Scala가 상위 3위 안에 드는 원래 자바 언어보다 훨씬 낮은 순위를 [116][117]차지하고 있습니다.

언어 튜토리얼 검색을 추적하는 프로그래밍 언어 색인(Popularity of Programming Language Index)[118]은 2018년 4월 스칼라를 소폭 하락세로 15위, 2021년 1월 17위로 평가했다.이로써 스칼라는 Java와 Kotlin(12위)에 이어 3번째로 인기 있는 JVM 기반 언어가 되었습니다.

프로그래밍 언어의 인기 지수 TIOBE[117] 인터넷 검색 엔진 순위와 유사한 출판물 수를 사용하여 언어의 인기를 판단합니다.2021년 9월 현재 스칼라 31위를 기록하고 있다.이 순위에서 스칼라는 하스켈(38위)과 얼랑보다 앞서지만 바둑(14위), 스위프트(15위), 펄(19위)보다는 낮다.

RedMonk Programming Language Rankings는 GitHub 프로젝트의 수와 Stack Overflow에 대한 질문을 바탕으로 순위를 설정하며 Scala를 14위에 [116]랭크한다.여기서 Scala는 Go, PowerShellHaskell보다 앞서 Swift, Objective-C, TypescriptR 뒤에 있는 2차 언어 그룹에 속합니다.

다양한 Java 관련 주제에 대해 5160명의 개발자로부터 데이터를 수집한 Java State of Java의 2018년 [119]호에서 Scala는 JVM의 대체 언어 사용률에서 3위를 차지했습니다.JVM 대체 언어 중 Scala의 사용률은 전년도에 비해 28.4%에서 21.5%로 떨어졌으며, 2017년 11.4%에서 2018년 28.8%로 증가한 Kotlin에 추월당했다.

Scala가 버전 2.10에 속해 있던 2013년에 ThinkWorks Technology Radar는 상급 [120]기술자 그룹의 의견 기반 연 2회 보고서로 언어 및 프레임워크 [121]범주에 Scala를 채택할 것을 권장했습니다.2014년 7월, 이 평가가 보다 구체화되어 현재는 「Scala, 좋은 부분」을 참조하고 있습니다.Scala를 올바르게 사용하기 위해서는, 언어를 연구해, 어느 부분이 자신에게 적합한지에 대해 강한 의견을 가지고, 좋은 [122]부분인 Scala에 대한 독자적인 정의를 작성할 필요가 있습니다」라고 기술되어 있습니다.

회사들

  • 2009년 4월, Twitter는 백엔드의 대부분을 Ruby에서 Scala로 전환하고 [123]나머지를 변환할 계획이라고 발표했습니다.
  • GiltScala와 Play [124]Framework를 사용합니다.
  • FoursquareScala와 Lift를 [125]사용합니다.
  • CourseraScala와 Play [126]Framework를 사용합니다.
  • Apple Inc.는 Java [127][128]및 Play 프레임워크와 함께 특정 팀에서 Scala를 사용합니다.
  • 2011년 4월 가디언지의 높은 트래픽 웹사이트 guardian[129].co.uk는 자바에서 [130][131]스칼라로 전환한다고 발표했습니다.
  • 뉴욕타임스(NYT)는 2014년 자사 내부 콘텐츠 관리 시스템 블랙비어드가 스칼라, 아크카,[132] 플레이를 이용해 구축됐다고 밝혔다.
  • Huffington Post 신문은 2013년에 콘텐츠 [133]전달 시스템 Athena의 일부로 Scala를 채용하기 시작했습니다.
  • 스위스 은행 UBS는 스칼라를 일반 생산용으로 [134]승인했다.
  • LinkedInScalatra 마이크로프레임워크를 사용하여 Signal [135]API에 전력을 공급합니다.
  • Meetup은 실시간 API에 [136]필터링되지 않은 툴킷을 사용합니다.
  • Milk는 공개 API 및 실시간 [137]업데이트를 위해 필터링되지 않은 툴킷, Scala 및 Akka를 사용합니다.
  • Verizon은 Scala를 [138]사용하여 "차세대 프레임워크"를 만드는 것을 목표로 하고 있습니다.
  • Airbnb는 Java와 Scala로 [139]작성된 오픈 소스 머신 러닝 소프트웨어 "에어로솔브"를 개발합니다.
  • Zalando는 기술 스택을 Java에서 Scala and [140]Play로 전환했습니다.
  • SoundCloud는 Finagle(마이크로 서비스),[141] Scalding(스칼라), Spark(데이터 처리)[142] 등의 기술을 채택하여 백엔드로 Scala를 사용하고 있습니다.
  • DataricksApache Spark Big Data 플랫폼에 Scala를 사용합니다.
  • Morgan Stanley는 재무 [143]및 자산 관련 프로젝트에서 Scala를 광범위하게 사용하고 있습니다.
  • Google과 Alphabet Inc. 에 Scala를 사용하는 팀이 있는데, 이는 주로[144] Firebase와 [145]Nest와 같은 인수 때문이다.
  • Walmart Canada는 백엔드 [146]플랫폼에 Scala를 사용합니다.
  • Duolingo[147]레슨을 생성하는 백엔드 모듈에 Scala를 사용합니다.
  • HMRC는 많은 영국 정부 세금 [148]적용에 Scala를 사용합니다.
  • M1 Finance는 백엔드 [149]플랫폼에 Scala를 사용합니다.

비판

2015년 3월, Twitter Raffi Krikorian의 Platform Engineering 그룹의 전 VP는 Scala의 학습 [150]곡선 때문에 2011년에 Scala를 선택하지 않았다고 말했습니다.같은 달, LinkedIn SVP Kevin Scott은 "Scala에 대한 의존도를 최소화"[151]하기로 결정했습니다.2011년 11월, Yammer는 새로운 팀원의 학습곡선과 Scala [152]컴파일러 버전 간의 비호환성 등의 이유로 Scala에서 퇴사했습니다.

「 」를 참조해 주세요.

  • sbt, Scala 프로젝트에서 널리 사용되는 빌드 도구
  • Scala를 지원하는 오픈 소스 웹 애플리케이션 프레임워크인 Play!
  • Akka, 동시 및 분산 애플리케이션을 구축하기 위한 오픈 소스 툴킷
  • Chisel은 하드웨어 설계 및 [153]생성에 사용되는 Scala 기반의 오픈 소스 언어입니다.

레퍼런스

  1. ^ https://github.com/lampepfl/dotty/releases/tag/3.1.1 를 참조해 주세요.
  2. ^ https://github.com/lampepfl/dotty/releases/tag/3.1.1-RC1 를 참조해 주세요.
  3. ^ "Notice file". GitHub. 2019-01-24. Retrieved 2019-12-04.
  4. ^ "Scala Macros".
  5. ^ Fogus, Michael (6 August 2010). "MartinOdersky take(5) toList". Send More Paramedics. Retrieved 2012-02-09.
  6. ^ a b c d Odersky, Martin (11 January 2006). "The Scala Experiment - Can We Provide Better Language Support for Component Systems?" (PDF). Retrieved 2016-06-22.
  7. ^ a b c d Odersky, Martin; et al. (2006). "An Overview of the Scala Programming Language" (PDF) (2nd ed.). École Polytechnique Fédérale de Lausanne (EPFL). Archived (PDF) from the original on 2020-07-09.
  8. ^ Odersky, Martin (2008). Programming in Scala. Mountain View, California: Artima. p. 3. ISBN 9780981531601. Retrieved 12 June 2014.
  9. ^ Potvin, Pascal; Bonja, Mario (24 September 2015). An IMS DSL Developed at Ericsson. Lecture Notes in Computer Science. Vol. 7916. arXiv:1509.07326. doi:10.1007/978-3-642-38911-5. ISBN 978-3-642-38910-8. S2CID 1214469.
  10. ^ "Frequently Asked Questions: Java Interoperability". Scala-lang.org. Retrieved 2015-02-06.
  11. ^ Martin Odersky (17 June 2020). Martin Odersky: A Scala 3 Update (video). YouTube. Event occurs at 36:35–45:08. Archived from the original on 2021-12-21. Retrieved 2021-04-24.
  12. ^ "Effect expt". scala. Retrieved 2022-07-31.
  13. ^ Loverdo, Christos (2010). Steps in Scala: An Introduction to Object-Functional Programming. Cambridge University Press. p. xiii. ISBN 9781139490948. Retrieved 31 July 2014.
  14. ^ a b c d Odersky, Martin (9 June 2006). "A Brief History of Scala". Artima.com.
  15. ^ a b c d Odersky, M.; Rompf, T. (2014). "Unifying functional and object-oriented programming with Scala". Communications of the ACM. 57 (4): 76. doi:10.1145/2591013.
  16. ^ 마틴 오더스키, "스칼라 언어 사양 버전 2.7"
  17. ^ "Scala Team Wins ERC Grant". Retrieved 4 July 2015.
  18. ^ "Commercial Support for Scala". 2011-05-12. Retrieved 2011-08-18.
  19. ^ "Why We Invested in Typesafe: Modern Applications Demand Modern Tools". 2011-05-12. Retrieved 2018-05-08.
  20. ^ "Open-source Scala gains commercial backing". 2011-05-12. Retrieved 2011-10-09.
  21. ^ "Cloud computing pioneer Martin Odersky takes wraps off his new company Typesafe". 2011-05-12. Retrieved 2011-08-24.
  22. ^ "Scala on Android". Retrieved 8 June 2016.
  23. ^ "Scala 2.12.8 is now available!". 2018-12-04. Retrieved 2018-12-09.
  24. ^ "Scala Js Is No Longer Experimental The Scala Programming Language". Scala-lang.org. Retrieved 28 October 2015.
  25. ^ "Releases · scala-js/Scala-js". GitHub.
  26. ^ Krill, Paul (15 March 2017). "Scaled-down Scala variant cuts ties to the JVM". InfoWorld. Retrieved 21 March 2017.
  27. ^ Krill, Paul (2016-05-11). "Scala language moves closer to bare metal". InfoWorld.
  28. ^ .net 백엔드를 paulp · Pull Request #1718 · scala · GitHub에 의해 삭제.Github.com (2012-12-05)2013-11-02에 취득.
  29. ^ "Getting Started with Scala". Scala-lang.org. 15 July 2008. Retrieved 31 July 2014.
  30. ^ "Home". Blog.lostlake.org. Archived from the original on 31 August 2010. Retrieved 2013-06-25.
  31. ^ Scala에는 다음과 같은 제어구조가 내장되어 있습니다.if또는while재검출할 수 없습니다.Scala-Virtualized라는 연구 프로젝트가 있습니다.이 프로젝트는 다음과 같은 제한을 없애는 것을 목적으로 하고 있습니다.아드리아안 무어스, 티아크 롬프, 필립 할러, 마틴 오더스키.스칼라 가상화부분 평가프로그램 조작에 관한 ACM SIGPLAN 2012 워크숍 진행, 117–120.2012년 7월
  32. ^ a b "Pimp my Library". Artima.com. 2006-10-09. Retrieved 2013-06-25.
  33. ^ "Expressions Scala 2.13". scala-lang.org. Retrieved 2021-05-24.
  34. ^ "Mutable and Immutable Collections - Scala Documentation". Retrieved 30 April 2020.
  35. ^ "Collections - Concrete Immutable Collection Classes - Scala Documentation". Retrieved 4 July 2015.
  36. ^ Dougherty, Rich. "Rich Dougherty's blog". Retrieved 4 July 2015.
  37. ^ "TailCalls - Scala Standard Library API (Scaladoc) 2.10.2 - scala.util.control.TailCalls". Scala-lang.org. Retrieved 2013-06-25.
  38. ^ a b "Java and Scala's Type Systems are Unsound" (PDF).
  39. ^ Giarrusso, Paolo G. (2013). "Reify your collection queries for modularity and speed!". Proceedings of the 12th annual international conference on Aspect-oriented software development. ACM. arXiv:1210.6284. Bibcode:2012arXiv1210.6284G. Also known as pimp-my-library pattern
  40. ^ Gilbert, Clint (2011-11-15). "What is highest priority for Scala to succeed in corporate world (Should be in scala-debate?) ?". Scala-lang.org. Retrieved 2019-05-08.
  41. ^ "Should we "enrich" or "pimp" Scala libraries?". stackexchange.com. 17 June 2013. Retrieved 15 April 2016.
  42. ^ 메서드 확장을 보다 간결하게 하기 위해 암묵적인 클래스가 Scala 2.10에 도입되었습니다.이것은 메서드를 추가하는 것과 같습니다.implicit def IntPredicate(i: Int) = new IntPredicate(i)클래스는 다음과 같이 정의할 수도 있습니다.implicit class IntPredicates(val i: Int) extends AnyVal { ... }scala 2.10에서도 도입된 이른바클래스를 생성합니다.컴파일러는 실제 인스턴스화를 제거하고 대신 정적 메서드를 생성하므로 확장 메서드는 성능 오버헤드가 거의 없습니다.
  43. ^ 아카란 무엇인가?Akka 온라인 문서
  44. ^ Sufrin, Bernard (2008). "Communicating Scala Objects". In Welch, P. H.; Stepney, S.; Polack, F.A.C.; Barnes, F. R. M.; McEwan, A.A.; Stiles, G.S.; Broenink, J. F.; Sampson, A. T. (eds.). Communicating Process Architectures 2008: WoTUG-31 (PDF). ISBN 978-1586039073.
  45. ^ Yan, Kay. "Scala Tour". Retrieved 4 July 2015.
  46. ^ "Parallelcollections - Overview - Scala Documentation". Docs.scala-lang.org. Retrieved 2013-06-25.
  47. ^ Yan, Kay. "Scala Tour". Retrieved 4 July 2015.
  48. ^ Scala, Alexandar Prokopec, Packt Publishing에서의 동시 프로그래밍 학습
  49. ^ Kops, Micha (2013-01-13). "A short Introduction to ScalaTest". hascode.com. Retrieved 2014-11-07.
  50. ^ Nilsson, Rickard (2008-11-17). "ScalaCheck 1.5". Scala-lang.org. Retrieved 2014-11-07.
  51. ^ "Build web applications using Scala and the Play Framework". workwithplay.com. 2013-05-22. Retrieved 2014-11-07.
  52. ^ Butcher, Paul (2012-06-04). "ScalaMock 3.0 Preview Release". paulbutcher.com. Retrieved 2014-11-07.
  53. ^ a b c d e f g "Scala Change History". Scala-lang.org. Archived from the original on 2007-10-09.
  54. ^ "Dropped: XML Literals". dotty.epfl.ch. Retrieved 2021-03-05.
  55. ^ "Changes in Version 2.0 (12-Mar-2006)". Scala-lang.org. 2006-03-12. Retrieved 2014-11-07.
  56. ^ "Changes in Version 2.1.8 (23-Aug-2006)". Scala-lang.org. 2006-08-23. Retrieved 2014-11-07.
  57. ^ "Changes in Version 2.3.0 (23-Nov-2006)". Scala-lang.org. 2006-11-23. Retrieved 2014-11-07.
  58. ^ "Changes in Version 2.4.0 (09-Mar-2007)". Scala-lang.org. 2007-03-09. Retrieved 2014-11-07.
  59. ^ "Changes in Version 2.5 (02-May-2007)". Scala-lang.org. 2007-05-02. Retrieved 2014-11-07.
  60. ^ "Changes in Version 2.6 (27-Jul-2007)". Scala-lang.org. 2007-06-27. Retrieved 2014-11-07.
  61. ^ "Changes in Version 2.7.0 (07-Feb-2008)". Scala-lang.org. 2008-02-07. Retrieved 2014-11-07.
  62. ^ "Changes in Version 2.8.0 (14-Jul-2010)". Scala-lang.org. 2010-07-10. Retrieved 2014-11-07.
  63. ^ "Changes in Version 2.9.0 (12-May-2011)". Scala-lang.org. 2011-05-12. Retrieved 2014-11-07.
  64. ^ "Changes in Version 2.10.0". Scala-lang.org. 2013-01-04. Retrieved 2014-11-07.
  65. ^ Harrah, Mark. "Value Classes and Universal Traits". Scala-lang.org. Retrieved 2014-11-07.
  66. ^ Suereth, Josh. "SIP-13 - Implicit classes". Scala-lang.org. Retrieved 2014-11-07.
  67. ^ Suereth, Josh. "String Interpolation". Scala-lang.org. Retrieved 2014-11-07.
  68. ^ Haller, Philipp; Prokopec, Aleksandar. "Futures and Promises". Scala-lang.org. Retrieved 2014-11-07.
  69. ^ "SIP-17 - Type Dynamic". Scala-lang.org. Retrieved 2014-11-07.
  70. ^ "SIP-18 - Modularizing Language Features". Scala-lang.org. Retrieved 2014-11-07.
  71. ^ Prokopec, Aleksandar; Miller, Heather. "Parallel Collections". Scala-lang.org. Retrieved 2014-11-07.
  72. ^ Miller, Heather; Burmako, Eugene. "Reflection Overview". Scala-lang.org. Retrieved 2014-11-07.
  73. ^ Burmako, Eugene. "Def Macros". Scala-lang.org. Retrieved 2014-11-07.
  74. ^ "Scala 2.10.2 is now available!". Scala-lang.org. 2013-06-06. Archived from the original on 2014-11-08. Retrieved 2014-11-07.
  75. ^ "Scala 2.10.3 is now available!". Scala-lang.org. 2013-10-01. Archived from the original on 2014-11-08. Retrieved 2014-11-07.
  76. ^ "Scala 2.10.4 is now available!". Scala-lang.org. 2014-03-18. Retrieved 2015-01-07.
  77. ^ "Scala 2.10.5 is now available!". Scala-lang.org. 2015-03-04. Retrieved 2015-03-23.
  78. ^ "Scala 2.11.0 is now available!". Scala-lang.org. 2014-04-21. Retrieved 2014-11-07.
  79. ^ "Scala 2.11.1 is now available!". Scala-lang.org. 2014-05-20. Retrieved 2014-11-07.
  80. ^ "Scala 2.11.2 is now available!". Scala-lang.org. 2014-07-22. Retrieved 2014-11-07.
  81. ^ "Scala 2.11.4 is now available!". Scala-lang.org. 2014-10-30. Retrieved 2014-11-07.
  82. ^ "Scala 2.11.5 is now available!". Scala-lang.org. 2015-01-08. Retrieved 2015-01-22.
  83. ^ "Scala 2.11.6 is now available!". Scala-lang.org. 2015-03-05. Retrieved 2015-03-12.
  84. ^ "Scala 2.11.7 is now available!". Scala-lang.org. 2015-06-23. Retrieved 2015-07-03.
  85. ^ "Scala 2.11.8 is now available!". Scala-lang.org. 2016-03-08. Retrieved 2016-03-09.
  86. ^ "Three new releases and more GitHub goodness!". Scala-lang.org. 2017-04-18. Retrieved 2017-04-19.
  87. ^ "Security update: 2.12.4, 2.11.12, 2.10.7 (CVE-2017-15288)". Scala-lang.org. 2017-11-13. Retrieved 2018-05-04.
  88. ^ "Scala 2.12.0 is now available!". Scala-lang.org. 2016-11-03. Retrieved 2017-01-08.
  89. ^ "Scala 2.12.1 is now available!". Scala-lang.org. 2016-12-05. Retrieved 2017-01-08.
  90. ^ "Three new releases and more GitHub goodness!". Scala-lang.org. 2017-04-18. Retrieved 2017-04-19.
  91. ^ "Scala 2.12.3 is now available!". Scala-lang.org. 2017-07-26. Retrieved 2017-08-16.
  92. ^ "Scala 2.12.4 is now available!". Scala-lang.org. 2017-10-18. Retrieved 2017-10-26.
  93. ^ "Scala 2.12.5 is now available!". Scala-lang.org. 2018-03-15. Retrieved 2018-03-20.
  94. ^ "Scala 2.12.6 is now available!". Scala-lang.org. 2018-04-27. Retrieved 2018-05-04.
  95. ^ "Scala 2.12.7 is now available!". Scala-lang.org. 2018-09-27. Retrieved 2018-10-09.
  96. ^ "Scala 2.12.8 is now available!". Scala-lang.org. 2018-12-04. Retrieved 2018-12-09.
  97. ^ "Scala 2.12.9 is now available!". Scala-lang.org. 2019-08-05. Retrieved 2021-01-20.
  98. ^ "Scala 2.12.10 is now available!". Scala-lang.org. 2019-09-10. Retrieved 2021-01-20.
  99. ^ "Scala 2.12.11 is now available!". Scala-lang.org. 2020-03-16. Retrieved 2021-01-20.
  100. ^ "Scala 2.12.12 is now available!". Scala-lang.org. 2020-07-13. Retrieved 2021-01-20.
  101. ^ "Scala 2.12.13 is now available!". Scala-lang.org. 2021-01-12. Retrieved 2021-01-20.
  102. ^ "Scala 2.12.14 is now available!". Scala-lang.org. 2021-05-28. Retrieved 2022-04-15.
  103. ^ "Scala 2.12.15 is now available!". Scala-lang.org. 2021-09-14. Retrieved 2022-06-19.
  104. ^ "Scala 2.12.16 is now available!". Scala-lang.org. 2022-06-10. Retrieved 2022-06-19.
  105. ^ "Scala 2.13.0 is now available!". Scala-lang.org. 2019-06-11. Retrieved 2018-06-17.
  106. ^ "Scala 2.13.1 is now available!". Scala-lang.org. 2019-09-18. Retrieved 2021-01-20.
  107. ^ "Scala 2.13.2 is now available!". Scala-lang.org. 2020-04-22. Retrieved 2021-01-20.
  108. ^ "Scala 2.13.3 is now available!". Scala-lang.org. 2020-06-25. Retrieved 2021-01-20.
  109. ^ "Scala 2.13.4 is now available!". Scala-lang.org. 2020-11-19. Retrieved 2021-01-20.
  110. ^ "Scala 2.13.5 is now available!". Scala-lang.org. 2021-02-22. Retrieved 2021-02-26.
  111. ^ "Scala 2.13.6 is now available!". Scala-lang.org. 2021-05-17. Retrieved 2022-04-15.
  112. ^ "Scala 2.13.7 is now available!". Scala-lang.org. 2021-11-01. Retrieved 2022-04-15.
  113. ^ "Scala 2.13.8 is now available!". Scala-lang.org. 2022-01-12. Retrieved 2022-04-15.
  114. ^ "Scala 3 is here!". Scala-lang.org. 2021-05-14. Retrieved 2021-05-26.
  115. ^ "Scala 3.1.2". Scala-lang.org. 2022-04-12. Retrieved 2022-06-19.
  116. ^ a b O'Grady, Stephen (1 March 2021). "The RedMonk Programming Language Rankings: January 2021". RedMonk.
  117. ^ a b "TIOBE Index for May 2021".
  118. ^ "Popularity of Programming Language Index".
  119. ^ "The State of Java in 2018".
  120. ^ "ThoughtWorks Technology Radar FAQ".
  121. ^ "ThoughtWorks Technology Radar MAY 2013" (PDF).
  122. ^ "Scala, the good parts".
  123. ^ Greene, Kate (1 April 2009). "The Secret Behind Twitter's Growth, How a new Web programming language is helping the company handle its increasing popularity". Technology Review. MIT. Retrieved 6 April 2009.
  124. ^ "Play Framework, Akka and Scala at Gilt Groupe". Lightbend. 15 July 2013. Retrieved 16 July 2016.
  125. ^ "Scala, Lift, and the Future". Archived from the original on 13 January 2016. Retrieved 4 July 2015.
  126. ^ "Why we love Scala at Coursera". Coursera Engineering. Retrieved 4 July 2015.
  127. ^ "Apple Engineering PM Jarrod Nettles on Twitter". Jarrod Nettles. Retrieved 2016-03-11.
  128. ^ "30 Scala job openings at Apple". Alvin Alexander. Retrieved 2016-03-11.
  129. ^ David Reid & Tania Teixeira (26 February 2010). "Are people ready to pay for online news?". BBC. Retrieved 2010-02-28.
  130. ^ "Guardian switching from Java to Scala". Heise Online. 2011-04-05. Retrieved 2011-04-05.
  131. ^ "Guardian.co.uk Switching from Java to Scala". InfoQ.com. 2011-04-04. Retrieved 2011-04-05.
  132. ^ Roy, Suman; Sundaresan, Krishna (2014-05-13). "Building Blackbeard: A Syndication System Powered By Play, Scala and Akka". The New York Times. Retrieved 2014-07-20.
  133. ^ Pavley, John (2013-08-11). "Sneak Peek: HuffPost Brings Real Time Collaboration to the Newsroom". Huffington Post. Retrieved 2014-07-20.
  134. ^ Binstock, Andrew (2011-07-14). "Interview with Scala's Martin Odersky". Dr. Dobb's Journal. Retrieved 2012-02-10.
  135. ^ Synodinos, Dionysios G. (2010-10-11). "LinkedIn Signal: A Case Study for Scala, JRuby and Voldemort". InfoQ.
  136. ^ "Real-life Meetups Deserve Real-time APIs".
  137. ^ "Real time updating comes to the Remember The Milk web app".
  138. ^ "Senior Scala Engineer". Retrieved 2014-08-18.
  139. ^ Novet, Jordan (2015-06-04). "Airbnb announces Aerosolve, an open-source machine learning software package". Retrieved 2016-03-09.
  140. ^ Kops, Alexander (2015-12-14). "Zalando Tech: From Java to Scala in Less Than Three Months". Retrieved 2016-03-09.
  141. ^ Calçado, Phil (2014-06-13). "Building Products at SoundCloud—Part III: Microservices in Scala and Finagle". Retrieved 2016-03-09.
  142. ^ "Customer Case Studies: SoundCloud". Concurrent Inc. 2014-11-18. Retrieved 2016-03-09.
  143. ^ Scala at Morgan Stanley (video). Skills Matter. 2015-12-03. Retrieved 2016-03-11.
  144. ^ Greg Soltis (2015-12-03). SF Scala, Greg Soltis: High Performance Services in Scala (video). Skills Matter. Archived from the original on 2021-12-21. Retrieved 2016-03-11.
  145. ^ Lee Mighdoll. "Scala jobs at Nest". Retrieved 2016-03-11.
  146. ^ Nurun. "Nurun Launches Redesigned Transactional Platform With Walmart Canada". Retrieved 2013-12-11.
  147. ^ Horie, André K. (2017-01-31). "Rewriting Duolingo's engine in Scala". Retrieved 2017-02-03.
  148. ^ "HMRC GitHub repository". GitHub.
  149. ^ Lviv, Oleh Zasadnyy, GDG. "ScalaCon. A series of virtual conferences brought to you by Scala eXchange and Scala Days". ScalaCon. A series of virtual conferences brought to you by Scala eXchange and Scala Days. Retrieved 2021-05-30.
  150. ^ Krikorian, Raffi (17 March 2015). O'Reilly Software Architecture Conference 2015 Complete Video Compilation: Re-Architecting on the Fly - Raffi Krikorian - Part 3 (video). O'Reilly Media. Event occurs at 4:57. Retrieved 8 March 2016. What I would have done differently four years ago is use Java and not used Scala as part of this rewrite. [...] it would take an engineer two months before they're fully productive and writing Scala code.
  151. ^ Scott, Kevin (11 Mar 2015). "Is LinkedIn getting rid of Scala?". quora.com. Retrieved 25 January 2016.
  152. ^ Hale, Coda (29 November 2011). "The Rest of the Story". codahale.com. Retrieved 7 November 2013.
  153. ^ "Chisel: Constructing Hardware in a Scala Embedded Language". UC Berkeley APSIRE. Retrieved 27 May 2020.

추가 정보