알골 68

ALGOL 68
알골 68
Algol68RevisedReportCover.jpg
알고리즘 언어에 관한 개정 보고서 - Algol 68 편집자: A. van Wijngaarden 외, 1973년 9월[1]
패러다임멀티패러다임:동시,필수
가족인식하다
설계자A. van Wijngaarden, B. J. Mailloux, J. E. L. Peck, C. H. A. 코스터
처음 등장한최종 보고서: 1968년, 54년 전(1968년)r0
안정된 릴리스
Algol 68/RR / 개정 보고서: 1973; 49년 전(1973년)r1
타이핑 분야정적, 강력, 안전, 구조
범위어휘
주요 구현
ALGOL 68C, Algol 68 Genie(최근), ALGOL 68-R, ALGOL 68RS, ALGOL 68S, FLACC, а 68 68 лl 68 лl / Lenegrine Unit, Odra ALGOL 68
사투리
ALGOL 68/FR (최종r0 보고서)
영향을 받다
알골 60, 알골 Y
영향받은
C,[3][5] C++,[6] Bourne 쉘, KornShell, Bash, Steelman, Ada, [7]Python, Seed7, Mary, S3

ALGOL 68(Algorithmic Language 1968의 줄임말)은 ALGOL 60 프로그래밍 언어의 후속으로 생각된 필수 프로그래밍 언어이며, 훨씬 더 넓은 응용 범위와 보다 엄격하게 정의된 구문 및 의미론을 목표로 설계되었습니다.

비표준 용어로 가득 찬 수백 페이지에 이르는 언어의 정의는 복잡하기 때문에 컴파일러 구현이 어려웠으며 "실장도 사용자도 없었다"고 알려져 있습니다.이것은 부분적으로만 해당되었습니다.ALGOL 68은 몇몇 틈새 시장, 특히 International Computers Limited(ICL) 기계와 교사 역할에서 인기가 높았던 영국에서 사용되었습니다.이러한 필드 이외에서는 사용이 상대적으로 제한되었습니다.

그럼에도 불구하고, 컴퓨터 과학 분야에 대한 ALGOL 68의 기여는 깊고 광범위하며 지속적이었지만, 이러한 기여의 대부분은 이후에 개발된 프로그래밍 언어로 다시 등장했을 때만 공개적으로 확인되었습니다.많은 언어들이 언어의 복잡성에 대한 반응으로 특별히 개발되었으며, 가장 주목할 만한 은 파스칼이거나 에이다와 같은 특정 역할을 위한 재실현이었다.

1970년대의 많은 언어들은 특정 역할에 대해 너무 복잡하거나 범위를 벗어난 것으로 여겨졌던 기능들을 버리고 일부 기능들을 선택하면서 그들의 디자인을 특별히 ALGOL 68로 추적하고 있다.에서도 특히 강력한 타이핑과 구조에 의해 ALGOL 68의 직접적인 영향을 받은 언어 C가 있다.대부분의 현대 언어들은 적어도 구문 중 일부를 C 또는 파스칼로 추적하고, 따라서 직간접적으로 ALGOL 68로 추적합니다.

개요

ALGOL68의 특징은 표현식 기반의 구문, 사용자가 선언한 유형 및 구조/태그 부착 유니온, 변수 및 참조 파라미터의 참조 모델, 문자열, 배열 및 매트릭스 슬라이싱 및 동시성을 포함한다.

ALGOL 68은 International Federation for Information Processing(IFIP) IFIP Working Group 2.1에 의해 알고리즘 언어와 계산 관련 설계되었습니다.1968년 12월 20일, 그 언어는 그룹에 의해 공식적으로 채택되었고, IFIP의 총회에 의해 출판이 승인되었다.

ALGOL 68은 Adrian van Vijngaarden에 의해 발명된 형식주의, 2단계 형식 문법을 사용하여 정의되었습니다.Van Wijngaarden 문법은 컨텍스트 프리 문법을 사용하여 특정 ALGOL 68 프로그램을 인식할 수 있는 무한한 생산 세트를 생성합니다.특히, 그들은 많은 다른 프로그래밍 언어 기술 표준에서 의미론이라고 라벨이 붙여지고 모호하기 쉬운 자연 언어 pr로 표현되어야 하는 일종의 요구사항을 표현할 수 있습니다.ose, 그 후 컴파일러에서 정식 언어 파서에 부가된 애드혹코드로 구현됩니다.

ALGOL 68은 구현되기 전에 완전한 정식 정의가 이루어진 최초의 (아마도 마지막) 메이저 언어입니다.

C. H. A. Koster[8]

