알골 68-R

ALGOL 68-R
알골 68R
원저작자I.F. Currie, Susan G. Bond, J.D.모리슨
개발자왕립 레이더 구축
초기 릴리즈1970년 7월 20일, 52년 전(1970-07-20)
기입처ALGOL 60 (오리지널)
ALGOL 68-R (라터)
운영 체제조지 3
플랫폼ICL 1907f
크기34K 단어
이용가능기간:영어
유형컴파일러, 번역자
면허증.프리웨어
웹 사이트sw.ccs.bcs.org/CCs/g3

ALGOL 68-RAlgorithmic Language ALGOL 68의 첫 번째 구현입니다.

1968년 12월 알고리즘 언어 ALGOL 68에 대한 보고서가 발표되었습니다.1970년 7월 20~24일 국제정보처리연맹(IFIP)이 언어 [1]구현 문제를 논의하기 위해 워킹 컨퍼런스가 마련되었고, 왕립레이더기구(RRE)의 소규모 팀이 I.F. Currie, Susan G Bond,[2] J.에 의해 작성된 컴파일러를 발표하기 위해 참석했다.모리슨.언어를 구현하는 데 최대 100명이 걸릴 것으로 예상되는데, 최대 7개의 패스를 가진 멀티패스 컴파일러를 사용하여 엔지니어링 및 과학용으로 생산 중인 원패스 컴파일러를 이미 구현한 방법을 설명했습니다.

컴파일러

ALGOL 68-R 컴파일러는 처음에 주소 조작과 목록 처리를 위한 확장 기능을 가진 ALGOL 60의 로컬 방언으로 작성되었습니다.파서는 J. M. 포스터의 구문 개선 장치(SID) 파서 생성기를 사용하여 작성되었습니다.

이 중 약 20K가 프로그램인데, 우리가 느끼기에 너무 큽니다.
– Currie[3]

컴파일러의 첫 번째 버전은 34,000개의 단어를 사용했습니다.이후 ALGOL 68-R로 [4]다시 쓰여져 대부분의 프로그램을 [5]컴파일하기 위해 약 36K개의 단어가 필요했습니다.

ALGOL 68-R은 ICL 1907FGeorge 3 운영 체제에서 구현되었습니다.컴파일러는 RRE(Royal Radar Establishment)를 대신해 ICL(International Computers Limited)에 의해 무료로 배포되었습니다.

컴파일된 언어의 제약사항

그것은 도덕성의 문제이다.우리에겐 성경이 있는데 넌 죄를 짓고 있어!
Mailloux[6]

원패스 컴파일을 허용하기 위해 ALGOL 68-R은 원래 [7]보고서에 정의된 언어의 서브셋을 구현했습니다.

  1. 사용하기 전에 식별자, 모드 및 연산자를 지정해야 합니다.
  2. 자동 처리 없음
  3. 명시적 VOID 모드
  4. 정식 신고자 없음
  5. 병렬 처리 없음
  6. GOTO는 생략할 수 없습니다.
  7. 단결은 강한 위치에서만 유효합니다.

이러한 제한의 대부분은 ALGOL 68에 대한 개정 보고서에 채택되었다.

사용 전 사양

ALGOL 68-R은 한 번에 컴파일을 할 수 있도록 모든 식별자를 사용하기 전에 지정(선언)해야 한다고 주장했습니다.

표준 프로그램:

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 = 구조(참조 B b), 모드 B = [1:10]참조 A;

절차 없음

표준언어에서 절차강제는 강한 맥락에서 어떤 유형의 표현을 그 유형을 반환하는 절차로 변환할 수 있다.이것은, 이름으로 콜을 실장하기 위해서 사용할 수 있습니다.

절차가 사용된 또 다른 사례는 선언문의 절차 선언이다.

PROC x + 1 = INT : x + 1;

오른쪽은 x + 1에서 정수까지의 캐스트였고, 그 후 정수를 반환하는 절차로 변환되었습니다.

ALGOL 68-R 팀은 이것이 너무 어려워서 이 언어를 두 가지 변경했습니다.절차 강제성이 폐기되고 형식 모드: expression절차 표현으로 재정의되었습니다.캐스트는 명시적인 VAL 기호로 나타납니다.

REAL : x CO ALGOL 68 CO REAL VAL x CO CO CO CO ALGOL 68-R CO의 REAL

이름으로 콜을 유효하게 사용한 코드(예를 들어 Jensen의 디바이스)는 프로시저 디노테이션에 간단하게 패스할 수 있습니다.

