IP 파스칼

IP Pascal

IP Pascal은 IP 이식성 플랫폼, 다중 머신, 운영 체제 및 언어 구현 시스템을 사용하여 Pascal 프로그래밍 언어를 구현한 것입니다.Pascaline 언어(Blaise Pascal의 계산기 이름)를 구현하고 있으며 Pascal Validation Suite를 통과했습니다.

개요

IP Pascal은 ISO 7185 Pascal의 고도로 확장된 슈퍼셋인 "Pascaline" 언어(블레이즈 파스칼의 계산기 이름)를 구현합니다.병렬 작업 모니터 개념, 동적 배열, 오버로드 및 오버라이드, 객체 및 언어에 대한 기타 마이너 확장 호스트 등 네임스페이스 제어를 포함모듈성을 추가합니다.IP는 위젯 툴킷, TCP/IP 라이브러리, MIDI 및 사운드 라이브러리 및 기타 기능을 포함한 포팅 플랫폼을 구현하여 IP Pascal로 작성된 프로그램과 IP Pascal 자체를 여러 운영 체제 및 머신으로 이동할 수 있도록 합니다.

IP Pascal은 ISO 7185 Pascal과의 호환성을 검증하기 위해 작성된 대규모 테스트 스위트인 Pascal Validation Suite를 통과한 유일한 Pascal 구현 중 하나입니다.

파스칼린은 ISO 7185 파스칼을 확장하지만 파스칼의 활자 안전을 낮추지는 않는다.이 언어의 기능은 C#과 비슷하며(C++와 유사한 언어를 구현하지만 유형의 보안은 제거됨), Pascaline은 관리 대상 프로그램을 사용할 수 있는 모든 곳에서 사용할 수 있습니다(C#보다 30년 오래된 언어에 기반함).

열림 또는 닫힘 상태

파스칼라인의 저자는 파스칼린이 독점적인 언어로 남아 있기를 바라지 않는다고 말했다.IP Pascal은 Pascaline의 구현으로 판매되지만 언어 자체는 개방적일 수 있으며 고품질 구현이 필요합니다.