ALGOL 68의 주요 목적과 설계 원칙은 다음과 같습니다.

  1. 설명의[9] 완전성과 명확성
  2. 설계[10] 직교성
  3. 보안[11]
  4. 효율성:[12]
    • 스태틱 모드 체크
    • 모드에 의존하지 않는 해석
    • 독립된 컴파일
    • 루프 최적화
    • 표현 – 최소 문자 또는 더 큰 문자 집합

ALGOL 68은 C와 같은 디자인 위원회의 일부 멤버들로부터 비판을 받아 왔습니다. A. R. HoareEdsger DijkstraALGOL 60의 단순함을 버리고 복잡하거나 지나치게 일반적인 아이디어를 위한 매개체가 되어 의도적으로 단순한 동시대의 ( 경쟁자)와 대조적으로 컴파일러 라이터의 작업을 쉽게 하기 위해 거의 노력하지 않았다.

1970년에 ALGOL 68-R은 ALGOL 68을 위한 최초의 컴파일러가 되었습니다.

1973년 개정에서는 절차, 꼼마[13]공식 경계와 같은 특정 기능이 [14]생략되었다.수정되지 않은 보고서의 언어입니다.r0

유럽 방위 기관(영국 왕립 신호레이더 확립(RSRE))은 예상되는 보안상의 이점을 위해 ALGOL 68의 사용을 장려했지만, 나토 동맹의 미국 측은 다른 프로젝트인 Ada를 개발하기로 결정하여 미국 방위 계약에 필수적으로 사용하기로 했다.

ALGOL 68은 소련에서도 현저한 영향을 미쳤으며, 자세한 내용은 안드레이 에르쇼프의 2014년 논문 "ALGOL 68과 그것이 소련과 러시아 프로그래밍에 미치는 영향"[15]과 "ALGOL 68과 그 영향"에서 확인할 수 있다.

ALGOL 68 개정 위원회의 멤버였던 Steve Bourne은 아이디어의 일부를 Bourne 쉘(그리고 Bash와 같은 Unix 쉘)과 C(그리고 C++와 같은 후예)에 가져갔다.

프로젝트의 전체 역사는 C. H. 린지의 A History of ALGOL [17][18]68에서 확인할 수 있습니다.

언어에 대한 전체 설명은 시안 마운트배튼 박사의 "AlgOL 68 Made Easy"[19] 또는 Marcel van der Veer의 "Learning ALGOL 68 Genie"[20]를 참조하십시오.

역사

오리진스

이름에서 알 수 있듯이 ALGOL 68은 1960년에 처음 공식화된 ALGOL 언어의 후속 버전입니다.같은 해 국제정보처리연맹(IFIP)은 ALGOL, 즉 WG2.1에 관한 워킹그룹을 결성하여 발족하였습니다.이 그룹은 1962년 4월에 업데이트된 ALGOL 60 사양을 로마에서 발표했습니다.1964년 3월 후속 회의에서 그룹은 두 가지 후속 표준인 ALGOL X와 LISP [21]스타일의 자체 프로그램을 수정할 수 있는 ALGOL Y에 대한 작업을 시작하기로 합의했다.

정의 프로세스

1965년 5월 프린스턴 대학에서 ALGOL X 그룹의 첫 회의가 열렸다.회의의 보고서는 두 가지 널리 뒷받침되는 주제, 즉 강력한 타이핑의 도입과 [22]수집을 다루는 '나무' 또는 '목록'의 오일러 개념에 대한 관심을 주목했다.

10월 프랑스에서 열린 두 번째 회의에서 니클라우스 비르트의 ALGOL W, Gerhard Seegmüler의 유사한 언어인 C.A.R. (토니) Hoare의 기록 구조에 대한 코멘트, Adrian van Wingaarden의 "직교 언어 설계 및 설명"이라는 세 가지 공식 제안이 제시되었다.후자는 거의 해독할 수 없는 "W-Grammar"로 쓰여졌고, 언어의 진화에 결정적인 변화를 가져왔다.회의는 W-Grammar를 [22]사용하여 Worth/Hoare의 제출서를 다시 작성하기로 합의하고 폐막했다.

단순해 보이는 이 작업은 결국 예상보다 더 어려운 것으로 판명되었고 후속 회의는 6개월 연기되어야 했다.1966년 4월 쿠트베이크에서 만났을 때, 반 빈가르덴의 초안은 미완성으로 남아 있었고, 워스와 호아레는 좀 더 전통적인 묘사를 사용한 버전을 제시했다.그들의 논문이 "잘못된 형식주의에서 올바른 언어"[23]라는 것에 일반적으로 동의하였다.이러한 접근법이 탐구됨에 따라 실제 효과가 있는 매개 변수가 기술되는 방식에 차이가 있다는 것이 분명해졌고, 워스와 호어는 더 이상의 지연이 끝이 없을 수 있다고 항의하는 동안 위원회는 반 빈가르덴의 버전을 기다리기로 결정했다.그 후 Worth는 현재의 정의를 ALGOL [24]W로 구현했습니다.

