오베론-2
Oberon-2![]() |
![]() | |
패러다임 | 명령형, 구조형, 모듈형, 객체 지향형 |
---|---|
가족 | 워스 오베론 |
설계자 | 니클라우스 워스 한스페터 뫼센뵈크 |
개발자 | ETH 취리히 |
처음 등장한 | 전( |
타이핑 분야 | 강력한 하이브리드(정적 및 동적) |
범위 | 어휘 |
플랫폼 | Ceres(NS32032), IA-32, x86-64 |
OS | Windows, Linux, Solaris, macOS |
웹 사이트 | www |
영향을 받다 | |
오베론, 모듈라-2, 객체 오베론 | |
영향받은 | |
Oberon-07, Zonnon, Active Oberon, 컴포넌트 Pascal, Go, Nim |
Oberon-2는 Oberon 프로그래밍 언어를 확장한 것으로 제한된 리플렉션 및 객체 지향 프로그래밍 기능, 포인터 베이스 유형으로서의 오픈 어레이, 읽기 전용 필드 내보내기 및 재도입합니다.FOR
모듈라-2의 루프
1991년 ETH 취리히에서 Niklaus Wirth와 Hansperter Mössenböck에 의해 개발되었으며, 현재 오스트리아 린츠 대학의 SSW(Institut für System software)에 재직하고 있습니다.오베론-2는 오베론의 슈퍼셋으로 완전히 호환되며 오브젝트 오베론을 재설계한 것입니다.
Oberon-2는 Oberon에서 인터페이스나 믹스인을 사용하지 않고 제한된 반사 및 단일 상속("타입 확장")을 상속받았지만 효율적인 가상 방식("타입 바인딩 절차")을 추가했습니다.메서드 콜은 실행 시 C++ 스타일의 가상 메서드테이블을 사용하여 해결되었습니다.
Smalltalk와 같은 완전한 객체 지향 언어에 비해 Oberon-2에서는 기본 데이터 유형과 클래스는 객체가 아니며, 많은 조작은 메서드가 아니며, 메시지 전달(ETH Oberon에서 설명한 것처럼 반영 및 메시지 확장을 통해 다소 에뮬레이트할 수 있음)이 없으며, 다형성은 공통 클래스의 하위 클래스로 제한됩니다(없음).Python에서와 [2]같이 duck typing을 수행하며 Java에서와 같이 인터페이스를 정의할 수 없습니다.)Oberon-2는 오브젝트레벨 또는 클래스레벨에서의 캡슐화를 지원하지 않지만 모듈을 이 목적으로 사용할 수 있습니다.
Oberon-2의 리플렉션에서는 메타오브젝트를 사용하지 않고 단순히 실행 가능한 바이너리로 컴파일되어 유형 및/또는 프로시저를 정의하는 모듈에 표시되는 유형 디스크립터로부터 읽습니다.이러한 구조의 형식이 언어 수준에서 공개되는 경우(예를 들어 ETH Oberon의 경우) 라이브러리 수준에서 반영이 구현될 수 있습니다.따라서 언어 코드를 변경하지 않고 거의 전적으로 라이브러리 수준에서 구현될 수 있습니다.실제로 ETH Oberon은 언어 수준 및 라이브러리 수준 반사 능력을 광범위하게 활용합니다.
Oberon-2는 Java와 유사한 가비지 컬렉션에 대한 내장 런타임 지원을 제공하며, C 및 C++ 고유의 잠재적인 스택 및 어레이 경계 덮어쓰기 문제 및 수동 메모리 관리 문제를 제거하는 경계 및 어레이 인덱스 체크 등을 수행합니다.모듈 아키텍처를 통해 심볼 파일과 네임스페이스를 사용하여 컴파일을 분리하면 인터페이스가 변경된 모듈만 재컴파일할 수 있으므로 신속한 재구축이 가능합니다.
언어[3] 컴포넌트 파스칼은 Oberon-2의 개량형(슈퍼셋)입니다.
코드 예시
다음 Oberon-2 코드는 단순한 바이너리 트리를 구현합니다.
모듈 나무들; 유형 트리* = 포인터 로. 노드; 노드* = 기록. 이름.-: 포인터 로. 어레이 의 문자; 왼쪽, 맞다: 트리 끝.; 절차. (t: 트리) 삽입* (이름.: 어레이 의 문자); VAR p, 아버지.: 트리; 시작한다. p := t; 따라하다 아버지. := p; 한다면 이름. = p.이름.^ 그리고나서 돌아가다 끝.; 한다면 이름. < > p.이름.^ 그리고나서 p := p.왼쪽 또 다른 p := p.맞다 끝. 까지 p = 없음; 신규(p); p.왼쪽 := 없음; p.맞다 := 없음; 신규(p.이름., 렌(이름.)+1); 알았다.(이름., p.이름.^); 한다면 이름. < > 아버지..이름.^ 그리고나서 아버지..왼쪽 := p 또 다른 아버지..맞다 := p 끝. 끝. 삽입; 절차. (t: 트리) 서치* (이름.: 어레이 의 문자): 트리; VAR p: 트리; 시작한다. p := t; 하는 동안에 (p # 없음) & (이름. # p.이름.^) 하다 한다면 이름. < > p.이름.^ 그리고나서 p := p.왼쪽 또 다른 p := p.맞다 끝. 끝.; 돌아가다 p 끝. 서치; 절차. 뉴트리* (): 트리; VAR t: 트리; 시작한다. 신규(t); 신규(t.이름., 1); t.이름.[0] := 0X; t.왼쪽 := 없음; t.맞다 := 없음; 돌아가다 t 끝. 뉴트리; 끝. 나무들.
오베론-2[4] 연장선
타입 바운드 프로시
절차는 레코드(또는 포인터) 유형에 바인딩할 수 있습니다.오브젝트 지향 용어로 인스턴스 메서드와 동등합니다.
읽기 전용 내보내기
내보낸 변수 및 레코드 필드의 사용은 읽기 전용 액세스로 제한할 수 있습니다.이는 "-" 가시성 플래그와 함께 표시됩니다.
오픈 어레이
이전에는 정식 파라미터 유형으로만 선언할 수 있었던 오픈어레이를 포인터 베이스 유형으로 선언할 수 있게 되었습니다.
FOR 스테이트먼트
그FOR
파스칼과 모듈라-2의 진술은 오베론에서 구현되지 않았습니다.그것은 오베론-2에 재도입되었다.
런타임 유형 확인
Oberon-2는 객체의 동적 유형을 체크하기 위한 몇 가지 메커니즘을 제공합니다.예를 들어, Bird 객체가 Duck 또는 Cuckoo로 인스턴스화될 수 있는 경우, Oberon-2는 프로그래머가 실행 시 객체의 실제 유형에 응답할 수 있도록 합니다.
첫 번째, 가장 전통적인 접근법은 유형 바인딩 시스템에 의존하는 것입니다.두 번째 접근법은 변수의 동적 서브유형을 직접 확인할 수 있는 문을 사용하는 것입니다.두 경우 모두 서브타입이 식별되면 프로그래머는 서브타입에 적합한 타입 바운드 프로시저 또는 변수를 사용할 수 있습니다.이러한 접근방식의 예를 다음에 나타냅니다.
의 형식은WITH
Oberon-2에 사용된 문장은 Pascal 및 Modula-2 WITH 문장과 무관합니다.레코드 필드에 대한 액세스를 줄이는 이 방법은 Oberon 또는 Oberon-2에서는 구현되지 않습니다.
유형 바인딩
모듈 새들; 유형 새* = 기록. 소리* : 어레이 10 의 문자; 끝.; 끝. 새들. 모듈 오리; 수입품 새들; 유형 오리* = 기록. (새들.새) 끝.; 절차. 사운드 설정* (VAR 새 : 오리); 시작한다. 새.소리 := 꽥꽥! 끝. 사운드 설정; 끝. 오리. 모듈 뻐꾸기과; 수입품 새들; 유형 쿠쿠* = 기록. (새들.새) 끝.; 절차. 사운드 설정* (VAR 새 : 쿠쿠); 시작한다. 새.소리 := "쿠쿠!" 끝. 사운드 설정; 끝. 뻐꾸기과.
WITH
진술
모듈 시험; 수입품 나가., 새들, 뻐꾸기과, 오리; 유형 썸버드* = 기록. (새들.새) 끝.; VAR 어떤 일을 맡다 : 썸버드; c : 뻐꾸기과.쿠쿠; d : 오리.오리; 절차. 사운드 설정* (VAR 새 : 새들.새); 시작한다. 와 함께 새 : 뻐꾸기과.쿠쿠 하다 새.소리 := "쿠쿠!" 새 : 오리.오리 하다 새.소리 := 꽥꽥! 또 다른 새.소리 := "트윗!" 끝. 끝. 사운드 설정; 절차. 사운드 만들기* (VAR b : 새들.새); 시작한다. 나가..인; 나가..스트링(b.소리); 나가..인 끝. 사운드 만들기; 시작한다. 사운드 설정(c); 사운드 설정(d); 사운드 설정(어떤 일을 맡다); 사운드 만들기(c); 사운드 만들기(d); 사운드 만들기(어떤 일을 맡다) 끝. 시험.
POINTER
모듈 포인터 버드; 수입품 나가.; 유형 Bird Rec* = 기록. 소리* : 어레이 10 의 문자; 끝.; 덕렉* = 기록. (Bird Rec) 끝.; 뻐꾸기 소리* = 기록. (Bird Rec) 끝.; 새 = 포인터 로. Bird Rec; 쿠쿠 = 포인터 로. 뻐꾸기 소리; 오리 = 포인터 로. 덕렉; VAR PB : 새; PC : 쿠쿠; PD : 오리; 절차. SetDuck 사운드* (새 : 오리); 시작한다. 새.소리 := 꽥꽥! 끝. SetDuck 사운드; 절차. SetCuckoo 사운드* (새 : 쿠쿠); 시작한다. 새.소리 := "쿠쿠!" 끝. SetCuckoo 사운드; 절차. 사운드 설정* (새 : 새); 시작한다. 와 함께 새 : 쿠쿠 하다 SetCuckoo 사운드(새) 새 : 오리 하다 SetDuck 사운드(새) 또 다른 새.소리 := "트윗!" 끝. 끝. 사운드 설정; 시작한다. 신규(PC); 신규(PD); SetCuckoo 사운드(PC); SetDuck 사운드(PD); 나가..인; 나가..스트링(PC^.소리); 나가..인; 나가..인; 나가..스트링(PD^.소리); 나가..인; 사운드 설정(PC); 사운드 설정(PD); 나가..인; 나가..스트링(PC^.소리); 나가..인; 나가..인; 나가..스트링(PD^.소리); 나가..인; (* -------------------------------------- *) (* 동적 유형을 프로시저에 전달 *) PB := PD; SetDuck 사운드(PB(오리)); 나가..인; 나가..스트링(PB^.소리); 나가..인; PB := PC; SetCuckoo 사운드(PB(쿠쿠)); 나가..인; 나가..스트링(PB^.소리); 나가..인; (* -------------------------------------- *) 사운드 설정(PB); 나가..인; 나가..스트링(PB^.소리); 나가..인; PB := PD; 사운드 설정(PB); 나가..인; 나가..스트링(PB^.소리); 나가..인; (* -------------------------------------- *) 신규(PB); 사운드 설정(PB); 나가..인; 나가..스트링(PB^.소리); 나가..인 끝. 포인터 버드.
IS
교환입니다.
연산자를 사용하여 세 번째 접근법이 가능합니다.이것은 등호(와 같은 precedence를 가진 관계 연산자입니다.=
더 크다( )>
다이내믹 타입을 테스트합니다.그러나 다른 두 가지 접근 방식과는 달리 프로그래머가 탐지된 하위 유형에 액세스할 수 없습니다.
구문
ALGOL → Pascal → Modula-2 → Oberon → Component Pascal 언어 패밀리의 개발은 언어 구문의 복잡성이 감소된 것을 특징으로 합니다.전체 Oberon-2 언어는 아래와 같이 확장 Backus-Naur 형식으로 33개의 문법적 작품만을 사용하여 기술되어 있다(Mössenböck & Wirth, 1995년 3월).
모듈= 모듈 식별";" [Import List(임포트 리스트)] 데크세크[BEGIN 스테이트먼트Seq] END 식별".". Import List(임포트 리스트)= 수입품[식별하다":="] 식별하다{"," [식별하다":="] 식별하다} ";". 데크세크= { 계속{ConstDecl";" } 유형{TypeDecl(유형선언)";"} VAR{VarDecl";"}} {ProcDecl";" ForwardDecl";"}. ConstDecl= Identify Def(식별 정의)"=" ConstExpr. TypeDecl(유형선언)= Identify Def(식별 정의)"=" 유형. VarDecl= 식별 리스트":" 유형. ProcDecl= 절차.[리시버] Identify Def(식별 정의)[포멀파스] ";" 데크세크[BEGIN 스테이트먼트Seq] END 식별. ForwardDecl= 절차."^" [리시버] Identify Def(식별 정의)[포멀파스]. 포멀파스= "(" [동작{";" 동작}] ")" [":" 적격]. 동작= [VAR] 식별하다{"," 식별하다} ":" 유형. 리시버= "(" [VAR] 식별하다":" 식별하다")". 유형= 적격 어레이[ConstExpr{"," ConstExpr}] OF 타입 기록.["("적격")"] 필드 리스트{";" 필드 리스트} 끝. 유형 포인터 절차.[포멀파스]. 필드 리스트= [식별 리스트":" 유형]. 스테이트먼트Seq= 진술{";" 진술}. 진술= [ 지정자":=" 익스프레르 지정자["(" [Expr List(익스프레 리스트)] ")"] IF Expr THEN 스테이트먼트Seq{ELSIF Expr THEN 스테이트먼트Seq} [ELSE 스테이트먼트Seq] 끝. 케이스의 유효기간{" " 사례.} [ELSE 스테이트먼트Seq] 끝. WHIN EXPr DO 스테이트먼트Seq END 만료될 때까지 스테이트먼트Seq를 반복합니다. 식별을 위해":=" Expr to Expr[ConstExpr 기준] DO 스테이트먼트Seq END LOUP 문Seq END With Guard DO 문Seq{" " 가드 DO 스테이트먼트Seq} [ELSE 스테이트먼트Seq] 끝. 퇴장 돌아가다[익스프레르] ]. 사례.= [케이스 라벨{"," 케이스 라벨} ":" 스테이트먼트Seq]. 케이스 라벨= ConstExpr[".." ConstExpr]. 가드= 적격":" 적격. ConstExpr= 익스프레르. 익스프레르= 심플 익스프레스[관계 SimpleExpr]. 심플 익스프레스= ["+" "-"] 용어{Add Op 용어}. 용어= 요인{MulOp 계수}. 요인= 지정자["(" [Expr List(익스프레 리스트)] ")"] 번호 성격 스트링 없음 세트 "(" 익스프레르")" "~" 요인. 세트= "{" [요소{"," 요소}] "}". 요소= 익스프레르[".." 익스프레르]. 관계.= "=" "#" "<" "<=" ">" ">=" 입력 IS. 추가 조작= "+" "-" 또는. 멀티롭= "*" "/" DIV 모드 "&". 지정자= 적격{"." 식별하다 "[" Expr List(익스프레 리스트)"]" "^" "(" 적격")"}. Expr List(익스프레 리스트)= 익스프레르{"," 익스프레르}. 식별 리스트= Identify Def(식별 정의){"," Identify Def(식별 정의)}. 적격= [식별하다"."] 식별하다. Identify Def(식별 정의)= 식별하다["*" "-"].
실장
ETH가 관리하는 Oberon-2 컴파일러에는 Windows, Linux, Solaris, macOS 버전이 포함됩니다.
Oxford Oberon-2 컴파일러는 네이티브 머신 코드를 컴파일하여 Windows, Linux 및 Mac OS X에서 JIT를 사용할 수 있습니다.Mike Spivey에 의해 작성/유지 관리되며 Keiko Virtual [5][6]Machine을 사용합니다.
Mössenböck와 Worth 참조에 있는 것을 기반으로 한 영국 맨체스터 대학의 Stephen J. Bevan의 Oberon-2 Lex 스캐너와 Yacc 파서가 있습니다.버전 1.4입니다.
운영체제를 포함한 Native Oberon이라는 릴리스가 있으며 PC 클래스 하드웨어에서 직접 부팅할 수 있습니다.
약간의 마이너를 추가한 Oberon의 .NET 실장.NET 관련 확장도 ETHZ에서 개발되었습니다.
Programmer's Open Workbench(POW!)[7]는 에디터, 링커 및 Oberon-2 컴파일러와 함께 제공되는 매우 단순한 통합 개발 환경입니다.이것은 Windows 실행 파일로 컴파일됩니다.완전한 소스 코드가 제공되며 컴파일러는 Oberon-2로 작성됩니다.
Java to Oberon 컴파일러(JOB)는 러시아의 볼로그다 대학에서 작성되었습니다.Java 클래스 파일(바이트 코드) 형식으로 객체 코드를 생성합니다.Java와 호환되지만 Oberon과 유사한 구성 요소 계층을 사용하는 일부 JOB별 클래스가 제공됩니다.
Optimizing Oberon-2 컴파일러는 프로그램 생성을 위해 GNU 컴파일러 컬렉션(GCC) 툴체인을 사용하여 C로 컴파일합니다.
Oberon Script는 Oberon 언어 전체를 JavaScript로 번역하는 컴파일러입니다.컴파일러는 JavaScript로 작성되므로 웹 페이지에서 호출하여 Oberon으로 작성된 스크립트를 처리할 수 있습니다.
XDS Modula2/Oberon2는 러시아 Novosibirsk, Excelsior LLC의 개발 시스템입니다.인텔 Pentium용 최적화 컴파일러 또는 크로스 플랫폼 소프트웨어 개발용 "via-C" 번역기가 포함되어 있습니다.Windows 및 Linux에서 사용할 수 있습니다.이 컴파일러는 Oberon-2로 작성되어 컴파일 됩니다.
오베론 리바이벌은 오베론2와 컴포넌트 파스칼(블랙박스 컴포넌트 빌더)을 리눅스와 윈32에 도입하는 프로젝트다.이전에는 Linux의 BlackBox 포트를 사용할 수 없었으며 원래 Microsoft Windows에서만 실행되었습니다.
XOberon은 Oberon-2로 작성된 PowerPC용 실시간 운영 체제입니다.
Portable Oberon-2 컴파일러(OP2)는 Oberon 시스템을 시판 플랫폼에 [1]이식하기 위해 개발되었습니다.
게이코 바이트 코드
오베론-2는 게이코 버추얼 [5][6]머신을 타겟으로 할 수 있다.예를 들어 다른 언어 컴파일러(O-code, p-code 등)와 마찬가지로 Oxford Oberon-2 컴파일러는 먼저 바이트 코드 인터프리터로 해석하거나 저스트 인 타임 컴파일을 사용할 수 있는 중간 바이트 코드(Keiko 바이트 코드)로 컴파일합니다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b Crelier, Régis. "Separate Compilation and Module Extension". ETH Zurich. Retrieved 18 November 2018.
- ^ "Related Reading". Dr. Dobb's.
- ^ Pfister, Cuno (2001). "What's New in Component Pascal (changes from Oberon-2 to CP)" (PDF). Oberon microsystems. Archived from the original (PDF) on 15 May 2011. Retrieved 10 January 2007.
- ^ Oberon과 Oberon-2, Mössenböck와 Worth의 차이점(1993)
- ^ a b 마이클 스파이비 박사님"케이코 사양"
- ^ a b 마이클 스파이비 박사님"OBC 설계 개요: 게이코 추상 기계.인용문: "Oxford Oberon-2 컴파일러는 소스 프로그램을 스택 기반 추상 머신용 코드로 변환합니다.게이코 기계
- ^ Collingbourne, H. (February 2000). "What Pascal's inventor did next". PC Plus. No. 160.
오베론과 오베론-2의 진화
상세 서류
- 모듈라에서 오베론 워스로 (1990년)
- Oberon에서의 프로그래밍 - Modula-2 Worth에서의 프로그래밍의 파생어(1982)
- 프로그래밍 언어 오베론 워스(1990)
- 오베론 2 보고서
- 프로그래밍 언어 Oberon-2 H. Mössenböck, N. Wirth, Institut für Computersysteme, ETH Zurich, 1992년 1월 및 구조화 프로그래밍 (1991) 12(4): 179-195.
책들

- 전자 온라인 버전을 포함한 다양한 참고 자료
- Oberon-2 Hansperter Mössenböck의 객체 지향 프로그래밍(1994년).(요하네스 케플러 대학에서 Springer-Verlag의 친절한 허가를 받아 PDF로 제공)
- Oberon-2 및 컴포넌트 Pascal의 설계 패턴
- 오베론 프로젝트. 운영체제 및 컴파일러 Niklaus Wirth & Jurg Gutknecht 설계(2005)
- 오베론 프로젝트. 운영체제 및 컴파일러 Niklaus Wirth & Jurg Gutknecht 설계(2013)