맨위로가기

Elm

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Elm은 2012년 에반 차플리츠키가 개발한 함수형 프로그래밍 언어이다. HTML, CSS, JavaScript를 대상으로 컴파일되며, 불변성, 정적 타입 지정, HTML/CSS/JavaScript와의 상호 운용성을 특징으로 한다. Elm은 모듈 시스템, Elm 아키텍처(TEA 패턴)를 제공하며, JavaScript와의 통신을 위한 Port 개념과 elm/html 라이브러리를 통해 웹 개발을 지원한다. 하지만 타입 클래스 및 고차 다형성 미지원으로 인해 제약 사항이 존재한다.

더 읽어볼만한 페이지

  • 도메인 특화 프로그래밍 언어 - 도메인 특화 언어
    도메인 특화 언어(DSL)는 특정 문제 영역에 특화된 프로그래밍 언어로, 외부 DSL, 내부 DSL, 시각적 다이어그램 언어 등으로 분류되며, 생산성 향상에 기여하지만 새로운 언어 학습의 필요성과 적용 분야의 제한이라는 특징을 가진다.
  • 도메인 특화 프로그래밍 언어 - G-code
    G-코드는 1950년대 MIT에서 처음 구현된 수치 제어 공작 기계를 제어하는 프로그래밍 언어로서, 다양한 표준과 구현을 거쳐 발전해왔으며 현대에는 매크로 기능과 CAD/CAM 응용 프로그램과의 연동을 지원한다.
  • 정적 타입 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 정적 타입 프로그래밍 언어 - 핵 (프로그래밍 언어)
    Hack은 페이스북에서 개발한 프로그래밍 언어이며, PHP와 상호 운용되도록 설계되었고, 정적 타이핑을 도입하여 타입 힌트를 확장하며 PHP 7에도 영향을 미쳤다.
  • 함수형 프로그래밍 언어 - XQuery
    XQuery는 함수형 프로그래밍 패러다임을 지원하며 XPath 식 구문의 상위 집합을 포함하는 XML 데이터 추출 및 조작을 위한 쿼리 언어로서, FLWOR 식을 통해 XML 데이터 조작 및 새로운 XML 문서 구성을 지원하고 XQuery 및 XPath 데이터 모델(XDM)을 기반으로 한다.
  • 함수형 프로그래밍 언어 - 코틀린 (프로그래밍 언어)
    코틀린은 젯브레인즈에서 개발한 정적 타입 언어로, 자바 가상 머신에서 동작하며 자바와의 호환성을 갖고, 안드로이드 공식 지원 언어로 채택되어 다양한 분야에서 활용되고 있으며, 이름은 러시아의 코틀린 섬에서 유래되었다.
Elm - [IT 관련 정보]에 관한 문서
기본 정보
Elm 로고
Elm 탕그램
패러다임함수형
계열Haskell
설계자Evan Czaplicki
발표일2012년 3월 30일
최신 버전0.19.1
최신 버전 발표일2019년 10월 21일
타이핑정적, 강한, 추론적
플랫폼x86-64
운영체제macOS, Windows
라이선스관대한 (수정 BSD)
파일 확장자.elm
웹사이트Elm 공식 웹사이트
영향을 받은 언어Haskell, Standard ML, OCaml, F#
영향을 준 기술Redux, Rust, Vue, Roc, Derw, Gren

2. 역사

Elm은 2012년 에번 차플리츠키(Evan Czaplicki)의 석사 논문으로 처음 설계되었다.[11] 최초의 Elm은 많은 샘플 코드와 그것들을 브라우저에서 간단하게 시험할 수 있는 온라인 에디터와 함께 릴리즈되었다.[12] 에번 차플리츠키는 Elm 개발을 위해 2013년 프레지에 입사했고,[13] 2016년부터는 오픈 소스 엔지니어로 노레드잉크에 소속되어 동시에 Elm 소프트웨어 재단을 설립했다.[14]

최초 구현에서 Elm 컴파일러는 HTML, CSS, JavaScript를 타겟으로 하고 있었다.[15] 일련의 툴은 그 후에도 확장을 계속하고 있어 현재는 REPL,[16] 패키지 매니저,[17] 타임머신 디버거,[18] macOS 및 Windows용 설치 프로그램을 갖추고 있다.[19] Elm은 또 커뮤니티에서 제작한 라이브러리 생태계를 가지고 있으며,[20] 작업 저장 및 커뮤니티 라이브러리 포함을 허용하는 고급 온라인 편집기인 Ellie가 있다.[21]

