에스알골

S-algol
에스알골
패러다임다중 패러다임: 절차적, 필수적, 구조적
가족알골
설계자론 모리슨, 토니 데이비
개발자세인트 앤드루스 대학교
첫 등장1979; 43년 전 (1998년)
구현 언어에스알골
플랫폼PDP-11/40, IBM System/360, VAX, Zilog Z80, Macintosh, Sun-3
OSUnix, BOS/360, VMS, CP/M
영향을 받은
알골 60
영향받은
PS-algol, Napier88

S-algol(St Andrews Algol)[1]: vii 모리슨과 토니 데이비에가 1979년 세인트 앤드루스 대학에서 개발한 ALGOL 60의 컴퓨터 프로그래밍 언어 파생 모델이다.이 언어는 모리슨이 박사학위 논문을 위해 만든 직교 데이터 유형을 포함하도록 ALGOL을 수정한 것이다.모리슨은 그 대학의 교수이자 컴퓨터 과학 학과의 책임자가 되었다.S-algol 언어는 1999년까지 학부 레벨에서 그 대학에서 가르치기 위해 S-algol 언어는 1999년까지 학부 레벨에서 이 대학에서 가르치기 위해 사용되었다.1980년대에 세인트 지방의 한 지방 학교에서 몇 년 동안 가르친 언어이기도 했다.앤드류스, 마드라스 칼리지.컴퓨터 과학 텍스트 Recursive Descent Composing[2] S-algol에서 구현된 S-algol용 재귀 강하 컴파일러를 설명한다.

PS-algol은 S-algol의 지속적인 파생물이다.1981년경 에든버러 대학교와 세인트 앤드류스에서 개발되었다.PS-algol 프로그램 종료 시 살아남는 지속적 힙 형태의 데이터 수명을 제공함으로써 데이터베이스 기능을 지원한다.

이력 및 구현

론 모리슨의 1979년 박사학위 논문 '알골의 발달에 관한 연구'는 S알골어의 설계와 구현을 기술하고 있다.[3]S-algol Reference Manual(1979, 1988) 언어를 정의하는 기술 보고서는 1975년경 언어 디자인에 대한 논의를 위해 David Turner를 포함한 여러 사람들에게 도움을 준 것에 대해 감사한다.[4]: 5 1981년 컴퓨터 과학 텍스트인 재귀적 강하 편찬은 컴파일러 구현과 부트스트래핑 과정을 기술하고 있으며,[2] 1982년 책 S알골로 프로그래밍하는 입문서는 이 언어를 사용하여 컴퓨터 프로그래밍을 가르친다.[1]

첫 번째 S-algol 구현은 Unix 운영 체제를 실행하는 PDP-11/40 컴퓨터에 있었다.[1]: vii PDP-11에서 사용할 수 있는 64킬로바이트작은 주소 공간 때문에 해석된 바이트 코드 구현이 선택되었다.[3]: 37–38 S-algol로 작성된 단일 패스, 재귀 강하 컴파일러는 S-algol 소스를 S-code로 변환한 것으로, S-algol에 맞춘 스택 기반 추상 기계의 바이트 코드다.그리고 나서 S-code는 통역관에 의해 실행되었다.S-algol 구현은 초기 Pascal 컴파일러들의 작업과 많은 유사점을 가지고 있었다.1970년대 초반부터 파스칼 P 컴파일러가 유명한 예가 될 정도로, 재귀 강하 컴파일러를 사용하여 추상적인 기계의 코드를 만드는 기술은 잘 알려져 있었다.[2]: 137 S-algol 컴파일러는 파스칼 컴파일러[5] 개발을 위해 Urs Amman이 기술한 단계적 정교화 과정을[2]: 71 이용하여 작성되었으며 파스칼의 발명가 Niklaus Wirth가 옹호하였다.[6]

PDP-11의 메모리 조직을 32K 16비트 워드로 반영하여 S-코드 명령 인코딩을 설계하여 각 바이트코드가 하나의 워드로 구성되도록 하였다.[3]: 38 초기 부트스트랩은 S-code를 생산한 IBM/360Algol W에서 S-algol 컴파일러를 작성하여 S-algol에서 S-code로 작성된 컴파일러를 컴파일하는 데 사용하는 방식으로 수행되었다.그 결과 S-code 파일은 PDP-11에 복사되어 PDP-11용으로 작성된 S-code 통역기로 실행되어 자체 호스팅이 되었다.자체 호스팅된 S-algol 컴파일러는 자신을 컴파일하기 위해 약 770만 개의 S-code 명령을 실행해 약 1만 개의 S-code 명령어(16비트 워드)의 출력 파일을 생성했다.[3]: 45