PROC 합계 = (INT lo, hi, PROC (INT) Real term) REAL : BEGIN 실제 온도 : = 0, i FROM LOTO HI DO 온도 +:= term (i), TEMP END; 인쇄 (1, 100, (INT i) Real : 1/i)

수정된 보고서에 정의된 언어 버전에서는 이러한 변경사항이 받아들여졌지만, 출연자의 형태는 모드(표현)로 약간 변경되었다.

REAL (x) 개정 ALGOL 68 CO에서 REAL로 주조

명시적 보이드 모드

원래 언어에서 VOID 모드는 빈 모드로 표시되었습니다.

: x : = 3.14; CO cast to void CO PROC endit = GOTO end; COvoid CO를 반환하는 절차입니다.

ALGOL 68-R 팀은 해석을 단순화하고 가독성을 높이기 위해 명시적인 VID 기호를 사용하기로 결정했습니다.

VOID VAL x : = 3.14; CO cast (x : = 3.14) to void CO PROC endit = VOID : GOTO end; COoid CO를 반환하는 절차

이러한 언어 수정은 ALGOL 68 개정 보고서에 채택되었다.

정식 신고자 없음

정식 선언자는 ID 선언 왼쪽에 있는 모드 또는 절차 선언으로 지정된 모드입니다.원래 언어에서는 어레이 경계를 포함할 수 있으며 일치하는 실제 딜레일러가 고정되었는지 여부를 FLEX 또는 다음 중 하나로 지정할 수 있습니다.

[15] INT a; CO는 실제 declarer, bounds 1:15 CO REF [3 : ] INT b = a; CO 이것은 오류 CO PROC x = (REF [ 1 : ANE] INT a) : ... 

공식 선언자 중에서 경계를 생략한 것은 합리적인 일이라고 생각합니다만, FLEX나 둘 중 하나를 생략한 것은 끔찍한 범죄라고 생각합니다.
- 린지[8]

ALGOL 68-R 팀은 공식 선언자를 바인딩된 정보를 포함하지 않는 가상 선언자와 동일하게 재정의했습니다.그들은 이것이 언어를 해석할 때 모호함을 줄였고, 그것이 실제 프로그램에서 사용되는 기능이 아니라고 느꼈다는 것을 알아냈다.

인수에 특정 경계가 필요한 프로시저는 UPB(상위) 연산자와 LWB(하위) 연산자를 사용하여 그 자체를 체크할 수 있습니다.

ALGOL 68-R 에서는, 상기의 예를 다음과 같이 재코딩 할 수 있습니다(순서의 의 범위는 발신자에 의해서 다릅니다).

[15] INT a; CO는 실제 하강기이고 CO 경계는 1:15 CO REF [] INT b = a [AT 3]; CO는 슬라이스를 사용하여 b는 경계 3:17 CO PROC x = (REF [] INT a) VID: ...발신자 CO에 의해 지정된 CO 경계

ALGOL 68에 대한 개정 보고서에서도 공식적인 경계가 삭제되었지만, FLEX 표시는 공식적인 선언자에 포함될 수 있도록 위치가 변경되었다.

[1: FLEX] INT a, CO 오리지널 ALGOL 68 또는 ALGOL 68-R CO FLEX [1:] INT a, CO 리비전 ALGOL 68, CO
PROC x = (참조 [1: FLEX] INT a) : ...CO Original ALGOL 68 CO PROC x = (REF [ ] INT a) VOID : ...CO ALGOL 68-R CO PROC x = (REF FLEX [ ] INT a) 보이드: ...CO 개정 ALGOL 68 CO

병렬 처리 없음

ALGOL에서 68 코드는 PAR에 이어서 다음과 같은 부수 조항을 작성하여 병렬로 실행할 수 있습니다.

PAR BEGIN 프로듀서, 컨슈머 엔드

절차 생산자와 소비자가 동시에 실행됩니다.기존 P(DOWN) V(UP) 연산자를 사용하는 세마포 타입(SEMA)은 병렬 절의 부분 간에 동기화를 위해 제공됩니다.

이 기능은 ALGOL 68-R에서는 실장되지 않았습니다.

ALGOL 68-RT라는 이름의 확장이 작성되었는데, ICL 1900의 서브프로그래밍 기능을 사용하여 ALGOL 68-R 프로그램에 [9]현대의 스레드 라이브러리와 유사한 의미를 가진 멀티스레딩 기능을 제공한다.런타임 라이브러리와 링커만 변경되었을 뿐 컴파일러는 변경되지 않았습니다.

goto는 생략할 수 없습니다.

ALGOL 68에서는 점프에서 GOTO 기호를 생략할 수 있다.

