알골 68RS
ALGOL 68RS| 원저작자 | I.F. Currie, J.D.모리슨 |
|---|---|
| 개발자 | 왕실 신호 및 레이더 설치 |
| 초기 릴리즈 | 8월, 전( |
| 안정된 릴리스 | algol68toc 1.14 / 2012년 8월 ; 전( |
| 기입처 | 알골 68 |
| 운영 체제 | VMS |
| 플랫폼 | ICL 2900 시리즈, 멀티, VAX |
| 이용가능기간: | 영어 |
| 유형 | 컴파일러, 번역자 |
| 면허증. | 프리웨어, 퍼블릭 도메인(부품) |
| 웹 사이트 | algol68 |
ALGOL 68RS는 I.F. Currie와 J. D.에 의해 작성된 두 번째 ALGOL 68 컴파일러입니다.Royal Signals and Radar Establishment(RSRE)[1]의 모리슨입니다.이전의 ALGOL 68-R과는 달리, 휴대할 수 있도록 설계되었으며 개정 보고서의 언어를 구현하였다.
ALGOL 68RS 버전은 [2][3]VMS를 실행하는 ICL 2900 시리즈, 멀티틱스 및 VAX용으로 작성되었습니다.
그 후, 이 컴파일러의 일부는 하드웨어 기술 언어 ELLA의 공개 릴리스의 일부로, 또한 RSRE에 의해 ALGOL 68에서 C로의 번역자로서 공개 도메인에 공개되었다.
역사
단, I.F.에 의해 작성된 ALGOL 68-R 컴파일러입니다.Currie, J.D. Morrison 및 S.G. Bond는 큰 성공을 거두었습니다.그것은 거의 구식 ICL 1900 컴퓨터에 쓰여져 있었고, ALGOL 68에 대한 개정 보고서가 나오기 전에 발표되었기 때문에 오래된 버전의 언어를 구현했습니다.
RSRE는 다양한 내부 프로젝트를 위해 새로운 컴파일러가 필요했기 때문에 Currie와 Morrison 팀은 머신 간의 크로스 플랫폼 소프트웨어 이식성을 위해 설계된 새로운 컴파일러를 작성했습니다.컴파일러는 ALGOL 68의 파싱을 처리하여 스트림 언어라고 알려진 고급 중간 언어를 생성하고 번역자에 의해 기계 코드로 컴파일되었습니다.컴파일러는 다양한 오브젝트 머신의 데이터 유형과 사용 가능한 문자 인코딩(세트)의 크기만 알면 되었습니다.
이 컴파일러는 처음에 ALGOL 68-R 컴파일러를 사용하여 부트스트랩된 ALGOL 68로 작성되었습니다.
Oxford University Computing Services의 두 명의 프로그래머 팀은 ICL 2900 [4]시리즈를 위한 코드 생성기를 작성했습니다.South West Universities Regional Computer Center(SWURCC)의 Martyn Thomas는 이 시스템을 International Computers Limited(ICL)가 후원하여 공식 ICL [5]제품으로 판매하도록 준비했습니다.
이후 멀티ics의 대규모 사용자인 Avon Universities 공동 컴퓨터 센터는 SWURCC 팀에 ALGOL 68RS의 멀티ics 버전 제작을 요청했습니다.DEC(Digital Equipment Corporation) VAX 컴퓨터 버전도 작성되었습니다.
결국 SWURCC 팀은 처음에는 ALGOL 68RS의 Multics 버전을 지원하는 Praxis라는 회사를 설립했습니다.
RSRE는 또한 Flex 머신과 ELLA 하드웨어 설계 언어를 포함한 내부 프로젝트를 위해 ALGOL 68RS 컴파일러를 사용했습니다.ELLA를 자유롭게 사용할 수 있도록 결정되었을 때, Praxis는 ALGOL 68RS 컴파일러에 기반하여 ctrans라는 이름의 ALGOL 68을 C 번역자에게 작성하도록 의뢰받았습니다.
컴파일된 언어의 제약사항
이전의 ALGOL 68-R 컴파일러와 마찬가지로, ALGOL 68RS는 원패스 컴파일러였으며 컴파일된 언어에 몇 가지 제한이 필요했습니다.
사용 전 신고
ALGOL 68 프로그램:
PROC 짝수 = (INT 번호) BOOL : (번호 = 0 TRUE 홀수 (ABS 번호 - 1) PROC 홀수 = (INT 번호) BOOL : (번호 = 0 FALSE 짝수 (ABS 번호 - 1) ) ;
다음과 같이 다시 작성해야 합니다.
PROC (INT) BOOL 홀수, PROC 짝수 = (INT 번호) BOOL : (번호 = 0 TRUE 홀수 (ABS 번호 - 1); 홀수 : = (INT 번호) BOOL : (번호 = 0 FALSE 짝수 (ABS (번호 - 1));
모드(타입)의 재귀 선언을 허용하기 위해 컴파일러에 다음 기호가 연산자가 아닌 모드임을 알리기 위해 특수 스터브 모드 선언이 사용되었습니다.
모드 B, A = 구조(REF B b), B = [1:10] REF A;
병렬 처리
ALGOL 68-R과 마찬가지로 연산자 PAR 구와 관련된 UP, DOWN 및 LEVEL의 SEMA 모드는 생략되었습니다.
ALGOL 68로의 확장
스트레이트
ALGOL 68의 주요 특징은 표준 트랜스풋(입출력) 프로시저를 순수 ALGOL 68로 쓸 수 없다는 것입니다.예를 들어, 인쇄 절차에서는 모든 모드의 아이템 배열을 사용하여 스트레이트라고 하는 프로세스를 통해 인쇄할 수 있는 단순한 값으로 변환합니다.예를 들어 다음과 같습니다.
STRUCT (INT a, REAL b) c : = ..., print (c), {인쇄하기 위해 마법으로 변환됨 (a OF c, b OF c), } ALGOL 68RS의 저자들은 언어의 일부로 직선화를 사용 가능하게 하기로 결정했다.STRAY 모드는 배열과 유사하지만 구성 요소를 모드로 강제할 수 있는 경우 항목을 STRAY 모드로 강제할 수 있는 특수 기능이 있습니다.예를 들어 다음과 같습니다.
구조(INT a, REAL b) c; 직선 결합(INT, REAL) z = c;
C의 두 필드는 UNION(INT, REAL)으로 강제할 수 있으므로 "a OF c" 필드는 z[1], "b OF c"는 z[2]로 액세스할 수 있습니다.
표준 인쇄 순서는 다음과 같이 선언할 수 있습니다.
MODE PRINTMODE = UNION (INT, REAL, ...)스트레이트 프린트 모드); PROC 프린트 = ([] PRINTMODE 인수) 무효: ...;
효율적인 어레이 처리
ALGOL 68 어레이 모드는 다중 치수, 정의된 상한 및 하한, 트리밍(어레이의 연속된 서브셋을 취함으로써 새로운 어레이 작성), 슬라이스(어레이에서 1차원을 제거하여 새로운 어레이 작성), 조정(기존 어레이에 치수를 추가하여 새로운 어레이 작성) 등 매우 강력합니다.
예를 들어 다음과 같습니다.
[5:23, -7:7] INT a; { a 2차원 배열 } REF [,] INT b = a [ 6:21, 0:3] { a }의 슬라이스 [] INT c = a [5] { a의 한 행만} 컴파일러는 모든 경우에 최적의 코드를 생성하기 위해 모든 노력을 기울였지만, 일부 간단한 기능을 추가하면 경우에 따라 더 나은 코드를 생성할 수 있을 것으로 생각되었습니다.이를 위해 ALGOL 68RS는 지수화 가능한 구조(i-구조), 벡터 및 FORALL 문을 포함했다.
색인화 가능한 구조
ALGOL 68은 이미 워드 기반 기계, BITS 및 BITS 모드에서 문자와 비트 데이터를 효율적으로 처리하기 위한 고정 길이 구조를 포함하고 있습니다.바이트 변수는 하나의 기계어 문자를, BITS 변수는 하나의 기계어 비트를 보유합니다.
ALGOL 68RS는 이러한 아이디어를 일반화하였다.STRUCT 4 CHAR 변수에는 정확히 4자가 포함되어 있습니다.사이즈는 그 타입의 일부였다.대부분의 ALGOL 68RS 시스템에서 BYTS 모드는 STRUCT 4 CHAR과 동등했습니다.
모드 바이트 = 구조 4 문자, OP ELEM = (INT 색인, 바이트 값) 문자: val[index];...바이트 b = "abcd", ... 인쇄 (2 ELEM b);
ALGOL 68RS 컴파일러는 임의의 문자열 상수를 적절한 STRUCT N CHAR로 컴파일합니다.
VECTOR 또는 배열이 필요한 상황에서는 i-structure를 적절한 VECTOR 또는 배열 유형으로 확장할 수 있습니다.
벡터
VECTOR는 1차원만 있고 하한은 1로 고정된 단순 배열입니다.
벡터 [4] INT a; { [1:4] INT a; } 배열이 필요한 모든 컨텍스트에서 VECTOR를 배열로 변환할 수 있습니다.
FORALL 스테이트먼트
FORALL 문을 사용하면 어레이 요소를 효율적으로 스텝업할 수 있습니다.
[12] INT a := ...; DO xa의 FORALL xa := xa * 2 OD
xa는 a의 각 요소에 대한 참조가 됩니다.FORALL은 여러 어레이를 병렬로 스텝업 할 수 있으며 WHY 절에 의해 제어됩니다.
[12] INT a, b;...FORALL xa IN a, xb IN b while xa > xb DO f(xa, xb) OD
개별 컴파일
ALGOL 68RS는 ALGOL 68-R의 개별 컴파일 기능과 유사한 라이브러리를 구축하는 메커니즘과 ALGOL 68C와 유사한 하향식으로 프로그램을 구축하는 메커니즘을 제공하였다.
선언 모듈
ALGOL 68RS의 라이브러리는 MODE, 변수, 연산자 및 프로시저 선언의 시퀀스로 구성된 선언 모듈을 사용하여 작성되며, 그 뒤에 다른 세그먼트에 어떤 선언이 보이는지를 정의하는 킵 리스트가 이어진다.
라이브러리 사용자는 컴파일러에게 하나 이상의 선언 라이브러리의 기호를 프로그램에서 사용할 수 있도록 지시하는 USE 헤더를 추가합니다.
예를 들어 그래픽 라이브러리는 다음과 같이 기술될 수 있습니다.
DECS graphlib 다른 라이브러리 모드 사용 GRAPHDATA = STRUCTUR ( ... ); MODE GRAPH = REF GRAPHDATA; PROC 새 그래프 = ( ... ) GRAPH : ...; PROC 그리기 그래프 = (GRAPH g) VID : ...; ... KEEP GRAPH, 새 그래프, 그리기 그래프 FINITY
이 라이브러리를 사용하는 사용자 프로그램은 다음과 같습니다.
프로그램 myprog 사용 graphlib BEGIN GRAPH g = 새 그래프 (...) ; ...그래프 (g) ; ...그리기엔드 피니시
네스트된 모듈
하향식 프로그래밍 스타일을 지원하기 위해 ALGOL 68RS는 HERE 및 Context 기능을 제공했습니다.
프로그램에는 나중에 HERE 태그와 함께 기입해야 할 부분을 기입하고 이어서 사용할 수 있도록 선언 목록을 작성할 수 있습니다.
PROGRAM (pass1, pass2) 컴파일러 BEGIN STRING 소스 :=...; TREE 구문 트리;...여기서 pass1(소스, parsetree);...IROSTIONS inst;여기서 pass2 (파세트리, insts);...엔드 피니시
HERE 태그의 컨텍스트에서 실행되는 코드는 다음과 같습니다.
PROGRAM pass1 구현 컨텍스트 pass1 in 컴파일러 시작...{ "source" 및 "parsetree"를 사용하는 코드 } 종료 완료 여기서 설명하는 것은 ALGOL 68C 환경과 비슷하며 컨텍스트는 ALGOL 68C 사용법과 동일합니다.
코드 및 외계인 액세스
ALGOL 68RS는 낮은 수준의 시스템 프로그래밍에 사용할 수 있도록 설계되었습니다.이를 위해 기계 코드 및 비 ALGOL 68RS 객체에 대한 액세스를 위한 설비가 포함되었습니다.
CODE 구문을 사용하여 코드가 삽입되었습니다.
SOMEMODE 코드(항목1, 항목2, ...)...코드..."
여기서 항목은 코드 삽입에 사용할 수 있는 ALGOL 68RS 값이고 SOMEMODE는 반환되는 모드입니다.코드가 값을 반환하지 않으면 모드를 생략할 수 있습니다.
ALIEN을 삽입하면 ALGOL68 이외의 오브젝트에 액세스할 수 있었습니다.
SOMEMODE 이름 = ALIEN "이름"
간단한 ALGOL 68RS 오브젝트는 STEPLE 연산자를 사용하여 VECTOR로 캐스트할 수 있습니다.
구조(INT a, REAL b) c = ...; print("internal repr = ", SPIR c, newline); 단순한 개체는 배열 또는 VECTER를 포함하지 않는 개체입니다.
유용성
Praxis가 ELLA 시스템용으로 작성한 ALGOL 68 to C 변환기에는 ALGOL 68RS 컴파일러의 대부분이 포함되어 있습니다.주목할 만한 예외는 FORMATs를 처리하는 코드입니다.
2020년 9월[update] 현재 ALGOL 68RS는 SourceForge에서 [6]이용할 수 있습니다.
레퍼런스
- ^ Bond, S. G.; Woodward, P. M. (August 1977). "Introduction to the 'RS' Portable ALGOL 68 Compiler". Technical Note (802). Archived from the original on 14 December 2012.
- ^ Woodward, P. M.; Bond, S. G. (1983). Guide to ALGOL 68 for Users of RS Systems. Edward Arnold (Publishers) Ltd. ISBN 978-0-7131-3490-2.
- ^ Lindsey, C. H. (August 1998). "Survey of Viable ALGOL 68 Implementations". ALGOL Bulletin (52): 5–8. ISSN 0084-6198.
- ^ "Multics Site History: Avon".
- ^ Lindsey, C. H. (December 1980). "ALGOL 68 Implementations: The ICL 2900 Compiler". ALGOL Bulletin (46): 7–8. ISSN 0084-6198.
- ^ van der Veer, Marcel; NevilleDNZ. "Open source ALGOL 68 implementations". SourceForge. Retrieved 18 September 2020.