VMS를 실행하는 VAX 컴퓨터에 S-코드 통역기가 쓰여 VAX가 최초의 S-algol 포트가 되었다.S-algol은 또한 언어에 추가된 래스터 그래픽 시설을 포함하여 CP/M을 실행하는 Zilog Z80 마이크로프로세서에 포팅되었다.1983년에는 지속성 연구에 사용되는 PS-algol 시스템의 기초로 S-algol을 사용하였다.PS-algol S-code 통역기는 C에서 구현되었고, S-code 언어는 래스터 그래픽을 포함하도록 확장되었다.PS-algol 구현은 MacintoshSun 워크스테이션에 대한 S-algol 포트의 기초였으며, C에서 다시 작성된 컴파일러를 특징으로 하며 확장된 S-code를 대상으로 했다.[4]: 5

1983년에 S-algol이 PS-algol 연구의 기초가 되었고, 몇 년 후 PS-algol은 Napier88 언어와 구현의 출발점이 되었다.모든 S-algol 컴파일러가 해석할 S-코드를 생성했지만, 후기 Napier88 구현에서는 C에서 코드를 생성하여 gcc 컴파일러와 컴파일러를 컴파일하여 네이티브 코드 구현을 제공하는 실험을 했다.[7]

언어 개요

S-algol 프로그램은 선언과 조항들의 순서다.선언되는 언어 요소에는 상수, 변수, 절차 및 구조가 포함된다.상수 및 변수 선언은 초기 값을 지정해야 한다.컴파일러는 초기값의 유형으로부터 선언된 상수나 변수의 데이터 유형을 주입하기 때문에 그 유형은 명시적으로 명시되지 않는다.데이터 유형에는 정수, 리얼, 부울, 문자열, 포인터(구조물에 대한 포인터), 파일, 벡터(array) 등이 포함된다.절차 선언은 자신의 주장과 반환 값의 데이터 유형을 명시한다(공백되지 않은 경우).구조는 또한 자신의 필드의 데이터 유형을 지정한다.조항은 표현과 제어 구조를 포함한다(만약, 대소문자, 그 동안 및 그 동안 반복).if 및 case 제어 구조는 값을 가질 수 있으며 형식 호환성 규칙이 충족되는 한 표현식에 자유롭게 사용할 수 있다.[4][1]

! 코멘트는 느낌표에서 도입되어 줄의 끝까지 계속된다! 키워드는 상수와 변수의 선언을 소개한다! 식별자는 알파벳 문자에 이어 알파벳 문자나 알파벳 문자 또는 전체 중지(.)로 시작한다! 초기 값은 반드시 주어져야 하며, 이것은 선언의 데이터 유형을 결정한다.h := 10 ! := 변수의 값을 설정하며, 이것은 intlet animal := "dog"! 타입 문자열 let x := -7; let y := x + x !; 절 구분, n.a = 6.022e+23 ! = 상수의 값을 설정하는 데 사용되는 경우에만 필요한 cfloat (constant float)이다.! if and case can have values and be used in expressions let no.of.lives := if animal = "cat" then 9 else 1  ! Sieve of Eratosthenes write "Find primes up to n = ?" let n = readi                     ! constant values can be set during the program run let p = vector 2::n of true       ! vector of bool with bounds 2 to n for i = 2 to truncate(sqrt(n)) do! 인덱스에 대해 ! do!는 상수여서 p(i) do!===p(i) do! i do!n에 대한 절차 호출처럼 paren을 사용하는데 p(i) do i를 쓸 경우 : i = 2 - n do에 대해 false를 사용하는데, "n!"은 2-do의 이진 트리에 대한 새로운 ! 구조(기록) 유형이다.Cstrings!pntr 데이터 형식은 형식의 구조 지목할 수 있고, 형식 검사 런타임 구조 tree.node(cstring 이름입니다;pntr, 좌회전)에!을 끝내는 2진 트리 머리 절차로 insert.tree(cpntr, cstring 새로운 ->, pntr)!이 사건 조항은 의무적인 기본 옵션이 기본 값을 사용한다 끝나:{}만약n.지 않을 때 새로운 문자열 삽입합니다이Ded 경우 머리의 진정한)영: 새로운<>tree.node( 새로운, 영, nil), head(이름):{head( 떠났다):)insert.tree(머리(왼쪽), 새로운);머리} 새로운>head(이름):{head(바로):)insert.tree(머리( 옳은), 새로운);머리}기본:머리 절차 print.tree(cpntr 머리)한 머리~= 영!~=은 oper와 같지 않다.ator begin     print.tree(head(left))     write head(name), "'n"     print.tree(head(right)) end  let fruit := nil fruit := insert.tree(fruit, "banana") fruit := insert.tree(fruit, "kiwi") fruit := insert.tree(fruit, "apple") fruit := insert.tree(fruit, "peach") print.tree(fruit)                 ! print in sorted order  ! The end of the S-algol program is는 ?로 표시되나?

