맨위로가기

오베론 (프로그래밍 언어)

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

1. 개요

오베론은 "단순함을 유지하되, 더 단순하게 만들지 말라"는 철학을 바탕으로 설계된 프로그래밍 언어이다. C++, 에이다와 같은 언어의 복잡성을 피하고 라이브러리 사용을 강조하며, 모듈 간 엄격한 타입 검사, 런타임 시 인덱스 및 널 포인터 검사를 통해 안정성을 높였다. 오베론은 배우기 쉽고 효율적인 언어를 목표로 하며, 객체 지향 프로그래밍을 지원하기 위해 레코드 타입의 확장을 활용한다. 오베론-2, 오베론-07, 액티브 오베론 등 다양한 변형이 존재하며, 컴포넌트 파스칼, 존논, 오베론-V 등의 관련 언어들도 개발되었다.

더 읽어볼만한 페이지

  • 1986년 개발된 프로그래밍 언어 - 오브젝티브-C
    오브젝티브-C는 C 언어를 기반으로 스몰토크의 객체 지향 기능을 결합하여 개발된 프로그래밍 언어이며, 애플의 macOS와 iOS 개발 환경에서 핵심 언어로 사용되었다.
  • 1986년 개발된 프로그래밍 언어 - 얼랭
    얼랭은 통신 애플리케이션 개발을 위해 설계된 함수형 프로그래밍 언어로, 동시성 및 분산 처리 지원이 강력하며 오류에 강한 시스템 구축에 유용하여 다양한 분야에서 활용되고 있다.
  • 시스템 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
  • 정적 타입 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 정적 타입 프로그래밍 언어 - 핵 (프로그래밍 언어)
    Hack은 페이스북에서 개발한 프로그래밍 언어이며, PHP와 상호 운용되도록 설계되었고, 정적 타이핑을 도입하여 타입 힌트를 확장하며 PHP 7에도 영향을 미쳤다.
오베론 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
기본 정보
오베론 프로그래밍 언어 로고
오베론 프로그래밍 언어 로고
패러다임명령형 프로그래밍
구조적 프로그래밍
모듈성
객체 지향 프로그래밍
계열니클라우스 비르트 오베론
설계자니클라우스 비르트
개발자취리히 연방 공과대학교
발표 연도1987년
최신 릴리스 버전오베론-07
최신 릴리스 날짜2020년 3월 6일
타이핑강한 타이핑, 하이브리드 (정적 타이핑 및 동적 타이핑)
스코프어휘적
플랫폼ARM, StrongARM
IA-32, x86-64
SPARC, Ceres (NS32032)
운영 체제윈도우
리눅스
솔라리스
classic Mac OS
Atari TOS
AmigaOS
웹사이트프로젝트 오베론 공식 웹사이트
영향 관계
영향을 받은 언어Modula-2
영향을 준 언어Oberon-2
Oberon-07
Active Oberon
Component Pascal
Zonnon
Go
V (Vlang)
Nim
오베론-2 관련 정보
등장 시기1991년
설계자니클라우스 비르트
형식강한 정적 타이핑
영향을 받은 언어Oberon
Modula-2
Object Oberon
영향을 준 언어Oberon-07
Zonnon
Active Oberon
Component Pascal
Go
Nim
플랫폼윈도우
리눅스
솔라리스
MacOS

2. 설계

알베르트 아인슈타인의 "가능한 한 단순하게 만들되, 더 단순하게 만들지는 말라"라는 좌우명을 염두에 두고 설계되었다. 주요 지침은 기본적이고 필수적인 기능에 집중하고 일시적인 문제는 생략하는 것이었다. 또 다른 요인은 C++, 에이다와 같은 언어의 복잡성 증가를 인식한 것이었다. 이와 대조적으로 오베론은 언어를 확장하기 위해 라이브러리 개념의 사용을 강조한다. 모듈라-2에 있던 열거형 및 서브레인지 유형은 생략되었으며, 집합 유형은 정수 집합으로 제한된다. 모든 가져온 항목은 선언된 모듈의 이름으로 한정해야 한다. 낮은 수준의 기능은 식별자 SYSTEM을 import 목록에 포함하는 모듈에서만 사용할 수 있도록 허용함으로써 강조된다. 모듈 간에도 엄격한 타입 검사, 런타임 시의 인덱스 검사, 널 포인터 검사, 안전한 타입 확장 개념은 프로그래밍이 언어 규칙에만 의존할 수 있도록 한다.

이러한 전략의 의도는 배우기 쉽고, 구현이 간단하며, 매우 효율적인 언어를 만드는 것이었다. 오베론 컴파일러는 상업용 컴파일러에 필적하는 코드 품질을 제공하면서 작고 빠르다고 평가받았다.[8]

3. 특징

오베론은 "가능한 한 단순하게 만들되, 더 단순하게 만들지는 말라"라는 알베르트 아인슈타인의 좌우명을 염두에 두고 설계되었다. 주요 지침은 기본적이고 필수적인 기능에 집중하고 일시적인 문제는 생략하는 것이었다. 또 다른 요인은 C++, 에이다와 같은 언어의 복잡성 증가를 인식한 것이었다. 이와 대조적으로 오베론은 언어를 확장하기 위해 라이브러리 개념의 사용을 강조한다.[8]