1966년 [25]10월 바르샤바에서 열린 다음 회의에서, 오크리지 국립 연구소와 일리노이 대학에서 만난 I/O 소위원회로부터 초기 보고서가 있었지만, 아직 큰 진전이 없었다.이전 회의의 두 가지 제안은 다시 검토되었고, 이번에는 포인터의 사용에 대한 새로운 논쟁이 일어났다. ALGOL W는 그것들을 레코드만을 참조하는 데 사용한 반면, van Wijngaarden의 버전은 어떤 물체도 가리킬 수 있었다.혼동을 더하기 위해 John McCarthy는 연산자 오버로드와 함께 연결하거나 구성할 수 있는 능력에 대한 새로운 제안을 제시했고, Klaus Samelson은 익명의 함수를 허용하기를 원했다.그 결과 혼란 속에서 모든 [24]노력을 포기하자는 논의가 있었다.1967년 [22]5월 잔드부트에서 ALGOL Y 회의가 열릴 예정이었던 것까지 혼란은 계속되었다.

출판

보고서 초안은 1968년 2월에 마침내 출판되었다.이것은 "충격, 공포, 반대"[22]로 대부분 읽을 수 없는 문법과 이상한 용어들로 인해 충족되었다.찰스 H. 린지는 "언어가 그 안에 숨겨져 있다"[26]는 것을 알아내기 위해 노력했는데, 이 과정에는 6주의 노력이 필요했다.그 결과 나온 논문인 "눈물이 적은 ALGOL 68"이 널리 유포되었다.1968년 5월 취리히에서 열린 광범위한 정보처리 회의에서 참석자들은 그 언어가 그들에게 강요되고 있으며 회의가 대부분 닫혀 있고 공식적인 피드백 메커니즘이 없기 때문에 IFIP가 "이 불합리한 상황의 진정한 악당"이라고 불평했다.Worth와 Peter Naur는 그 [26]당시 WG2.1에서 공식적으로 작가직을 사임했다.

다음 WG2.1 회의는 1968년 6월 티레니아에서 열렸다.컴파일러의 발매나 그 외의 문제에 대해 논의하기로 되어 있었지만, 그 대신에 언어에 관한 논의로 옮겨졌습니다.이에 대해 반 빈가르덴은 한 가지 버전의 보고서만 더 발표하겠다고 답했다.이때쯤이면 나우르, 호아레, 워스는 노력을 떠났고,[27] 몇 명은 그렇게 하겠다고 위협하고 있었다.1968년 8월 노스베릭, 1969년 1월 공식 보고서를 발표했지만 논란의 여지가 있는 마이너리티 보고서가 작성되는 등 여러 회의가 이어졌다.마지막으로 1969년 9월 앨버타주 밴프에서는 프로젝트가 완료된 것으로 간주되어 주로 에라타와 대폭 확대된 [28]보고서 개요에 대해 논의했습니다.

그 노력은 5년이 걸렸고, 컴퓨터 공학계의 많은 위대한 명사들을 불태웠으며, 몇 번인가 정의와 그룹 전체의 문제로 교착 상태에 빠졌습니다.Hoare는 "AlgOL 68에 대한 비판"[29]을 거의 즉시 발표했는데, 이것은 많은 작품에서 널리 언급되어 왔다.워스는 ALGOL W 개념을 더욱 발전시켜 1970년 파스칼로 출시했다.

실장

알골 68-R

1968년 말 초안 보고서에 기초한 이 표준의 첫 번째 구현은 1970년 7월 영국 왕립 레이더 기구에 의해 ALGOL 68-R로 도입되었다.그러나 이것은 완전한 언어의 부분집합이었고, 이 보고서의 최종 편집자인 배리 메일은 "이것은 도덕성에 대한 질문이다.우리는 성경을 가지고 있고 당신은 죄를 짓고 있다![30]그럼에도 불구하고 이 버전은 ICL 기계에서 매우 인기를 끌었고 특히 영국에서 [31]군사 코딩에서 널리 사용되는 언어가 되었습니다.

68-R의 변경 사항 중에는 모든 변수를 처음 사용하기 전에 선언해야 하는 요건이 있었다.이것은 액티베이션레코드의 변수를 위한 공간이 사용되기 전에 확보되었기 때문에 컴파일러를 원패스할 수 있다는 큰 이점이 있었습니다.그러나 이 변경은 PROC를 두 번 선언할 것을 요구하는 부작용도 있었습니다.한 번은 형식 선언으로, 또 다시 코드 본문으로 선언할 것을 요구했습니다.또 다른 변경은 값을 반환하지 않는 표현인 가정된 VOID 모드를 제거하고(다른 언어로 된 문장으로 명명됨), 가정된 곳에 VOID라는 단어를 추가할 것을 요구하는 것이었다.또, 68-R은,[30] PAR근거하는 명시적인 병렬 처리 커맨드를 없앴다.

