SNOBOL
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
SNOBOL은 1960년대에 개발된 문자열 처리 중심의 프로그래밍 언어이다. 초기에는 다항식 조작 도구로 시작하여, IBM 7090용 어셈블리어로 구현되었다. SNOBOL3는 널리 사용되었지만, 이후 다양한 자료형과 가상 머신을 통한 이식성을 강화한 SNOBOL4가 개발되었다. SNOBOL4는 문자열, 패턴, 배열 등 다양한 자료형을 지원하며, 패턴 매칭 기능을 통해 텍스트 처리에 강점을 보인다. SNOBOL은 인터프리터 방식으로 구현되었으며, SPITBOL과 같은 컴파일러도 존재한다. 현재 Macro SNOBOL4, Catspaw SNOBOL4, Minnesota SNOBOL4 등의 구현이 존재하며, Snocone과 같은 확장 언어도 개발되었다. 이름은 'snowball's chance in hell'에서 유래하여 SNOBOL로 명명되었다.
더 읽어볼만한 페이지
- 1962년 개발된 프로그래밍 언어 - 시뮬라
시뮬라는 1960년대 노르웨이에서 개발된 프로그래밍 언어로, 시뮬레이션용으로 개발되었으나 객체 지향 프로그래밍 개념을 도입하여 후대 언어에 영향을 미쳤으며 코루틴, 클래스, 상속 등의 기능을 제공한다. - 패턴 매칭 프로그래밍 언어 - AWK
AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다. - 패턴 매칭 프로그래밍 언어 - 하스켈
하스켈은 해스켈 커리의 이름을 딴 순수 함수형 프로그래밍 언어로, 여러 함수형 언어 통합 노력의 결과로 탄생하여 느긋한 계산법, 패턴 매칭, 타입 클래스, 모나드 등의 특징을 가지며 GHC가 표준 구현체로 사용된다. - 텍스트 지향 프로그래밍 언어 - Tcl
Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다. - 텍스트 지향 프로그래밍 언어 - PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
SNOBOL - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
언어 유형 | 텍스트 문자열 지향 프로그래밍 언어 |
이름 | 스노볼 |
개발 | |
최초 설계자 | David J. Farber, Ralph Griswold, Ivan P. Polonsky |
개발자 | David J. Farber, Ralph E. Griswold, Ivan P. Polonsky, 벨 연구소 |
발표 연도 | 1962년 |
최신 버전 | SNOBOL4 |
최신 버전 발표일 | 1967년 |
특징 | |
프로그래밍 패러다임 | 명령형 프로그래밍, 절차적 프로그래밍, 비구조적 프로그래밍 |
구현체 | SNOBOL, SPITBOL |
영향을 받은 언어 | COMIT |
영향을 준 언어 | AWK, SL5, Icon, bs, Lua |
웹사이트 | 스노볼 공식 웹사이트 |
2. 개발
SNOBOL은 텍스트 처리를 목적으로 1960년대에 개발된 프로그래밍 언어이다.[19] 초기 버전은 개발자가 다항식을 기호적으로 조작하기 위해 IBM 7090용 어셈블리어로 작성되었으며, 매우 단순한 특징을 가졌다. 이후 사용이 확산되면서 함수 추가 등 기능 확장을 거쳐 SNOBOL3가 개발되었으나, 이 과정에서 여러 비호환 버전이 생겨나는 문제가 발생했다.[20] (SNOBOL2는 사용자 지정 함수가 없는 중간 개발 단계였으며 출시되지 않았다.)
이러한 문제들을 해결하고 1960년대 말에 도입된 새로운 컴퓨터를 활용하기 위해, 다양한 자료형과 기능을 갖추고 가상 머신을 이용하여 컴퓨터 간 이식성을 개선한 SNOBOL4가 1966년 이후 개발되었다.[19][20] SNOBOL4 언어 번역기는 SNOBOL 구현 언어(SIL)라는 가상 기계어를 정의하여 이식성을 높였다.
SNOBOL이라는 이름의 유래에 대해서는 두 가지 설이 있다. 하나는 "문자열 지향 기호 언어"를 의미하는 영어 ''''s'''tri'''n'''g '''o'''riented sym'''bo'''lic '''l'''anguageeng'의 백 트로님이라는 설이고, 다른 하나는 'snowball's chance in hell'(지옥에 눈덩이가 있을 가능성, 즉 전혀 가망이 없다는 뜻)이라는 영어 표현에서 유래했다는 설이다.[19]
SNOBOL은 '테이블'(table)이라고 불리는 기능을 구현했는데, 이는 후에 연관 배열로 발전하여 많은 언어에서 채택되었다. 따라서 SNOBOL은 연관 배열의 시조라고 할 수 있다. 또한, 기술된 문자열의 패턴을 인식하고 분할하는 강력한 기능을 통해 문자열 분석에 뛰어난 성능을 보였다.
SNOBOL 개발을 주도한 Griswold는 SNOBOL의 후계 언어로서 Icon을 개발했다.
2. 1. SNOBOL1
초기 SNOBOL 언어는 개발자들이 다항식을 기호적으로 조작하기 위한 도구로 만들어졌다. IBM 7090 컴퓨터용 어셈블리어로 작성되었으며, 매우 단순한 특징을 가졌다. 문법이 간단했고, 자료형은 오직 문자열 하나만 존재했다. 또한 함수나 변수 선언 기능이 없었으며, 오류를 제어하는 기능도 거의 갖추지 않았다. 본래 개인적인 용도로 만들어졌지만, 이러한 단순함 덕분에 다른 그룹에서도 사용하기 시작했다. 사용이 확산되면서 개발자들은 언어를 확장하고 개선할 필요성을 느끼게 되었고, 이는 후속 버전 개발로 이어졌다.2. 2. SNOBOL2
SNOBOL2는 존재했지만, 사용자 정의 함수가 없는 단명한 중간 개발 버전이었으며, 출시되지 않았다.2. 3. SNOBOL3
초기 SNOBOL 언어는 단순했지만 사용이 확산되면서 개발자들은 이를 확장하기로 결정했다. 언어를 재작성하고 함수들을 추가했는데, 여기에는 표준 함수와 사용자 지정 함수가 모두 포함되었다. 이렇게 개선된 버전이 SNOBOL3이다.[20] (SNOBOL2는 사용자 지정 함수가 없는 중간 개발 단계였으며 출시되지 않았다.)SNOBOL3는 상당한 인기를 얻었고, 다른 프로그래머들이 IBM 7090 외의 다른 컴퓨터용으로 이식하기도 했다. 그러나 이 과정에서 여러 호환되지 않는 버전(방언)이 생겨나는 문제가 발생하였다.[20] 이러한 문제와 추가적인 확장 요구는 이후 SNOBOL4 개발의 배경이 되었다.
2. 4. SNOBOL4
SNOBOL3가 대중화되면서 언어 확장 요구가 늘어났고, 여러 비호환 버전으로 인한 문제도 발생했다. 이러한 문제들을 해결하고 1960년대 후반에 등장한 새로운 컴퓨터를 효과적으로 활용하기 위해 SNOBOL4가 개발되었다.[7] SNOBOL4는 이전 버전에 비해 훨씬 다양한 자료형과 기능을 갖추었으며, 특히 가상 머신을 도입하여 컴퓨터 기종 간의 이식성을 크게 향상시킨 것이 특징이다.[20][7]SNOBOL4의 언어 번역기 자체는 여전히 어셈블리어로 작성되었지만, 어셈블러의 매크로 기능을 활용하여 'SNOBOL 구현 언어'('''SIL''', SNOBOL Implementation Language)라는 가상 기계어를 정의했다. 이 SIL 덕분에 매크로 어셈블러나 고수준 언어가 있는 어떤 기계든 가상 명령어를 구현하여 번역기를 비교적 쉽게 이식할 수 있게 되었다.[8] 이러한 기계 독립적인 SIL의 개발은 초기 SNOBOL 구현에서 널리 사용된 더글러스 매킬로이(Douglas McIlroy)의 문자열 조작 매크로를 일반화하는 과정에서 영향을 받았다. 또한 매킬로이는 1969년에 SNOBOL4에 '테이블'(table) 자료형을 추가할 것을 제안하여 언어 발전에 기여했는데,[9][10] 이 테이블 기능은 이후 다른 프로그래밍 언어에서 연관 배열이라는 이름으로 널리 채택되는 기능의 시초가 되었다.
SNOBOL4는 1966년 이후 개발되었다.[19]
3. 기능
SNOBOL4는 정수, 제한된 정밀도의 실수, 문자열, 패턴, 배열, 테이블(연관 배열)과 같은 여러 내장 자료형을 지원한다. 또한 프로그래머가 추가적인 자료형과 새로운 함수를 정의할 수도 있다. 프로그래머가 직접 자료형을 정의하는 기능은 당시로서는 진보적인 것으로, 초기 코볼이나 이후 파스칼의 레코드와 유사한 개념이다.
모든 SNOBOL 명령 줄은 다음과 같은 형식을 가진다.
:''레이블 피연산자 패턴'' '''=''' ''객체'' ''':''' ''전송''
이 다섯 가지 요소(레이블, 피연산자, 패턴, 객체, 전송)는 모두 선택 사항이다. 일반적으로 ''피연산자''(주어 문자열)가 ''패턴''과 일치하는지 검사한다. 만약 ''객체''가 지정되어 있다면, 패턴과 일치한 부분은 ''객체''로 대체된다. ''전송'' 부분은 프로그램의 흐름을 제어하는데, 특정 레이블로 무조건 분기하거나, 피연산자 평가, 패턴 평가, 패턴 일치 성공/실패, 객체 평가, 최종 할당의 성공 또는 실패 여부에 따라 조건부로 분기할 수 있다. 심지어 실행 중에 프로그램 자체에서 생성하고 컴파일한 코드로 제어를 넘기는 것도 가능하다.
패턴 매칭은 SNOBOL의 가장 핵심적인 기능이다. 패턴은 단순한 텍스트 문자열(예: "ABCD")일 수도 있고, 컴퓨터 언어의 전체 문법을 기술하는 것처럼 매우 복잡한 구조일 수도 있다. 바쿠스-나우르 표기법(BNF)으로 작성된 문법 표현식을 거의 그대로 SNOBOL 패턴으로 옮겨 언어 인터프리터를 구현하는 것이 가능할 정도이다. 복잡한 SNOBOL 패턴은 다른 언어의 정규 표현식으로는 처리하기 어렵거나 불가능한 작업을 수행할 수 있다. 이러한 강력함은 패턴 일치 과정 중에 발생하는 부작용(side effect)에서도 나온다. 예를 들어, 패턴 매칭 중에 중간 결과를 저장하거나, 사용자 정의 함수를 호출하여 추가적인 처리를 하고, 그 결과에 따라 패턴 매칭의 진행 방향을 바꾸거나 패턴 자체를 동적으로 변경할 수도 있다. 패턴은 다른 데이터 타입처럼 변수에 저장하고, 연결하고, 다른 패턴의 일부로 사용하여 매우 정교한 패턴 표현식을 만들 수 있다.
SNOBOL4의 패턴 일치는 논리 프로그래밍 언어인 프롤로그에서 사용하는 것과 유사한 백트래킹 알고리즘을 사용한다. 이는 결정 절 문법(DCG)을 통해 패턴과 유사한 구문을 제공하는 프롤로그의 특징과 연결된다.
SNOBOL은 변수, 문자열, 데이터 구조 등을 모두 가비지 수집이 이루어지는 단일 힙 메모리 영역에 저장하여 관리한다.
언어의 또 다른 특징은 '테이블(table)'이라고 불리는 기능인데, 이는 후에 연관 배열로 발전하여 많은 현대 프로그래밍 언어에서 채택되었다. 이런 점에서 SNOBOL은 연관 배열의 시조로 여겨진다. 테이블은 다음과 같이 정의하고 사용한다.
```
변수명 = TABLE()
변수명['키_문자열'] = 값
```
SNOBOL은 구조적 프로그래밍 개념이 널리 퍼지기 전에 만들어진 언어이기 때문에, 반복문 등은 기본적으로 goto 문을 이용한 분기로 구현한다. 모든 문장은 실행 후 성공(Success) 또는 실패(Failure) 상태를 가지며, 이 상태에 따라 다음에 실행할 문장의 레이블을 지정하여 if 문과 유사한 조건 분기를 구현한다. 예를 들어, 표준 입력에서 한 줄을 읽는 코드는 다음과 같다.
```
LINE = INPUT :S(성공_레이블) F(실패_레이블)
```
이 코드는 입력이 성공하면 `성공_레이블`로, 파일 끝에 도달하는 등 입력에 실패하면 `실패_레이블`로 프로그램 흐름을 이동시킨다. 표준 입출력은 `INPUT`과 `OUTPUT`이라는 특수 변수에 값을 읽거나 쓰는 방식으로 이루어진다.
SNOBOL에는 자주 사용되는 문자 집합이 미리 키워드로 정의되어 있다. 예를 들어, 알파벳 소문자 집합은 `&LCASE`, 대문자 집합은 `&UCASE`로 사용할 수 있다.
4. 구문 (일본어판 참고)
SNOBOL은 구조적 프로그래밍 개념이 널리 퍼지기 전에 개발된 언어로, 포트란이나 알골 같은 동시대 절차적 언어와는 다른 독특한 구문 구조를 가진다.
모든 SNOBOL 명령 줄은 기본적으로 다음 형식을 따른다. 각 부분은 생략 가능하다.
레이블 피연산자 패턴 = 객체 :전송
- `레이블`: 해당 줄을 식별하는 이름이다. 다른 줄에서 이 레이블로 실행 흐름을 옮길 수 있다.
- `피연산자 패턴 = 객체`: 이 부분은 주로 문자열 처리 작업을 수행한다. `피연산자`(주로 변수)의 내용에 대해 `패턴` 매칭을 시도하고, 매칭이 성공하면 그 부분을 `객체`로 치환할 수 있다. 패턴 매칭은 SNOBOL의 강력한 기능이지만, 자세한 내용은 패턴 매칭 섹션에서 다룬다.
- `전송`: 명령 실행 후 다음에 실행할 줄을 지정하는 부분이다. goto 문과 유사하게 특정 `레이블`로 무조건 분기하거나(`:(레이블)`), 명령 실행의 성공(Success) 또는 실패(Failure) 여부에 따라 조건부로 분기할 수 있다(`:S(성공_레이블) F(실패_레이블)`).
이러한 성공/실패 기반의 조건부 분기 메커니즘은 if 문이 없는 SNOBOL에서 조건 제어를 위한 핵심적인 역할을 한다. 예를 들어, 표준 입력에서 한 줄을 읽는 작업은 다음과 같이 작성할 수 있다.
LINE = INPUT :S(READ_SUCCESS) F(READ_FAIL)
위 코드는 `INPUT` 변수를 통해 표준 입력에서 한 줄을 읽어 `LINE` 변수에 저장한다. 읽기 작업이 성공하면 `READ_SUCCESS` 레이블로, 실패하면(예: 파일 끝 도달) `READ_FAIL` 레이블로 실행 흐름이 이동한다.
표준 입출력은 이처럼 `INPUT`(입력)과 `OUTPUT`(출력)이라는 특수한 변수에 값을 읽거나 쓰는 방식으로 처리된다.
SNOBOL에는 미리 정의된 키워드를 통해 자주 사용되는 문자 집합 등을 편리하게 사용할 수 있다. 예를 들어, 모든 알파벳 소문자 집합은 `&LCASE`로, 대문자 집합은 `&UCASE`로 나타낼 수 있다. 이러한 키워드는 주로 패턴 정의에 활용된다.
4. 1. 연관 배열 (일본어판 참고)
SNOBOL의 특징 중 하나는 테이블형이라는 연관 배열의 원형 데이터 구조가 있다는 것이다. 이는 다음 코드와 같이 `TABLE()` 함수를 사용하여 정의한다.변수명 = TABLE()
정의된 테이블은 아래 예시처럼 `변수명[문자열]` 형태로 사용할 수 있다.
변수명[문자열]
4. 2. 패턴 매칭 (일본어판 참고)
SNOBOL 언어의 가장 독특하고 강력한 기능 중 하나는 패턴 매칭이다. SNOBOL의 패턴은 단순한 문자열 검색을 넘어, 매우 복잡한 구조를 정의하고 분석하는 데 사용될 수 있다.패턴은 기본적인 텍스트 조각(예: `"ABCD"`)부터 시작하여, 특정 종류의 문자 집합에 일치하는 내장 패턴(예: `&LCASE` - 소문자, `&UCASE` - 대문자, `&DIGITS` - 숫자), 그리고 이들을 결합한 복잡한 구조까지 다양하게 만들 수 있다. 예를 들어, 프로그래밍 언어의 문법 전체를 SNOBOL 패턴으로 기술하는 것도 가능하다. 바쿠스-나우르 표기법으로 표현된 문법을 거의 그대로 SNOBOL 패턴으로 옮길 수 있을 정도이다.
SNOBOL의 패턴 매칭은 다른 언어에서 흔히 사용되는 정규 표현식보다 훨씬 강력한 기능을 제공한다. 이 힘의 일부는 소위 "SPITBOL 확장"에서 비롯되기도 했지만 (이후 SNOBOL4의 현대 구현 대부분에 통합됨), 기본적인 기능만으로도 복잡한 작업이 가능하다. 패턴 매칭 과정 중에 다양한 부작용(side effects)을 일으킬 수 있기 때문이다. 예를 들어, 매칭 도중 특정 부분 문자열을 변수에 저장하거나(값 할당 연산자 `.`), 사용자가 정의한 함수를 호출하여 추가적인 처리를 하거나, 심지어 매칭 과정 중에 패턴 자체를 동적으로 변경하는 것도 가능하다. 패턴은 다른 데이터 유형처럼 변수에 저장하고, 연결하고, 다른 패턴의 일부로 사용하는 등 유연하게 다룰 수 있다. 이 때문에 "전체 이름 및 국제 우편 주소"와 같이 정규 표현식으로는 다루기 매우 어려운 복잡한 패턴도 SNOBOL로는 작성할 수 있다.
패턴 매칭 과정은 백트래킹 알고리즘을 기반으로 동작한다. 이는 논리 프로그래밍 언어인 프롤로그의 처리 방식과 유사하며, 여러 가능한 매칭 경로를 탐색하다가 실패하면 이전 상태로 돌아가 다른 경로를 시도하는 방식이다.
다음은 간단한 패턴 매칭 예시이다.
WORD = "abc123defABCgh"
- 패턴 정의: 연속된 소문자(&LCASE)를 찾아 ITEM 변수에 저장
PAT = SPAN(&LCASE) . ITEM
- 첫 번째 패턴 매칭 및 결과 확인
WORD PAT = ; "abc"가 PAT에 매칭되고 ITEM에 저장됨. 매칭된 "abc"는 WORD에서 제거됨.
OUTPUT = ITEM ; "abc"가 출력됨. (WORD는 "123defABCgh"가 됨)
- 두 번째 패턴 매칭 및 결과 확인
WORD PAT = ; 현재 WORD("123defABCgh")에서 다시 PAT 매칭 시도.
; "123"은 &LCASE가 아니므로 건너뛰고 "def"가 매칭되어 ITEM에 저장됨.
; 매칭된 "def"는 WORD에서 제거됨.
OUTPUT = ITEM ; "def"가 출력됨. (WORD는 "123ABCgh"가 됨)
위 예시에서 `PAT`는 `SPAN(&LCASE) . ITEM`으로 정의된다.
- `SPAN(&LCASE)`: 문자열 내에서 연속되는 소문자(`&LCASE`) 덩어리 전체에 해당하는 패턴이다.
- `. ITEM`: `SPAN(&LCASE)` 패턴에 일치한 부분을 `ITEM`이라는 변수에 저장하는 즉시 할당 연산자이다.
- `WORD PAT =`: `WORD` 변수의 현재 문자열 값에 대해 `PAT` 패턴 매칭을 시도한다. 매칭에 성공하면, `PAT` 정의 내의 `. ITEM`에 의해 매칭된 부분이 `ITEM` 변수에 저장되고, `=` 연산자에 의해 매칭된 부분은 `WORD` 문자열에서 제거된다(오른쪽에 대체할 문자열이 없으므로).
첫 번째 `WORD PAT =` 실행 시, 문자열 시작 부분의 "abc"가 `SPAN(&LCASE)`에 매칭되어 `ITEM` 변수에 저장되고, `WORD`에서는 "abc"가 제거된다. 이후 `OUTPUT = ITEM`을 통해 "abc"가 출력된다. 두 번째 `WORD PAT =` 실행 시, 변경된 `WORD`("123defABCgh")의 시작 부분("123")은 `SPAN(&LCASE)`에 맞지 않으므로 건너뛰고, 다음 위치인 "def"가 매칭되어 `ITEM`에 저장되고 `WORD`에서 제거된다. `OUTPUT = ITEM`을 통해 "def"가 출력된다. 이처럼 SNOBOL 패턴 매칭은 문자열을 순차적으로 탐색하며, 매칭, 변수 할당, 문자열 변경 등의 작업을 복합적으로 수행할 수 있다.
5. 예제 프로그램
아래는 SNOBOL 언어로 작성된 간단한 예제 프로그램들이다.
헬로 월드 프로그램가장 기본적인 "Hello, World!" 출력 프로그램은 다음과 같다.
OUTPUT = "Hello, World!"
END
사용자 이름 입력 및 출력사용자에게 이름을 묻고 입력받은 이름을 포함하여 문장을 출력하는 프로그램이다.
OUTPUT = "What is your name?"
Username = INPUT
OUTPUT = "Thank you, " Username
END
조건부 출력입력된 사용자 이름에 따라 다른 메시지를 출력하는 프로그램이다. 이름이 "J"로 시작하면 특정 메시지를, "K"로 시작하면 다른 메시지를, 그 외의 경우에는 일반적인 인사말을 출력한다.
OUTPUT = "What is your name?"
Username = INPUT
Username "J" :S(LOVE)
Username "K" :S(HATE)
MEH OUTPUT = "Hi, " Username :(END)
LOVE OUTPUT = "How nice to meet you, " Username :(END)
HATE OUTPUT = "Oh. It's you, " Username
END
입력 반복 처리사용자가 빈 줄을 입력할 때까지 계속해서 이름을 입력받고, 입력받은 이름의 개수를 세어 출력하는 프로그램이다.
OUTPUT = "This program will ask you for personal names"
OUTPUT = "until you press return without giving it one"
NameCount = 0 :(GETINPUT)
AGAIN NameCount = NameCount + 1
OUTPUT = "Name " NameCount ": " PersonalName
GETINPUT OUTPUT = "Please give me name " NameCount + 1
PersonalName = INPUT
PersonalName LEN(1) :S(AGAIN)
OUTPUT = "Finished. " NameCount " names requested."
END
단어 빈도수 계산표준 입력으로 텍스트 파일의 내용을 읽어, 파일 내 각 단어의 출현 빈도를 계산하여 출력하는 프로그램이다. 입력된 텍스트는 모두 소문자로 변환되며, 단어는 알파벳, 숫자, 아포스트로피(`'`), 하이픈(`-`)의 연속으로 정의된다.
&TRIM = 1
WORD = "'-" '0123456789' &LCASE
PAT = SPAN(WORD) . ITEM
DATA = TABLE()
READ LINE = REPLACE(INPUT, &UCASE, &LCASE) :F(DONE)
DIV LINE PAT = :F(READ)
DATA[ITEM] = DATA[ITEM] + 1 :(DIV)
DONE A = CONVERT(DATA, 'ARRAY') :F(EMPTY)
I = 0
PRINT I = I + 1
OUTPUT = A[I,1] '=' A[I,2] :S(PRINT) F(END)
EMPTY OUTPUT = 'This file have no words'
END
6. 구현
최초의 SNOBOL 구현은 뉴저지주 홀름델에 있는 벨 연구소의 IBM 7090에서 이루어졌다. 이후 SNOBOL4는 이식성을 염두에 두고 설계되었으며, 가상 머신 개념을 이용하여 컴퓨터 간 이식성을 개선했다.[20] SNOBOL4 언어 번역기는 어셈블리어로 작성되었지만, 어셈블러의 매크로 기능을 사용하여 '''S'''NOBOL '''I'''mplementation '''L'''anguage(SIL)이라는 가상 기계어를 정의했다. 이를 통해 다양한 기계에서 가상 명령어를 구현하여 번역기를 비교적 쉽게 이식할 수 있었다.[8] 첫 이식 작업은 1966년 IBM 7094에서 시작되어 1967년 IBM 360에서 완료되었고, 이후 다른 많은 플랫폼으로 빠르게 퍼져나갔다.
클래식 구현은 PDP-10에서 이루어졌으며, 주로 컴파일러, 형식 문법, 인공지능 연구, 특히 기계 번역과 자연어의 기계 이해 분야에서 사용되었다.
SNOBOL4는 일반적으로 인터프리터 방식으로 구현되지만, 인터프리터의 거의 모든 기능을 제공하는 컴파일러인 SPITBOL도 존재한다. PDP-10에서의 클래식 구현은 상대적으로 느렸기 때문에, 1972년 벨 연구소의 제임스 짐펠(James Gimpel)은 SITBOL이라는 PDP-10용 네이티브 SNOBOL4 구현을 설계했다. 이는 스티븐스 공과대학의 문자열 처리 수업 프로젝트를 통해 개발되었으며, 모든 기능을 갖춘 고성능 인터프리터였다.
그나트 에이다 컴파일러는 Spitbol의 문자열 조작 의미 체계를 구현하는 패키지(GNAT.Spitbol)를 제공하여 에이다 프로그램 내에서 SNOBOL 기능을 사용할 수 있게 한다. 또한 미시간 터미널 시스템 (MTS)의 파일 편집기는 SNOBOL4 패턴에 기반한 패턴 매칭 기능을 제공했다.[11]
현재 여러 구현이 존재하며, 주요 구현은 다음과 같다.
7. 구조적 프로그래밍 확장 (영어판 참고)
SNOBOL 자체에는 구조적 프로그래밍 기능이 부족하지만, 이를 보완하기 위한 여러 확장 기능이나 관련 도구들이 개발되었다.
1970년대에 프레드 G. 슈와츠(Fred G. Swaartz)는 미시간 대학교의 미시간 터미널 시스템 (MTS) 환경에서 사용하기 위해 Snostorm이라는 SNOBOL 전처리기를 설계하고 구현했다.[14] Snostorm은 구조적 프로그래밍 구문을 SNOBOL 코드로 변환해주는 역할을 했으며, MTS를 운영하던 여러 기관과 1982년부터 1984년까지 유니버시티 칼리지 런던 (UCL)에서도 사용되었다.
앤드루 코닉이 개발한 Snocone은 SNOBOL4 언어에 블록 구조 구문을 추가한 언어이다. 하지만 Snocone은 SNOBOL4의 기능을 단순히 확장한 것이 아니라, 그 자체로 독립적인 프로그래밍 언어에 가깝다.[15]
SPITBOL 구현 역시 구조적 프로그래밍과 유사한 기능을 제공하는 데 사용될 수 있는 여러 특징을 도입했다. 비록 전통적인 구조적 프로그래밍 키워드를 직접 사용하지는 않지만, 중첩된 if/then/else 형태의 구문 등을 지원하여 코드 구조화를 도왔다. 이러한 SPITBOL의 기능들은 이후 등장한 대부분의 최신 SNOBOL4 구현에도 영향을 주어 추가되었다. 오랫동안 상용 소프트웨어로 판매되던 SPITBOL은 2009년 4월, GNU 일반 공중 사용 허가서 라이선스에 따라 자유 소프트웨어로 공개되었다.
8. 명칭
개발 초기에는 '기호식 표현 해석기(Symbolic EXpression Interpreter)'를 줄여 'SEXI'라는 이름이 고려되었다.[16] 개발자 중 한 명인 데이브 파버(Dave Farber)에 따르면, 당시 천공 카드에 'SEXI Farber'라고 적어 제출했을 때 컴퓨터 센터 직원이 농담 섞인 반응을 보인 것을 계기로 다른 이름을 찾게 되었다고 한다.[16]
새로운 이름을 찾는 데 어려움을 겪던 중, 누군가가 "우리는 이름을 찾을 가망이 전혀 없다(snowball's chance in hell)"라고 말한 것에서 착안하여 'SNOBOL'이라는 이름이 탄생했다. 이는 당시 COBOL과 같은 '-BOL'로 끝나는 언어 이름들의 흐름을 따른 것이기도 하다.[16]
'SNOBOL'은 종종 '문자열 지향 기호 언어(String Oriented Symbolic Language)'[17] 또는 '문자열 지향 기호 언어(StriNg Oriented symBOlic Language)'[18]의 후문자어(backronym)로 설명되기도 한다. 하지만 실제 유래는 앞서 언급한 영어 표현 "snowball's chance in hell"(지옥에 눈덩이가 있을 가능성, 즉 '전혀 가망이 없다'는 뜻)에서 비롯되었다는 설이 있다.[19]
참조
[1]
간행물
Proceedings of the third ACM SIGPLAN conference on History of programming languages
https://www.lua.org/[...]
2007
[2]
논문
A theory of discrete patterns and their implementation in SNOBOL4
1973-02
[3]
웹사이트
Dr. Dobb's: Programs That Transform Their Own Source Code; or: the Snobol Foot Joke
http://www.drdobbs.c[...]
Dobbscodetalk.com
2011-12-04
[4]
웹사이트
perlre
http://perldoc.perl.[...]
perldoc.perl.org
2011-12-04
[5]
웹사이트
Recursive Regex Tutorial
http://www.rexegg.co[...]
2017-03-19
[6]
논문
An Overview of SL5
1977-04
[7]
문서
See Chapter 1 of The Macro Implementation of SNOBOL4
[8]
문서
SNOBOL4 has been implemented using C to recreate the virtual machine instructions.
[9]
논문
A history of the SNOBOL programming languages
http://pdfs.semantic[...]
[10]
서적
History of Programming Languages
Academic Press
[11]
문서
Introduction to the MTS file editor
https://books.google[...]
University of Michigan Computing Center
1986
[12]
웹사이트
SNOBOL4.ORG -- SNOBOL4 Resources
http://www.regressiv[...]
[13]
웹사이트
The MINNESOTA SNOBOL4 Programming Language
http://www.berstis.c[...]
[14]
간행물
SNOSTORM
https://books.google[...]
Computing Center, University of Michigan
1979-06
[15]
간행물
The Snocone Programming Language
http://www.snobol4.c[...]
USENIX (Portland, Oregon)
1985-06
[16]
문서
WORTH READING Wikipedia entry on SNOBOL #REDIRECT
[17]
문서
Computers and the humanities
1967
[18]
서적
Encyclopedia of Computer Science and Technology
CRC Press
1979
[19]
웹사이트
SNOBOL4.ORG -- SNOBOL History
http://www.snobol4.o[...]
[20]
문서
See Chapter 1 of The Macro Implementation of SNOBOL4
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com