의미 원리

이름에서 알 수 있듯이 S-algol은 프로그래밍 언어의 ALGOL 계열의 일원이다.모리슨은 ALGOL 계열의 다섯 가지 특징을 파악했다.[3]: 5

  1. 범위 규칙 블록 구조로컬 환경 외부에서 정의되지 않은 로컬 양을 정의하기 위해 이름을 도입할 수 있지만, 서로 다른 환경에서는 서로 다른 개체를 나타내기 위해 동일한 이름을 모호하게 사용할 수 있다.[3]: 5
  2. 추상화 시설 – 프로그램을 단축하고 명확히 하기 위한 강력한 추상화 시설의 제공.ALGOL 계열에서는 매개변수가 있는 절차로 제공된다.[3]: 5
  3. 컴파일 시간 유형 확인 – 프로그램의 정적 분석을 통해 유형을 확인할 수 있다.[3]: 5
  4. 무한 스토어 – 프로그래머는 스토리지 할당을 담당하지 않으며 필요한 만큼 많은 데이터 객체를 생성할 수 있다.[3]: 5
  5. 선택적 매장 업데이트 – 프로그램은 상점을 선택적으로 변경할 수 있다.ALGOL 계열에서 이것은 할당 명세서에 의해 영향을 받는다.[3]: 6

S-algol은 단순함을 통한 힘, 더 큰 일반성을 통한 단순성을 통한 단순함을 제공하도록 의미 원리에 따라 설계되어 ALGOL 계열의 이전 구성원들과 차별화되도록 설계되었다.(직교 참조)모리슨은 S-algol의 설계를 안내한 세 가지 의미 원리를 설명한다.

  1. 통신의 원칙 – 이름을 지배하는 규칙은 균일해야 하며 어디에나 적용되어야 한다.이는 대부분 모든 매개변수 전달 모드에 대한 고려를 포함하여 선언과 절차 매개변수 사이의 일치에 적용된다.이 원칙은 R. D.에 의해 검토되었다.Tennent는 Pascal과 함께 일하며,[8] Peter Landin[9] Christopher Strachey의 작업에 뿌리를 두고 있다.[3]: 9–10 [10]
  2. 추상화의 원리 – 언어의 모든 의미 범주에 대해 추상화할 수 있어야 한다.표현에 대한 추상화인 함수와 문장 위에 대한 추상화인 절차를 예로 들 수 있다.테넨트와 모리슨은 이것이 추상화되어야 할 의미론적으로 의미 있는 구조를 식별하기 어렵기 때문에 적용하기 어려운 원칙이라고 지적한다.[3]: 10
  3. 데이터 유형 완전성의 원칙 – 모든 데이터 유형은 언어에서 동일한 권한을 가져야 하며, 할당 또는 매개 변수로 전달되는 등의 일반 작업에서 허용되어야 한다.[3]: 10 (일등 시민을 참조하십시오.)

Morrison은 또한 한 가지 더 기본적인 설계 고려사항을 확인한다.

  1. 개념 저장소 – 스토어(메모리 관리)에 관한 주요 설계 결정 사항에는 스토어의 사용 방법, 데이터 유형과의 관계, 포인터의 구현 및 보호(업데이트할 수 없는 일정한 위치)가 포함된다.[3]: 10–11

디자인

모리슨의 논문은 S-algol에서 설계원리가 어떻게 적용되었는지 설명한다.

데이터 유형

S-algol의 기본 데이터 유형 또는 원시 데이터 유형은 정수, 리얼, 부울, 파일 및 문자열이다. (래스터 그래픽을 지원하기 위해 라이터 픽셀과 그림 유형을 추가했다.)정수, 실제부울은 대부분의 프로그래밍 언어에 공통적인 유형이다.파일 형식은 데이터 객체를 쓰거나 읽을 수 있는 입출력(I/O) 스트림이다.당시 여러 언어로 된 문자열 타입복합형으로 간주되었지만, 이를 네이티브 타입으로 포함하면 연결, 하위 문자열 선택, 길이, 비교(등등, 이하 등)의 기본 연산을 보다 쉽게 사용할 수 있다.파스칼에서 사용되는 등장인물의 배열보다 훨씬 더 즐겁다.[3]: 12