다른이들

이 언어의 완전한 구현은 1974년 CDC 네덜란드에 의해 제어 데이터 메인프레임 시리즈에 도입되었습니다.이것은 주로 독일과 [31]네덜란드에서 가르치면서 제한적으로 사용되었습니다.

68-R과 유사한 버전은 Carnegie Mellon University에서 68S로 1976년에 도입되었으며, 다시 원패스의 다양한 단순화에 기초한 원패스 컴파일러로, DEC PDP-11과 같은 소형 머신에 사용하기 위한 것입니다.그것 역시 대부분 교육 [31]목적으로 사용되었습니다.

IBM 메인프레임 버전은 1978년 캠브리지 대학에서 출시된 이후에야 사용할 수 있게 되었습니다.이것은 "거의 완성"이었다.린지는 [31]1984년 IBM PC를 포함한 소형 기계용 버전을 출시했다.

다음 3가지 오픈소스 Algol 68 구현이 [32]알려져 있습니다.

  • a68g, GPLv3, Marcel van der Veer에 의해 작성되었습니다.
  • ALGOL 68RS오픈소스 소프트웨어 포트인 algol68toc.
  • Jose E가 작성한 GCC용 실험용 Algol68 프론트 엔드.마르체이[33]

타임라인

연도 이벤트 투고자
1959년 3월 ALGOL 게시판 제1호 (최초) 피터 나우르 / ACM
1968년 2월 초안(DR) 보고서[34] 공개 IFIP 작업 그룹 2.1
1968년 3월 알골68 뮌헨 회의r0 최종 보고서 발표 IFIP 워킹 그룹 2.1
1968년 6월 이탈리아 티레니아에서의 미팅 IFIP 워킹 그룹 2.1
1968년 8월 스코틀랜드 노스베릭에서의 미팅 IFIP 워킹 그룹 2.1
1968년 12월 뮌헨 회의에서 ALGOL 68 최종r0 보고서 발표 IFIP 워킹 그룹 2.1
1970년 4월 ICL 1907GORGE 3 아래의 ALGOL 68-R(R)에프 로열 시그널과 레이더 에스트.
1970년 7월 다트머스 시간 공유[35][36] 시스템용 ALGOL 68 시드니 마셜
1973년 9월 Algol 68 개정[37]r1 보고서 발표 IFIP 워킹 그룹 2.1
1975 ALGOL 68C(C) – 트랜스포터블 컴파일러 (zcode VM) S. 본, 앤드류 버렐, 마이클 가이
1975년 6월 G.E. 헤드릭과 앨런 로버트슨.Oklahoma State ALGOL 68 Subset Compiler. 1975년 ALGOL 68에 관한 국제회의.
1977년 6월 Strathclyde ALGOL 68 회의(스코틀랜드 ACM
1978년 5월 ALGOL H – ALGOL[38] 68의 슈퍼 언어 제안 A. P. 블랙, V. J. 레이워드 스미스
1984 Sun, SPARC 및 PC용 풀 ALGOL 68S(S) 컴파일러 C. H. 린지 외 맨체스터
1988년 8월 ALGOL Bulletin 제52호 (최종) Ed. C. H. 린지 / ACM
1997년 5월 인터넷에[39] 공개된 Algol68(S) S 찰스 H. 린지
2001년 11월 인터넷에[40] 공개된 Algol 68(G) Genie (GNU GPL 오픈소스 라이선스) 마르셀 판 데르 베어

알고리즘 언어 ALGOL 68 보고서 및 작업 그룹 멤버

Van Wijngaarden은 4명의 저자를 Koster: transputter, Peck: synternatemer, Maillous: 실행자, Van Wijngaarden: 정당 이데올로기로 특징지었습니다.– Koster

표준화 일정

1968년: 1968년 12월 20일, "최종 보고서"(MR 101)는 작업 그룹에 의해 채택되었고, 그 후 유네스코 IFIP 총회에 의해 출판이 승인되었다.러시아어, 독일어, 프랑스어, 불가리아어, 일본어[46]중국어로 번역되었다.이 표준은 점자로도 제공되었다.

1984: TC97은 ALGOL 68을 "New Work Item" TC97/N1642[2][3]로 표준화를 검토하였다.서독, 벨기에, 네덜란드, 구소련 및 체코슬로바키아는 표준 마련에 기꺼이 참여했지만, 구소련과 체코슬로바키아는 "적절한 ISO 위원회의 올바른 구성원이 아니었다"며 알골 68의 ISO 표준화가 지연되었다.[5]

1988: 이후 ALGOL 68은 러시아에서 GOST 표준 중 하나가 되었습니다.

  • GOST 27974-88 프로그래밍 언어 ALGOL 68 – 프로그램 언어 ALGOL 68[47]
  • GOST 27975-88 Programming language ALGOL 68 extended – Язык программирования АЛГОЛ 68 расширенный[48]

주요 언어 요소

굵은 기호와 예약된 단어

표준어에는 보통 굵은 글씨로 표시된 약 60개의 예약어가 포함되어 있으며 일부는 "간단한 기호"에 해당합니다.

MODE, OP, PRIO, PROC, FLEX, HEAP, LOC, LONG, REF, SHORT, BITS, BOOL, BYTES, CHAR, COMPL, INT, REAL, SEMA, STRING, VOID, CHANNEL, FILE, FORMAT, STRUCT, UNION, AT "@", EITHERr0, IS ":=:", ISNT IS NOTr0 ":/=:" ":≠:", OF "→"r0, TRUE, FALSE, EMPTY, NIL "○", SKIP "~", CO "¢", COMMENT "¢", PR, PRAGMAT, CASE ~ IN ~ OUSE ~ IN ~ OUT ~ ESAC "( ~   ~  : ~   ~ ~)"~ FROM ~ ~ BY ~ WHILE ~ DO ~ OD, IF ~ THEN ~ ELIF ~ THEN ~ ELSE ~ FI ( ~ : ~ ),  BEGIN ~ END ( ~ ), GOTO, 출구 "□"r0경우.

단위: 식

기본 언어 구성은 단위입니다.단위는 공식, 동봉된 절, 루틴 텍스트 또는 기술적으로 필요한 여러 구성물(할당, 점프, 건너뛰기, 니힐) 중 하나일 수 있습니다.기술 용어 폐쇄 절은 다른 현대 언어에서 block, do 문, switch 문으로 알려진 본질적으로 괄호화된 구조 중 일부를 통합합니다.키워드를 사용하면 일반적으로 인클로저의 끝에는 도입 키워드의 역문자 시퀀스가 사용됩니다(: IF ~ THEN ~ ELSE ~ FI, CASE ~ IN ~ OUT ~ ESAC, FOR ~ WHILE ~ DO ~ OD).이 Guarded Command 구문은 공통 Unix Bourne 쉘에서 Stephen Bourne에 의해 재사용되었습니다.표현식은 또한 부수 절에 의해 다른 값으로부터 구성되는 다중 값을 산출할 수 있다.이 구성은 프로시저 호출의 파라미터 팩과 비슷합니다.

모드: 선언

기본 데이터 유형(호출)modes in Algol 68 paralance)는real,int,compl(복소수),bool,char,bits그리고.bytes. 예:

INT n = 2; CO n은 2의 상수로 고정된다. CO n은 CO INT m : = 3; CO m은 새로 생성된 국소 변수이며, 값은 처음에 3으로 설정되었다. CO CO CO CO CO CO 이것은 ref m = loc int : = 3; CO REAL Avogadro = 6.0221415 23, CO Avogadro의 긴 실수의 약자이다.-1의 루트 = 0 ÷ 1;

단, 선언은REAL x;통사당일 뿐이다REF REAL x = LOC REAL;.그것은,x는 새로 생성된 로컬 REAL 변수에 대한 참조의 상수 식별자입니다.

게다가, 양쪽 모두를 정의하는 것이 아니라float그리고.double, 또는int그리고.long그리고.short, 등, ALGOL 68은 수식자를 제공하므로, 현재 공통인double 예를 들어 LONGREAL 또는 LONGREAL로 표기됩니다.전주 상수 max real그리고.min long int다양한 구현에 맞게 프로그램을 조정하기 위해 제공됩니다.

모든 변수를 선언해야 하지만 처음 사용 전에 선언할 필요는 없습니다.

primitive-declarer: INT, REAL, COMPLEXG, BOOL, CHAR, String, BITS, BYTS, FORMAT, FILE, 파이프G, 채널, SEMA

  • BITSBOOL의 '팩 벡터'
  • 바이트CHAR의 '팩 벡터'
  • STRINGCHAR플렉시블 배열.
  • SEMA오퍼레이터 레벨로 초기화할 수 있는 SEMAphore.

다양한 유형 생성자를 사용하여 단순한 유형에서 복합 유형을 생성할 수 있습니다.

  • REF 모드– C/C++ Pascal의 REF와 유사한 유형 모드의 값을 참조합니다.
  • STRUCT – C/C++의 STRUCT Pascal의 RECORD와 같은 구조를 구축하는 데 사용됩니다.
  • UNION – C/C++ 및 Pascal과 같은 유니언 구축에 사용
  • PROC – C/C++의 함수 및 Pascal의 프로시저/함수 등의 프로시저를 지정하는 데 사용됩니다.

