오즈 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
오즈(Oz)는 1991년 게르트 스몰카에 의해 처음 설계된 다중 패러다임 프로그래밍 언어이다. 논리 프로그래밍, 함수형 프로그래밍, 명령형 프로그래밍, 객체 지향 프로그래밍, 제약 프로그래밍, 분산 프로그래밍, 동시 프로그래밍 등 다양한 프로그래밍 패러다임을 지원하며, 특히 제약 프로그래밍과 분산 프로그래밍에 강점을 보인다. 오즈는 병렬성을 쉽게 구현할 수 있도록 설계되었으며, 모차르트 프로그래밍 시스템을 통해 오픈 소스로 제공된다.
더 읽어볼만한 페이지
- 1991년 개발된 프로그래밍 언어 - 파이썬
파이썬은 귀도 반 로섬이 개발한 객체 지향적 프로그래밍 언어이며, 간결한 문법과 다양한 라이브러리를 통해 웹 개발, 과학 계산, 인공지능 등 다양한 분야에서 활용된다. - 1991년 개발된 프로그래밍 언어 - 비주얼 베이직
비주얼 베이직은 1991년 마이크로소프트에서 출시된 GUI 기반 응용 프로그램 개발에 강점을 가진 프로그래밍 언어이며, 윈도우용 응용 프로그램 및 데이터베이스 조작 프로그램 개발에 주로 사용되었고, 2005년 표준 지원이 중단되었다. - 논리형 프로그래밍 언어 - 프롤로그 (프로그래밍 언어)
프롤로그는 알랭 콜메로에르가 개발한 논리 프로그래밍 언어로, 사실과 규칙 기반 데이터베이스에 대한 질의를 통해 프로그램을 실행하며, 단일화, 백트래킹, 논리 변수 바인딩을 핵심 특징으로 인공지능, 자연어 처리 등에 활용된다. - 논리형 프로그래밍 언어 - 앨리스 (프로그래밍 언어)
앨리스는 Standard ML을 확장하여 동시성 및 지연 평가 기능을 제공하는 프로그래밍 언어이며, 미래와 약속 개념을 통해 동시성 프로그래밍을 지원하고 원격 프로시저 호출을 통해 다른 컴퓨터에서 계산을 수행할 수 있다. - 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
오즈 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
개발 시작 | 1991년 |
설계자 | Gert Smolka 및 그의 제자들 |
개발자 | Mozart 컨소시엄 |
첫 공개 | 1991년 |
최신 버전 | Oz 1.4.0 (최종), Mozart 2.0.1 |
최신 릴리스 날짜 | 2018년 9월 5일 |
자료형 | 동적 |
구현체 | Mozart 프로그래밍 시스템 |
라이선스 | MIT X11 |
영향을 받은 언어 | Erlang, Lisp, Prolog |
영향을 준 언어 | Alice, Scala |
웹사이트 | Mozart 프로그래밍 시스템 |
프로그래밍 패러다임 | |
패러다임 | 멀티 패러다임: 논리형, 함수형, 명령형, 객체 지향형, 제약형, 분산형, 동시성 |
방언 | |
방언 | Oz, Mozart |
2. 역사
1991년, 게르트 스몰카가 학생들과 함께 오즈를 설계하였다. 1996년 스웨덴 전산 과학 연구소의 세이프 하리디 연구 그룹이 오즈 개발에 협력하였다. 1999년 이후, 오즈 개발은 국제적 그룹인 ''Mozart Consortium''이 주도하고 있다. 이 컨소시엄에는 자를란트 대학교, 스웨덴 전산 과학 연구소, 루뱅 가톨릭 대학교가 참여하고 있다. 2005년, 모차르트 프로그래밍 시스템 개발 관리를 위한 Mozart Board가 설치되어 오픈 소스 개발을 확대하였다.
오즈는 논리, 함수형( 느긋한 계산과 탐욕적 계산 모두 포함), 명령형, 객체 지향, 제약, 분산, 동시 프로그래밍 등 다양한 프로그래밍 패러다임을 지원하는 언어이다.[2] 병행성 지향 언어로, 병행성을 쉽고 효율적으로 사용할 수 있게 한다.[2] 표준 그래픽 사용자 인터페이스(GUI) 언어인 QTk를 지원한다.[3]
3. 언어 특징
오즈는 제약 프로그래밍과 분산 프로그래밍에 강점을 보인다. 네트워크 투명 분산 프로그래밍 모델을 통해 개방적이고 결함 내성을 가진 애플리케이션을 쉽게 개발할 수 있다. 제약 프로그래밍에서는 "계산 공간" 개념을 도입하여 사용자 정의 검색 및 분산 전략을 제약 영역에 직교하게 적용할 수 있다.
3. 1. 데이터 구조
오즈는 구문 설탕을 통해 더 실용적인 것으로 확장될 수 있는 매우 적은 수의 데이터 유형을 가진 코어 언어를 기반으로 한다.
기본 데이터 구조는 다음과 같다.
```erlang
'|'(2 '|'(4 '|'(6 '|'(8 nil)))) % 레코드 형태
2|(4|(6|(8|nil))) % 구문 설탕 사용
2|4|6|8|nil % 더 많은 구문 설탕 사용
[2 4 6 8] % 훨씬 더 많은 구문 설탕 사용
```
이러한 데이터 구조는 값(상수), 일급 객체이며 동적 타이핑을 한다. 오즈의 변수 이름은 소문자로 시작하는 리터럴[4]과 구별하기 위해 대문자로 시작한다.
3. 2. 함수
함수는 일급 값이며, 고차 함수형 프로그래밍을 지원한다. 함수는 자유 변수와 바운드 변수를 모두 사용할 수 있고, 자유 변수의 값은 정적 렉시컬 스코핑을 통해 찾는다.[6]
3. 2. 1. 고차 프로그래밍
함수는 일급 값으로, 고차 함수형 프로그래밍을 가능하게 한다.[5] 함수는 다른 오즈(Oz) 객체와 마찬가지로 다른 함수의 인자로 전달되거나 함수에서 반환될 수 있다. 함수는 자유 변수와 바운드 변수 모두 사용될 수 있으며, 자유 변수 값은 정적 렉시컬 스코핑을 사용하여 찾는다.[6]
3. 2. 2. 익명 함수
오즈는 다른 많은 함수형 언어와 마찬가지로 고차 프로그래밍과 함께 익명 함수(이름을 갖지 않는 함수)의 사용을 지원한다. 익명 함수는 `$` 기호를 사용하여 나타낸다.[6]
다음 예제에서 `square` 함수는 익명으로 정의되어 전달되며, 이로 인해 `[1 4 9]`가 표시된다.
```erlang
{Browse {Map fun {$ N} N*N end [1 2 3]}}
```
익명 함수는 이름을 갖지 않기 때문에, 재귀적인 익명 함수를 정의하는 것은 불가능하다.[6]
3. 2. 3. 프로시저
오즈에서 값을 반환하지 않는 함수를 프로시저(procedure)라고 하며, `proc` 키워드를 사용하여 정의한다.[7] 프로시저는 다음과 같이 정의할 수 있다.
```erlang
declare
proc {Ret X}
if X > 0 then {Browse 5} else {Browse ~5} end
end
```
위 예제는 값을 반환하지 않고, `X`의 부호에 따라 오즈 브라우저에 5 또는 -5를 출력한다.
3. 3. 데이터플로우 변수와 선언적 동시성
프로그램이 바인딩되지 않은 변수를 만나면 값에 대한 대기를 시작한다.[2] 예를 들어, 아래 예시에서 스레드는 X와 Y가 모두 값에 바인딩될 때까지 대기한 후 Z의 값을 표시한다.
```erlang
thread
Z = X+Y
{Browse Z}
end
thread X = 40 end
thread Y = 2 end
```
데이터플로우 변수의 값은 한 번 바인딩되면 변경할 수 없다.[2]
```erlang
X = 1
X = 2 % 오류
```
데이터플로우 변수를 사용하면 동시 스트림 에이전트(concurrent stream agent)를 쉽게 만들 수 있다.[2]
```erlang
fun {Ints N Max}
if N == Max then nil
else
{Delay 1000}
N|{Ints N+1 Max}
end
end
fun {Sum S Stream}
case Stream
of nil then S
[] H|T then S|{Sum H+S T}
end
end
local X Y in
thread X = {Ints 0 1000} end
thread Y = {Sum 0 X} end
{Browse Y}
end
```
데이터플로우 변수의 작동 방식 때문에 프로그램의 어느 곳에나 스레드를 배치해도 동일한 결과를 보장받을 수 있다. 이는 동시 프로그래밍을 매우 쉽게 만든다. 스레드는 매우 가볍기 때문에 100,000개의 스레드를 동시에 실행할 수 있다.[8]
3. 4. 예제: 시도 나누기 체
이 예시는 시도 나누기 알고리즘을 사용하여 소수의 스트림을 계산하며, 소수가 아닌 숫자를 걸러내는 동시 스트림 에이전트를 재귀적으로 생성한다.[1]
```oz
fun {Sieve Xs}
case Xs of nil then nil
[] X|Xr then Ys in
thread Ys = {Filter Xr fun {$ Y} Y mod X \= 0 end} end
X|{Sieve Ys}
end
end
3. 5. 느긋한 계산
오즈는 기본적으로 탐욕적 계산법을 사용하지만, 느긋한 계산법[9]도 가능하다. 아래 예제에서 X의 값을 Y의 값을 계산하는 데에만 Fact가 계산된다.
```erlang
fun lazy {Fact N}
if N =< 0 then 1 else N*{Fact N-1} end
end
local X Y in
X = {Fact 100}
Y = X + 1
end
```
느긋한 계산법은 오즈에서 무한한 자료 구조를 저장할 수 있게 해준다. 느긋한 계산법의 강력함은 다음 코드 샘플에서 볼 수 있다.
```erlang
declare
fun lazy {Merge Xs Ys}
case Xs#Ys
of (X|Xr)#(Y|Yr) then
if X < Y then X|{Merge Xr Ys}
elseif X>Y then Y|{Merge Xs Yr}
else X|{Merge Xr Yr}
end
end
end
fun lazy {Times N Xs}
case Xs
of nil then nil
[] X|Xr then N*X|{Times N Xr}
end
end
declare H
H = 1 | {Merge {Times 2 H} {Merge {Times 3 H} {Times 5 H}}}
{Browse {List.take H 6}}
```
위 코드는 무한 리스트에서 모든 정규수[10]를 계산한다. 실제 숫자는 필요할 때만 계산된다.
3. 6. 메시지 전달 동시성
선언적 동시성 모델은 간단한 의미 체계를 통해 메시지 전달로 확장될 수 있다.[2]
```erlang
declare
local Stream Port in
Port = {NewPort Stream}
{Send Port 1} % Stream is now 1|_ ('_'는 바운드되지 않은 익명의 변수를 나타냅니다)
{Send Port 2} % Stream is now 1|2|_
...
{Send Port n} % Stream is now 1|2| .. |n|_
end
```
포트와 스레드를 사용하면 비동기 에이전트를 정의할 수 있다.[2]
```erlang
fun {NewAgent Init Fun}
Msg Out in
thread {FoldL Msg Fun Init Out} end
{NewPort Msg}
end
3. 7. 상태와 객체
오즈는 Cells라는 가변 데이터 구조를 통해 상태(state)를 표현하여 선언적 모델을 확장함으로써 상태와 객체 지향 프로그래밍을 지원한다.[2]
```erlang
local A X in
A = {NewCell 0}
A := 1 % A의 값을 1로 변경합니다.
X = @A % @는 A의 값에 접근하는 데 사용됩니다.
end
```
이러한 간단한 의미 체계 변경을 통해 전체 객체 지향 패러다임을 지원할 수 있다. 아래는 `class` 키워드를 사용하여 클래스를 정의하고 객체를 생성하는 예시이다.
```erlang
class Counter
attr val
meth init(Value)
val:=Value
end
meth browse
{Browse @val}
end
meth inc(Value)
val :=@val+Value
end
end
local C in
C = {New Counter init(0)}
{C inc(6)}
{C browse}
end
4. 처리계
모차르트 프로그래밍 시스템은 오즈의 고품질 구현으로, 모차르트 컨소시엄에서 배포한 오픈 소스이다. 유닉스 계열 운영체제, FreeBSD, 리눅스, 마이크로소프트 윈도우, macOS 등 다양한 운영체제에서 사용할 수 있다.
5. 실행 속도
Mozart 컴파일러(Oz 3를 구현하는 버전 1.4.0)로 생성된 프로그램의 실행 속도는 느린 편이다. 2012년 벤치마크 결과, C 언어의 GCC에 비해 평균 50배 정도 느린 것으로 나타났다.[11]
참조
[1]
웹사이트
Mozart Oz License Info
https://mozart.githu[...]
2014-01-16
[2]
서적
Computer Science Today
[3]
웹사이트
QTk
http://www.mozart-oz[...]
2009-04-06
[4]
웹사이트
3 Basics
https://mozart.githu[...]
[5]
서적
Advanced Functional Programming in Oz
http://www2.gslt.hum[...]
2014-11-03
[6]
간행물
Lexical Scope in Statistical Computing
https://www.stat.auc[...]
2000-09
[7]
웹사이트
5 Basic Control Structures
https://mozart.githu[...]
[8]
웹사이트
Archived copy
http://www.mozart-oz[...]
2008-11-29
[9]
간행물
Conception, evolution, and application of functional programming languages
[10]
간행물
Application of the Hamming number technique to detect isomorphism among kinematic chains and inversions
[11]
웹사이트
The Computer Language Benchmarks Game
https://archive.toda[...]
[12]
웹인용
Mozart Oz License Info
https://mozart.githu[...]
2014-01-16
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com