오베론-2

Oberon-2
오베론-2
Oberon programming language logo.svg
패러다임명령형, 구조형, 모듈형, 객체 지향형
가족워스 오베론
설계자니클라우스 워스
한스페터 뫼센뵈크
개발자ETH 취리히
처음 등장한1991년; 31년 전(1991년)
타이핑 분야강력한 하이브리드(정적동적)
범위어휘
플랫폼Ceres(NS32032), IA-32, x86-64
OSWindows, Linux, Solaris, macOS
웹 사이트www.ethoberon.ethz.ch
영향을 받다
오베론, 모듈라-2, 객체 오베론
영향받은
Oberon-07, Zonnon, Active Oberon, 컴포넌트 Pascal, Go, Nim

[1]

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는 프로그래머가 실행 시 객체의 실제 유형에 응답할 수 있도록 합니다.

첫 번째, 가장 전통적인 접근법은 유형 바인딩 시스템에 의존하는 것입니다.두 번째 접근법은 변수동적 서브유형을 직접 확인할 수 있는 문을 사용하는 것입니다.두 경우 모두 서브타입이 식별되면 프로그래머는 서브타입에 적합한 타입 바운드 프로시저 또는 변수를 사용할 수 있습니다.이러한 접근방식의 예를 다음에 나타냅니다.

의 형식은WITHOberon-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 바이트 코드)로 컴파일합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b Crelier, Régis. "Separate Compilation and Module Extension". ETH Zurich. Retrieved 18 November 2018.
  2. ^ "Related Reading". Dr. Dobb's.
  3. ^ 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.
  4. ^ Oberon과 Oberon-2, Mössenböck와 Worth의 차이점(1993)
  5. ^ a b 마이클 스파이비 박사님"케이코 사양"
  6. ^ a b 마이클 스파이비 박사님"OBC 설계 개요: 게이코 추상 기계.인용문: "Oxford Oberon-2 컴파일러는 소스 프로그램을 스택 기반 추상 머신용 코드로 변환합니다.게이코 기계
  7. ^ Collingbourne, H. (February 2000). "What Pascal's inventor did next". PC Plus. No. 160.

오베론과 오베론-2의 진화

상세 서류

책들

외부 링크