일부 예에 대해서는 ALGOL 68과 C++비교를 참조하십시오.

기타 선언 기호: FLEX, HEAP, LOC, REF, LONG, SHORT, EVENTS

  • 유연성 – 어레이는 유연성이 뛰어나며 필요에 따라 길이를 늘릴 수 있습니다.
  • [HEAP] : 글로벌히프에서 변수를 빈 공간으로 할당합니다.
  • LOC: 변수에 로컬스택의 빈 공간을 할당합니다.
  • 길이 – INT, REAL 또는 COMP가 긴 크기임을 선언합니다.
  • SHORTINT, REAL 또는 COMP가 더 짧은 크기임선언합니다.

모드(유형)의 이름은 모드 선언을 사용하여 선언할 수 있습니다. 모드 선언은 C/C++의 TYPEF 및 Pascal의 TYPE과 유사합니다.

INT max=99; MODE new mode = [0:9][0:max]구조(LONG REAL a, b, c, SHORT INT i, j, k, REF REAL r );

이는 다음 C 코드와 유사합니다.

  컨스턴트 인트 맥스.=99;   유형화된 구조 {       이중으로 하다 a, b, c; 짧다 i, j, k; 흘러가다 *r;   } 새로운 모드[9+1][맥스.+1]; 

ALGOL68은 등호 왼쪽에 NEWMODE 모드 표시만 나타나며, 가장 주목할 만한 것은 우선순위에 관계없이 왼쪽에서 오른쪽으로 구성이 이루어져 읽을 수 있다.또한 Algol 68 배열의 하한은 기본적으로 1이지만 -max int ~ max int의 임의의 정수일 수 있습니다.

모드 선언을 사용하면 유형을 재귀화할 수 있습니다. 직접 또는 간접적으로 그 자체로 정의할 수 있습니다.여기에는 몇 가지 제한이 따릅니다.예를 들어, 다음과 같은 선언은 불법입니다.

모드 A = REF A 모드 A = 구조(A, B) 모드 A = PROC(A) A

다음 항목이 유효한 경우:

모드 A = 구조(참조 A, B) 모드 A = PROC(참조 A) REF A

강압: 캐스팅

강압은 세 가지 기준에 따라 강압으로부터 강압을 생산한다: 강압의 적용 전 강압의 선험적 모드, 강압의 후순적 모드, 강압의 구문적 위치 또는 "정렬".강압은 계단식으로 진행될 수 있습니다.

가능한 6가지 강압을 디프로세싱, 디프로세싱, 디레퍼런스, 통합, 확대, 조정, 배뇨라고 한다.결합을 제외한 각 강요는 관련된 값에 대응하는 동적 효과를 규정한다.그러므로, 많은 원시적인 행동들은 강압에 의해 암묵적으로 프로그램될 수 있다.

콘텍스트 강도– 허용 강제:

  • 소프트 – 절차 해제
  • 약한 – 비논리적이거나 절차 해제되어 이름 붙임성
  • meek – 회의 또는 절차 해제
  • 단단함 – 온순함, 그 후 단결함
  • 강한 – 단단하고 그 뒤에 확폭, 노 젓기 또는 배뇨가 뒤따른다.

예가 있는 강제 계층

ALGOL68은 프로그램 내의 특정 포인트에서 이용 가능한 강압의 종류를 결정하는 콘텍스트의 계층을 가진다.다음의 콘텍스트가 있습니다.

맥락
컨텍스트 위치 강제 사용 가능 콘텍스트에서의 강제 예시
부드러운
약한
미크
회사.
강한.
강한.
오른쪽:
  • 아이덴티티 선언(~)은 다음과 같습니다.REAL x = ~
  • 초기화('~'로 표시):REAL x := ~