벡터는 모든 유형의 구성요소와 함께 제공된다.모든 데이터 유형에 대해T,*T타입 T의 구성요소를 가진 벡터의 유형이다.벡터의 경계는 그 유형의 일부가 아니라 동적으로 결정되며, 다차원 배열을 벡터의 벡터로 구현한다.[3]: 12

구조 데이터 유형은 고정된 유형 각각에 대해 고정된 필드 수로 구성된다.구조물의 등급은 형식에 속하지 않지만 동적으로 결정할 수 있다.[3]: 12

벡터 및 구조물에 대한 기본 유형의 폐쇄는 무한정 많은 데이터 유형을 제공한다.언어 정의는 어떤 형식이든 허용 가능한 곳에서 사용될 수 있도록 허용한다.이것은 infix 연산자에게는 적용되지 않는데, 이는 공통 기능에 대한 통사적 설탕이며 의미론적 모델의 일부가 아니기 때문이다.[3]: 12–13

가게

벡터와 구조물은 완전한 권한을 가지고 있고 매개 변수로 전달된 대로 할당될 수 있지만, 할당 시 복사 및 전달 시 대형 객체에 비효율적일 수 있다.벡터와 구조물은 객체에 대한 포인터로 취급되며, 포인터는 파라미터로 할당되어 전달된다.ALGOL 68C에서와 같이 일반 개체로서의 포인터들Null 포인터[11] 매달린 포인터들의 문제들에 대한 C.A.R. Hoare의 우려 때문에 S-algol에 대해 거부된다.[3]: 13

S-algol은 값을 업데이트할 수 없는 개체인 참 상수 값을 제공한다.이 아이디어는 Strachey 덕분이지만, Pascal과 같은 많은 언어의 상수는 매니페스트 상수로서 컴파일 시간에 처리되고 보호되는 위치로 구현되지 않는다.또한 스칼라 타입만이 아니라 어떠한 데이터 타입의 상수도 선언할 수 있어야 한다.[3]: 13

제어 구조물

S-algol은 표현 중심의 언어로서, 진술형식 공허의 표현이다.따라서 일부 제어 구조을 산출하는 식입니다.

몇 가지 조건부 구문이 있다.조건의 2대체 버전은if <condition> then <clause> else <clause>여기서 절은 진술이나 표현이 될 수 있다.표현일 경우 유형이 동일해야 한다.외팔 조건부if <condition> do <statement>활자가 비어 있다.[3]: 13 의 사용do대신에else조건문에서는 매달리는 다른 구문적 모호성을 피한다.[2]: 20

case절에는 선택한 절을 찾기 위해 동일한 유형의 표현식에 대한 동등성 테스트를 사용하여 일치하는 모든 유형의 선택기가 있다.사례절은 성명이나 표현이 될 수 있으므로 결과절은 모두 진술(유형 무효) 또는 같은 유형의 표현이어야 한다.성냥은 순서대로 시험하므로 이는 비결정론 없는 에드스가르 디크스트라경호를 받는 명령과 닮았다.[3]: 14

반복 진술은 대부분 관습적이다.for루프는 호아레와 비슷하다.[12]제어 식별자는 일정하며 루프 내에서 수정할 수 없다.또한 관습적인 것은 다음과 같다.while <condition> do <statement>그리고repeat <statement> while <condition>루프를 돌다. The loops. Therepeat <statement> while <condition> do <statement>구성 요소는 초기 출구 또는 "n-and-aff" [13]루프를 제공한다.[3]: 14

추상화

S-algol은 표현을 함수로 추상화하며, 문장(구체적 표현)을 절차로 추상화한다.모듈은 선언의 추상화를 제공하지만, S-algol은 블록 구조화된 스코프에서 발생하는 어려움 때문에 모듈을 포함하지 않는다.마지막 통사적 범주는 시퀀서 또는 제어 구조다.Tennent는 속편이라는 용어를 시퀀서들에 대한 추상화에 사용했는데, 이것들은 gotobreak의 일반화일 것이다.이 범주에서 가장 잘 알려진 추상화는 콜 위-전류-연속이지만, 몇 년이 지나야 잘 이해될 것이다.S-algol은 goto나 break를 포함하지 않으며, sequencer에 대한 추상화는 포함하지 않는다.[3]: 14

선언 및 매개 변수

