ML(프로그래밍 언어)

ML (programming language)
ML
패러다임멀티패러다임: 기능, 범용, 필수
설계자에든버러 대학의 로빈 밀너와 다른 사람들
처음 등장한1973년, 49년(연장)
타이핑 분야추정, 정적, 강력
사투리
OCaml, 표준 ML, F#
영향을 받다
ISWIM
영향받은
Clojure, Coq, 사이클론, C++, Elm, F#, F*, Haskell, Idris, Kotlin, 미란다, Nemerle, Ocaml, Opa, Erlang, Rust, Scala, Standard ML

ML(메타 언어)은 범용 기능 프로그래밍 언어입니다.다형성 힌들리-밀너 유형 시스템을 사용하는 것으로 알려져 있으며, 이는 명시적인 유형 주석 없이 대부분의 유형을 자동으로 할당하고 유형 안전을 보장합니다. 잘 타이핑된 ML 프로그램이 런타임 유형 오류를 [1]유발하지 않는다는 공식 증거가 있습니다.ML은 함수 인수, 가비지 컬렉션, 필수 프로그래밍, 값별 호출카레링에 대한 패턴 매칭을 제공합니다.프로그래밍 언어 연구에 많이 사용되며 정식 의미론을 사용하여 완전히 지정되고 검증되는 몇 안 되는 언어 중 하나입니다.그 유형과 패턴 매칭은 컴파일러 쓰기, 자동 정리 증명, 형식 검증과 같은 다른 형식 언어에서 작동하기에 적합하고 일반적으로 사용됩니다.

개요

ML의 특징은 값별 콜 평가 전략, 퍼스트 클래스 함수, 가비지 수집을 통한 자동 메모리 관리, 파라메트릭 다형성, 정적 타이핑, 유형 추론, 대수 데이터 유형, 패턴 매칭, 예외 처리 등이다.ML은 정적 범위 지정 [2]규칙을 사용합니다.

ML은 기능적 프로그래밍을 장려하지만 부작용[3] 허용하기 때문에 불순한 기능적 언어라고 할 수 있습니다(리스프와 같은 언어, 그러나 하스켈과 같은 순수 기능적 언어와는 다릅니다).대부분의 프로그래밍 언어와 마찬가지로 ML은 열성 평가를 사용합니다. 즉, 모든 하위 식은 항상 평가되지만, 느린 평가는 폐쇄를 사용하여 달성할 수 있습니다.따라서 Haskell에서처럼 무한 스트림을 생성하여 사용할 수 있지만 그 표현은 간접적입니다.

ML의 강점은 주로 언어 설계와 조작(컴파일러, 분석기, 정리프로버)에 적용되지만 생물정보학 및 금융시스템에서도 사용되는 범용 언어입니다.

ML은 1970년대 초 [4]에든버러 대학에서 Robin Milner와 다른 사람들에 의해 개발되었으며, 그 구문은 ISWIM에서 영감을 얻었다.역사적으로 ML은 LCF 정리프로버에서 증명 전술을 개발하는 것으로 생각되었다. (1차 술어 미적분과 단순 다형 다형 람다 미적분의 조합인 pplambda는 ML을 메타 언어로 사용했다.)

현재 ML 패밀리에는 몇 가지 언어가 있습니다.가장 두드러진 언어는 Standard ML(SML), OCaml 및 F#입니다.ML의 아이디어는 Haskell, Cyclon, Nemerle,[5] ATSElm[6]같은 다른 수많은 언어에 영향을 미쳤다.

다음 예제에서는 표준 ML 구문을 사용합니다.OCaml이나 F# 등의 다른 ML 방언은 작은 차이가 있습니다.

요인

순수 ML로 표시되는 요인 함수:

재밌어요  (0 : 인트) : 인트 = 1      (n : 인트) : 인트 = n *  (n - 1) 

이 예에서는 요인이 단일 종단 기준 대/소문자가 있는 재귀 함수로 설명됩니다.이는 수학 교과서에서 볼 수 있는 요인 설명과 유사합니다.ML 코드의 대부분은 기능 및 구문 면에서 수학과 유사합니다.

표시된 정의의 일부는 옵션이며 이 함수의 유형을 설명합니다.표기법 E : t는 식 E에 t형이 있기 때문에 읽을 수 있습니다.예를 들어 인수 n에는 type integer(int)가 할당되어 있으며 정수 n에 fac을 적용한 결과인 fac(n : int)에도 type integer가 할당되어 있습니다.함수 fac 전체는 정수에서 정수(int -> int)로 type 함수를 가집니다.즉, fac은 정수를 인수로 받아들이고 정수 결과를 반환합니다.유형 추론 덕분에 유형 주석은 생략될 수 있으며 컴파일러에 의해 파생됩니다.유형 주석 없이 다시 쓴 예제는 다음과 같습니다.

재밌어요  0 = 1      n = n *  (n - 1) 

이 기능은 ML 프로그래밍의 중요한 부분인 패턴 매칭에도 의존합니다.함수의 파라미터는 반드시 괄호 안에 있는 것이 아니라 공백으로 구분됩니다.함수의 인수가 0이면 정수 1(1)을 반환합니다.다른 모든 경우에는 두 번째 행이 시도됩니다.이것은 재귀이며, 베이스 케이스에 도달할 때까지 함수를 다시 실행합니다.

