시스템 프로그래밍 언어
Systems Programming Language| 패러다임 | 절차, 필수, 구조화 |
|---|---|
| 가족 | 인식하다 |
| 처음 등장한 | 전 ( |
| 영향을 받다 | |
| 알골 60, ESPOL | |
| 영향받은 | |
| ZSPL, Micro-SPL, 액션! | |
시스템 프로그래밍 언어(SPL로 줄여서 SPL/3000이라고도 함)는 HP 3000 미니 컴퓨터 제품군을 위해 Hewlett-Packard가 작성한 절차 지향 프로그래밍 언어이며 1972년에 처음 도입되었습니다.SPL은 HP 3000의 주요 운영 체제인 MPE(Multi-Programming Executive)를 작성하는 데 사용되었습니다.다른 플랫폼의 유사한 언어는 일반적으로 시스템 프로그래밍 언어라고 불리며 문제를 혼란스럽게 했습니다.
원래 Alpha Systems Programming Language로 알려진 SPL은 3000 시리즈를 제작한 개발 프로젝트의 이름을 따서 Alpha의 스택 기반 프로세서 설계를 활용하도록 설계되었습니다.이 패턴은 Burroughs B5000 메인프레임 시스템에서 사용되는 유사한 ALGOL 유래 언어인 ESPOL을 기반으로 합니다. ESPOL은 PL360 및 JOVICAL과 같은 1960년대 언어에도 영향을 미쳤습니다.
1970년대 중반까지 HP 시스템의 성공은 많은 SPL 분사를 낳았다.예를 들어 Zilog Z80 프로세서의 경우 ZSPL, Xerox Alto의 경우 Micro-SPL 등이 있습니다.이후 Atari 8비트 패밀리에 영감을 준 Action!은 상당히 성공적이었다.후자는 파스칼 구문을 더욱 밀접하게 따랐고 SPL의 특징 중 일부를 잃었다.
SPL은 원래 집적회로 기반 버전 HP 3000 플랫폼의 수명 동안 널리 사용되었습니다.1980년대에 HP 3000과 MPE는 PA-RISC 기반의 HP 9000 플랫폼에서 실행되는 에뮬레이터에 재실장되었습니다.HP는 PA-RISC에서 파스칼을 선호하는 시스템 언어로 홍보했으며 SPL 컴파일러를 제공하지 않았습니다.이로 인해 코드 유지보수에 관한 문제가 발생하였고, 이를 충족시키기 위해 서드파티제의 SPL 컴파일러가 도입되었습니다.
역사
Hewlett-Packard는 1967년에 최초의 미니 컴퓨터인 HP 2100 시리즈를 발표했습니다.이 기계는 원래 Union Carbide에서 일하는 외부 팀에 의해 설계되었으며, 광범위한 데이터 처리 시장이 아닌 산업용 임베디드 제어 용도로 주로 설계되었습니다.HP는 이를 기존 계측 비즈니스에 자연스럽게 적합하다고 보고 처음에는 이를 사용자에게 제안했습니다.그럼에도 불구하고 HP는 이 머신의 가격 대비 성능비가 비즈니스 [1][2]시장에서 점점 더 성공하고 있음을 알게 되었습니다.
이 기간 동안, 특히 코어 메모리 비용이 떨어지고 시스템이 더 많은 메모리를 탑재하기 시작하면서, 시간 공유의 개념이 대중화되었습니다.1968년 HP는 HP Time-Shared BASIC을 실행하는 2대의 2100 시리즈 머신을 사용하여 번들 시스템을 도입했습니다.이것에 의해, BASIC 프로그래밍 언어 뿐만이 아니라 완전한 operating system이 제공되었습니다.HP 2000s로 통칭되는 이러한 2대의 머신 시스템은 즉시 [3]성공했습니다.HP BASIC은 오랫동안 큰 영향력을 가지고 있으며, 그 구문은 Palo Alto TinyB를 포함한 다수의 마이크로컴퓨터 BASIC에서 확인할 수 있습니다.ASIC, Integer BASIC, North Star BASIC, Atari BASIC 등
HP의 디자이너들은 "만약 우리가 2116과 같은 고물 컴퓨터를 사용하여 이렇게 좋은 시분할 시스템을 만들 수 있다면,[4] 우리가 직접 컴퓨터를 설계한다면 무엇을 이룰 수 있을지 생각해보라"고 생각하기 시작했다.이를 위해 1968년 회사는 새로운 중간 규모 아키텍처를 설계하기 위해 더 큰 팀을 구성하기 시작했습니다.새로운 팀원 중에는 Burroughs 및 IBM 메인프레임 시스템에서 일한 경험이 있는 사람들이 포함되었으며, 그 결과 도출된 개념은 매우 성공적인 Burroughs B5000 시스템과 매우 유사했습니다.B5000은 스택 머신 프로세서를 사용하여 멀티프로그래밍을 보다 간단하게 구현했습니다.또, HP의 새로운 개념에도 [5]같은 아키텍처가 선택되었습니다.
Omega로 알려진 32비트 메인프레임 스케일 머신과 Alpha로 알려진 16비트 설계의 두 가지 구현이 검토되었습니다.거의 모든 노력이 오메가에 집중되었지만, 1970년 6월에 오메가는 취소되었다.그 결과 Alpha는 2100년대와의 차별화를 위해 광범위한 재설계를 하게 되었고, 결국 더욱 공격적인 운영체제 설계를 위한 계획을 수립하게 되었습니다.Omega는 배치 모드로 실행되어 사용자와의 상호작용을 처리하기 위해 작은 컴퓨터인 "프런트 엔드"를 사용하고자 했습니다.이것은 2000 시리즈와 같은 동작 컨셉이었습니다.그러나 2000년은 Alpha에게는 충분하지 않을 것이며, 일괄 처리,[5] 인터랙티브 처리, 실시간 처리까지 단일 처리로 결정되었습니다.
이를 실현하기 위해서는 광범위한 다이렉트 메모리 액세스(DMA)를 갖춘 고도의 컴퓨터 버스 설계가 필요했습니다.또, 유저의 조작에 신속히 대응할 수 있는 고도의 operating system(OS)이 필요했습니다.B5000은 운영 체제와 핵심 유틸리티가 모두 고급 언어인 ESPOL로 프로그래밍되었다는 점에서도 당시로서는 독특했습니다.ESPOL은 1960년대에 큰 영향을 미쳤던 개념인 B5000에서 작동하도록 조정된 ALGOL 언어의 파생어였습니다.HP 팀은 운영체제 작업에 ALGOL에서 파생된 언어도 사용하기로 결정했습니다.HP의 유사한 언어는 처음에는 Alpha Systems Programming [5]Language로 알려져 있었습니다.
알파는 1972년 HP 3000으로 등장하기까지 몇 년이 걸렸다.이 기계는 단지 몇 달 동안만 시장에 나왔지만 제대로 작동하지 않는 것이 분명했고 HP는 이미 판매된 3000대를 모두 회수해야 했다.그것은 1973년 말에 재도입되었고 대부분의 문제가 해결되었다.시스템 전체, CX 머신 및 그 위에서 실행되는 MPE-C에 대한 대규모 업그레이드로 이미지가 쇄신되어 1970년대 [5]후반에는 3000이 또 하나의 큰 성공을 거두었습니다.
이 성공으로 SPL은 2000년 시리즈의 BASIC만큼 널리 보급되었고, SPL은 그 언어처럼 다른 플랫폼용 버전도 다수 출시되었습니다.그 중 주목할 만한 것은 Xerox Alto 워크스테이션용으로 작성된 버전인 Micro-SPL이다.이 기계는 원래 BCPL을 주요 언어로 사용했지만 성능에 대한 불만 때문에 헨리 베이커가 1979년 [6]클린턴 파커와 함께 구현한 비재귀 언어를 설계하게 되었습니다.클린턴은 1983년 [7]Micro-SPL을 더욱 수정하여 Atari 8비트 패밀리용 Action!을 제작하였다.
HP는 HP 3000 시스템을 PA-RISC 칩셋에 재실장하여 MPE/iX라고 하는 새로운 버전의 운영체제를 실행하였습니다.MPE/iX는 2가지 모드를 가지고 있으며, 새로운 PA-RISC용으로 재컴파일된 어플리케이션을 "원어민 모드"로 "호환 모드"로 실행하고, 기존의 모든 에뮬레이션 소프트웨어를 통해 실행할 수 있습니다.HP는 MPE/iX용 네이티브 모드 컴파일러를 제공하지 않았기 때문에 기존 소프트웨어를 새로운 플랫폼으로 이동시키는 것이 쉽지 않았습니다.필요성을 충족시키기 위해 Allegro Consultants는 SPL 호환 언어인 "SPLASH!"를 작성했습니다.이 언어는 에뮬레이터 내에서 실행되는 원래 HP 3000 코드 또는 네이티브 모드로 컴파일할 수 있습니다.이를 통해 기존 SPL 소프트웨어의 [8]이식 경로가 제공되었습니다.
언어
기본 구문
SPL은 일반적으로 ALGOL 60 구문 규칙을 따르며, Pascal 및 Modula-2와 같은 ALGOL 또는 그 후속 제품에 대한 경험이 있는 모든 사람에게 친숙합니다.이러한 언어와 마찬가지로 프로그램 문은 여러 개의 물리적 행에 걸쳐 세미콜론으로 끝날 수 있습니다.코멘트는,COMMENT또는 << 및 [9]>>의 코멘트텍스트를 둘러싸는 것으로 합니다.
문장은 BEGIN과 END를 사용하여 블록으로 그룹화되지만, Pascal에서처럼 프로그램의 END 뒤에 마침표가 와야 합니다.프로그램 전체가 BEGIN과 END로 둘러싸여 있는데, 파스칼과 비슷하지만 [10]PROGRAM 키워드나 맨 위에 유사한 문장이 없습니다.그 이유는 SPL이 코드 블록을 자체 프로그램으로 사용하거나 다른 프로그램으로 컴파일하여 라이브러리로 사용할 수 있기 때문입니다.프로그램 또는 서브프로그램으로서의 코드 작성은 언어 자체의 일부가 아니라 대신 다음 명령어를 배치함으로써 처리됩니다.$CONTROL SUBPROGRAM 파일 [11]맨 위에 컴파일러 지시문을 표시합니다.
언어에서는 INTINL 키워드를 사용하여 외부 코드를 로컬 이름으로 직접 호출할 수 있습니다.예를 들어 콘솔 벨을 실행하는 함수를 노출하는 기계어 라이브러리는 다음과 같이 SPL 프로그램으로 가져올 수 있습니다.INTRINSIC BELL그리고 그 벨은 키워드를 사용하여 조작할 수 있습니다.BELL마치 원어민 [12]명령인 것처럼요
Pascal과는 대조적으로, Pascal은 다음과 같습니다.PROCEDURE그리고.FUNCTIONSPL은 C와 같은 접근방식을 사용합니다.PROCEDURE를 함수로 변환하기 위한 유형을 앞에 붙일 수 있습니다.다른 ALGOL과 유사한 언어의 구문에 따라 파라미터의 유형은 이름이 아닌 이름 뒤에 나열되어 있습니다.예:[13]
정수 절차 팩트(N); 값 N; 정수 N;
정수 값 N을 받는 함수 FACT를 선언합니다.그VALUE는 이 변수가 [13]프로시저의 반환값이기도 함을 나타냅니다.
ALGOL과 Pascal은 찡그렸지만 콜론으로 끝나는 선행 이름을 사용하여 코드에 라벨을 붙일 수 있었습니다.이러한 이름은 루프의 타겟으로 사용될 수 있습니다.GO TO진술들.작은 차이점 중 하나는 SPL이 다음 명령어를 사용하여 변수 섹션에서 라벨 이름을 선언해야 한다는 것입니다.LABEL키워드를 [14]지정합니다.
SPL이 이 개념에 추가된 것은ENTRY명령행에서 액세스할 수 있는 "진입점"으로 이들 라벨을 정의할 수 있는 스테이트먼트입니다.엔트리 스테이트먼트에 기재되어 있는 라벨은 운영체제에 노출되어 RUN 명령에서 호출할 수 있습니다.예를 들어 문자열 함수를 포함하는 프로그램을 작성하여 대문자 또는 소문자로 변환한 다음 이 두 가지에 대해 ENTERY 포인트를 제공할 수 있습니다.이는 명령줄에서 다음과 같이 호출할 수 있습니다.RUN $STRINGS,TOUPPER를 클릭합니다.[15]
데이터형
SPL이 ALGOL과 가장 눈에 띄는 차이점은 데이터 유형이 3000의 16비트 빅 엔디언 워드 [10]형식에 기반하여 매우 머신에 고유하다는 것입니다.
그INTEGERtype은 16비트 부호 타입으로 15비트의 값과 최하위 비트를 기호로 합니다. DOUBLE는 부동소수점 타입이 아닌 32비트 정수입니다. REAL는 32비트 부동소수점 값이며, 가수 22비트, 지수 9비트입니다.LONG는 64비트 부동소수점 값이며, 54비트의 가수 [16]및9비트의 지수입니다.
BYTE는 문자 처리에 사용되며, 2개의 8비트 문자를 포함하는 16비트 기계 워드로 구성됩니다. LOGICAL는 최상위 비트에 단일 비트를 저장하는 부울형입니다.에 필적하는 것은 없다.PACKEDPascal에서 볼 수 있는 수식어, 그래서LOGICAL기억력이 [17]다소 낭비됩니다.
C와 마찬가지로 데이터는 약하게 입력되며 메모리 위치와 가변 스토리지는 혼합된 개념이며 위치를 통해 직접 값에 액세스할 수 있습니다.예를 들어, 코드는 다음과 같습니다.
정수 A, B, C 논리 D=A+2
는 3개의 16비트 정수 변수(A, B 및 C)를 정의하고 다음으로 논리(LOGICAL)를 정의합니다.이것도 16비트 값입니다.그=Pascal과 마찬가지로, "과 동등하다"는 의미이지 "의 가치를 얻는다"는 의미는 아닙니다.:=알골어 같은 언어로.따라서 두 번째 행은 "A+2와 같은 메모리 위치에 있는 변수 D를 선언합니다."라고 되어 있으며, 이 경우 변수 C의 위치이기도 합니다.이것에 의해, 같은 값을 C 경유로 정수로 읽거나 논리 경유로 [18]D 경유로 읽거나 할 수 있습니다.
이 구문은 메모리가 일반적으로 블랙박스인 현대의 독자들에게는 이상하게 보일 수 있지만, 특정 메모리 위치가 기본 하드웨어의 값을 유지하는 시스템 프로그래밍에서 많은 중요한 용도가 있습니다.특히 값 테이블의 앞쪽을 가리키는 변수를 정의한 후 테이블 내의 개별 값을 가리키는 추가 변수를 선언할 수 있습니다.테이블 위치가 변경되면 단일 값, 즉 초기 주소만 변경하면 모든 개별 변수가 자동으로 적절한 상대적 [18]오프셋을 유지합니다.
포인터가 선언된 것은POINTER변수 선언의 수정자 및 참조된 변수의 메모리 위치@.따라서INTEGER POINTER P:=@A는 A [19]값이 아닌 변수 A의 주소가 포함된 포인터를 선언합니다. @할당의 어느 쪽에서도 사용할 수 있습니다.@P:=AA의 값을 P로 하여 포인터가 매달릴 가능성이 있습니다.@P:=@AP는 A를 가리키지만,P:=A는 A의 값을 현재 [20]P가 가리키는 위치에 배치합니다.
마찬가지로 SPL은 인덱스 변수가 초기 변수에 대해 설정된 메모리 위치로부터 오프셋된 단어 수인 C형 어레이 지원을 포함한다.C와 달리 SPL은 1차원 배열만 제공하며 [21]괄호가 아닌 괄호를 사용했습니다.변수를 선언할 수도 있습니다.GLOBAL이 경우 로컬 메모리는 따로 확보되지 않았으며 스토리지는 다른 [22]라이브러리에 선언된 것으로 간주됩니다.이 거울은extern키워드를 지정합니다.
리터럴은 다양한 접미사를 사용하여 지정할 수 있으며 접미사가 없는 접미사는 다음과 같이 가정합니다.INTEGER.예를 들어.1234로 해석될 것이다.INTEGER,하는 동안에1234D였다DOUBLE.Ea를 나타내다REAL그리고.L a LONG. 문자열 상수는 큰따옴표로 구분하고 행 내의 큰따옴표는 두 번째 [24]큰따옴표로 이스케이프합니다.[23]
변수 선언은 다음과 같이 상수를 사용하여 초기 값을 정의할 수 있습니다.INTEGER A:=10is-a가 아닌 assign-to의 사용에 주의해 주십시오.또한 SPL에는EQUATE텍스트 문자열을 변수로 정의할 수 있도록 한 다음 컴파일 중에 코드 내의 [25]변수 인스턴스를 리터럴 문자열로 바꿉니다.이것은 와 비슷합니다.const키워드를 지정합니다.
메모리 세그멘테이션
HP 3000은 바이트 지향 세그먼트 메모리 모델을 사용하여 주소가 단일 16비트 워드인 코드를 최대 65,536바이트(또는 "반쪽 워드"라고 칭함)까지 액세스할 수 있도록 했습니다.더 많은 양의 메모리에 액세스할 수 있도록 가상 메모리 시스템이 사용되었습니다.메모리에 액세스 했을 때, 16비트 주소에는, 2개의 8비트 세그먼트 값(프로그램 코드(PB)용과 가변 데이터용) 중 하나가 프리픽스 됩니다.그 결과 24비트 주소가 되었습니다.따라서 각 프로그램은 한 번에 총 128kB에 액세스할 수 있지만 세그먼트를 바꿔 16MB 메모리 [26]공간에 액세스할 수 있습니다.
SPL에는 다양한 지원 시스템이 포함되어 있어 프로그램을 쉽게 분할하여 코드 내에서 비교적 보이지 않게 할 수 있습니다.주요 메커니즘은 다음과 같습니다.$CONTROL SEGMENT=asegmentname 컴파일러 디렉티브는 다음 코드를 어느 세그먼트에 배치해야 하는지를 정의합니다.기본값은 다음과 같습니다.MAINLINESEG그러나 프로그래머는 코드를 [27]블록으로 정리하기 위해 명명된 세그먼트를 얼마든지 추가할 수 있습니다.
기타 기능
SPL에는 비트 조작을 단순화할 수 있는 "비트 추출" 기능이 포함되어 있습니다.단어 내의 임의의 비트 또는 비트스트링에는.(x:y)구문. 여기서 x와 y는 0 ~15의 시작 및 종료 비트 위치입니다.따라서A.(8:15)A를 [28]저장하는 단어의 하위 바이트를 반환했습니다.이 형식을 사용하여 필요에 따라 비트를 분할 및 병합할 수 있습니다.또한, 교대 및 회전에 대한 추가 연산이 제공되었으며, 이 연산이 있는 모든 변수에 적용될 수 있습니다.&,예를 들어.A:=A & LSR(3)를 클릭합니다.[29]
예
1984년 버전의 참조 설명서에서 나온 이 간단한 프로그램은 SPL [11]언어의 대부분의 기능을 보여줍니다.
프로그램 전체는 다음과 같이 구분됩니다.BEGIN그리고.END.글로벌 변수 A, B 및 C의 정의로 시작하여 단일 프로시저를 정의하고 20회 호출합니다.이 절차에는 BEGIN과 END가 없습니다.실제 코드는 1줄뿐이기 때문입니다.X:=X*(Y+Z);그INTEGER X,Y,Z는 코드 자체의 일부로 간주되지 않으며 위의 행에서 전달되는3개의 파라미터의 유형을 나타내며 해당 [11]행의 일부로 간주됩니다.
시작 정수 A:=0, B, C:=1; 절차 N(X,Y,Z); 정수 X,Y,Z; X:=X*(Y+Z), B:=1 ~ 20DO N(A,B,C); 종료.
레퍼런스
인용문
- ^ Leibson 2017. 오류:: 2017
- ^ "History of the 2116A digital computer". HP.
- ^ "Hewlett/Packard Computers".
The 2000A was the first HP 2000 time share system on the market ca. 1969
- ^ 그린 2004.
- ^ a b c d 에들러 1995년
- ^ Baker, Henry; Parker, Clinton (September 1979). "Micro-SPL" (PDF).
- ^ Parker, Clinton (31 December 2015). "ANTIC Interview 111, Clinton Parker, Action!" (podcast). Interviewed by Randy Kindig.
- ^ "SPLash! The Native Mode SPL Compiler for MPE/iX". Allegro Consultants. 1 January 2004.
- ^ SPL 1984, 페이지 1.2, 1.3.
- ^ a b SPL 1984, 1.1페이지
- ^ a b c SPL 1984, 1.5페이지
- ^ SPL 1984, 1.12페이지
- ^ a b SPL 1984, 페이지 1.11
- ^ SPL 1984, 3.15페이지
- ^ SPL 1984, 1.13, 1.14페이지
- ^ SPL 1984, 2.1–2.3페이지.
- ^ SPL 1984, 2.4페이지
- ^ a b SPL 1984, 3.2페이지
- ^ SPL 1984, 2.13페이지
- ^ SPL 1984, 페이지 4.4
- ^ SPL 1984, 페이지 2.12
- ^ SPL 1984, 페이지 3.6
- ^ SPL 1984, 페이지 2.6
- ^ SPL 1984, 페이지 2.11
- ^ SPL 1984, 3.18페이지
- ^ SPL 1984, 1.6–1.7페이지.
- ^ SPL 1984, 1.8페이지
- ^ SPL 1984, 페이지 4.6
- ^ SPL 1984, 페이지 4.9
참고 문헌
- Edler, Christopher (November 1995). "The Strongest Castle: The Rise, Fall and Rise of the HP 3000". The Analytical Engine. 3 (1). ISSN 1071-6351. Archived from the original on 3 February 2002.
- Green, Bob (2004). HP3000 Evolution. Robelle.
- Systems Programming Language reference manual (PDF). Hewlett-Packard. February 1984.
