슈퍼 파스칼
SuperPascal패러다임 | 동시, 필수, 구조화 |
---|---|
가족 | 워스 파스칼 |
설계자 | 페르 브린치 한센 |
처음 등장한 | 전( |
안정된 릴리스 | 1993년 , 전( |
타이핑 분야 | 강한. |
웹 사이트 | brinch-hansen |
영향을 받다 | |
순차 프로세스 커뮤니케이션, Pascal, Concurrent Pascal, Joyce, occam |
SuperPascal은 Per Brinch [1]Hansen에 의해 개발된 필수 동시 컴퓨팅 프로그래밍 언어입니다.이는 병렬 프로그래밍에서 개념을 명확하고 간결하게 표현할 수 있는 생각 도구인 출판 언어로 설계되었습니다.이것은, 머신의 상세나 과거의 표기법이 복잡하게 되어 있는 실장 언어와는 대조적입니다.그것은 병렬 출판 언어의 필요성을 해결하기 위해 만들어졌다.오늘날 생각의 도구로 사용될 만큼 표현력이 풍부하고 간결한 언어는 거의 없습니다.
역사와 발전
SuperPascal은 Niklaus Worth의 순차 언어 Pascal을 기반으로 하며 안전하고 효율적인 동시성을 위한 기능으로 확장합니다.파스칼 자체는 1970년대에 출판 언어로 많이 사용되었다.이것은 구조화된 프로그래밍 실습을 가르치는 데 사용되었고, 예를 들어 컴파일러와 프로그래밍 [3]언어에 관한[2] 교과서에서 다루어졌습니다.Hansen은 일찍이 Concurrent [4]Pascal이라는 언어를 개발했는데, 이것은 운영 체제와 실시간 제어 시스템의 설계를 위한 최초의 동시 언어 중 하나입니다.
SuperPascal의 요구사항은 한센이 컴퓨터 과학에서 공통적인 [5]문제에 대한 방법을 구현하는 일련의 모델 병렬 프로그램을 개발하면서 3년 동안 얻은 경험에 기초했다.이 실험을 통해 그는 과학적 병렬 컴퓨팅의 미래에 대해 다음과 같은 결론을 내릴 수 있었습니다.
- 미래의 병렬 컴퓨터는 범용성이 있어 프로그래머가 문제지향적인 프로세스 구성으로 생각할 수 있게 됩니다.이것은, 어레이, 트리, 또는 하이퍼 큐브에 접속할 수 있는 범용 프로세서인 트랜스포머의 프로그래밍 네트워크에 근거하고 있습니다.
- 계산과학의 규칙적인 문제는 결정론적 병렬화, 즉 여러 채널에서가 아니라 특정 채널에서 통신을 기대하는 것만을 필요로 한다.
- 병렬 과학 알고리즘은 우아한 출판 언어로 개발되어 순차적인 컴퓨터에서 테스트될 수 있습니다.알고리즘이 확립되면 병렬 구현 언어로 쉽게 구현할 수 있습니다.
그 결과 병렬 출판 언어에 대한 다음과 같은 요건이 발생하였습니다.
- 언어는 결정론적 병렬과 메시지 전달을 통해 널리 사용되는 표준 언어를 확장해야 한다.확장자는 표준어의 정신으로 해야 합니다.
- 언어는 통신 채널로 연결된 병렬 프로세스의 임의 구성을 프로그래밍할 수 있어야 합니다.이러한 설정은 반복적 또는 재귀적으로 정의되어 동적으로 작성될 수 있습니다.
- 이 언어를 사용하면 싱글패스 컴파일러가 병렬 프로세스가 시간 의존적인 방식으로 간섭하지 않는지 확인할 수 있습니다.
특징들
SuperPascal 설계의 핵심 아이디어는 병렬 [6][7]처리를 위한 추상적 개념과 함께 안전한 프로그래밍을 제공하는 것이었습니다.
보안.
SuperPascal은 컴파일러와 런타임 시스템이 언어 개념이 분해되어 의미 없는 [8]결과를 생성하는 경우를 가능한 많이 검출할 수 있도록 해야 한다는 점에서 안전합니다.SuperPascal은 단일 패스 컴파일러가 병렬 프로세스가 분리된 것을 확인할 수 있도록 하는 변수 사용에 제한을 가합니다. 프로세스가 글로벌 변수와 함께 프로시저를 사용하더라도 시간 의존적 오류를 제거합니다.Pascal의 일부 기능은 모호하거나 안전하지 않으며 SuperPascal에서 누락되었습니다(예: 레이블 및 ).goto
스테이트먼트, 포인터, 포워드 [6]선언을 지정합니다.
평행성
SuperPascal의 병렬 기능은 ocam 2의 서브셋으로 동적 프로세스 배열과 재귀적 [7]병렬 프로세스가 추가되었습니다.
A parallel
statement는 포함된 고정 개수의 스테이트먼트를 병렬로 실행해야 함을 나타냅니다.예를 들어 다음과 같습니다.
병렬 소스() sink() 끝
A forall
스테이트먼트는 다이내믹한 수의 프로세스에 의한 스테이트먼트의 병렬 실행을 나타냅니다.다음은 예를 제시하겠습니다.
all i : = 0 ~10 을 실행합니다()
채널 및 통신
병렬 프로세스는 동적으로 작성된 채널을 통해 입력된 메시지를 전송함으로써 통신합니다.채널 자체는 변수가 아니지만 채널 변수에 의해 유지되는 채널 참조라고 하는 고유한 값으로 식별됩니다.채널은 예를 들어 선언에 의해 선언됩니다.
유형 채널. = *(부울, 정수); 변화하다 c: 채널.;
여기에는 채널이라는 이름의 새로운 (혼합)유형과 c라는 이름의 변수가 정의됩니다.혼합형 채널은 지정된 유형(이 경우 부울값과 정수값)만 전송하도록 제한됩니다.채널 c는 에 의해 초기화됩니다.open
스테이트먼트:
오픈(c)
그런 다음 와 메시지 통신이 이루어집니다.send(channel, value)
그리고.receive(channel, variable)
진술들.값을 제공하는 식 또는 변수send
, 및 의 변수receive
둘 다 첫 번째 채널 인수와 같은 유형이어야 합니다.다음 예시는 왼쪽 채널에서 값을 수신하여 오른쪽 채널로 출력하는 프로세스에서 이러한 함수를 사용하는 방법을 보여 줍니다.
변화하다 왼쪽, 맞다: 채널.; a: 번호; 받다(왼쪽, a); 보내세요(맞다, a)
기능send
그리고.receive
는 각각 복수의 입력 인수와 출력 인수를 사용할 수 있습니다.
send(채널, e1, e2, ...en); receive(채널, v1, v2, ..., vn)
다음과 같은 런타임 통신 오류가 발생할 수 있습니다.
- 채널 경합은 2개의 병렬 프로세스가 같은 채널에서 동시에 송수신을 시도할 때 발생합니다.
- 메시지 유형 오류는 2개의 병렬 프로세스가 같은 채널을 통해 통신을 시도하고 출력 식과 입력 변수가 다른 유형일 때 발생합니다.
- 교착 상태는 송신 또는 수신 작업이 완료될 때까지 무기한 대기할 때 발생합니다.
병렬 재귀
재귀적 프로시저는 다음과 같이 조합할 수 있습니다.parallel
그리고.forall
병렬 재귀 프로세스를 생성하는 문입니다.다음 예시는 프로세스 파이프라인을 재귀적으로 정의하는 방법을 보여 줍니다.parallel
진술.
절차. 파이프라인(분, 맥스.: 정수; 왼쪽, 맞다: 채널.); 변화하다 가운데: 채널.; 시작한다. 한다면 분 < > 맥스. 그리고나서 시작한다. 열다.(가운데); 평행한 노드(분, 왼쪽, 가운데) 파이프라인(분 + 1, 맥스., 가운데, 맞다) 끝. 끝. 또 다른 노드(분, 왼쪽, 맞다) 끝.;
또 다른 예는 프로세스 트리의 재귀 정의입니다.
절차. 트리(깊이: 정수, 맨 아래: 채널.); 변화하다 왼쪽, 맞다: 채널.; 시작한다. 한다면 깊이 > 0 그리고나서 시작한다. 열다.(왼쪽, 맞다); 평행한 트리(깊이 - 1, 왼쪽) 트리(깊이 - 1, 맞다) 뿌리(맨 아래, 왼쪽, 맞다) 끝. 끝. 또 다른 잎사귀(맨 아래)
간섭 제어
동시 프로그래밍의 가장 어려운 측면은 시간에 의존하는 오류로 인해 발생하는 예측 불가능한 또는 재현 불가능한 동작입니다.시간 의존형 오류는 가변 업데이트 또는 채널 경합으로 인해 병렬 프로세스 간의 간섭에 의해 발생합니다.변수를 공유하는 프로세스가 예측 불가능한 시간에 변수를 업데이트하면 프로그램의 동작은 시간에 따라 달라집니다.마찬가지로 2개의 프로세스가 동시에 공유 채널로 송수신을 시도하면 그 결과는 시간에 따라 달라집니다.
SuperPascal은 시간 의존 오류를 최소화하거나 제거하기 위해 변수 및 통신 사용에 일정한 제한을 가합니다.변수의 경우 병렬 프로세스는 분리된 [1]변수 집합만 업데이트할 수 있다는 단순한 규칙이 필요합니다.예를 들어,parallel
하나의 대상 변수를 둘 이상의 공정에서 업데이트할 수 없지만 식 변수(업데이트할 수 없음)는 여러 공정에서 사용할 수 있습니다.경우에 따라서는 배열과 같은 변수가 여러 병렬 프로세스의 대상이며 프로그래머가 그 요소별 사용이 분리되었음을 알고 있을 때 분리 제한은 이전과 함께 재정의될 수 있습니다.[sic]
진술.
구조 및 구문
SuperPascal은 Pascal과 동일한 기본 구문을 가진 블록 구조 언어입니다.프로그램은 헤더, 전역 변수 정의, 함수 또는 프로시저 정의 및 주요 절차로 구성됩니다.함수 및 절차는 블록으로 구성되며, 여기서 블록은 문 집합입니다.문은 C나 Java와 같은 언어가 아닌 세미콜론으로 구분됩니다.이 언어에서는 세미콜론으로 끝납니다.
다음으로 100노드로 파이프라인 통신 구조를 구축하는 완전한 SuperPascal 프로그램의 예를 제시하겠습니다.마스터 노드는 정수 토큰을 제1 노드에 송신하고, 이 토큰은 파이프라인에 따라 전달되어 각 단계에서 증분되며, 마지막으로 마스터 노드에 의해 수신되어 인쇄된다.
프로그램. 파이프라인; 컨스턴트 렌 = 100; 유형 채널. = *(정수); 변화하다 왼쪽, 맞다: 채널.; 가치: 정수; 절차. 노드(i: 정수; 왼쪽, 맞다: 채널.); 변화하다 가치: 정수; 시작한다. 받다(왼쪽, 가치); 보내세요(맞다, 가치+1) 끝.; 절차. 만들다(왼쪽, 맞다: 채널.); 유형 배를 젓다 = 배열 [0..렌] 의 채널.; 변화하다 c: 배를 젓다; i: 정수; 시작한다. c[0] := 왼쪽; c[렌] := 맞다; 위해서 i := 1 로. 렌-1 하다 열다.(c[i]); 전면적으로 i := 1 로. 렌 하다 노드(i, c[i-1], c[i]) 끝.; 시작한다. 열다.(왼쪽, 맞다); 평행한 보내세요(왼쪽, 0) 만들다(왼쪽, 맞다) 받다(맞다, 가치) 끝.; 기입하다('결과값은 입니다.', 가치) 끝..
실행
SuperPascal 소프트웨어는 Brinch Hansen [9]Archive에서 무료로 액세스할 수 있습니다.컴파일러와 인터프리터로 구성되어 있으며, 둘 다 일반 순차 Pascal(ISO 레벨 1 표준 Pascal)로 작성됩니다.이것은 GNU Pascal 컴파일러와 새로운 버전의 Free Pascal 컴파일러(2.7.1+)에 의해 지원됩니다.-Miso
스위치, 코드 각각에 다음과 같은 작은 수정을 가합니다.
GPC의 경우 파일은interpret.p
비표준을 사용합니다.clock
함수(1786행), 시스템 시간을 구하는 데 사용됩니다.대신 확장 파스칼은getTimeStamp
함수는 (GNU 파스칼 컴파일러에 의해 지원됨) 유형의 변수를 선언함으로써 사용할 수 있습니다.TimeStamp
를 사용하여 현재 시각으로 설정합니다.getTimeStamp
를 할당하고 있습니다.Second
의 분야TimeStamp
변수로t
.
64비트 운영 체제의 GPC에 대해서는 GNU Pascal 컴파일러를 소스 코드로 [10]컴파일하여 설치해야 합니다.
또한 Free Pascal은 위의 "clock" 문제에 대한 해결책이 필요합니다(Windows에서는 gettickcount를 외부로 선언하고 "clock"을 이름으로 선언합니다).또한 소스 코드에 표준이 아닌 것으로 표시된 리셋/리라이트는 할당/리셋(또는 다시 쓰기) 쌍으로 변경해야 합니다. (GPC는 엄밀한 플래그를 사용하도록 설정한 경우 이 경우 오류만 발생합니다.) C preprocessor 명령어 #include 'xx'는 {$include 'x'로 변경해야 합니다.
{ Unix 시스템의 Freepascal 읽기 시간의 시간 코드} 기능. Fp 시간(변화하다 밧테루 : 정수): 정수; 외부의 이름. 'FPC_SYSC_TIME'; 절차. 읽기 시간( 변화하다 t: 정수); 시작한다. { 비표준 함수가 읽음 프로세서 시간(ms) t:=동작 시간(t); 끝.;
레퍼런스
- ^ a b Hansen, Per Brinch (1993), SuperPascal: a publication language for parallel scientific computing
- ^ Welsh, Jim (1980). Structured System Programming. Upper Saddle River, NJ, USA: Prentice-Hall. ISBN 0-13-854562-6.
- ^ Tennent, R. D. (1981). Principles of Programming Languages. Upper Saddle River, NJ, USA: Prentice-Hall. ISBN 0-13-709873-1.
- ^ Hansen, Brinch (1977). The Architecture of Concurrent Programs. Prentice-Hall. ISBN 978-0130446282.
- ^ Hansen, Brinch (May 1993), "Model programs for computational science: A programming methodology for multicomputers", Concurrency: Practice and Experience, pp. 407–423
- ^ a b Hansen, Brinch (1994). "The programming language SuperPascal". Software: Practice and Experience. 24, 5: 399–406.
- ^ a b Hansen, Brinch (1977). The invention of concurrent programming. New York: Springer-Verlag. ISBN 0-387-95401-5.
- ^ Hoare, C. A. R. (1974). "Hints on programming language design". Computer System Reliability: 505–534.
- ^ Hayden, C.C. (2008-06-11). "Per Brinch Hansen Archive". Retrieved 2020-03-03.
- ^ "4.3 Compiling GPC". GNU Pascal. 1996–2005. Retrieved 2020-03-03.
외부 링크
- 공식 웹사이트 Brinch Hansen Archive, 그의 논문 세트 및 압축 파일로 다운로드 가능한 SuperPascal 소프트웨어. 완전한 언어 사양과 유용한 문서가 포함되어 있습니다.
- Christopher Long의 원래 SuperPascal 구현의 수정된 버전인 GitHub의 Superpascal; 최신 Free Pascal에서 컴파일 및 실행; 프로그램 실행 속도는 Perl 5 또는 6보다 빠르며 Python 3만큼 빠릅니다.