맨위로가기

오즈 (프로그래밍 언어)

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

1. 개요

오즈(Oz)는 1991년 게르트 스몰카에 의해 처음 설계된 다중 패러다임 프로그래밍 언어이다. 논리 프로그래밍, 함수형 프로그래밍, 명령형 프로그래밍, 객체 지향 프로그래밍, 제약 프로그래밍, 분산 프로그래밍, 동시 프로그래밍 등 다양한 프로그래밍 패러다임을 지원하며, 특히 제약 프로그래밍과 분산 프로그래밍에 강점을 보인다. 오즈는 병렬성을 쉽게 구현할 수 있도록 설계되었으며, 모차르트 프로그래밍 시스템을 통해 오픈 소스로 제공된다.

더 읽어볼만한 페이지

  • 1991년 개발된 프로그래밍 언어 - 파이썬
    파이썬은 귀도 반 로섬이 개발한 객체 지향적 프로그래밍 언어이며, 간결한 문법과 다양한 라이브러리를 통해 웹 개발, 과학 계산, 인공지능 등 다양한 분야에서 활용된다.
  • 1991년 개발된 프로그래밍 언어 - 비주얼 베이직
    비주얼 베이직은 1991년 마이크로소프트에서 출시된 GUI 기반 응용 프로그램 개발에 강점을 가진 프로그래밍 언어이며, 윈도우용 응용 프로그램 및 데이터베이스 조작 프로그램 개발에 주로 사용되었고, 2005년 표준 지원이 중단되었다.
  • 논리형 프로그래밍 언어 - 프롤로그 (프로그래밍 언어)
    프롤로그는 알랭 콜메로에르가 개발한 논리 프로그래밍 언어로, 사실과 규칙 기반 데이터베이스에 대한 질의를 통해 프로그램을 실행하며, 단일화, 백트래킹, 논리 변수 바인딩을 핵심 특징으로 인공지능, 자연어 처리 등에 활용된다.
  • 논리형 프로그래밍 언어 - 앨리스 (프로그래밍 언어)
    앨리스는 Standard ML을 확장하여 동시성 및 지연 평가 기능을 제공하는 프로그래밍 언어이며, 미래와 약속 개념을 통해 동시성 프로그래밍을 지원하고 원격 프로시저 호출을 통해 다른 컴퓨터에서 계산을 수행할 수 있다.
  • 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
    자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다.
  • 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
오즈 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
기본 정보
다양한 프로그래밍 패러다임을 지원하는 Oz의 능력
다양한 프로그래밍 패러다임을 지원하는 Oz의 능력
개발 시작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가 설치되어 오픈 소스 개발을 확대하였다.

3. 언어 특징

오즈는 논리, 함수형( 느긋한 계산과 탐욕적 계산 모두 포함), 명령형, 객체 지향, 제약, 분산, 동시 프로그래밍 등 다양한 프로그래밍 패러다임을 지원하는 언어이다.[2] 병행성 지향 언어로, 병행성을 쉽고 효율적으로 사용할 수 있게 한다.[2] 표준 그래픽 사용자 인터페이스(GUI) 언어인 QTk를 지원한다.[3]

오즈는 제약 프로그래밍과 분산 프로그래밍에 강점을 보인다. 네트워크 투명 분산 프로그래밍 모델을 통해 개방적이고 결함 내성을 가진 애플리케이션을 쉽게 개발할 수 있다. 제약 프로그래밍에서는 "계산 공간" 개념을 도입하여 사용자 정의 검색 및 분산 전략을 제약 영역에 직교하게 적용할 수 있다.

3. 1. 데이터 구조

오즈는 구문 설탕을 통해 더 실용적인 것으로 확장될 수 있는 매우 적은 수의 데이터 유형을 가진 코어 언어를 기반으로 한다.

기본 데이터 구조는 다음과 같다.

  • 숫자: 부동 소수점 또는 정수(실수 정수)
  • 레코드: 데이터를 그룹화하기 위해 사용한다. 예: `circle(x:0 y:1 radius:3 color:blue style:dots)`. 여기서 x, y, radius 등은 특징이라고 불리며, 특징과 관련된 데이터(이 경우 0, 1, 3 등)는 값이다.
  • 튜플: 오름차순으로 정수 특징을 가진 레코드이다. 예: `circle(1:0 2:1 3:3 4:blue 5:dots)`
  • 리스트: 간단한 선형 구조이다.


```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