{{위키데이터 속성 추적}}
{{Infobox programming language
| name                   = ML
| logo                   =
| paradigm               = [[다중 패러다임 프로그래밍 언어|다중 패러다임]]: [[함수형 프로그래밍|함수형]],
[[제네릭 프로그래밍|제네릭]], [[명령형 프로그래밍|명령형]]
| year                   = {{시작 날짜와 나이|1973}}
| designer               = [[로빈 밀너]] 등 ([[에든버러 대학교]])
| developer              =
| latest release version =
| latest release date    =
| typing                 = [[형 추론]], [[정적 타이핑|정적]], [[스트롱 타이핑|스트롱]]
| implementations        =
| dialects               = [[OCaml]], [[표준 ML]], [[F 샤프|F#]]
| influenced by          = [[ISWIM]]
| influenced             = [[클로저 (프로그래밍 언어)]], [[Coq]], [[사이클론 (프로그래밍 언어)|사이클론]], [[C (프로그래밍 언어)|C]], [[Elm]], [[F 샤프|F#]], [[F* (프로그래밍 언어)|F*]], [[하스켈]], [[Idris]], [[코틀린]], [[미란다]], [[Nemerle]], [[OCaml]], [[Opa]], [[Erlang]], [[Rust]], [[Scala]], [[표준 ML]]
| operating system       =
| license                =
| website                =
}}
'''ML'''은 범용 [[프로그래밍 언어]]의 일종이다. 프로그래밍 언어 분야의 핵심 연구 성과들을 잘 반영하면서도 실용적인 언어로 알려져 있다. 특히, 안전한 [[타입 시스템]]을 갖추고 있어 프로그램을 실행하는 중에 나올 수 있는 타입 에러를 실행하기 전에 미리 모두 찾아준다. 힌들리-밀너(Hindley-Milner) 타입 추론 시스템을 구현하여 [[자바 (프로그래밍 언어)|자바]]와 같은 길고 불편한 [[자료형]](타입) 표기 없이도 변수들의 자료형을 추론할 수 있다.

ML은 [[하스켈]]과 같은 순수한 함수형 언어와 같이 함수가 자유롭게 사용될 수 있으면서도, 메모리 상태를 변화시키는 함수를 허용하는 [[함수형 프로그래밍|함수형 프로그래밍 언어]]의 모습도 갖추고 있다. 이 때문에 함수형 언어이면서 순수하지 않은 함수형 언어로 분류한다.

그밖에 ML에는 이런 특징이 있다.
* [[메모리 재활용]](garbage collection)을 통해서 자동으로 메모리를 관리한다.
* 함수의 [[다형성]](polymorphic functions)을 지원하여 타입과 상관 없이 실행할 수 있는 함수를 정의할 수 있다.
* [[대수적 자료형]](algebraic data type)을 지원하여 상위에서 자료구조를 표현할 수 있다.
* 값들의 패턴 매칭을 통해 간편하게 조건문을 만들 수 있다.
* 간단하고 강력한 예외 시스템으로 프로그램의 실행흐름을 편리하게 기획할 수 있다.

ML 프로그래밍 시스템은 다양한 종류가 있다. [[SML 프로그래밍 언어|SML]](Standard ML)과 [[Caml 프로그래밍 언어|Caml]]이 가장 널리 알려진 것이며, [[F 샤프|F#]] 등 다른 언어들도 존재한다. [[한국]]에서 개발된 ML 프로그래밍 시스템으로는 [[한국과학기술원|KAIST]]에서 개발하였고 현재는 [[서울대학교|서울대]]에서 확장·관리하고 있는 [[nML]]이 있다.

ML의 기본 아이디어는 [[C 샤프|C#]], [[자바 (프로그래밍 언어)|자바]], [[하스켈]], [[사이클론 프로그래밍 언어|사이클론]], [[네멜레 프로그래밍 언어|네멜레]] 등 많은 언어에 영향을 미쳤다.

ML은 주로 프로그래밍 언어의 실행기(interpreter)나 번역기(compiler), 프로그램 분석기 등을 개발하고 다루는 데 사용하지만, ML은 본래 범용 프로그래밍 언어이므로 [[생물정보학]], 금융 전산망, P2P 클라이언트/서버 프로그램 등의 개발에도 사용한다.

== 예제 ==

=== ML 함수의 형태 ===

함수형 프로그래밍의 [[Hello world 프로그램|Hello world]]라고 할 만한 것은 [[계승 (수학)|팩토리얼]]을 계산하는 코드이다. 순수 ML로는 다음과 같이 표현할 수 있다.

 fun fac : (fn: int -> int) 0 = 1
  | fac n = n * fac (n-1);

이 코드는 팩토리얼을 기본적인 경우(base case)가 하나 있는 [[재귀 함수]]로 정의한 것이다. 수학 교과서에서 볼 수 있는 팩토리얼의 정의와 비슷하다. ML 코드는 문법과 계산방식의 측면에서 수학적 언어와 닮았다.

팩토리얼 함수의 첫 번째 줄은 이 함수의 [[자료형]]을 표시하는 부분이다. ML은 코드로부터 자동으로 변수와 함수의 자료형을 추론하므로 이 부분은 없어도 무방하다. 첫 번째 줄은 "''함수 fac'' (fac)''의 자료형은'' (:) ''정수에서 정수로 가는'' (fn: int -> int) ''함수이다.''" 와 같이 해석할 수 있다. 따라서 이 함수는 정수를 인자로 받아 또 다른 정수를 반환하는 함수이다.

자료형을 명시하는 부분을 제거하면 코드는 다음과 같이 간단해진다.

 fun fac 0 = 1
  |  fac n = n * fac(n-1);

함수의 인자가 괄호로 둘러싸여 있지 않고 공백으로 구분되어 있음을 주목하라. 두 번째 줄은 ML의 또다른 중요한 특성인 패턴 매칭으로 이루어져 있다. 함수 fac은 인자가 0이면 1을 반환한다. 나머지 모든 경우에 대해서는 두 번째 줄을 실행하여 0에 도달할 때까지 fac을 재귀적으로 계속 호출한다.

== 같이 보기 ==
* [[표준 ML]]
* [[OCaml]]
* [[F 샤프]]
== 외부 링크 ==
* [https://web.archive.org/web/20121231010227/http://benchmarksgame.alioth.debian.org/ 여러 언어들 사이의 속도 비교]
* [https://web.archive.org/web/20120225230022/http://www.dina.kvl.dk/~sestoft/mosml.html Standard ML의 유명한 버전인 Moscow ML]
* [http://research.microsoft.com/projects/ilx/fsharp.aspx 마이크로소프트의 .NET 프레임워크를 이용한 ML언어인 F#]

{{주요 프로그래밍 언어}}

{{전거 통제}}

[[분류:함수형 프로그래밍 언어]]
[[분류:절차적 프로그래밍 언어]]
[[분류:1973년 개발된 프로그래밍 언어]]
[[분류:ML 프로그래밍 언어 계열]]
[[분류:패턴 매칭 프로그래밍 언어]]
[[분류:정적 타입 프로그래밍 언어]]