맨위로가기

Occam

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의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