3. 특징

Elm은 if 표현식, let 표현식, 패턴 매칭을 위한 case 표현식, 익명 함수 등 작지만 표현력이 풍부한 언어 구성 요소를 가지고 있다.[22] 불변성, 정적 타이핑, HTML, CSS, JavaScript와의 상호 운용성을 주요 기능으로 갖는다.

함수형 언어로서 Elm은 익명 함수, 함수를 인수로 사용하거나 함수가 함수를 반환하는 기능을 지원한다. 후자는 종종 커링된 함수의 부분 적용을 통해 이루어진다. 함수는 값으로 호출되며, 불변 값, 순수 함수, 타입 추론을 통한 정적 타이핑을 의미 체계로 포함한다. Elm 프로그램은 가상 DOM을 통해 HTML을 렌더링하고, "서비스로서의 자바스크립트"를 사용하여 다른 코드와 상호 작용할 수 있다.

Elm은 모듈 시스템을 갖추고 있어 코드를 모듈이라는 더 작은 부분으로 나눌 수 있다. 모듈은 헬퍼 함수와 같은 구현 세부 정보를 숨기고 관련 코드를 함께 그룹화한다. 타사 라이브러리(또는 패키지)는 하나 이상의 모듈로 구성되며, [https://package.elm-lang.org/ Elm 공개 라이브러리]에서 이용 가능하다. 모든 라이브러리는 semver에 따라 버전이 관리된다.

Elm은 포트(Port)라는 추상화를 통해 JavaScript와 협업하며,[25][52] 이를 통해 Elm과 JavaScript 간 데이터 교환이 가능하다. Elm은 elm/html 라이브러리를 이용해 Elm 내부에서 HTML과 CSS를 다룰 수 있고,[26][53] Virtual DOM을 사용하여 효율적인 업데이트를 수행한다.[27][54]

3. 1. 불변성

Elm의 모든 값은 불변이며, 한 번 만들어진 값은 나중에 변경할 수 없다. Elm은 영구 자료 구조를 이용해 `Array`, `Dict`, `Set` 라이브러리를 구현하고 있다.[23]

3. 2. 정적 타이핑

Elm은 정적 타입 언어이다. 모든 정의에는 해당 값을 정확하게 나타내는 타입을 명시할 수 있다. Elm의 타입에는 다음이 포함된다.

  • 정수나 문자열 등의 원시형 타입
  • 리스트, 튜플, 확장 레코드와 같은 기본적인 데이터 구조
  • 사용자 정의 타입 (Tagged Union, 합타입(sum type영어))


Elm은 완전한 타입 추론을 지원하고 있어 컴파일러는 타입 명시 없이 타입 안전 여부를 판정할 수 있다.[24] 함수는 `round : Float -> Int`와 같이 화살표로 타입이 작성된다. `List a`는 알 수 없는 타입의 값들의 리스트로, 빈 리스트의 타입이며, 리스트의 요소에 관계없이 `List.length`의 인자 타입이다.

JavaScript의 `undefined` 또는 널 포인터와 같이 임의의 값을 암묵적으로 널 가능하게 허용하는 대신, Elm의 표준 라이브러리는 `Maybe a` 타입을 정의한다. 선택적 값을 생성하거나 처리하는 코드는 이 타입을 사용하여 명시적으로 그렇게 하며, 다른 모든 코드는 주장된 타입의 값이 실제로 존재함을 보장받는다.

Elm은 제한된 수의 내장 타입 클래스를 제공한다.

  • `number`: `Int` 및 `Float`를 포함하며 `(+)` 또는 `(*)`와 같은 숫자 연산자를 사용한다.
  • `comparable`: 숫자, 문자, 문자열, 비교 가능한 것들의 리스트, 비교 가능한 것들의 튜플을 포함하며 비교 연산자를 사용한다.
  • `appendable`: 문자열과 리스트를 포함하며 `(++)`를 사용하여 연결할 수 있다.


Elm은 사용자 정의 타입을 이러한 타입 클래스에 포함하거나 새로운 타입 클래스를 만들 수 있는 메커니즘을 제공하지 않는다.

3. 3. 모듈 시스템

Elm은 모듈 시스템을 가지고 있어서 사용자는 코드를 모듈이라고 하는 더 작은 부분으로 나눌 수 있다. 모듈은 헬퍼 함수와 같은 구현 세부 정보를 숨기고 관련 코드를 함께 그룹화할 수 있게 한다. 모듈은 `Bitwise.and`와 같이 가져온 코드의 네임스페이스 역할을 한다. 타사 라이브러리(또는 패키지)는 하나 이상의 모듈로 구성되며 [https://package.elm-lang.org/ Elm 공개 라이브러리]에서 사용할 수 있다. 모든 라이브러리는 semver에 따라 버전이 관리되며, 이는 컴파일러 및 기타 도구에 의해 적용된다. 즉, 함수를 제거하거나 유형을 변경하는 것은 주요 릴리스에서만 수행할 수 있다.

3. 4. HTML, CSS, JavaScript와의 상호 운용성

Elm은 포트(Port)라는 추상화를 사용하여 JavaScript와 협업할 수 있다.[25][52] 이를 통해 Elm과 JavaScript 간에 데이터 교환이 가능해진다.

Elm은 elm/html이라는 라이브러리를 통해 Elm 내부에서 HTML과 CSS를 다룰 수 있다.[26][53] 이는 Virtual DOM을 사용하여 효율적으로 업데이트를 수행한다.[27][54]

4. The Elm Architecture (TEA 패턴)

Elm 아키텍처는 대화형 웹 애플리케이션을 구축하기 위한 소프트웨어 디자인 패턴이며, TEA 패턴이라는 두문자어로도 불린다. Elm 애플리케이션은 본질적으로 이러한 방식으로 구성되지만, 다른 프로젝트에서도 이 개념을 유용하게 사용할 수 있다.

Elm 프로그램은 항상 세 부분으로 나뉜다.


  • 모델 - 애플리케이션의 상태
  • 뷰 - 모델을 HTML로 변환하는 함수
  • 업데이트 - 메시지를 기반으로 모델을 업데이트하는 함수


이것이 Elm 아키텍처의 핵심이다.[31]

예를 들어, 숫자를 표시하고 버튼을 누르면 숫자가 증가하는 애플리케이션을 상상해 보자.[31] 이 경우, 하나의 숫자만 저장하면 되므로 모델은 `type alias Model = Int`와 같이 간단할 수 있다. `view` 함수는 `Html` 라이브러리로 정의되며 숫자와 버튼을 표시한다. 숫자를 업데이트하려면 `update` 함수에 메시지를 보낼 수 있어야 하는데, 이는 `type Msg = Increase`와 같은 사용자 정의 유형을 통해 수행된다. `Increase` 값은 `view` 함수에 정의된 버튼에 연결되어 사용자가 버튼을 클릭하면 `Increase`가 `update` 함수로 전달되어 숫자를 증가시켜 모델을 업데이트할 수 있다.

Elm 아키텍처에서 `update`에 메시지를 보내는 것이 상태를 변경하는 유일한 방법이다. 더 정교한 애플리케이션에서는 메시지가 다양한 소스에서 올 수 있다. 사용자 상호 작용, 모델의 초기화, `update`의 내부 호출, 외부 이벤트에 대한 구독 (창 크기 조정, 시스템 시계, JavaScript 상호 운용 등) 및 URL 변경, 요청 등이 있다.

5. 제약 사항

Elm은 하스켈, 퓨어스크립트와 달리 타입 클래스를 지원하지 않아, 여러 공통 처리를 추상화하기 어렵다.[55] 예를 들어 `map`, `apply`, `fold`, `filter` 같은 범용 함수가 없다. 대신 `List.map`, `Dict.map`처럼 각 모듈 이름을 붙여 사용한다.

Elm은 고차 다형성을 지원하지 않으며,[32] 하스켈, 스칼라, 퓨어스크립트는 이를 지원한다. 또한 Elm은 타입 클래스 생성을 지원하지 않는다.

이는 Elm이 `List`와 `Set` 같은 여러 데이터 구조에서 작동하는 일반적인 `map` 함수를 가질 수 없음을 의미한다. Elm에서는 이러한 함수를 `List.map`과 `Set.map`처럼 모듈 이름으로 한정하여 호출한다. 하스켈이나 퓨어스크립트에서는 `map` 함수가 하나만 존재한다. 이는 적어도 2015년부터 Mr. Czaplicki의 대략적인 로드맵에 있는 알려진 기능 요청이다.[33] 반면, 스칼라 같은 고급 언어에서 TEA 패턴 구현은 이러한 제한에 영향을 받지 않고, 스칼라의 타입 클래스, 타입 레벨 프로그래밍, kind-level 프로그래밍 구성을 활용할 수 있다.[34]

또 다른 결과로, "Elm in Action"의 저자가 단일 페이지 애플리케이션 예시에서 보여주듯, 중대형 규모 프로젝트에서 많은 양의 보일러플레이트 코드가 발생한다.[35] 업데이트, 보기, 구독, 경로 구문 분석 및 빌드 함수에서 거의 동일한 코드 조각이 반복된다.

6. 도구

Elm의 첫 번째 릴리스는 많은 예제와 웹 브라우저에서 쉽게 사용해 볼 수 있는 온라인 편집기를 제공했다.[12] 핵심 도구 집합은 계속 확장되어 현재 REPL,[16] 패키지 매니저,[17] 타임머신 디버거,[18] macOS 및 Windows용 설치 프로그램을 포함한다.[19] Elm은 또한 커뮤니티에서 제작한 라이브러리 생태계를 가지고 있으며,[20] 작업 저장 및 커뮤니티 라이브러리 포함을 허용하는 고급 온라인 편집기인 Ellie가 있다.[21]

Elm 관련 자료는 다음과 같다.

7. 코드 샘플

elm


  • - 한 줄 주석


{- 여러 줄 주석

여러 줄에 걸쳐 쓸 수 있습니다.

  • }


{- 여러 줄 주석은 {- 중첩 -}될 수 있습니다 -}

  • - ''greeting''이라는 값을 정의합니다. 타입은 String으로 추론됩니다.

greeting =

"Hello World!"

  • - 톱 레벨 선언에는 타입 어노테이션을 붙이는 것이 좋습니다.

hello : String

hello =

"Hi there."

  • - 함수도 마찬가지로 선언됩니다. 인수는 함수 이름 뒤에 씁니다.

add x y =

x + y

  • - 역시 타입 어노테이션을 붙이는 것이 좋습니다.

hypotenuse : Float -> Float -> Float

hypotenuse a b =

sqrt (a^2 + b^2)

  • - 함수는 커리화되어 있습니다. 여기서는 곱셈 중위 연산자를 2로 부분 적용하고 있습니다.

multiplyBy2 : number -> number

multiplyBy2 =

(*) 2

  • - 조건 분기에는 if 식을 사용합니다.

absoluteValue : number -> number

absoluteValue number =

if number < 0 then negate number else number

  • - 이름이 지정된 필드를 유지하려면 레코드를 사용합니다.

book : { title : String, author : String, pages : Int }

book =

{ title = "Steppenwolf"

, author = "Hesse"

, pages = 237

}

  • - `.`으로 레코드 값에 접근합니다.

title : String

title =

book.title

  • - `.`를 이용한 레코드 접근은 함수로 사용할 수도 있습니다.

author : String

author =

.author book

  • - 새로운 타입을 정의하려면 `type` 키워드를 사용합니다.
  • - 다음 타입은 이진 트리를 나타냅니다.

type Tree a

= Empty

| Node a (Tree a) (Tree a)

  • - 이러한 타입은 case 식으로 분기할 수 있습니다.

depth : Tree a -> Int

depth tree =

case tree of

Empty ->

0

Node value left right ->

1 + max (depth left) (depth right)

참조

[1] 웹사이트 My Thesis is Finally Complete! "Elm: Concurrent FRP for functional GUIs" https://www.reddit.c[...] 2012-03-30
[2] 웹사이트 Releases: elm/Compiler https://github.com/e[...]
[3] 웹사이트 elm/compiler https://github.com/e[...] 2021-10-16
[4] 웹사이트 Prior Art - Redux https://redux.js.org[...] 2024-04-28
[5] 웹사이트 Uniqueness Types https://blog.rust-la[...] 2016-10-08
[6] 웹사이트 Comparison with Other Frameworks — Vue.js https://vuejs.org/v2[...]
[7] 웹사이트 roc/roc-for-elm-programmers.md at main · roc-lang/roc https://github.com/r[...] 2024-02-17
[8] 웹사이트 Why Derw: an Elm-like language that compiles to TypeScript? https://derw.substac[...] 2021-12-20
[9] 웹사이트 Gren 0.1.0 is released https://gren-lang.or[...]
[10] 웹사이트 Elm home page https://elm-lang.org[...]
[11] 웹사이트 Elm: Concurrent FRP for Functional GUIs https://elm-lang.org[...]
[12] 웹사이트 Try Elm https://elm-lang.org[...] 2019-07-24
[13] 웹사이트 elm and prezi https://elm-lang.org[...]
[14] 웹사이트 new adventures for elm https://elm-lang.org[...]
[15] 웹사이트 elm/compiler https://github.com/e[...] 2021-10-16
[16] 웹사이트 repl https://elm-lang.org[...]
[17] 웹사이트 package manager https://elm-lang.org[...]
[18] 웹사이트 Home https://elm-lang.org[...]
[19] 웹사이트 Install https://guide.elm-la[...]
[20] 웹사이트 Elm packages https://package.elm-[...]
[21] 웹사이트 Ellie https://ellie-app.co[...]
[22] 웹사이트 syntax http://elm-lang.org/[...] 2013-05-31
[23] 웹사이트 elm/core https://package.elm-[...]
[24] 웹사이트 Model The Problem https://guide.elm-la[...] 2016-05-04
[25] 웹사이트 JavaScript interop https://guide.elm-la[...]
[26] 웹사이트 elm/html https://package.elm-[...]
[27] 웹사이트 Blazing Fast HTML https://elm-lang.org[...]
[28] 웹사이트 Kofigumbs/Elm-beam https://github.com/h[...] 2021-09-24
[29] 웹사이트 What is it? https://github.com/w[...] 2021-09-24
[30] 웹사이트 Board https://github.com/A[...] 2021-09-18
[31] 웹사이트 Buttons · An Introduction to Elm https://guide.elm-la[...] 2020-10-15
[32] 웹사이트 Higher-Kinded types Not Expressible? #396 https://github.com/e[...] 2015-03-06
[33] 웹사이트 Higher-Kinded types Not Expressible #396 https://github.com/e[...] 2019-11-19
[34] 웹사이트 The Elm Architecture https://tyrian.indig[...] 2024-09-07
[35] 웹사이트 Main.elm https://github.com/r[...] 2020-06-30
[36] 웹사이트 LICENSE https://github.com/e[...] 2019-03-21
[37] 웹사이트 Elm home page https://elm-lang.org[...] 2017-05-17
[38] 논문 Elm: Concurrent FRP for Functional GUIs https://elm-lang.org[...]
[39] 웹사이트 Elm's Online Editor http://elm-lang.org/[...]
[40] 웹사이트 Elm joins Prezi https://elm-lang.org[...]
[41] 웹사이트 New Adventures for Elm https://elm-lang.org[...]
[42] 웹사이트 Elm compiler source code https://github.com/e[...]
[43] 웹사이트 Elm REPL announcement https://elm-lang.org[...]
[44] 웹사이트 Elm Package Manager announcement https://elm-lang.org[...]
[45] 웹사이트 Elm's Time-Traveling Debugger https://debug.elm-la[...]
[46] 웹사이트 Elm Platform https://github.com/e[...]
[47] 웹사이트 Elm Packages https://package.elm-[...]
[48] 웹사이트 The Syntax of Elm https://elm-lang.org[...]
[49] 웹사이트 About Elm http://elm-lang.org/[...]
[50] 웹사이트 Elm Standard Libraries https://package.elm-[...]
[51] 웹사이트 Model The Problem http://elm-lang.org/[...] 2016-05-04
[52] 웹사이트 Ports https://guide.elm-la[...]
[53] 문서 documentation https://package.elm-[...]
[54] 웹사이트 Blazing Fast Html https://elm-lang.org[...]
[55] 웹사이트 Higher-Kinded types Not Expressible? #396 https://github.com/e[...] 2015-03-06
[56] 웹인용 LICENSE https://github.com/e[...] 2019-03-21



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com