Occam
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Occam은 1980년대에 개발된 동시성 프로그래밍 언어이다. 들여쓰기와 서식이 코드 파싱에 중요한 역할을 하며, 채널을 통해 프로세스 간 통신을 수행한다. 주요 명령어로는 순차적 실행을 위한 `SEQ`, 동시 실행을 위한 `PAR`, 가드 명령 목록을 지정하는 `ALT`가 있다. Occam은 여러 버전으로 발전했으며, Occam 1, Occam 2, Occam 2.1, Occam 3, Occam-π 등이 있다. Occam-π는 Kent Retargettable Occam compiler (KRoC)에서 구현된 Occam 변형으로, π-계산법에서 영감을 얻은 확장 기능을 포함한다.
더 읽어볼만한 페이지
- 1983년 개발된 프로그래밍 언어 - C++
C++는 비야네 스트롭스트룹이 개발한 다중 패러다임 프로그래밍 언어로, C를 기반으로 객체 지향 프로그래밍과 제네릭 프로그래밍을 지원하며 다양한 분야에 사용되고, 꾸준한 표준 업데이트를 통해 기능이 확장되었지만 복잡한 문법으로 높은 학습 곡선을 가진다. - 1983년 개발된 프로그래밍 언어 - GW 베이직
GW-BASIC은 1980년대 마이크로소프트에서 개발한 BASIC 프로그래밍 언어의 인터프리터 버전이며, IBM PC 하드웨어 기능을 추가하여 사운드와 그래픽 기능을 활용한다. - 명령형 프로그래밍 언어 - 코틀린 (프로그래밍 언어)
코틀린은 젯브레인즈에서 개발한 정적 타입 언어로, 자바 가상 머신에서 동작하며 자바와의 호환성을 갖고, 안드로이드 공식 지원 언어로 채택되어 다양한 분야에서 활용되고 있으며, 이름은 러시아의 코틀린 섬에서 유래되었다. - 명령형 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
| Occam - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 기본 정보 | |
| 종류 | 명령형, 절차적, 병행 |
| 설계자 | 데이비드 메이 |
| 개발자 | 인모스 |
| 발표일 | 1983년 |
| 최신 버전 | 2.1 (공식), 2.5 (비공식), 3 (완전 미구현) |
| 최신 버전 발표일 | 1994년 |
| 영향을 받은 언어 | 커뮤니케이팅 시퀀셜 프로세스 |
| 영향을 준 언어 | Ease, Go, 파이썬 |
2. 언어 특징
Occam은 채널을 이용한 프로세스 간 통신, 병렬 프로그래밍을 지원하는 독특한 특징을 가진 언어이다. 코드의 들여쓰기가 문법적으로 중요한 역할을 하며, 이는 오프사이드 규칙이라고 불린다. 이러한 특징은 하스켈, 파이썬 등 다른 프로그래밍 언어에서도 찾아볼 수 있다.
Occam의 주요 특징은 다음과 같다.
- 채널 통신: 프로세스 간 통신은 명명된 채널을 통해 이루어진다. `!` 연산자는 채널에 데이터를 출력하고, `?` 연산자는 채널에서 데이터를 입력받는다. 데이터 전송은 송수신 프로세스가 모두 준비될 때까지 블록된다.
- `SEQ` (순차 실행): `SEQ` 키워드는 다음에 오는 코드 블록을 순차적으로 실행한다. 다른 프로그래밍 언어와 달리 Occam에서는 순차 실행이 명시적으로 지정되어야 한다.
- `PAR` (병렬 실행): `PAR` 키워드는 다음에 오는 코드 블록을 병렬적으로 실행한다.
- `ALT` (선택 실행): `ALT` 키워드는 여러 개의 ''가드''된 명령 목록 중 하나를 선택하여 실행한다. 각 가드는 조건문과 입력문의 조합으로 구성되며, 조건이 참이고 입력 채널이 준비된 가드가 선택된다.
2. 1. 기본 구문
Occam의 코드는 들여쓰기에 따라 파싱된다. 표현식은 줄 끝으로 종료되며, 표현식 목록은 같은 들여쓰기 수준이어야 한다. 이러한 특징은 오프사이드 규칙이라고 불리며, 하스켈, 파이썬 등 다른 프로그래밍 언어에서도 찾아볼 수 있다.프로세스 간 통신은 명명된 '''채널'''을 통해 이루어진다. 한 프로세스는 `!`를 사용하여 채널에 데이터를 출력하고, 다른 프로세스는 `?`를 사용하여 데이터를 입력한다. 입력과 출력은 상대 프로세스가 데이터를 주고받을 준비가 될 때까지 블록된다.
- `keyboard ? c`: keyboard 채널에서 데이터를 입력받아 변수 c에 저장한다.
- `screen ! c`: 변수 c의 값을 screen 채널로 출력한다.
`SEQ`는 순차적으로 실행되는 표현식 목록을 나타낸다.
```
SEQ
x := x + 1
y := x * x
```
위 코드는 x의 값을 1 증가시킨 후, x의 제곱을 y에 저장한다.
`PAR`은 동시에 실행될 수 있는 표현식 목록을 시작한다.
```
PAR
p()
q()
```
위 코드는 p()와 q()를 동시에 실행한다.
`ALT`는 ''가드''라고 불리는 조건 목록을 지정한다. 가드는 부울 조건과 입력 표현식의 조합이며, 둘 다 선택적이다. 조건이 참이고 입력 채널이 준비된 각 가드가 성공하며, 성공한 가드 중 하나가 실행된다.
```
ALT
count1 < 100 & c1 ? data
SEQ
count1 := count1 + 1
merged ! data
count2 < 100 & c2 ? data
SEQ
count2 := count2 + 1
merged ! data
status ? request
SEQ
out ! count1
out ! count2
```
위 코드는 다음 동작을 수행한다.
- 채널 c1 또는 c2에서 데이터를 읽어 merged 채널로 전달한다.
- count1 또는 count2가 100보다 작으면 해당 채널에서 데이터를 읽고, count 값을 1 증가시킨 후 merged 채널로 데이터를 보낸다.
- count1 또는 count2가 100에 도달하면 해당 채널에서 읽는 것을 비활성화한다.
- status 채널에서 요청이 오면 out 채널에 count1과 count2 값을 출력한다.
2. 2. 프로세스 간 통신
Occam에서 프로세스 간 통신은 명명된 ''채널''을 통해 이루어진다. 한 프로세스는 `!`를 사용하여 채널에 데이터를 출력하고, 다른 프로세스는 `?`를 사용하여 데이터를 입력한다. 입력과 출력은 상대 프로세스가 데이터를 주고받을 준비가 될 때까지 ''블록''된다. (프로그램이 스핀이나 폴링을 하지 않으므로 '대기', '멈춤', '양보'와 같은 용어도 사용된다. 또한, 다른 독립 프로세스의 실행을 블록하지 않는다.)예시 (c는 변수):
keyboard ? c
screen ! c
`SEQ`는 뒤따르는 표현식 목록을 순차적으로 평가한다. 이는 대부분의 다른 프로그래밍 언어에서 암시적으로 순차 평가를 하는 것과 다르다.
예시:
SEQ
x := x + 1
y := x * x
`PAR`은 뒤따르는 표현식 목록을 동시에 평가할 수 있게 한다.
예시:
PAR
p()
q()
`ALT`는 ''가드'' 명령 목록을 지정한다. 가드는 부울 조건과 입력 표현식의 조합이며, 둘 다 선택 사항이다. 조건이 참이고 입력 채널이 준비된 각 가드가 성공한다. 성공적인 가드 중 하나가 실행을 위해 선택된다.
예시:
ALT
count1 < 100 & c1 ? data
SEQ
count1 := count1 + 1
merged ! data
count2 < 100 & c2 ? data
SEQ
count2 := count2 + 1
merged ! data
status ? request
SEQ
out ! count1
out ! count2
위 코드는 채널 c1 또는 c2 (준비된 채널)에서 데이터를 읽어 병합된 채널(merged)에 전달한다. countN이 100에 도달하면 해당 채널에서의 읽기는 비활성화된다. 상태 채널에 대한 요청이 있으면 `out` 채널에 카운트를 출력하여 응답한다.
2. 3. 기본 명령어
Occam 프로그래밍 언어의 기본 명령어는 다음과 같다.- 채널 통신:
- 프로세스 간 통신은 명명된 채널을 통해 이루어진다.
- `!` (출력): 채널에 데이터를 출력한다.
- `?` (입력): 채널에서 데이터를 입력받는다.
- 입력과 출력은 상대 프로세스가 준비될 때까지 블록된다.
- `SEQ` (순차 실행):
- `SEQ` 다음에 오는 표현식 목록을 순차적으로 실행한다.
- 다른 프로그래밍 언어와 달리, Occam에서는 순차 실행이 암시적이지 않다.
```
SEQ
x := x + 1
y := x * x
```
- `PAR` (병렬 실행):
- `PAR` 다음에 오는 표현식 목록을 병렬적으로 실행한다.
```
PAR
p()
q()
```
- `ALT` (선택 실행):
- `ALT`는 가드(guard)된 명령어 목록을 지정한다.
- 각 가드는 부울 조건과 입력 표현식(둘 다 선택 사항)으로 구성된다.
- 조건이 참이고 입력 채널이 준비된 가드가 성공하며, 성공한 가드 중 하나가 실행된다.
```
ALT
count1 < 100 & c1 ? data
SEQ
count1 := count1 + 1
merged ! data
count2 < 100 & c2 ? data
SEQ
count2 := count2 + 1
merged ! data
status ? request
SEQ
out ! count1
out ! count2
```
위 예시는 `c1` 또는 `c2` 채널에서 데이터를 읽어 `merged` 채널로 전달한다. `countN`이 100에 도달하면 해당 채널에서의 읽기는 비활성화된다. `status` 채널에 대한 요청은 `out` 채널에 카운트를 출력하여 응답한다.
코드 형식: Occam에서 들여쓰기와 서식은 코드를 파싱하는 데 중요하며, 오프사이드 규칙을 따른다. 표현식은 줄의 끝으로 종료되며, 표현식 목록은 동일한 들여쓰기 수준에 있어야 한다. 이는 하스켈 및 파이썬과 같은 다른 언어에서도 찾아볼 수 있다.
3. 언어 버전
Occam은 여러 버전을 거치며 발전해왔다.
Occam 2는 1987년 인모스사가 개발한 확장판으로, 부동 소수점 연산과 다양한 데이터 형(정수 크기 변경, 문자형 추가)을 지원하여 실용적인 프로그램 작성을 가능하게 했다.[3] 이전 버전인 Occam 1은 주로 알고리즘 개발에 사용되었다.
Occam 2.1은 1988년 인모스사가 개발한 마지막 버전이다. 이름 있는 데이터형, 레코드, 패킹된 레코드, 형 변환 규칙 완화, 새로운 연산자(BYTESIN), 채널 형 변경, 채널 배열, 고정 길이 배열 반환 등 사용자 편의성을 위한 기능들이 추가되었다.[1]
Occam 3는 코드 공유, 동시 개발, 코드 재사용에 초점을 맞춘 차세대 Occam 언어 사양이었으나, 실제로 작동하는 컴파일러는 제작되지 않았다. 이는 인모스와 인수 회사의 문제 때문이었다.[1]
다른 팀들이 Occam 3의 일부 요소를 Occam 2.1 컴파일러에 도입하여 Occam 2.5라는 중간 버전을 만들었다.
Occam-π (Occam 2.5)는 켄트 대학교(KRoC) 팀이 개발한 버전으로, 파이-계산의 영향을 받은 기능들이 추가되었다. 추가된 기능에는 중첩 프로토콜, 실행 시 프로세스 생성, 이동 가능한 채널, 데이터, 프로세스, 재귀, 프로토콜 상속, 배열 생성자, 확장된 만남 등이 있다.
3. 1. Occam 1
Occam영어 1[2] (1983년 출시)은 데이비드 메이의 EPL 작업과 토니 호어의 CSP에서 차용한 언어의 예비 버전이었다. 이는 대상 아키텍처의 기본 워드 길이에 해당하는 정수형인 VAR 데이터 유형과 1차원 배열만 지원했다.3. 2. Occam 2
Occam 2는 1987년 Inmos Ltd에서 개발한 확장판으로, 부동 소수점 연산, 함수, 다차원 배열, 다양한 크기의 정수(INT16, INT32) 및 바이트와 같은 데이터 형식을 추가했다.[3]이 개정판을 통해 Occam은 유용한 프로그램을 표현할 수 있는 언어가 되었지만, Occam 1은 알고리즘을 검토하고 새로운 언어를 탐구하는 데 더 적합했다. (Occam 1 컴파일러는 Occam 1으로 작성되었으므로[4], 제한에도 불구하고 Occam 1으로 상당한 크기의 유용한 프로그램을 작성할 수 있다는 것을 보여준다.)
3. 3. Occam 2.1
occam영어 2.1[1]은 인모스(Inmos)가 개발에 기여한 occam영어 언어 시리즈의 마지막 버전이다. 1994년에 정의된 이 언어는 1990년대 초 인모스의 제프 배럿(Geoff Barrett)이 개발한 occam영어 3 (초기 개발 과정에서 "occam91"이라고도 불림)에 대한 이전 제안의 영향을 받았다. occam영어 3을 설명하는 개정된 참조 매뉴얼이 커뮤니티 의견 수렴을 위해 배포되었지만,[5] 이 언어는 컴파일러로 완전히 구현되지 않았다.occam영어 2.1은 occam영어 2에 다음과 같은 여러 가지 새로운 기능을 도입했다.
- 명명된 데이터 유형 (DATA TYPE x IS y)
- 명명된 레코드
- 팩 레코드
- 일부 유형 변환 규칙 완화
- 새로운 연산자 (예: BYTESIN)
- 채널 재지정 및 채널 배열
- 함수에서 고정 길이 배열을 반환하는 기능
변경 사항에 대한 전체 목록은 [http://www.wotug.org/occam/documentation/oc21refman.pdf 인모스 occam영어 2.1 참조 매뉴얼]의 부록 P에서 확인할 수 있다.
3. 4. Occam 3 (Occam91)
Occam 3는 INMOS의 프로그래머들이 만든 차세대 Occam 언어 사양이다. 이 사양은 커뮤니티의 의견을 얻기 위해 배포되었다.[1] 주요 변경 사항은 코드 공유, 동시 개발, 코드 재사용에 초점을 맞추었다.[1]http://www.wotug.org/occam/documentation/oc3refman.pdf Occam 3에서 영어 사양을 확인할 수 있지만, 이 사양에 따라 실제로 작동하는 컴파일러는 제작되지 않았다.[1] 이는 주로 INMOS 자체와 INMOS를 인수한 회사의 문제 때문이었다.[1]
다른 팀들이 Occam 3의 몇 가지 요소를 Occam 2.1 컴파일러에 도입하여 Occam 2.5라고 불리는 중간 버전을 만들었다.[1]
3. 5. Occam-π (Occam 2.5)
KRoC에 구현된 Occam-π는 π-계산법에서 영감을 얻은 여러 아이디어를 포함하고 있다.[6] Occam-π는 기존 occam 2.1 컴파일러에 다음과 같은 몇 가지 중요한 확장을 제공한다.- 중첩 프로토콜
- 런타임 프로세스 생성
- 이동 채널, 데이터 및 프로세스
- 재귀
- 프로토콜 상속
- 배열 생성자
- 확장된 만남
KRoC 팀은 컴파일러를 개발하여 웹사이트에 공개했다. π 계산을 사용함에 따라, 최근 팀은 컴파일러의 명칭을 Occam-π로 변경했다.
참조
[1]
서적
occam 2.1 Reference Manual
http://www.wotug.org[...]
SGS-Thomson Microelectronics Ltd
1995-05-12
[2]
서적
occam Programming Manual
Prentice-Hall
[3]
서적
occam 2 Reference Manual
Prentice-Hall
[4]
간행물
Occam on Field-Programmable Gate Arrays
https://books.google[...]
IOS Press
2016-11-28
[5]
논문
occam 3 Reference Manual
http://www.wotug.org[...]
Inmos
2008-03-24
[6]
웹사이트
occam-pi: Blending the best of CSP and the pi-calculus
http://www.cs.kent.a[...]
2006-11-24
[7]
서적
occam 2.1 Reference Manual
http://www.wotug.org[...]
SGS-THOMSON Microelectronics Ltd
1995-05-12
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com