기타:

  • 에서 "~"와 같은 콜의 실제 파라미터:PROC: sin(~)
  • 다음에서 "~"와 같이 캐스트 절을 동봉합니다.REAL(~)
  • 루틴 텍스트 단위
  • VOID를 산출하는 스테이트먼트
  • 균형 절의 모든 부분(하나 제외)
  • 아이덴티티 관계의 일면(다음에서 "~"로 표시: ~ IS ~
절차 해제
모든 SOFT 및 Weak Derferencing(디레퍼런스 또는 디프로시저링, 이름 생성)
모두 WEARK 후 회의 해제(회의 해제 또는 절차 해제)
모든 MICK 후 통합
모든 것이 단단해진 후 확폭, 조정 또는 배뇨

정밀도 손실이 없는 경우 확폭구간이 발생합니다.예를 들어 다음과 같습니다.INTREAL로, REALLONG REAL로 강제됩니다.하지만 그 반대는 아니다.예:

  • INT에서 Long INT로
  • INT to Real
  • 고객님께는 진짜
  • BITS to [ ]B울다
  • 바이트문자열

변수를 길이 1의 배열로 강제(행)할 수도 있습니다.

예를 들어 다음과 같습니다.

  • INT to [1]인트
  • REAL to [1]REAL 등
회사.
  • 수식의 연산자 "~"는 다음과 같습니다.OP: ~ * ~
  • 트랜스포트 콜의 파라미터
예:

UNION(INT,REAL) var := 1

미크
  • Trimscripts(INT 실행)
  • 문의: 아래 예: "~"

IF ~ THEN ... FI그리고.FROM ~ BY ~ TO ~ WHILE ~ DO ... OD etc

  • 콜의 프라이머리(예: sin(x)의 sin)
예:
  • Ref Ref BOOL에서 BOOL로
  • 참조 참조 INT에서 INT로
약한
  • 슬라이스의 주: "~"와 같이~[1:99]
  • 2차 선택 항목(다음에서 "~"로 표시:value OF ~
예:
  • Ref BOOL에서 Ref BOOL로
  • 참조 INT에서 참조 INT로
  • REF REF REAL REF REAL
  • REF REF 구조물과 REF 구조체 연결
부드러운
할당의 LHS(~)는 다음과 같습니다.~ := ... 예:
  • 절차 해제:PROC REAL random: e.g. random

프라이머리, 세컨더리, 제3 및 제4의 상세한 것에 대하여는, 오퍼레이터의 우선 순위를 참조해 주세요.

PR & co: 프래그마트와 코멘트

플러그매트는 프로그램 내의 지시어로 컴파일러에 대한 힌트입니다.새로운 언어에서는 "pragmas"('t' 없음)라고 부릅니다.

PRUGMAT 힙=32 PRUGMAT PR 힙=32 PR

코멘트는 다양한 방법으로 삽입할 수 있습니다.

① 프로그램에 2센트 상당의 코멘트를 추가하는 원래의 방법  코멘트 「대담한」코멘트 코멘트 i 코멘트 CO# Style i 코멘트 # Style i 코멘트 # £ 이것은 영국 키보드의 해시/파운드 코멘트입니다.

통상은, 코멘트는 ALGOL 68 에 네스트 할 수 없습니다.다른 코멘트 딜리미터를 사용하면 이 제한을 회피할 수 있습니다(예를 들어 일시적인 코드 삭제에만 해시 사용).

표현식 및 복합문

ALGOL68은 표현 지향 프로그래밍 언어이며, 할당문에 의해 반환되는 값은 수신처에 대한 참조이다.따라서 유효한 ALGOL 68 코드는 다음과 같습니다.

REAL 하프 파이, 1 파이, 1 파이 : = 2 * ( 하프 파이 : = 2 * 아크 태닝 (1) )

이 개념은 특히 CPerl에 존재합니다.Algol 60 및 FORTRAN 등의 이전 언어에서와 마찬가지로 식별자에 공백이 허용되므로half pi단일 식별자입니다(밑줄낙타 대 소문자 대 소문자모든 문제를 회피합니다).

또 다른 예로, 합계의 수학적 아이디어를 표현하기 위해f(i)i=1에서 n까지는 다음 ALGOL 68 정수식으로 충분하다.

(INT sum : = 0, FOR i TO n DO sum +:= f(i) OD, sum)

정수 표현식이기 때문에 이전 코드 블록은 정수 값을 사용할 수 있는 모든 컨텍스트에서 사용할 수 있습니다.코드 블록은 마지막으로 평가한 식 값을 반환합니다. 이 아이디어는 다른 언어 중에서도 리스프에 있습니다.

복합문은 모두 고유한 닫힘 괄호로 끝납니다.

  • IF 선택 절:
IF 조건 THEN 스테이트먼트 [ELSE 스테이트먼트]FI "개요" 형식: ( condition 스테이트먼트)
IF condition 1 THEN 스테이트먼트 ELIF condition 2 THEN 스테이트먼트 [ELSE 스테이트먼트]FI "개요" 형식: ( condition 1 스테이트먼트: condition 2 스테이트먼트)

이 스킴은, 행잉 하는 그 외의 문제를 회피할 뿐만 아니라,BEGIN그리고.END내장 스테이트먼트시퀀스에 포함되어 있습니다.

  • CASE 선택 조항:
케이스 스위치 입력 문, 문...[OUT 스테이트먼트] ESAC "개요" 형식: ( switch 스테이트먼트, 스테이트먼트 등)스테이트먼트)
케이스 스위치1 입력문, 문...OUSE 스위치2 IN 문, 문...[OUT 스테이트먼트] ESAC의 CASE 스테이트먼트의 "개요" 형식: ( switch1 스테이트먼트, 스테이트먼트 등): switch2 문, 문...스테이트먼트)