S-algol의 모든 데이터 개체는 선언되었을 때 값을 부여해야 한다.는 값 매개변수 전달에 대응하며 초기화되지 않은 값을 사용할 가능성을 제거한다.사실 값별 호출은 S-algol에서 유일한 매개변수 전달 방법이다.기준 및 결과 매개변수는 거부되며, 이는 합격 l-값에 대한 S-algol 금지와 일치한다.구조와 벡터는 객체에 대한 포인터로서 전달되지만, 이는 여전히 동작이 할당 오른쪽에서 사용되는 값과 동일하기 때문에 가치에 의해 호출된다.[3]: 15

모든 선언에는 파라메트릭 등가물이 있다.모든 절차 매개변수 유형을 지정해야 한다.매개변수로 전달된 절차에는 전체 유형이 지정되며(Pascal과는 대조적으로)[3]: 15 구조물 등급도 동일하다.

입력 출력 모델

S-algol은fileI/O 스트림의 데이터 유형 및 여러 가지 변형read그리고write기본 유형에 따라 작동하도록 정의된다.필요에 따라 이러한 간단한 설비를 개별 구현하면 확장할 수 있을 것으로 한다.[3]: 15

콘크리트 구문

ALGOL 언어는 장황하다는 비판을 받아왔다.S-algol은 덜 제한적인 구문을 제공함으로써 이것을 개선하려고 시도한다.[1]: 159 이것은 주로 선언 구문에서 증명된다.변수 선언에는 항상 초기값이 포함되어야 하므로 유형을 명시적으로 지정할 필요는 없다.[3]: 17

절차를 호출하는 위치를 조사하여 절차 매개변수와 반환 형식을 추론할 수 있지만, S-algol은 매개변수와 반환 형식을 지정해야 한다.이는 전화를 검토하지 않고도 절차를 이해할 수 있어야 하기 때문에 실질적인 결정이다.[3]: 17

대부분의 ALGOL은 모든 선언이 한 블록의 성명보다 먼저 나오도록 요구한다.S-algol에서 선언문은 모든 것이 사용되기 전에 선언되어야 하고 선언문을 뛰어넘을 수 있는 goto가 없기 때문에 진술서와 혼합될 수 있다.[3]: 17

참고 항목

참조

  1. ^ a b c d e Cole, A.J.; Morrison, R. (1982), An introduction to programming with S-algol, Cambridge University Press, ISBN 978-0-521-25001-6
  2. ^ a b c d e Davie, Antony J. T.; Ronald Morrison (1981), Brian Meek (ed.), Recursive Descent Compiling, Ellis Horwood series in computers and their applications, Chichester, West Sussex: Ellis Horwood, ISBN 978-0-470-27270-1
  3. ^ a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad Morrison, R. (1979). On the Development of Algol (PhD). University of St. Andrews. pp. 1–70.
  4. ^ a b c Morrison, Ron (1988) [1979], The S-algol Language Reference Manual (tech report CS/79/1), Fife: University of St Andrews, pp. 1–53
  5. ^ Amman, Urs (1972), "The development of a compiler", Proc. Int. Symposium on Computing, North Holland, pp. 93–99
  6. ^ Wirth, Niklaus (April 1971), "Program development by stepwise refinement", Communications of the ACM, 14 (4): 221–227, doi:10.1145/362575.362577, hdl:20.500.11850/80846
  7. ^ Bushell, SJ; Dearle, A; Brown, AL; Vaughan, FA (1994), "Using C as a Compiler Target Language for Native Code Generation in Persistent Systems" (pdf), in Atkinson, MP; Maier, D; Benzaken, V (eds.), Proc. 6th International Workshop on Persistent Object Systems (POS6), Tarascon, France, Workshops in Computing, Springer-Verlag, pp. 164–183
  8. ^ Tennent, R.D. (1977), "Language design methods based on semantic principles", Acta Informatica, 8 (2): 97–112, doi:10.1007/bf00289243
  9. ^ Landin, P.J. (March 1966), "The next 700 programming languages", Communications of the ACM, 9 (3): 157–164, doi:10.1145/365230.365257
  10. ^ Strachey, C. (1966), "Towards a formal semantics", Formal language description languages, North-Holland, pp. 198–220
  11. ^ Hoare, C.A.R. (1975), "Recursive data structures", International Journal of Computer and System Sciences, 4 (2): 105–132, doi:10.1007/bf00976239
  12. ^ Hoare, C.A.R. (1972), "A note on the for statement", BIT, 12 (3): 334–341, doi:10.1007/bf01932305
  13. ^ Edsgar Dijkstra (1973년).Donald Knuth와의 개인 통신, 인용:

외부 링크