이를 위해 Pascaline의 완전한 사양은 온라인으로 공개되며, 장기적인 목적은 Pascaline 준수를 구현하는 오픈 소스 P5 컴파일러 인터프리터(Wirth's P4 컴파일러 인터프리터의 ISO 7185 버전)의 버전을 만드는 것입니다.이것은 P6 컴파일러라고 불리며 공개되어 배포됩니다.

상용 제품으로서의 IP Pascal의 가치는 해당 시스템의 IDE 및 컴파일러 인코더 리소스에 기반합니다.

이 기사는 꽤 오래된 버전의 파스칼린을 따르고 있다.파스칼린의 새로운 버전은 파스칼-P 시리즈의 일부인 파스칼-P6로 존재합니다.아래의 참고 자료를 참조하십시오.

언어

IP Pascal은 ISO 7185 Pascal(Niklaus Worth의 원래 언어를 표준화한 것)로 시작하여 다음과 같이 추가합니다.

모듈(병행 태스크 구성 포함) 프로세스, 감시 및 공유

mymod 모듈(입력, 출력);
extlib을 사용합니다.const 1 = 1 ;
string = char의 packedarray입력합니다.
프로시저 wrtstr(표시 s: 문자열);
사적인
var s: 문자열;
프로시저 wrtstr(표시 s: 문자열);
var i: 정수;
시작한다.
i : = 1 ~ max ( s [ i ])의 경우는, 기입합니다.
종료.
{모니터 초기화} 시작
종료.
{shutdown monitor} 시작
종료합니다.

모듈에는 입구와 출구 섹션이 있습니다.모듈 선언은 자체 인터페이스 사양을 형성하며 인터페이스 섹션과 구현 섹션을 모두 가질 필요는 없습니다.별도의 인터페이스 선언 파일이 필요한 경우 모듈에서 코드를 제거하고 모듈의 "skeleton"을 생성함으로써 생성됩니다.이것은 보통 모듈의 오브젝트가 송신원 없이 송신되는 경우에만 실행됩니다.

모듈은 1개의 파일을 점유해야 하며 모듈은 uses 또는 joins 문을 통해 다른 모듈을 참조합니다.이를 허용하려면 모듈이 파일 이름과 동일한 이름을 가져야 합니다.uses 문은 참조 모듈이 글로벌 선언을 참조 모듈과 Marge하고 그 결과로 발생하는 이름 경합에 의해 오류가 발생함을 나타냅니다.joins 문을 사용하면 참조 모듈을 통해 참조 모듈에 액세스할 수 있지만 두 모듈의 이름 공간은 병합되지 않습니다.대신 참조 모듈은 이른바 "수식 식별자"를 사용해야 합니다.

module.identifier (모듈 식별자)

ISO 7185 파스칼로부터의 프로그램은 모듈과 직접 유사하며, 사실상 출구 섹션이 없는 모듈이다.시스템 내의 모든 모듈이 순서대로 실행되도록 "데이지 체인"되어 있기 때문에, 프로그램은 단순히 완전한 기능이 완료될 때까지 초기화를 종료하지 않는다는 이유로 프로그램의 "명령"을 가정합니다.실제로 여러 프로그램 섹션이 순차적으로 실행될 수 있습니다.

프로세스 모듈은 프로그램 모듈과 마찬가지로 초기화 섹션만 있으며 이 섹션에서 시작, 전체 기능 및 완료가 실행됩니다.그러나 프로그램 모듈을 실행하는 메인 스레드와는 별도로 실행할 자체 스레드를 가져옵니다.따라서 모니터와 모듈 공유만 호출할 수 있습니다.

모니터는 외부에서 액세스할 수 있는 절차 또는 기능에 대한 각 호출에 대한 태스크 잠금을 포함하는 모듈로, 세마포어를 통해 태스크 간의 통신을 구현합니다.

공유 모듈은 글로벌 데이터가 전혀 없기 때문에 시스템 내의 다른 모듈에서 사용할 수 있으며 라이브러리 코드를 배치하는 데 사용됩니다.

모듈 시스템은 모니터 개념을 사용하여 멀티태스킹/멀티스레딩을 직접 구현하므로 대부분의 멀티스레딩 액세스 문제를 해결할 수 있습니다.모듈의 데이터는 뮤텍스 또는 상호 배타적 섹션으로 코드에 바인딩됩니다.서브태스크/서브스레드는 프로세스 모듈에서 투과적으로 시작됩니다.여러 서브태스크/서브스레드가 모니터에 액세스하거나 모듈을 공유할 수 있습니다.공유 모듈은 데이터가 없는 모듈로, 모니터의 잠금 메커니즘이 필요하지 않습니다.

동적 어레이

IP Pascal에서는 다이내믹스는 정적 어레이의 "컨테이너"로 간주됩니다. 결과 동적 어레이가 원래 언어의 ISO 7185 정적 어레이와 완전히 호환되는 유일한 Pascal이 될 수 있습니다.정적 어레이는 절차 또는 함수에 대한 동적 어레이 파라미터로 전달하거나 새로운 어레이를 사용하여 생성할 수 있습니다.

프로그램 테스트(출력);
string = char의 packedarray입력합니다.
var s: 문자열;
프로시저 wrtstr(표시 s: 문자열);
var i: 정수;
시작한다.
i : = 1 ~ max ( s [ i ])의 경우는, 기입합니다.
종료.
시작한다.
new(s, 12); s:= 'Hello, world'; wrtstr(s^; wrtstr('That's all people')
종료합니다.

이러한 「컨테이너」어레이는, 임의의 사이즈로 할 수 있습니다.

상수 표현

상수 선언은 다른 상수의 식을 포함할 수 있습니다.

const b = a+10;

숫자의 기수

$ff, &76, %011000

영숫자 goto 라벨

라벨 출구, goto exit;

모든 라벨에 밑줄을 치다

var my_number: 정수;

숫자로 밑줄을 치다

a : = 1234_5678;

'_'(브레이크) 문자는 첫 번째 숫자를 제외한 숫자에 포함할 수 있습니다.이는 무시되며 번호의 숫자를 구분하는 데만 사용됩니다.

상수 문자열에 포함할 수 있는 특수 문자 시퀀스

const str = '스페인의 비\cr\lf';

표준 ISO 8859-1 니모닉 사용.

전달된 헤더의 복제

절차 x(i: 정수); 전달;
...
절차 x(i: 정수);
시작한다.
...
종료.

이것에 의해, 컷 앤 페이스트에 의해서 전송을 선언하는 것이 용이하게 되어, 프로시저 또는 함수의 파라메타가 실제의 헤더에 표시됩니다.

정지 절차

프로시저 오류(표시 s: 문자열);
시작한다.
writeln('**** 오류: ', s:0), 정지 {terminate program}
종료.

특별한 사전 정의된 헤더 파일

myprog(입력, 출력, 목록) 프로그램;
시작한다.
writeln(목록, '목록 시작:'); ...
프로그램 에코(출력, 명령);
var c: char;
시작한다.
Whilenot eoln(명령) dobegin
read(명령어, c); write(c)
종료; 쓰기
종료합니다.
프로그램 newprog(입력, 출력, 오류);
시작한다.
... writeln(오류, 'Bad parameter'; 중지...

'command'는 일반적인 파일 읽기 작업을 사용하여 읽을 수 있도록 명령줄에 연결하는 파일입니다.

명령줄 이름에 프로그램 헤더 파일 자동 연결

프로그램 복사(소스, 대상);
var 소스, 대상: 텍스트; c: char;
시작한다.
reset(소스); rewrite(대상); wilenot eof(소스) dobegin
Whilenot eoln (소스) dobegin
read(소스, c); write(수신처, c)
end;readln(소스); writeln(수신처)
끝.
종료합니다.

'source' 및 'destination' 파일은 프로그램의 명령줄에 있는 파라미터에 자동으로 연결됩니다.

파일 이름 지정 및 처리 작업

 프로그램. 외부 파일(산출량);  변화하다 f: 파일  정수;  시작한다.     할당하다(f, 'myfile'); { 외부 파일 이름 설정}     갱신하다(f); {기존 파일을 유지하고 쓰기 모드로 설정}     위치(f, 길이(f)); { 파일에 추가할 파일의 끝 위치 }     기입하다('파일의 끝은 다음과 같습니다.', 위치(f)); { 새 요소의 위치를 사용자에게 알립니다}     쓰다(f, 54321); { 새 마지막 요소 쓰기}     가까운.(f) { 파일 닫기}  끝.. 

구조화된 상수형을 선언하는 고정 선언

                   고정 테이블: 레코드 a의 배열 [1..5]: 정수, 패킹 배열 [1..]char end = 배열의 10]
record 1, data1 end, record 2, data2 end, record 3, data3 end, record 4, record 5, data5 end
종료.

부울 비트 연산자

프로그램 테스트, var a, b: 정수, a := a  b 시작, b := b 또는 $a5, a := b가 아닌 a := a xor b 끝. 

확장 범위 변수

프로그램 테스트; var a: linterger; b: 기수; c: lcardinal; d: 1 . maxint*2; ... 

확장 범위 사양은 -maxint 범위를 벗어나는 스칼라에 대한 규칙을 제공합니다.maxint. 가능한 숫자의 크기에 대해서는 구현에 따라 다르지만, Pascaline은 확장 범위를 이용하는 일련의 표준 유형을 정의합니다. 이중 범위 정수의 경우 링거, 부호 없는 정수의 경우 기수, 부호 없는 이중 범위 정수의 경우 lcardinal이 포함됩니다.또한 Pascaline은 이러한 유형에 대해 maxlint, maxcrd 및 maxlcrd로 새로운 제한을 정의합니다.

세마포어

모니터 테스트
var notempty, notfull: semaphore; procedure enterqueue; beginwhile nodata do wait(비어 있지 않음), ... signalone(비어 있지 않음) end; ... beginend.

세마포어는 Per Brinch Hansen이 개략적으로 설명한 고전적인 방법을 사용하여 언어로 직접 태스크 이벤트 큐잉을 구현합니다.

오버라이드

모듈 test1; 가상 프로시저 x; 시작...종료.
프로그램 테스트, test1 참여, 절차x 덮어쓰기, 상속된x 종료 시작, 종료 시작. 

다른 모듈의 프로시저 또는 함수를 덮어쓰면 해당 루틴이 효과적으로 "훅"되어 해당 루틴의 모든 발신자에 대한 정의가 대체되지만 후킹모듈에서 원래 정의를 사용할 수 있게 됩니다.이를 통해 오버라이드 모듈은 이전 절차 또는 기능에 새로운 기능을 추가할 수 있습니다.이것은, 어느 정도의 깊이까지 실장할 수 있습니다.

과부하

절차 x; 시작 끝; 과부하 절차 x(i: 정수), 시작 끝; 과부하 함수 x: 정수; 시작 xx:= 1 ;

과부하 "그룹"을 사용하면 일련의 프로시저 및/또는 기능을 동일한 이름으로 배치하고 공식 매개 변수 또는 사용 "서명"으로 액세스할 수 있습니다.개념을 구현하는 다른 언어들과 달리, 파스칼린은 과부하가 서로 모호하지 않은 한 같은 그룹에 속하는 것으로 받아들이지 않습니다.이는 과부하의 "우선순위"가 없으며 주어진 실제 참조에 대해 과부하 그룹의 어떤 루틴이 실행될지에 대한 질문도 없음을 의미합니다.

물건들

프로그램 테스트, 베이스 클래스 사용, 클래스 알파; 확장 베타; alpha_ref = alpha대한 참조; var a, b: 정수; next: alpha_ref; self: = next end; private var q: integer. var r: alpha_ref; b: 1(x): r. 

Pascaline에서 클래스는 모듈의 동적 인스턴스입니다(모듈은 클래스의 정적 인스턴스입니다).클래스는 모듈과 프로시저 및 함수 사이에 존재하는 코드 구성(유형이 아님)입니다.클래스는 모듈이기 때문에 상수, 유형, 변수, 고정, 프로시저, 함수 등의 코드구조를 정의하고 클래스 클라이언트에 공개하거나 private 키워드로 숨길 수 있습니다.클래스는 모듈이기 때문에 정규 식별자를 통해 액세스할 수 있습니다.

모듈로서의 클래스는 수식을 필요로 하지 않는다는 점에서 C# 및 C++에 있는 이름 공간에 자동으로 액세스할 수 있습니다.클래스 외부에서는 정규 식별자 또는 참조를 통해 클래스의 모든 멤버에 액세스할 수 있습니다.참조는 클래스에 따라 생성된 객체에 대한 포인터입니다.new() 문을 사용하여 "objects"로 알려진 클래스의 인스턴스를 얼마든지 만들고 dispose() 문을 사용하여 삭제할 수 있습니다.변수(또는 필드) 및 메서드와 같은 인스턴스 데이터가 연관된 클래스 구성원은 참조를 통해 액세스해야 합니다.참조는 유형이며 값이 0이 되는 기능과 다른 참조 유형과의 동일성을 확인하는 기능을 포함하여 포인터와 유사합니다.포인터 액세스를 "^"로 한정할 필요는 없습니다.

Pascaline은 참조가 인스턴스 단위인지 여부에 관계없이 객체의 모든 부분에 액세스할 수 있도록 "참조 유예" 개념을 구현합니다.이 특성을 통해 클래스 멤버를 "승격"할 수 있으며, 이 멤버는 상수에서 변수로 이동한 다음 "속성"으로 이동할 수 있습니다. "속성"은 읽기 및 쓰기 액세스가 "get" 및 "set" 메서드에 의해 제공되는 클래스 필드입니다.

및 객체의 메서드에 대해 오버로드와 오버라이드가 모두 제공됩니다.재정의되는 메서드는 virtual로 표시되어야 합니다.

오브젝트 메서드에 따라 액세스하기 위해 사용되는 참조를 변경할 수 있습니다.self키워드를 지정합니다.

단일 상속만 구현됩니다.

구조화된 예외 처리

시도하다 제외하고그렇지 않으면...던지다

"try" 문은 일련의 문을 보호할 수 있으며 코드 내에서 플래그가 지정된 예외는 "except" 후에 해당 문으로 라우팅됩니다.try 스테이트먼트에는 try 블록의 통상적인 종료시에 스테이트먼트를 실행할 수 있는 else 절도 있습니다.

예외는 throw() 프로시저를 통해 코드로 발생합니다.try 문을 사용하면 프로그램이 중첩된 블록에서 벗어나 프로시저 내 gotos(Pascaline에서 여전히 지원됨)를 더 잘 대체할 수 있습니다.처리되지 않은 예외는 기본적으로 오류를 생성하므로 throw() 프로시저는 범용 오류 플래깅시스템으로 기능할 수 있습니다.

어설션

단언(의견);

시스템 프로시저 아사트에 의해 테스트된 값이 false일 경우 프로그램이 종료됩니다.일반적으로 런타임 덤프 또는 진단에 연결되며 컴파일러 옵션을 통해 제거할 수 있습니다.

유니코드

IP Pascal은 컴파일 시에 간단한 스위치로 ISO 8859-1 모드 프로그램(8비트 문자) 또는 Unicode 모드 프로그램 중 하나를 생성할 수 있습니다(다른 많은 언어와 달리 Unicode 프로그램과 Unicode 이외의 프로그램 사이에는 소스 차이가 없습니다).텍스트 파일에는 ASCII 상향 호환 UTF-8 형식이 사용되며, 이러한 파일은 프로그램 내부의 8비트 또는 16비트 문자로 읽혀집니다(ISO 8859-1의 상위 128 문자는 8비트 문자로 인코딩된 프로그램에서도 텍스트 파일의 UTF-8 형식으로 변환됩니다).

문자 상한 상수

maxint와 마찬가지로 Pascaline은 maxchr을 가지고 있습니다.maxchr은 문자 집합에 존재하는 최대 문자입니다(그래픽으로 표현되지 않을 수도 있습니다).char 유형의 범위는 0..maxchr로 정의됩니다.이것은 "문자 집합"과 같은 유형을 처리하는 데 중요한 추가 사항이며, 다양한 문자 집합 옵션(ISO 8859-1 또는 Unicode 등)을 처리하는 데 도움이 됩니다.

모듈러 구조

IP Pascal은 모듈에 고유한 스태킹 개념을 사용합니다.각 모듈은 메모리 내에서 서로 위에 스택되고 아래에서 실행됩니다.하단 모듈이 다음 모듈을 호출하고 해당 모듈이 다음 모듈을 호출하는 등의 작업을 수행합니다.

래퍼 serlib 프로그램 캡

캡 모듈(집적회로 설계의 개념에서 따온 IP Pascal 용어로 "셀"이라고도 함)은 스택을 종료하고 프로그램이 종료될 때까지 리플 다운되는 반환 프로세스를 시작합니다.각 모듈에는 스택을 올라갈 때 시작 섹션 또는 시작 섹션이 실행되고 다시 내려갈 때 종료 섹션이 실행됩니다.

이것은 프로그램의 자연 의존성과 일치합니다."serlib"의 기본 I/O 지원과 같은 가장 원시적인 모듈은 먼저 초기화를 수행하고 스택의 상위 레벨 모듈 전후로 최종화를 수행합니다.

이식 플랫폼

IP Pascal에는 "포트 플랫폼"을 구성하는 일련의 모듈(또는 "라이브러리")이 있습니다.이러한 라이브러리는 파일 및 확장 운영 체제 기능, 그래픽, midi 및 사운드 등 적용되는 기능별로 이상적인 API를 제공합니다.전체 컬렉션은 IP Pascal이 표시되는 각 운영 체제 및 머신에 구현하기 위한 기반이 됩니다.

IP Pascal과 휴대용 그래픽 라이브러리와 단순히 결합되어 있는 다른 많은 언어의 두 가지 중요한 차이점은 다음과 같습니다.

  1. IP Pascal은 자체 로우 레벨 코드를 위해 자체 포팅 플랫폼을 사용합니다.이것에 의해, 플랫폼이 특정의 operating system 및 머신용으로 작성되면, IP 시스템과 그 컴파일 된 프로그램이 모두 그 위에서 동작할 수 있습니다.이는 Java 및 UCSD Pascal 시스템이 작동하는 방식과 유사하지만, 코드 해석이나 "저스트 인 타임" 컴파일된 코드가 아닌 진정한 고 최적화 컴파일된 코드입니다.
  2. 모듈은 Pascal의 "write" 스테이트먼트와 같은 하위 수준의 기능을 덮어쓸 수 있기 때문에 일반 ISO 7185 Pascal 프로그램에서도 포팅 플랫폼의 고급 기능을 사용할 수 있습니다.이는 C, 기타 Pascal, Visual Basic 등 사용자가 윈도우 그래픽 시스템에 액세스하기 위해 완전히 다른 I/O 방법을 사용해야 하는 많은 또는 대부분의 휴대용 그래픽 라이브러리와는 다릅니다.

시스템에 의존하지 않고 포팅 플랫폼모듈에만 의존하는 IP 모듈도 작성할 수 있습니다.그 결과 IP Pascal은 휴대성이 매우 뛰어납니다.


예:표준 "hello world" 프로그램은 그래픽 창에 출력하기 위해 결합됩니다.

프로그램 HelloWorld(출력); writeln('Hello, World!')을 시작합니다. 


예: 그래픽 명령어가 추가된 "hello world"표준 Pascal 출력문은 여전히 사용됩니다.

 프로그램. 안녕(입력, 산출량);  사용하다 그래픽스;  변화하다 음.정말: 인식하다;  시작한다.     컬러(산출량, 초록의);     커비스(산출량, 거짓의);     자동(산출량, 거짓의);     페이지입니다.(산출량);     컬러(산출량, 빨간.);     프랙트(산출량, 50, 50, 최대값(산출량)-50, 모니터(산출량)-50);     컬러(산출량, 최대값, 최대값-(최대값 나누다 3), 최대값-최대값 나누다 3);     프랙트(산출량, 50, 50, 53, 모니터(산출량)-50);     프랙트(산출량, 50, 50, 최대값(산출량)-50, 53);     컬러(산출량, 최대값 나누다 2, 0, 0);     프랙트(산출량, 52, 모니터(산출량)-53, 최대값(산출량)-50, 모니터(산출량)-50);     프랙트(산출량, 최대값(산출량)-53, 52, 최대값(산출량)-50, 모니터(산출량)-50);     폰트(산출량, 폰트_부호);     폰트 사이즈(산출량, 100);     빈비스(산출량);     컬러(산출량, 청록색);     커서(산출량, 최대값(산출량) 나누다 2-스트레이트(산출량, '안녕, 세상아') 나누다 2+3,                     모니터(산출량) 나누다 2-100 나누다 2+3);     기입하다('안녕, 세상아');     컬러(산출량, 파랑색);     커서(산출량, 최대값(산출량) 나누다 2-스트레이트(산출량, '안녕, 세상아') 나누다 2,                     모니터(산출량) 나누다 2-100 나누다 2);     기입하다('안녕, 세상아');     따라하다 이벤트(입력, 음.정말) 까지 음.정말.입력하다 = 기간   끝.. 
예: 브레이크아웃 게임.
예: 큰 창의 그래픽 클럭.

IP Pascal 모듈은 서로 "오버라이드"할 수 있기 때문에 그래픽 확장 모듈(또는 다른 유형의 모듈)은 아래 모듈에 구현된 표준 I/O 호출을 덮어쓸 수 있습니다.따라서 paslib은 읽기, 쓰기 및 기타 지원 서비스와 같은 표준 Pascal 문을 구현합니다. gralib은 이러한 서비스를 무시하고 모든 표준 Pascal I/O를 그래픽 창으로 리디렉션합니다.

이 라이브러리와 다른 구현 라이브러리의 차이점은 표준 I/O 문 사용을 중지하고 완전히 다른 일련의 호출 및 패러다임으로 전환해야 한다는 것입니다.즉, 시리얼 I/O 패러다임으로 구현된 프로그램을 그래픽 시스템으로 "전송"할 수 없습니다.

IP Pascal의 또 다른 중요한 차이점은 절차적 언어 방법을 사용하여 윈도우 그래픽 라이브러리에 액세스한다는 것입니다.대부분의 그래픽 툴킷은 오브젝트 지향 프로그래밍 방법을 툴킷에 강제로 사용합니다.그 이유 중 하나는 오브젝트 방향이 그래픽스와 잘 일치하기 때문이기도 하지만 Windows와 같은 일반적인 시스템에서 응용 프로그램이 운영체제에 대한 서비스 프로그램으로 나타나도록 강제하기 때문에 프로그램이 자체 실행을 제어하도록 하는 것이 아니라 운영체제에 의해 호출되는 기능의 집합으로 나타나기 때문입니다.n 및 운영체제를 호출합니다.이것은 일반적으로 콜백 설계라고 불립니다.객체 지향 코드는 종종 콜백과 함께 더 잘 작동하는데, 이는 프로그래머가 함수들에 대한 여러 포인터를 이벤트 처리 코드에 등록해야 하는 대신 객체의 메서드를 콜백으로 호출할 수 있기 때문이다.

오브젝트 오리엔테이션은 좋은 프로그래밍 방법이지만 IP Pascal은 프로그램을 작성하기 위한 필수 방법이 아닌 선택적인 방법입니다.IP Pascal은 절차적 방법을 사용하여 모든 그래픽 기능에 액세스할 수 있기 때문에 오래된 프로그램에는 "벼랑 끝 효과"가 없습니다.최신 프로그래밍 환경을 활용하기 위해 다시 작성할 필요는 없습니다.

IP 포팅 플랫폼의 또 다른 흥미로운 기능은 픽셀 그리드를 오버레이하는 "문자 그리드"를 제공함으로써 그래픽 환경에서도 문자 모드를 지원하며, 문자 모드 호출만 사용하는 프로그램(모든 단말기 또는 Telnet 연결에서 작동 가능)이 그래픽 환경에서 자동으로 작동한다는 것입니다.

역사

Z80의 실장

컴파일러는 1980년에 Micropolis Disk 운영 체제에서 시작되었지만 Z80에서 실행되는 CP/M으로 빠르게 이동되었습니다.원래 시스템은 Z80 어셈블리 언어로 코딩되었으며 Z80용 직접 기계 코드를 출력했습니다.링커가 없는 싱글패스 컴파일러로 컴파일러 내에 시스템 지원 라이브러리를 포함하고 생성된 코드로 재배치하여 실행 가능한 디스크 파일로 출력합니다.

컴파일러가 가동된 후 거의 정확히 1980년 새해에 컴파일러의 동반 어셈블러가 파스칼로 작성되고 링커가 Z80 어셈블리 언어로 작성되었습니다.이 홀수 조합은 64kb 제한 Z80에서는 링커 테이블이 문제가 된다는 계산이 있었기 때문에 링커는 가능한 한 작아야 했습니다.그런 다음 컴파일러와 링커 Z80 소스 코드를 마이크로폴리스 어셈블러(단일 출력 바이너리를 만든 링커리스 어셈블러)에서 새로운 어셈블러 링커 시스템으로 이동하기 위해 사용되었습니다.

그 후 컴파일러는 링커 포맷으로 출력하도록 재툴링되어 지원 라이브러리가 다른 파일로 이동되어 링크되었습니다.

1981년, 컴파일러는 레지스터 할당, 부울에서 점프, 데드 코드, 지속적인 폴딩 및 기타 최적화와 같은 최적화를 추가하기 위해 광범위하게 재설계되었다.이를 통해 Pascal 구현은 기존 Z80 컴파일러와 대부분의 8086 컴파일러보다 더 잘 벤치마킹할 수 있게 되었습니다.안타깝게도 46kb에서는 테이블이 넘쳐나기 전에 몇 페이지의 소스 코드만 컴파일할 수 있어 사용이 어려웠습니다(이것은 소규모 주소 프로세서의 대부분의 파스칼 구현에서 흔히 볼 수 있는 문제였습니다).이 시스템을 사용할 수 있었던 것은 주로 이러한 작은 객체 파일에서 대형 시스템을 구축할 수 있는 콤팩트 링커를 만들기로 결정했기 때문입니다.

그럼에도 불구하고 원래 IP Pascal 구현은 범용 컴파일러로서 1987년까지 실행되었습니다.이 단계에서 IP Pascal은 모듈러 레이아웃과 마찬가지로 C였습니다.각 소스 파일은 하나의 단위였으며 '프로그램' 모듈, 유형, 상수, 변수, 절차 또는 함수의 조합으로 구성되었습니다.이것들은 "자유 형식"이었다.절차, 함수, 유형, 상수 및 변수는 모든 블럭 외부에 있을 수 있습니다.다른 파일의 프로시저, 함수 및 변수는 '외부' 선언으로 참조되었으며, 현재 파일의 프로시저, 함수 및 변수는 '글로벌'로 선언되었습니다.각 파일은 오브젝트 파일로 컴파일된 후 링크되었습니다.개체 파일에 대한 유형 검사가 없습니다.

오리지널 컴파일러의 일부로서 디바이스 독립 터미널 I/O모듈이 생성되어 오늘날까지 남아 있는 시리얼 터미널(Turbo Pascal의 CRT 유닛과 유사)을 사용할 수 있게 되었습니다.

1985년에 파스칼로 컴파일러를 다시 쓰려는 노력이 시작되었다.새로운 컴파일러는 첫 번째 컴파일러와 관련된 메모리 문제를 해결하기 위해 설계된 중간 컴파일러와 2패스입니다.컴파일러의 프런트 엔드는 중간 코드 생성 기능을 사용하지 않고 생성 및 테스트되었습니다(파스만 해당).

1987년, IP에 사용되는 Z80 시스템이 80386 IBM-PC로 교환되었고, 그 작업은 중단되었다.그 후 ISO 7185 표준 컴파일러가 사용되었고, 32비트 DPMI 익스텐더 기반의 구현인 SVS Pascal 컴파일러로 종료되었습니다.

80386의 실장

1993년에는 ISO 7185 호환 컴파일러로 고품질의 32비트 코드를 제공하던 컴파일러가 쇠퇴하고 있었습니다.이 시점에서 선택은 파스칼 사용을 중단하거나 이전 IP 파스칼 프로젝트를 부활시켜 80386 컴파일러로 현대화하는 것이었습니다.이때 파스칼 파서와 어셈블러(Z80용)가 IBM-PC에서 사용할 수 있는 전부였습니다.1993년부터 1994년까지 어셈블러는 80386을 포함한 여러 CPU를 대상으로 모듈화되었고, Z80 어셈블리 언어 링커를 대체하는 링커가 생성되었으며, 중간 코드로 출력하기 위해 파스칼 컴파일러 프런트 엔드가 종료되었습니다.마지막으로, 중간 코드 시뮬레이터가 Pascal에 구축되어 시스템 아웃을 증명했습니다.

1994년에 이 시뮬레이터는 ISO 7185 IP Pascal "코어" 언어를 확장하여 동적 배열과 같은 기능을 포함하기 위해 사용되었습니다.

1995년에는 80386 머신 코드를 대상으로 하는 "체크 인코더"가 생성되었고 출력 객체 파일을 가져와 Windows용 "Portable Executable" 파일을 생성하기 위한 변환 프로그램이 생성되었습니다.시스템 지원 라이브러리는 IP Pascal용으로 생성되었으며 IP Pascal 자체에서 생성되었습니다.이는 나중에 라이브러리를 어셈블리 또는 다른 Pascal에서 IP Pascal로 재코딩할 필요가 없도록 하기 위한 이례적인 조치였지만 80386 코드 생성기와 라이브러리를 함께 디버깅해야 하는 문제가 있었습니다.

1996년 초에 Windows NT의 원래 타깃은 Windows 95로 전환되었고 IP Pascal은 Windows에서 80386 컴파일러로 완전히 작동하게 되었습니다.시스템의 부트스트랩은 자동적으로 행해졌고, 나머지 Pascal 코드는 SVS Pascal에서 IP Pascal로 이식되어 부트스트랩을 완료했습니다.이 과정은 DPMI 기반의 SVS Pascal이 Windows 95에서 실행할 수 있는 기능에 의해 상당히 도움이 되었습니다.그것은 DOS와 Windows 95 사이를 왔다 갔다 할 필요가 없어졌다는 것을 의미합니다.

Linux 구현

2000년에는 텍스트 모드 전용 Linux(Red Hat) 버전이 생성되었습니다.이 실장에서는 시스템콜을 직접 사용하여 glibc를 사용하지 않기 때문에 C에 필요한 풀지원 시스템이 사용되었을 때보다 더 얇은 바이너리가 작성됩니다.단, 바이너리 이식성을 희생합니다.

이 계획은 용어집 정보를 사용하는 텍스트 라이브러리와 X11 아래에 그래픽 라이브러리를 작성하는 것입니다.

"한 번 쓰고 어디서나 실행"하기 위한 단계

1997년, 최초의 1980 IP Pascal에서 Windows로 터미널 라이브러리의 버전이 이식되어 80386의 최종 인코더가 시작되었습니다.그러나 향상된 인코더를 필요로 하는 주된 이유인 실행 속도는 IBM-PC의 프로세서 속도의 증가로 인해 크게 무관하게 되었습니다.그 결과, 새로운 인코더는 2003년까지 완성되지 않았습니다.

2001년, C 헤더 파일을 Pascal 헤더 파일로 변환하기 위한 IP Pascal 지원 프로그램이 만들어졌습니다.이는 IP Pascal용 운영체제인터페이스를 수동으로 작성하는 방법을 대체하기 위한 것입니다.

2003년에는 IP Pascal용 완전한 그래픽 운영체제 독립 모듈이 생성되었습니다.

2005년에 Windows 관리 및 위젯 키트가 추가되었습니다.

레슨

돌이켜보면 Z80 버전에서 가장 큰 오류는 싱글패스 구조였다.작성자의 이전 (기본) 컴파일러는 중간 스토리지를 사용한 다중 패스였기 때문에 실제 이유는 없었습니다.유일한 이유는 싱글패스 컴파일이 더 빨라야 한다는 것이었습니다.그러나 싱글패스 컴파일은 소형 머신에 적합하지 않으며 대형 머신에서 일반적으로 사용되는 고급 최적화에 도움이 되지 않습니다.

게다가 싱글 패스 애스펙트로 인해 컴파일러가 Z80 어셈블리 언어에서 Pascal 자체에 부트스트랩되는 것을 늦추거나 방지할 수 있었습니다.컴파일러는 모노리식이었기 때문에 파스칼로의 변환은 한 번에 한 섹션씩 할 수 없었지만 일괄적인 대체품으로 진행되어야 했습니다.교체가 시작되었을 때 프로젝트는 기계보다 더 오래 지속되었습니다.2개의 패스 컴파일이 I80386의 실장에 가장 큰 도움이 된 것은 컴파일러의 프론트 엔드와 백 엔드를 통신하는 중간 명령어 표준북의 유지 보수입니다.이렇게 잘 알려진 컴파일 "단계"는 전체적인 복잡성을 줄여줍니다.직관적으로 동일한 크기의 두 프로그램을 밀접하게 결합할 경우, 복잡성은 가법적이 아니라 곱셈이 됩니다. 왜냐하면 프로그램 절반 사이의 연결이 제어 불가능하게 증가하기 때문입니다.

80386 컴파일러에서 수정된 Z80일의 또 다른 교훈은 가능한 한 많은 코드를 파스칼 자체, 심지어 지원 라이브러리에 쓰는 것이었습니다.80386 지원 코드가 모두 Pascal로 작성되었기 때문에 모듈러형으로 휴대할 수 있게 되어 대부분의 지원 코드는 운영체제 고유의 영역에서 "공통 코드" 라이브러리 섹션으로 이동하게 되었습니다.이 섹션은 각 머신과 운영체제별로 변경되지 않는 코드 전용 섹션입니다.「시스템 고유의」코드도, 실장으로부터 실장까지 약간의 수정만이 필요합니다.그 결과, 시스템을 이식하는 동안 구현 작업이 대폭 절감됩니다.

마지막으로 컴파일러를 부트스트랩하기 전에 두 번째 최적화 라운드를 시작하는 것은 오류입니다.출력 코드의 향상은 상당했지만 컴파일러의 복잡성이 증가하여 제한된 주소 공간에 문제가 발생하였습니다.그 당시에는 더 잘 최적화된 코드가 Pascal에서 코드를 부트스트래핑하는 데 도움이 되는 것으로 보였다.돌이켜보면, 나머지 어셈블리 서면 섹션이 문제였으며, 빠를수록 삭제가 필요했습니다.또 다른 방법은 공간 문제가 일시적인 것일 수 있지만 어셈블리에서 중요한 프로그램 섹션을 작성하는 것은 심각하고 지속적인 문제라는 것입니다.

추가 정보

  • Kathleen Jansen과 Niklaus Worth: PASCAL사용자 매뉴얼보고서.Springer-Verlag, 1974년, 1985년, 1991년 ISBN0-387-97649-3, ISBN0-387-90144-2ISBN3-540-90144-2[1]
  • Niklaus Worth: "프로그래밍 언어 파스칼"악타 인포마티카, 1, (1971년 6월) 35-63
  • ISO/IEC 7185: 프로그래밍 언어 - [2]PASCAL.

레퍼런스

  1. ^ Supcik, Jacques (December 5, 1997). "PASCAL - User Manual and Report". ETH Zürich: Department of Computer Science. Archived from the original on March 14, 2005. Retrieved June 23, 2005.
  2. ^ Moore, Scott A. "ANSIISO PASCAL". Moorecad.com. Retrieved February 21, 2017.

외부 링크