간단한 기호가 있는 선택 절 예제:

의 PROC 일수 = (INT 년, )INT: (31번째 달, (year××4=0 ∧ year××10000 ∨ year××400=0 29 28), 31, 30, 31, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30

굵은 기호가 있는 선택 절 예제:

의 PROC 일수 = (INT 년, )INT: 사례월 31일 MOD 4 EQ 0  연도 MOD 100 NE 0 또는 연도 MOD 400 EQ 0에 이어 29 기타 28 FI, 31, 30, 30, 30, 30, 31, 31, 31 ESAC;

굵은 글씨 기호와 간단한 기호를 혼합한 선택 절 예제:

의 PROC 일수 = (INT 년, )INT: CASE month IN 「Jan」31 「Feber」(연식 MOD 4 = 0 AND year MOD 100 0 0 OR year MOD 400 0 0 29 28 ), 「Mar」31, 30, 31, 30, 31, 31, 31, 31, 31, 31, 12월~12월 ESAC.

Algol68에서는 스위치를 INT 타입 또는 (고유한) UNION 타입 중 하나로 할 수 있습니다.후자를 사용하면 UNION 변수(예: 아래 c.f. union)에 강력한 입력을 적용할 수 있습니다.

  • do loop 구:
[ 색인] [처음부터] [증분 기준] [마지막까지] [WHEN 조건] DO  OD "루프 절"의 최소 형식은 다음과 같습니다: DO  OD

이것은 「범용」루프로 간주되어 완전한 구문은 다음과 같습니다.

i의 경우 i×i do4444 DO ~ OD 동안 -22 ~ -333까지

이 구조에는 몇 가지 특이한 측면이 있습니다.

  • DO ~ OD 부분만 필수이며, 이 경우 루프가 무기한 반복됩니다.
  • 따라서 TO 100 DO ~ OD는 100회만 반복됩니다.
  • WHILE "통사적 요소"를 통해 프로그래머는 FOR 루프에서 조기에 벗어날 수 있었습니다.
INT sum sq:=0, FOR i WHIRE print("지금까지:",i,newline), sq≠70↑2 DO sum sq+=i↑2 OD

표준 Algol68에 대한 후속 "확장"을 통해 TO 구문 요소UPTO로 대체하고 DOWNTO를 통해 작은 최적화를 달성할 수 있었다.같은 컴파일러에도 다음 컴파일러가 포함되어 있습니다.

  • [TIL] : 레이트루프 종료용(C).
  • FOREACH(S) – 어레이 병렬 작업용.

그 외의 예는, 다음의 코드 예제는 다음과 같습니다.

구조, 조합 및[:]: 구조, 유니언 및 어레이

ALGOL68은 임의의 수의 치수를 가진 배열을 지원하며 전체 또는 일부 행 또는 열을 슬라이스할 수 있습니다.

모드 벡터 = [1:3] REAL, # 벡터 모드 선언(표준) # 모드 매트릭스 = [1:3, 1:3]REAL; # 매트릭스 모드 선언(정렬 정의) # VECTER v1 := (1,2,3) # []REAL v2 = (4,5,6) # 상수 배열, VECTER와 동등유형, 경계가 암묵적 # OP + = (Vector a,b) 벡터 정의자 #2진수 OPVE #ut); MATrix m : = (v1, v2, v1+v2); print ((m[,2:]); # 두 번째 및 세 번째 열의 슬라이스

행렬은 어떤 방식으로든 슬라이스할 수 있습니다. 예:

REF 벡터 행 = m[2,]; # 두 번째 행에 대한 REF(영역) 정의 # REF 벡터 col = m[,2]; # 두 번째 열에 대한 REF(영역) 정의 #

ALGOL 68은 다중 필드 구조(STRUCT) 및 통합 모드를 지원합니다.참조 변수는 배열 슬라이스 및 구조 필드를 포함한 모든 MODE를 가리킬 수 있습니다.

예를 들어 기존의 링크드리스트 선언을 다음에 나타냅니다.

MODE NODE = UNION (VOID, REAL, INT, CONF, STRING), 목록 = 구조(NODE val, REF LIST 다음);

NODEUNION CASE 사용 예:

1968년 최종 보고서와 같은 Algol68r0 1973년 개정 보고서와 같은 Algol68r1
노드 n := "1234"; REAL r; INT i; CONF c; STRING s CASE r,i,c:=n IN print("real:",r), print("int("int:",i), print("com:), c)), print("clint("cling:", c)), print("string("string:", s"), s)Out(?, s) 출력 출력(?, s) ES.
노드 n : = "1234"; # 또는 n : = EMTY; # CASE n IN (VOID) : print ("class:", "EMPTY"), (REAL r) : print ("real:", r), (INT i) : print ("int ("int:), (compled) , cring S , string