네거티브 인수는 재귀 의 무한 내림차순 체인을 일으키기 때문에 요인 함수의 구현이 종료되는 것은 보증되지 않습니다.보다 견고한 구현에서는 다음과 같이 반복하기 전에 부정적이지 않은 인수를 확인합니다.

재밌어요 사실 n = 허락하다   재밌어요  0 = 1        n = n *  (n - 1)        한다면 (n < > 0) 그리고나서 올리다 도메인 또 다른  n   끝. 

문제가 있는 경우(n이 음수인 경우)는 ML의 예외 시스템을 사용하는 것을 나타냅니다.

이 함수는 내부 루프를 테일콜로서 쓰는 것으로 한층 더 향상할 수 있습니다.따라서 스택은 함수 콜 수에 비례하여 증가할 필요가 없습니다.이는 내부 함수에 추가 누적기 파라미터를 추가하여 이루어집니다.드디어 도착하다

재밌어요 사실 n = 허락하다   재밌어요  0 액세스 = 액세스        n 액세스 =  (n - 1) (n * 액세스)        한다면 (n < > 0) 그리고나서 올리다 도메인 또 다른  n 1   끝. 

목록 반전

다음 함수는 목록의 요소를 반대로 합니다.보다 정확하게는 지정된 목록과 비교하여 요소가 역순인 새 목록을 반환합니다.

재밌어요 거꾸로 하다 [] = []     거꾸로 하다 (x :: xs) = (거꾸로 하다 xs) @ [x] 

이 역방향 구현은 정확하고 명확하지만 비효율적이며 실행에 2차 시간이 필요합니다.함수를 다시 작성하여 선형 시간 내에 실행할 수 있습니다.

재밌어요 'a' 거꾸로 하다 xs : 'a' 목록. = 목록..접다 (동작 ::) [] xs 

특히 이 함수는 파라메트릭 다형성의 한 예이다.즉, 요소가 임의의 타입을 가지는 리스트와 같은 타입의 리턴 리스트를 소비할 수 있습니다.

모듈

모듈은 대규모 프로젝트와 라이브러리를 구조화하기 위한 ML의 시스템입니다.모듈은 시그니처 파일과1개 이상의 구조 파일로 구성됩니다.시그니처 파일은 실장할 API(C 헤더파일이나 Java 인터페이스 파일 등)를 지정합니다.이 구조체는 시그니처를 구현합니다(C 소스 파일이나 Java 클래스 파일 등).예를 들어, 다음은 Rational 번호를 사용하여 산술 시그니처와 그 구현을 정의합니다.

서명 산술적 = 시그니처         유형 t           : t          성공하다 : t -> t           : t * t -> t 끝. 
구조. 합리적인 : 산술적 = 구조         데이터형 t = 쥐.  인트 * 인트           = 쥐. (0, 1)         재밌어요 성공하다 (쥐. (a, b)) = 쥐. (a + b, b)         재밌어요  (쥐. (a, b), 쥐. (c, d)) = 쥐. (a * d + c * b , b * d) 끝. 

이들은 'use' 명령에 의해 인터프리터로 Import됩니다.구현과의 상호 작용은 서명 함수를 통해서만 허용됩니다. 예를 들어, 이 코드를 통해 직접 'Rat' 데이터 개체를 생성할 수 없습니다.'구조' 블록은 모든 구현 세부사항을 외부에서 숨깁니다.

ML의 표준 라이브러리는 이러한 방식으로 모듈로 구현됩니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ 로빈 밀너.프로그래밍의 유형 다형성 이론.컴퓨터 및 시스템 과학 저널, 17(3): 348 ~ 375, 1978.
  2. ^ Milner, Robin; Tofte, Mads (1991). "4.1 Contexts, environments and scope". Commentary on Standard ML. The MIT Press. pp. 35–36. ISBN 0-262-63137-7.
  3. ^ Sebesta, Robert (1999). Concepts of Programming Languages (4th ed.). Addison-Westley. p. 54. ISBN 0-201-38596-1.
  4. ^ Gordon, Michael J. C. (1996). "From LCF to HOL: a short history". Retrieved 2007-10-11.
  5. ^ Programming language for "special forces" of developers, Russian Software Development Network: Nemerle Project Team, retrieved January 24, 2021
  6. ^ Tate, Bruce A.; Daoud, Fred; Dees, Ian; Moffitt, Jack (2014). "3. Elm". Seven More Languages in Seven Weeks (Book version: P1.0-November 2014 ed.). The Pragmatic Programmers, LLC. pp. 97, 101. ISBN 978-1-941222-15-7. On page 101, Elm creator Evan Czaplicki says: 'I tend to say "Elm is an ML-family language" to get at the shared heritage of all these languages.' ["these languages" is referring to Haskell, OCaml, SML, and F#.]
  7. ^ OCAML은 기능성, 명령성객체 지향 스타일을 지원하는 산업용 프로그래밍 언어입니다.2018년 1월 2일 취득.

추가 정보

외부 링크