PROC stop = : ...; ... BEGIN IF x > 3 다음 FI 정지, CO가 아닌 점프를 실행... 정지: SKIP END

ALGOL 68-R은 원패스 컴파일러였기 때문에 너무 어려웠기 때문에 GOTO 기호는 필수적으로 사용되었습니다.

공식 하위 언어인 ALGOL [10]68S에서도 동일한 제한이 적용되었습니다.

단결은 강한 위치에서만 허용됩니다.

ALGOL 68에서 유니언은 구성 모드에서 UNION을 생성하는 강제성입니다.다음은 예를 제시하겠습니다.

MODE IBOOL = UNION (INT, BOOL), COOOLINT 또는 BOOL CO IBOOL a = TRUE, COOOL  TRUE는 IBOOL CO에 통합됨

표준 ALGOL 68의 결합은 확정 또는 강력한 컨텍스트에서 가능하므로 예를 들어 다음과 같은 공식의 오퍼랜드에 적용할 수 있습니다.

OP ISTRUE = (IBOOL a) BOOL: ...; 1(INT)이 IBOOL CO에 통합될 수 있기 때문에 ISTRUE 1 CO가 합법인 경우... 

ALGOL 68-R 구현자는 이것이 너무 많은 애매한 상황을 초래하고 있기 때문에 강력한 컨텍스트에 대한 통합 강제가 제한된다는 것을 알게 되었습니다.

이 제한의 효과는 거의 중요하지 않았으며, 필요한 경우 프로그램의 필수 지점에서 강한 맥락을 제공하기 위해 깁스를 사용하여 해결할 수 있었다.

F00L

ALGOL 68-R 컴파일러는 미사용 메모리를 -6815700으로 [11][12]초기화했습니다.

이 값이 선택된 이유는 다음과 같습니다.

  • 정수로서 그것은 큰 음수 값이었다.
  • 주소로서 ICL 1900의 실제 프로그램의 최대 주소를 초과했습니다.
  • 지시로서 그것은 불법이었다.
  • 텍스트로 표시됨F00L
  • 부동소수점 번호로서 오버플로우 비트가 설정되어 있다.

NIL을 나타내기 위해 동일한 값이 사용되었습니다.

스트로핑

일부 샘플 프로그램에서 밑줄이나 스트로핑이 없는 것을 알 수 있습니다.
Mailloux[13]

ALGOL 계열 언어에서는 언어의 식별자와 기본 기호를 구별할 필요가 있습니다.인쇄된 텍스트에서 이는 보통 굵은 글씨 또는 밑줄(예: BEGIN 또는 시작)로 기본 기호를 인쇄함으로써 달성되었습니다.

소스 코드 프로그램에서는 몇 가지 스트로핑 기술을 사용해야 했습니다.많은 ALGOL 유사 언어에서, ALGOL 68-R 이전에는, 이것은 작은 따옴표 문자(예를 들면, 시작)로 기본 기호를 묶음으로써 달성되었습니다.68-R에서 기본 기호는 대문자, 식별자는 소문자로 표기하여 구별할 수 있었다.

ALGOL 68-R이 6비트 바이트(따라서 64자 세트)의 머신에 실장되었기 때문에, 이것은 매우 복잡했습니다.최소한 처음에는 Friden Flexowriter를 사용하여 종이로 천공된 테이프에 프로그램을 구성해야 했습니다.

부분적으로 ALGOL 68-R의 경험에 기초하여, ALGOL 68에 대한 개정된 보고서는 UPER 스트로핑을 포함한 언어에 대한 하드웨어 표현을 지정했습니다.

ALGOL 68로의 확장

ALGOL 68-R에는 머신에 대한 개별 컴파일 및 저레벨 액세스를 위한 확장 기능이 포함되어 있습니다.

개별 컴파일

ALGOL 68은 강력한 유형의 언어이기 때문에 ICL 1900 시스템의 다른 언어에서 사용되는 단순한 라이브러리 시설은 충분하지 않았습니다.ALGOL 68-R은 자체 라이브러리 형식과 유틸리티와 함께 제공되어 앨범에 [14]저장될 수 있는 별도의 컴파일 코드 세그먼트 간에 모드, 함수, 변수 및 연산자를 공유할 수 있게 되었습니다.

다른 세그먼트가 이용할 수 있도록 하는 세그먼트는 이용할 수 있도록 하는 선언 목록으로 종료됩니다.

graphlib CO 세그먼트 이름 CO BEGIN MODE GRAPHDATA = STRUCTUR ( ... ); MODE GRAPH = REF GRAPHDATA; PROC 새 그래프 = ( ... ) GRAPH : ...; PROC 그리기 그래프 = (GRAPH g) VID : ...; ...그래프 끝 유지, 새 그래프, 그래프 끝 그리기

