Elm
"오늘의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 관련 정보]에 관한 문서 | |
|---|---|
| 기본 정보 | |
![]() | |
| 패러다임 | 함수형 |
| 계열 | 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은 if 표현식, let 표현식, 패턴 매칭을 위한 case 표현식, 익명 함수 등 작지만 표현력이 풍부한 언어 구성 요소를 가지고 있다.[22] 불변성, 정적 타이핑, HTML, CSS, JavaScript와의 상호 운용성을 주요 기능으로 갖는다.
최초 구현에서 Elm 컴파일러는 HTML, CSS, JavaScript를 타겟으로 하고 있었다.[15] 일련의 툴은 그 후에도 확장을 계속하고 있어 현재는 REPL,[16] 패키지 매니저,[17] 타임머신 디버거,[18] macOS 및 Windows용 설치 프로그램을 갖추고 있다.[19] Elm은 또 커뮤니티에서 제작한 라이브러리 생태계를 가지고 있으며,[20] 작업 저장 및 커뮤니티 라이브러리 포함을 허용하는 고급 온라인 편집기인 Ellie가 있다.[21]
3. 특징
함수형 언어로서 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의 타입에는 다음이 포함된다.
Elm은 완전한 타입 추론을 지원하고 있어 컴파일러는 타입 명시 없이 타입 안전 여부를 판정할 수 있다.[24] 함수는 `round : Float -> Int`와 같이 화살표로 타입이 작성된다. `List a`는 알 수 없는 타입의 값들의 리스트로, 빈 리스트의 타입이며, 리스트의 요소에 관계없이 `List.length`의 인자 타입이다.
JavaScript의 `undefined` 또는 널 포인터와 같이 임의의 값을 암묵적으로 널 가능하게 허용하는 대신, Elm의 표준 라이브러리는 `Maybe a` 타입을 정의한다. 선택적 값을 생성하거나 처리하는 코드는 이 타입을 사용하여 명시적으로 그렇게 하며, 다른 모든 코드는 주장된 타입의 값이 실제로 존재함을 보장받는다.
Elm은 제한된 수의 내장 타입 클래스를 제공한다.
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 관련 자료는 다음과 같다.
- 온라인 에디터 (간단한 확인용): http://elm-lang.org/try elm-lang.org/try
- 로컬 설치: https://guide.elm-lang.org/install/elm.html Install Elm
- 학습용 리소스: https://elm-lang.org/docs 학습용 리소스
- 샘플집: https://elm-lang.org/examples 샘플집
- 코어 라이브러리: https://package.elm-lang.org/packages/elm/core/latest/ 코어 라이브러리
- 커뮤니티 라이브러리: https://package.elm-lang.org/ 커뮤니티 라이브러리
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