오베론 언어의 특징은 다음과 같다:[9]


  • 대소문자를 구분하며, 키워드는 대문자를 사용한다.
  • 타입 테스트를 통한 타입 확장
  • 모듈과 개별 컴파일
  • 문자열 연산
  • 안전하지 않은 코드 격리
  • 시스템 프로그래밍 지원

4. 객체 지향

오베론은 레코드 타입 확장을 통해 추상화와 이질적인 구조 구축을 지원한다. 초기 오베론은 언어 자체에 동적 디스패치 메커니즘이 없었지만, 메서드 스위트(Method suite)와 메시지 처리기(Message handler) 같은 프로그래밍 기법을 통해 객체 지향 프로그래밍의 유연성을 제공한다.[1]

4. 1. 메서드 스위트

오베론은 레코드 유형의 확장을 지원하여 추상화 및 이질적인 구조를 구축할 수 있도록 한다. 후기 버전인 오베론-2 및 액티브 오베론과 달리, 오리지널 오베론은 언어 기능으로 디스패치 메커니즘을 제공하지 않지만, 프로그래밍 기법(또는 설계 패턴)을 통해 이를 구현할 수 있다. 이는 객체 지향 프로그래밍(OOP)에서 큰 유연성을 제공한다. 오베론 운영 체제에서는 메서드 스위트와 메시지 처리기라는 두 가지 프로그래밍 기법이 함께 사용된다.

메서드 스위트는 프로시저 변수의 테이블을 정의하고, 이 유형의 전역 변수를 확장 모듈에서 선언한 후 일반 모듈에 다시 할당하는 방식이다.

```

MODULE Figures; (* 추상 모듈 *)

TYPE

Figure* = POINTER TO FigureDesc;

Interface* = POINTER TO InterfaceDesc;

InterfaceDesc* = RECORD

draw* : PROCEDURE (f : Figure);

clear* : PROCEDURE (f : Figure);

mark* : PROCEDURE (f : Figure);

move* : PROCEDURE (f : Figure; dx, dy : INTEGER);

END;

FigureDesc* = RECORD

if : Interface;

END;

PROCEDURE Init* (f : Figure; if : Interface);

BEGIN

f.if := if

END Init;

PROCEDURE Draw* (f : Figure);

BEGIN

f.if.draw(f)

END Draw;

(* 여기에 다른 프로시저 *)

END Figures.

```

일반 타입 Figure를 특정 모양으로 확장하는 예시는 다음과 같다.

```

MODULE Rectangles;

IMPORT Figures;

TYPE

Rectangle* = POINTER TO RectangleDesc;

RectangleDesc* = RECORD

(Figures.FigureDesc)

x, y, w, h : INTEGER;

END;

VAR

if : Figures.Interface;

PROCEDURE New* (VAR r : Rectangle);

BEGIN

NEW(r);

Figures.Init(r, if)

END New;

PROCEDURE Draw* (f : Figure);

VAR

r : Rectangle;

BEGIN

r := f(Rectangle); (* f AS Rectangle *)

(* ... *)

END Draw;

(* 여기에 다른 프로시저 *)

BEGIN (* 모듈 초기화 *)

NEW(if);

if.draw := Draw;

if.clear := Clear;

if.mark := Mark;

if.move := Move

END Rectangles.

```

동적 디스패치는 일반 모듈인 Figures 모듈의 프로시저를 통해서만 수행된다.

4. 2. 메시지 처리기

오베론은 레코드 유형의 확장을 통해 추상화와 이질적인 구조를 구축할 수 있도록 지원한다. 초기 오베론은 언어 기능으로 동적 디스패치 메커니즘이 부족했지만, 프로그래밍 기법(설계 패턴)으로 이를 구현했다. 오베론 운영 체제에서는 동적 디스패치를 위해 메서드 스위트와 메시지 처리기라는 두 가지 기법이 함께 사용된다.

메시지 처리기는 메서드 집합을 여러 메서드를 구별하는 단일 프로시저로 대체한다. 다음은 메시지 처리기의 예시이다.

```

MODULE 도형; (* 추상 모듈 *)

TYPE

도형* = POINTER TO 도형설명;

메시지* = RECORD END;

그리기메시지* = RECORD (메시지) END;

지우기메시지* = RECORD (메시지) END;

표시메시지* = RECORD (메시지) END;

이동메시지* = RECORD (메시지) dx*, dy* : INTEGER END;

처리자* = PROCEDURE (f : 도형; VAR msg : 메시지);

도형설명* = RECORD

(* 추상 *)

handle : 처리자;

END;

PROCEDURE 처리* (f : 도형; VAR msg : 메시지);

BEGIN

f.handle(f, msg)

END 처리;

PROCEDURE 초기화* (f : 도형; handle : 처리자);

BEGIN

f.handle := handle

END 초기화;

END 도형.

```

일반적인 유형의 도형을 특정 모양으로 확장하는 예시는 다음과 같다.

```

MODULE 사각형;

IMPORT 도형;

TYPE

사각형* = POINTER TO 사각형설명;

사각형설명* = RECORD

(도형.도형설명)

x, y, w, h : INTEGER;

END;

PROCEDURE 그리기* (r : 사각형);

BEGIN

(* ... *)

END 그리기;

(* 여기에 다른 프로시저 *)

PROCEDURE 처리* (f: 도형; VAR msg: 도형.메시지);

VAR

r : 사각형;

BEGIN

r := f(사각형);

IF msg IS 도형.그리기메시지 THEN 그리기(r)

ELSIF msg IS 도형.표시메시지 THEN 표시(r)

ELSIF msg IS 도형.이동메시지 THEN 이동(r, msg(도형.이동메시지).dx, msg(도형.이동메시지).dy)

ELSE (* 무시 *)

END

END 처리;

PROCEDURE 새것* (VAR r : 사각형);

BEGIN

NEW(r);

도형.초기화(r, 처리)

END 새것;

END 사각형.

```