그런 다음 다른 세그먼트에서 그래프 기능을 사용할 수 있습니다.

myprog WITH graphlib FROM graph album BEGIN GRAPH g = new graph (...) ; ...그래프 그리기 (g) ; ...엔드 피니시

낮은 수준의 시스템 액세스

ALGOL68은 강력한 유형의 고급 언어로서 프로그램이 하위 수준의 하드웨어에 직접 접근하는 것을 방지합니다.예를 들어 주소 산술 연산자는 존재하지 않습니다.

ALGOL 68-R은 표준 ICL 세미 컴파일 형식(링크 지원)으로 컴파일되지 않았기 때문에 ALGOL 68-R의 기능을 제공하기 위해 언어를 확장하여 일반적으로 어셈블리 언어로 작성되는 코드를 작성할 필요가 있었습니다.기계 명령은 CODE 안에 인라인으로 작성될 수 있습니다.EDOC 섹션과 주소 조작 연산자 INC, DEC, DIF, AS가 추가되었습니다.[15]

한 예를 들면 하나의 명령을 발령하는 조지 peri 연산을 사용하여:.

[1:120]CHAR광. INTunitnumber, STRUCT(BackgroundIntelligentTransferServicetypemode, 대답, 절대 말 안 할 거야 수, REFCHAR 주소)통제 지역:)(8r47400014,0,120,buff[1]);...;코드 0,6/unitnumber, 157,6/typemode 통제 지역 유효 일자 변경의.

유용성

George 3 운영체제 에뮬레이터에서 실행 가능한 ALGOL 68-R 컴파일러의 복사본은 소스 코드와 함께 GNU General Public License([16]GPL)로 제공됩니다.

레퍼런스

  1. ^ Peck, J.E.L., ed. (1970), Proceedings of the IFIP working conference on ALGOL 68 Implementation, Munich: North-Holland, ISBN 0-7204-2045-8
  2. ^ Bond, Susan; Abbate, Janet (26 September 2001). "Oral-History: Susan Bond: Developing the World's First ALGOL 68 Compiler". Engineering and Technology History Wiki (ETHW). Institute of Electrical and Electronics Engineers (IEEE). Retrieved 22 April 2020 – via United Engineering Foundation (UEF).
  3. ^ ALGOL 68 구현, 21페이지
  4. ^ Currie, I. F.; Bond, S. G.; Morison, J. D. (1971), "ALGOL 68-R, Its Implementation and Use", Proc IFIP Congress 1971 (Information Processing 1971), Ljubljana, Yugoslavia: North-Holland, pp. 360–363, ISBN 0-7204-2063-6
  5. ^ Anonymous (January 1977). Algol 68-R System – Installation and Maintenance (PDF). Division of Computing and Software Research - Royal Radar Establishment. Retrieved 2011-04-09.[영구 데드링크]
  6. ^ ALGOL 68 구현(294페이지)
  7. ^ ALGOL 68 구현, 페이지 21-26
  8. ^ ALGOL 68 구현, 276페이지
  9. ^ Oliver, J. R.; Newton, R.S. (1979). "Practical experience with ALGOL 68-RT". The Computer Journal. 22 (2): 114–118. doi:10.1093/comjnl/22.2.114.
  10. ^ Lindsey, Charles H.; van der Meulen, S. G. (1997). "Appendix 4, the sublanguage". informal introduction to ALGOL 68 (revised). north-holland. ISBN 0-7204-0726-5.
  11. ^ Raymond, Eric S. (1996). "fool". The new hacker's dictionary; 3rd edition. MIT Press. p. 200. ISBN 978-0-262-68092-9. The Algol 68-R compiler used to initialize its storage to the character string "F00LF00LF00LF00L..." because as a pointer or as a floating point number it caused a crash, and as an integer or a character string it was very recognizable in a dump.
  12. ^ Algol 68-R 시스템 - 설치 및 유지보수, 25페이지
  13. ^ ALGOL 68 구현(30페이지)
  14. ^ Woodward, P. M.; Bond, S. G. (1974). "14 - Program segmentation". ALGOL 68-R Users Guide. Her Majesty's Stationery Office (HMSO). pp. 87–89. ISBN 0-11-771600-6.
  15. ^ Algol 68-R 시스템 - 설치 및 유지보수, 페이지 26-30
  16. ^ Toal, Graham (September 2018). "George3: Emulation of the ICL 1900". Software Preservation and Machine Emulation. Retrieved 2020-04-19.

외부 링크

  • Algol 68 – Malvern Radar and Technology History Society