오베론 운영 체제에서는 알려진 메서드 집합에는 첫 번째 기법(메서드 스위트)을, 확장 모듈에 선언된 모든 새 메서드에는 두 번째 기법(메시지 처리기)을 사용하여 동적 디스패치를 구현한다. 예를 들어, 확장 모듈 `사각형`이 새로운 `회전()` 프로시저를 구현하는 경우, `도형` 모듈 내에서 메시지 처리자를 통해서만 호출할 수 있다.[1]

5. 구현 및 변형

오베론은 배우기 쉽고, 구현이 간단하며, 매우 효율적인 언어를 목표로 설계되었다. 오베론 컴파일러는 작고 빠르면서도 상업용 컴파일러에 필적하는 코드 품질을 제공하는 것으로 평가받았다.[8]
오베론-2오베론의 최초 명세에는 몇 가지 변경 사항이 있었다. 예를 들어, 객체 지향 프로그래밍(OOP) 기능이 추가되었고, `FOR` 루프가 부활했다. 그 결과물이 오베론-2이다. IBM PC 호환급 하드웨어에서 직접 부팅할 수 있는 운영체제를 포함하는 네이티브 오베론이라는 릴리스가 있다. 또한 취리히 연방 공과대학교(ETHZ)에서 약간의 .NET 관련 확장이 추가된 오베론의 .NET 구현도 개발되었다. 1993년, ETHZ의 대학 스핀오프 회사가 오베론-L이라는 오베론-2 방언을 시장에 내놓았고, 1997년에 컴포넌트 파스칼로 이름이 변경되었다.

ETH에서 개발한 오베론-2 컴파일러는 마이크로소프트 윈도우, 리눅스, 솔라리스, 클래식 Mac OS용 버전을 포함한다. Atari TOS 및 AmigaOS를 포함한 다른 운영 체제에 대한 다른 소스에서 제공되는 구현이 존재한다.

영국 맨체스터 대학교의 스티븐 J. 베반이 제작한 오베론-2 렉스 스캐너와 Yacc 파서가 있으며, 이는 뫼센뵈크와 비르트의 레퍼런스를 기반으로 한다. 버전은 1.4이다.

오베론-2에서 추가되거나 변경된 주요 기능은 다음과 같다.


  • 프로시저를 레코드형(혹은 포인터형)에 바인딩할 수 있다. 객체 지향적 용어로 인스턴스 메서드와 같다.
  • 익스포트된 변수나 레코드의 필드에 대해 참조만 접근을 제한할 수 있다.
  • Oberon에서는 정식 파라미터형으로만 선언 가능했지만, Oberon-2에서는 포인터 기반의 형으로 선언할 수 있다.
  • Pascal이나 Modula-2에 있던 FOR 문은 Oberon에서는 구현되지 않았지만 Oberon-2에서 부활했다.


오베론-2 구현에는 다음이 포함된다.

  • 취리히 연방 공과대학교에서는 Windows, Linux, Solaris, Mac OS X용 Oberon-2 컴파일러를 구현 및 유지보수하고 있다.
  • 맨체스터 대학교의 스티븐 J. 베반(Stephen J. Bevan)이 개발한 Oberon-2를 지원하는 Lex(를 사용한) 어휘 분석기와 Yacc(를 사용한) 구문 분석기가 있다. 현재 버전은 1.4이다.
  • [https://www.fim.uni-linz.ac.at/pow/Pow.htm Programmer's Open Workbench](POW!)는 에디터, 링커, Oneron-2 컴파일러를 갖춘 단순한 통합 개발 환경이다. Windows 상에서 실행 파일을 생성한다. 전체 소스 코드도 제공되며, 컴파일러 자체가 Oberon-2로 작성되었다.
  • [http://www.uni-vologda.ac.ru/JOB/ Java to Oberon Compiler](JOB)는 러시아 볼로다 대학교(University of Vologda)에서 개발한 Oberon-2 컴파일러이다. 생성하는 코드는 Java 클래스 파일(바이트코드)이다. Java 호환 전용 클래스가 제공되지만, 전체적인 계층 구조는 Oberon의 것이다.
  • [http://sourceforge.net/projects/ooc Optimizing Oberon-2 Compiler]는 일단 C로 변환한 후, gcc를 사용하여 객체를 생성한다.

오베론-07오베론-07은 2007년 니클라우스 비르트에 의해 정의되었으며, 2008년, 2011년, 2013년, 2014년, 2015년, 2016년에 걸쳐 개정되었다.[13] 오리지널 오베론을 기반으로 하며, 오베론-2의 일부 기능이 제거되거나 변경되었다. 주요 변경 사항은 다음과 같다:[13]

  • 명시적인 숫자 변환 함수(`FLOOR`, `FLT` 등)를 사용해야 한다.
  • `WITH`, `LOOP`, `EXIT` 구문이 생략되었다.
  • `WHILE` 구문이 확장되었다.
  • `CASE` 구문에서 타입 확장 테스트를 할 수 있다.
  • `RETURN` 구문은 함수 끝에만 연결될 수 있다.
  • 가져온 변수와 구조화된 값 매개변수는 읽기 전용이다.
  • `COPY` 없이 배열 할당이 가능하다.


오베론-07 컴파일러는 여러 컴퓨터 시스템에서 사용하도록 개발되었다. 비르트의 컴파일러는 Xilinx 필드 프로그래머블 게이트 어레이(FPGA) Spartan-3 보드에서 프로젝트 오베론 운영 체제의 2013년 버전을 구현하는 데 사용된 자체 설계 축소 명령어 집합 컴퓨터(RISC) 프로세서를 대상으로 한다. FPGA Spartan-6, Spartan-7, Artix-7에 대한 RISC 프로세서 포트와 Windows용 RISC 에뮬레이터(Linux 및 macOS에서 컴파일 가능하며 Windows용 바이너리 사용 가능)도 존재한다. [https://miasap.se/obnc/ OBNC]는 C를 통해 컴파일되며 POSIX 호환 운영 체제에서 사용할 수 있다. 상용 [http://www.astrobe.com Astrobe] 구현은 32비트 ARM Cortex-M3, M4 및 M7 마이크로컨트롤러를 대상으로 한다. [https://github.com/congdm/Patchouli-Compiler Patchouli] 컴파일러는 64비트 Windows 바이너리를 생성한다. [http://www.exaprog.com/ Oberon-07M]은 32비트 Windows 바이너리를 생성하고 언어의 2008년 개정을 구현한다. [https://sites.google.com/site/oberon07compiler/versii Akron's]는 Windows와 Linux 모두에 대한 바이너리를 생성한다. [http://oberspace.org/oberonjs.html OberonJS]는 오베론을 자바스크립트로 변환한다. [https://visual.sfu-kras.ru online IDE for Oberon] 온라인 오베론 IDE가 있다. [https://github.com/lboasso/oberonc oberonc]는 자바 가상 머신을 위한 구현체이다.
액티브 오베론 (Active Oberon)액티브 오베론은 객체(객체 중심의 접근 보호 및 로컬 활동 제어 포함), 시스템 보호 어서션, 선점형 우선 순위 스케줄링, 메서드에 대한 변경된 구문(타입 바운드 프로시저)을 추가한 오베론의 또 다른 변종이다.[14] 객체는 액티브할 수 있으며, 이는 스레드 또는 프로세스가 될 수 있음을 의미한다. 또한, 액티브 오베론은 연산자 오버로딩, 배열 사용을 위한 고급 구문([http://www.ethoberon.ethz.ch/native/compiler/x.index.html 오베론X 언어 확장] 참조)과 네임스페이스를 인식한다.[15] A2(구 ''액티브 객체 시스템''(AOS),[16] 이후 ''블루보틀'') 운영 체제의 커널은 서로 다른 액티브 객체를 동기화하고 조정한다.

ETHZ는 액티브 객체를 지원하는 액티브 오베론과 이를 기반으로 하는 운영 체제(AOS, 블루보틀, A2) 및 언어용 환경(JDK, HTTP, FTP 등)을 출시했다. 2003년 기준으로 지원되는 중앙 처리 장치(CPU)에는 싱글 및 듀얼 코어 x86, 그리고 StrongARM이 포함된다.
관련 언어컴포넌트 파스칼(CP)은 오베론-2의 확장판으로, 원래 오베론/L로 불렸다. ETH 취리히의 스핀오프 기업인 오베론 마이크로시스템즈가 윈도우 및 클래식 Mac OS 버전을, 퀸즐랜드 공과대학교가 .NET 버전을 개발하였다.[17][18][19] 오블릭과 Lagoona는[17][18][19] 오베론의 방식을 특정 분야에 적용한 언어이다.

존논은 ETH 취리히의 .NET 개발 노력으로 탄생한 언어이다. 오베론의 기능을 포함하고, 파스칼의 일부 기능(열거형, 내장 IO)을 복원했지만, 구문 차이가 있다. 액티브 객체, 연산자 오버로딩, 예외 처리 등의 기능이 추가되었다.

오베론-V (원래 세네카에서 이름을 따서 세네카)는 슈퍼컴퓨터, 특히 벡터 또는 파이프라인 아키텍처에서 수치 응용 프로그램을 위해 설계된 오베론의 후손이다. 배열 생성자와 `ALL` 문을 포함한다.[20]

5. 1. 오베론

오베론은 "가능한 한 단순하게 만들되, 더 단순하게 만들지는 말라"라는 알베르트 아인슈타인의 좌우명을 염두에 두고 설계되었다. 주요 지침은 기본적이고 필수적인 기능에 집중하고 일시적인 문제는 생략하는 것이었다. 또 다른 요인은 C++, 에이다와 같은 언어의 복잡성 증가를 인식한 것이었다. 이와 대조적으로 오베론은 언어를 확장하기 위해 라이브러리 개념의 사용을 강조한다. 모듈라-2에 있던 열거형 및 서브레인지 유형은 생략되었으며, 집합 유형은 정수 집합으로 제한된다. 모든 가져온 항목은 선언된 모듈의 이름으로 한정해야 한다. 낮은 수준의 기능은 식별자 SYSTEM을 import 목록에 포함하는 모듈에서만 사용할 수 있도록 허용함으로써 강조된다. 모듈 간에도 엄격한 타입 검사, 런타임 시의 인덱스 검사, 널 포인터 검사, 안전한 타입 확장 개념은 프로그래밍이 언어 규칙에만 의존할 수 있도록 한다.

이러한 전략의 의도는 배우기 쉽고, 구현이 간단하며, 매우 효율적인 언어를 만드는 것이었다. 오베론 컴파일러는 상업용 컴파일러에 필적하는 코드 품질을 제공하면서 작고 빠르다고 평가받았다.[8] 오베론(프로그래밍 언어)과 오베론(운영 체제)의 무상 구현은 인터넷에서 찾을 수 있다(몇몇은 ETHZ 자체에서 제공한다).

5. 2. 오베론-2

최초로 공개된 명세에는 몇 가지 변경 사항이 있었다. 예를 들어, 객체 지향 프로그래밍(OOP) 기능이 추가되었고, `FOR` 루프가 부활했다. 그 결과가 ''오베론-2''이다. IBM PC 호환급 하드웨어에서 직접 부팅할 수 있는 운영체제를 포함하는 ''네이티브 오베론(Native Oberon)''이라는 릴리스가 있다. 또한 취리히 연방 공과대학교(ETHZ)에서 약간의 .NET 관련 확장이 추가된 오베론의 .NET 구현도 개발되었다. 1993년, ETHZ의 대학 스핀오프 회사가 ''오베론-L''이라는 오베론-2 방언을 시장에 내놓았다. 1997년, 이 이름은 ''컴포넌트 파스칼''로 변경되었다.

ETH에서 개발한 오베론-2 컴파일러는 마이크로소프트 윈도우, 리눅스, 솔라리스, 클래식 Mac OS용 버전을 포함한다. Atari TOS 및 AmigaOS를 포함한 다른 운영 체제에 대한 다른 소스에서 제공되는 구현이 존재한다.

영국 맨체스터 대학교의 스티븐 J. 베반이 제작한 오베론-2 렉스 스캐너와 Yacc 파서가 있으며, 이는 뫼센뵈크와 비르트의 레퍼런스를 기반으로 한다. 버전은 1.4이다.

; 타입 바인딩 프로시저

: 프로시저는 레코드형(혹은 포인터형)에 바인딩할 수 있다. 객체 지향적 용어로 말하면, 인스턴스 메서드와 등가이다.

; 읽기 전용 익스포트

: 익스포트된 변수나 레코드의 필드에 대해 참조만 접근을 제한할 수도 있다. 이것은 visibility flag에 "-"를 부여함으로써 나타낸다.

; 열린 배열

: Oberon에서는 정식 파라미터형으로만 선언 가능했지만, Oberon-2에서는 포인터 기반의 형으로 선언할 수 있다.

; FOR 문

: Pascal이나 Modula-2에 있던 FOR 문은 Oberon에서는 구현되지 않았다. 그것이 Oberon-2에서 부활했다.

  • 취리히 연방 공과대학교에서는 Windows, Linux, Solaris, Mac OS X용 Oberon-2 컴파일러를 구현 및 유지보수하고 있다.
  • 맨체스터 대학교의 스티븐 J. 베반(Stephen J. Bevan)이 개발한 Oberon-2를 지원하는 Lex(를 사용한) 어휘 분석기와 Yacc(를 사용한) 구문 분석기가 있다. 현재 버전은 1.4이다.
  • Programmer's Open Workbench(POW!)는 에디터, 링커, Oneron-2 컴파일러를 갖춘 단순한 통합 개발 환경이다. Windows 상에서 실행 파일을 생성한다. 전체 소스 코드도 제공되며, 컴파일러 자체가 Oberon-2로 작성되었다.
  • Java to Oberon Compiler(JOB)는 러시아 볼로다 대학교(University of Vologda)에서 개발한 Oberon-2 컴파일러이다. 생성하는 코드는 Java 클래스 파일(바이트코드)이다. Java 호환 전용 클래스가 제공되지만, 전체적인 계층 구조는 Oberon의 것이다.
  • Optimizing Oberon-2 Compiler는 일단 C로 변환한 후, gcc를 사용하여 객체를 생성한다.

5. 3. 오베론-07

오베론-07은 2007년 니클라우스 비르트에 의해 정의되었으며, 2008년, 2011년, 2013년, 2014년, 2015년, 2016년에 걸쳐 개정되었다.[13] 오리지널 오베론을 기반으로 하며, 오베론-2의 일부 기능이 제거되거나 변경되었다. 주요 변경 사항은 다음과 같다:[13]

  • 명시적인 숫자 변환 함수(`FLOOR`, `FLT` 등)를 사용해야 한다.
  • `WITH`, `LOOP`, `EXIT` 구문이 생략되었다.
  • `WHILE` 구문이 확장되었다.
  • `CASE` 구문에서 타입 확장 테스트를 할 수 있다.
  • `RETURN` 구문은 함수 끝에만 연결될 수 있다.
  • 가져온 변수와 구조화된 값 매개변수는 읽기 전용이다.
  • `COPY` 없이 배열 할당이 가능하다.


오베론-07 컴파일러는 여러 컴퓨터 시스템에서 사용하도록 개발되었다. 비르트의 컴파일러는 Xilinx 필드 프로그래머블 게이트 어레이(FPGA) Spartan-3 보드에서 프로젝트 오베론 운영 체제의 2013년 버전을 구현하는 데 사용된 자체 설계 축소 명령어 집합 컴퓨터(RISC) 프로세서를 대상으로 한다. FPGA Spartan-6, Spartan-7, Artix-7에 대한 RISC 프로세서 포트와 Windows용 RISC 에뮬레이터(Linux 및 macOS에서 컴파일 가능하며 Windows용 바이너리 사용 가능)도 존재한다. [https://miasap.se/obnc/ OBNC]는 C를 통해 컴파일되며 POSIX 호환 운영 체제에서 사용할 수 있다. 상용 [http://www.astrobe.com Astrobe] 구현은 32비트 ARM Cortex-M3, M4 및 M7 마이크로컨트롤러를 대상으로 한다. [https://github.com/congdm/Patchouli-Compiler Patchouli] 컴파일러는 64비트 Windows 바이너리를 생성한다. [http://www.exaprog.com/ Oberon-07M]은 32비트 Windows 바이너리를 생성하고 언어의 2008년 개정을 구현한다. [https://sites.google.com/site/oberon07compiler/versii Akron's]는 Windows와 Linux 모두에 대한 바이너리를 생성한다. [http://oberspace.org/oberonjs.html OberonJS]는 오베론을 자바스크립트로 변환한다. [https://visual.sfu-kras.ru online IDE for Oberon] 온라인 오베론 IDE가 있다. [https://github.com/lboasso/oberonc oberonc]는 자바 가상 머신을 위한 구현체이다.

5. 4. 액티브 오베론 (Active Oberon)

액티브 오베론은 객체(객체 중심의 접근 보호 및 로컬 활동 제어 포함), 시스템 보호 어서션, 선점형 우선 순위 스케줄링, 메서드에 대한 변경된 구문(타입 바운드 프로시저)을 추가한 오베론의 또 다른 변종이다.[14] 객체는 액티브할 수 있으며, 이는 스레드 또는 프로세스가 될 수 있음을 의미한다. 또한, 액티브 오베론은 연산자 오버로딩, 배열 사용을 위한 고급 구문([http://www.ethoberon.ethz.ch/native/compiler/x.index.html 오베론X 언어 확장] 참조)과 네임스페이스를 인식한다.[15] A2(구 ''액티브 객체 시스템''(AOS),[16] 이후 ''블루보틀'') 운영 체제의 커널은 서로 다른 액티브 객체를 동기화하고 조정한다.

ETHZ는 액티브 객체를 지원하는 액티브 오베론과 이를 기반으로 하는 운영 체제(AOS, 블루보틀, A2) 및 언어용 환경(JDK, HTTP, FTP 등)을 출시했다. 2003년 기준으로 지원되는 중앙 처리 장치(CPU)에는 싱글 및 듀얼 코어 x86, 그리고 StrongARM이 포함된다.

5. 5. 관련 언어

컴포넌트 파스칼(CP)은 오베론-2의 확장판으로, 원래 오베론/L로 불렸다. ETH 취리히의 스핀오프 기업인 오베론 마이크로시스템즈가 윈도우 및 클래식 Mac OS 버전을, 퀸즐랜드 공과대학교가 .NET 버전을 개발하였다.[17][18][19] 오블릭과 Lagoona는[17][18][19] 오베론의 방식을 특정 분야에 적용한 언어이다.

존논은 ETH 취리히의 .NET 개발 노력으로 탄생한 언어이다. 오베론의 기능을 포함하고, 파스칼의 일부 기능(열거형, 내장 IO)을 복원했지만, 구문 차이가 있다. 액티브 객체, 연산자 오버로딩, 예외 처리 등의 기능이 추가되었다.

오베론-V (원래 세네카에서 이름을 따서 세네카)는 슈퍼컴퓨터, 특히 벡터 또는 파이프라인 아키텍처에서 수치 응용 프로그램을 위해 설계된 오베론의 후손이다. 배열 생성자와 `ALL` 문을 포함한다.[20]

6. 문법 (오베론-2)

ALGOL - 파스칼 - Modula-2 - 오베론 - Component Pascal 계열의 언어는 문법을 단순화해왔다고 할 수 있다. 오베론-2는 EBNF를 사용하여 아래와 같이 33개의 구문 생성 규칙으로 나타낼 수 있다.[1]

```ebnf

Module = MODULE ident ";" [ImportList] DeclSeq [BEGIN StatementSeq] END ident ".".

ImportList = IMPORT [ident ":="] ident {"," [ident ":="] ident} ";".

DeclSeq = { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}} {ProcDecl ";" | ForwardDecl ";"}.

ConstDecl = IdentDef "=" ConstExpr.

TypeDecl = IdentDef "=" Type.

VarDecl = IdentList ":" Type.

ProcDecl = PROCEDURE [Receiver] IdentDef [FormalPars] ";" DeclSeq [BEGIN StatementSeq] END ident.

ForwardDecl = PROCEDURE "^" [Receiver] IdentDef [FormalPars].

FormalPars = "(" [FPSection {";" FPSection}] ")" [":" Qualident].

FPSection = [VAR] ident {"," ident} ":" Type.

Receiver = "(" [VAR] ident ":" ident ")".

Type = Qualident

| ARRAY [ConstExpr {"," ConstExpr}] OF Type

| RECORD ["("Qualident")"] FieldList {";" FieldList} END

| POINTER TO Type

| PROCEDURE [FormalPars].

FieldList = [IdentList ":" Type].

StatementSeq = Statement {";" Statement}.

Statement = [ Designator ":=" Expr

| Designator ["(" [ExprList] ")"]

| IF Expr THEN StatementSeq {ELSIF Expr THEN StatementSeq} [ELSE StatementSeq] END

| CASE Expr OF Case {"|" Case} [ELSE StatementSeq] END

| WHILE Expr DO StatementSeq END

| REPEAT StatementSeq UNTIL Expr

| FOR ident ":=" Expr TO Expr [BY ConstExpr] DO StatementSeq END

| LOOP StatementSeq END

| WITH Guard DO StatementSeq {"|" Guard DO StatementSeq} [ELSE StatementSeq] END

| EXIT

| RETURN [Expr]

].

Case = [CaseLabels {"," CaseLabels} ":" StatementSeq].

CaseLabels = ConstExpr [".." ConstExpr].

Guard = Qualident ":" Qualident.

ConstExpr = Expr.

Expr = SimpleExpr [Relation SimpleExpr].

SimpleExpr = ["+" | "-"] Term {AddOp Term}.

Term = Factor {MulOp Factor}.

Factor = Designator ["(" [ExprList] ")"] | number | character | string | NIL | Set | "(" Expr ")" | " ~ " Factor.

Set = "{" [Element {"," Element}] "}".

Element = Expr [".." Expr].

Relation = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.

AddOp = "+" | "-" | OR.

MulOp = " * " | "/" | DIV | MOD | "&".

Designator = Qualident {"." ident | "[" ExprList "]" | " ^ " | "(" Qualident ")"}.

ExprList = Expr {"," Expr}.

IdentList = IdentDef {"," IdentDef}.

Qualident = [ident "."] ident.

IdentDef = ident [" * " | "-"].

7. 코드 예시 (오베론-2)

다음은 오베론-2로 작성된 간단한 리스트 클래스를 구현한 코드이다.

```oberon2

MODULE ListClass;

TYPE List* = POINTER TO ListNode;

ListNode = RECORD

value : INTEGER;

next : List;

END;

PROCEDURE ( l : List ) Add* ( v : INTEGER );

BEGIN

(* ... *)

END Add;

PROCEDURE ( l : List ) AddLast*( v : INTEGER );

BEGIN

(* ... *)

END AddLast;

PROCEDURE ( l : List ) AddAt* ( i : INTEGER; v : INTEGER );

BEGIN

(* ... *)

END AddAt;

PROCEDURE ( l : List ) Remove*;

BEGIN

(* ... *)

END Remove;

PROCEDURE ( l : List ) RemoveLast*;

BEGIN

(* ... *)

END RemoveLast;

PROCEDURE ( l : List ) RemoveAt* ( i : INTEGER );

BEGIN

(* ... *)

END RemoveAt;

END ListClass.

8. 실행 시 타입 검사 (오베론-2)

오베론-2는 객체의 타입에 대해 런타임(실행 시)에 동적 검사를 수행하는 여러 기능을 갖추고 있다. 예를 들어, `Bird` 객체의 인스턴스로 `Duck`과 `Cuckoo`가 있을 때, 오베론-2에서는 런타임에 객체의 실제 타입에 따라 처리가 가능하다.

타입 검사 방법에는 "타입 바인딩 시스템"을 사용하는 전통적인 방법, `WITH` 문을 사용하는 방법, 그리고 `IS` 연산자를 사용하는 방법이 있다.

`WITH` 문을 사용하면 변수의 동적인 파생 타입을 직접 검사할 수 있다. 타입 바인딩 시스템이나 `WITH` 문을 사용하면 파생 타입을 특정하여 해당 파생 타입에 적절한 타입 바인딩 프로시저나 타입 바인딩 변수를 사용할 수 있다.

오베론-2의 `WITH` 문은 파스칼(Pascal) 또는 모듈라-2(Modula-2)의 `WITH` 문과는 관련이 없다.
타입 바인딩 예시```oberon2

MODULE Birds;

TYPE Bird* = RECORD

sound* : ARRAY 10 OF CHAR;

END;

END Birds.

(*-------------------------------------*)

MODULE Ducks;

IMPORT Birds;

TYPE Duck* = RECORD(Birds.Bird) END;

PROCEDURE makeSound*( VAR bird: Duck );

BEGIN COPY("Quack!", bird.sound); END makeSound;

END Ducks.

(*-------------------------------------*)

MODULE Cuckoos;

IMPORT Birds;

TYPE Cuckoo* = RECORD(Birds.Bird) END;

PROCEDURE makeSound*( VAR bird: Cuckoo );

BEGIN COPY("Cuckoo!", bird.sound); END makeSound;

END Cuckoos.

```
`WITH` 문 예시```oberon2

MODULE Test;

IMPORT Out, Birds, Cuckoos, Ducks;

TYPE SomeBird* = RECORD ( Birds.Bird ) END;

VAR sb : SomeBird;

VAR c : Cuckoos.Cuckoo;

VAR d : Ducks.Duck;

PROCEDURE setSound*( VAR bird : Birds.Bird );

BEGIN

WITH bird : Cuckoos.Cuckoo DO

bird.sound := "Cuckoo!";

| bird : Ducks.Duck DO

bird.sound := "Quack!";

ELSE

bird.sound := "Tweet!";

END;

END setSound;

PROCEDURE MakeSound* ( VAR b : Birds.Bird );

BEGIN

Out.Ln;

Out.String( b.sound );

Out.Ln;

END MakeSound;

BEGIN

setSound(c);

setSound(d);

setSound(sb);

MakeSound(c);

MakeSound(d);

MakeSound(sb);

END Test.

```
`POINTER` 예시```oberon2

MODULE PointerBirds;

IMPORT Out;

TYPE BirdRec* = RECORD sound* : ARRAY 10 OF CHAR; END;

DuckRec* = RECORD(BirdRec) END;

CuckooRec* = RECORD(BirdRec) END;

TYPE Bird = POINTER TO BirdRec;

Cuckoo = POINTER TO CuckooRec;

Duck = POINTER TO DuckRec;

VAR pb : Bird;

pc : Cuckoo;

pd : Duck;

PROCEDURE makeDuckSound*( bird : Duck );

BEGIN COPY("Quack!", bird.sound) END makeDuckSound;

PROCEDURE makeCuckooSound*( bird : Cuckoo );

BEGIN COPY("Cuckoo!", bird.sound) END makeCuckooSound;

PROCEDURE makeSound*( bird : Bird );

BEGIN

WITH bird : Cuckoo DO makeCuckooSound(bird);

| bird : Duck DO makeDuckSound(bird)

ELSE

COPY("Tweet!", bird.sound);

END;

END makeSound;

BEGIN

NEW(pc);

NEW(pd);

makeCuckooSound( pc );

makeDuckSound( pd );

Out.Ln;Out.String( pc^.sound );Out.Ln;

Out.Ln;Out.String( pd^.sound );Out.Ln;

makeSound( pc );

makeSound( pd );

Out.Ln;Out.String( pc^.sound );Out.Ln;

Out.Ln;Out.String( pd^.sound );Out.Ln;

(* -------------------------------------- *)

(* Pass dynamic type to procedure *)

pb := pd;

makeDuckSound( pb(Duck) );

Out.Ln;Out.String( pb^.sound );Out.Ln;

pb := pc;

makeCuckooSound( pb(Cuckoo) );

Out.Ln;Out.String( pb^.sound );Out.Ln;

(* -------------------------------------- *)

makeSound(pb);

Out.Ln;Out.String( pb^.sound );Out.Ln;

pb := pd;

makeSound(pb);

Out.Ln;Out.String( pb^.sound );Out.Ln;

(* -------------------------------------- *)

NEW(pb);

makeSound(pb);

Out.Ln;Out.String( pb^.sound );Out.Ln;

END PointerBirds.

```

`IS` 연산자는 등호(`=`)나 부등호(`>`)와 같은 우선순위의 관계 연산자이며, 동적 타입 검사를 수행한다. 하지만 `IS` 연산자는 앞서 설명한 타입 바인딩이나 `WITH` 문과는 달리, 감지한 파생 타입에 따라 처리를 분기할 수는 없다.

참조

[1] 보고서 From Modula to Oberon and the programming language Oberon https://doi.org/10.3[...] Wiley
[2] 논문 The Programming Language Oberon 1988-07
[3] 논문 From Modula to Oberon 1988-07
[4] 논문 Type Extensions 1988-04
[5] 간행물 Modula's Children, Part II: Oberon https://archive.org/[...]
[6] 웹사이트 Project Oberon https://people.inf.e[...] 1987–2021
[7] 웹사이트 Oberon Change Log https://www.inf.ethz[...] ETH Zurich 2021-01-16
[8] 웹사이트 Compiler Construction: The Art of Niklaus Wirth ftp://ftp.ssw.uni-li[...] Johannes Kepler University
[9] 웹사이트 Project Oberon http://www.projectob[...] 1987–2021
[10] 웹사이트 Oxford Oberon-2 compiler http://spivey.oriel.[...] 2021-01-17
[11] 웹사이트 Vishap Oberon Compiler https://github.com/v[...] 2021-01-17
[12] 웹사이트 Ofront https://github.com/j[...] 2021-01-17
[13] 보고서 The Programming Language Oberon-07 https://people.inf.e[...] 2021-01-17
[14] 문서 Springer, Berlin Heidelberg 2006
[15] 웹사이트 Proposal for Module Contexts http://www.ocp.inf.e[...]
[16] PhD The active object system design and multiprocessor implementation http://e-collection.[...] Swiss Federal Institute of Technology, Zürich (ETH Zurich) 2002
[17] 보고서 On Certain Basic Properties of Component-Oriented Programming Languages http://oberon2005.ob[...] University of California, Irvine 2021-01-18
[18] 논문 Supporting software composition at the programming language level Elsevier B.V. 2005-04
[19] 서적 Proceedings: Fifth International Workshop on Object-Oriented Real-Time Dependable Systems Institute of Electrical and Electronics Engineers (IEEE) 1999-11-20
[20] 서적 Proceedings CONPAR 90: VAPP IV Conference, Diss Nr. 10277 ETH Zurich 1993
[21] 보고서 From Modula to Oberon and the programming language Oberon https://doi.org/10.3[...] Wiley
[22] 논문 The Programming Language Oberon https://archive.org/[...] 1988-07
[23] 보고서 From Modula to Oberon 1988-07
[24] 논문 Type Extensions 1988-04
[25] 웹인용 Oberon Change Log https://www.inf.ethz[...] ETH Zurich 2021-01-16



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com