인터칼
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
인터칼(INTERCAL)은 1972년 프린스턴 대학교 학생 돈 우즈와 제임스 리옹에 의해 고안된 난해한 프로그래밍 언어이다. C-INTERCAL을 비롯한 여러 변종이 존재하며, 튜링 완전성을 갖추고 있지만, 의도적으로 난해하고 장황한 구문을 사용하여 프로그래머에게 미적으로 불쾌하게 보이도록 설계되었다. INTERCAL은 "PLEASE"와 같은 수식어를 사용하여 컴파일러가 프로그램의 정중함 정도를 판단하게 하는 특징을 가지며, 헬로 월드 프로그램의 예시를 통해 일반적인 프로그래밍 언어와 차이점을 보여준다.
더 읽어볼만한 페이지
- 1972년 개발된 프로그래밍 언어 - C (프로그래밍 언어)
C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다. - 1972년 개발된 프로그래밍 언어 - 프롤로그 (프로그래밍 언어)
프롤로그는 알랭 콜메로에르가 개발한 논리 프로그래밍 언어로, 사실과 규칙 기반 데이터베이스에 대한 질의를 통해 프로그램을 실행하며, 단일화, 백트래킹, 논리 변수 바인딩을 핵심 특징으로 인공지능, 자연어 처리 등에 활용된다. - 난해한 프로그래밍 언어 - HQ9+
HQ9+는 간단한 인터프리터 구현이 가능한 난해한 프로그래밍 언어로, 'Hello, world!' 출력, 소스 코드 출력, "99 Bottles of Beer" 가사 출력, 누산기 값 증가의 네 가지 명령을 제공한다. - 난해한 프로그래밍 언어 - FRACTRAN
FRACTRAN은 정수의 소인수 지수를 레지스터로 활용하여 분수 목록을 곱하는 과정을 반복하며 다양한 계산을 수행하는 계산 모델이다.
인터칼 | |
---|---|
기본 정보 | |
![]() | |
설계자 | 제임스 M. 라이언 돈 우즈 |
개발 시기 | 1972년 |
종류 | 난해한 프로그래밍 언어 |
파일 확장자 | .i |
특징 | |
영향 받은 언어 | 없음 |
영향을 준 언어 | Malbolge, Piet |
구현체 | |
주요 구현체 | C-INTERCAL |
기타 | |
웹사이트 | INTERCAL 리소스 페이지 |
2. 역사
1972년 프린스턴 대학교 학생이었던 돈 우즈와 제임스 리옹에 의해 인터칼이 고안되었다.[5] 초기 구현은 천공 카드와 EBCDIC 문자 집합을 사용했다.[5] ASCII 환경을 위해 일부 문자가 대체되었는데, 예를 들어 `$`는 `¢`를, `?`는 `⊻`를 대체한다.[5]
저자에 따르면, 원본 설명서에는 다음과 같이 적혀 있다.
"컴파일러의 전체 이름은 "발음 가능한 약어가 없는 컴파일러 언어"이며, 명백한 이유로 "INTERCAL"로 줄여 쓴다."
에릭 레이먼드에 의해 관리되는 C-INTERCAL은 여러 변종이 존재한다. 우즈(Woods)와 리용(Lyon)이 만든 최초의 INTERCAL은 입출력 능력이 극도로 제한적이었다. 입력할 수 있는 데이터는 자릿수가 지정된 숫자뿐이었고, 출력은 확장된 로마 숫자뿐이었다. 인터넷에서 이용 가능한 재구현 버전인 C-INTERCAL은 보다 일반적인 사양을 갖추고 있으며, 난해 프로그래밍 언어 애호가들에 의해 만들어졌다. C-INTERCAL에는 오리지널 버전에서 몇 가지 변경 사항과 새롭게 도입된 몇 가지 기능이 존재하는데, COME FROM 문[19]이나 튜링 텍스트 모델에 의한 텍스트의 입출력 기능이 그 예이다.
C-INTERCAL의 제작자는 또한 TriINTERCAL이라는 변형도 만들었다[20]. 이는 3진법 시스템으로, 연산자가 일반화되어 있다. 더욱 새로운 변형으로 Threaded Intercal이 있다[21]. 이 변형에서는 멀티스레딩을 지원하기 위해 "COME FROM" 문의 기능이 확장되었다.
C-INTERCAL은 주 버전 번호와 부 버전 번호를 전통적인 방식과 다르게 사용한다.[7] HISTORY 파일을 보면 버전 0.3부터 시작하여 2020년 5월까지 0.31로 발전해 왔으며, 0.26과 0.27 사이에 1.26을 포함하고 있다.[7]
CLC-INTERCAL의 버전 번호 체계는 버전 0.06까지는 전통적인 방식을 따랐지만, 이후 README 파일에 문서화된 체계로 변경되었다.[8] "버전"이라는 용어는 "perversion(왜곡)"으로 대체되었고,[8] perversion 번호는 정수 부분과 소수 부분에 독립적인 부호를 가진 부동 소수점 숫자로 구성된다.[8] 음수 분수는 사전 이스케이프를 나타내는데, 예를 들어 1.-94는 "1.00 전에 94개의 사전 이스케이프"를 의미한다.[8] 이는 숫자를 모두 더하면 0.06이 되지만, 0.06은 개발 중이 아니기 때문에 완전히 우연의 일치이다.[8] perversion 번호의 소수 부분은 정수 또는 부동 소수점일 수 있으며, 각 부분에 비슷한 의미가 있다.[8] 현재 사전 이스케이프는 1.-94.-2로, "사전 이스케이프 1.-94 전에 2개의 사전-사전 이스케이프"를 의미한다.[8]
2. 1. 버전 번호
C-INTERCAL은 주 버전 번호와 부 버전 번호를 전통적인 방식과 다르게 사용한다.[7] HISTORY 파일을 보면 버전 0.3부터 시작하여 2020년 5월까지 0.31로 발전해 왔으며, 0.26과 0.27 사이에 1.26을 포함하고 있다.[7]CLC-INTERCAL의 버전 번호 체계는 버전 0.06까지는 전통적인 방식을 따랐지만, 이후 README 파일에 문서화된 체계로 변경되었다.[8] "버전"이라는 용어는 "perversion(왜곡)"으로 대체되었고,[8] perversion 번호는 정수 부분과 소수 부분에 독립적인 부호를 가진 부동 소수점 숫자로 구성된다.[8] 음수 분수는 사전 이스케이프를 나타내는데, 예를 들어 1.-94는 "1.00 전에 94개의 사전 이스케이프"를 의미한다.[8] 이는 숫자를 모두 더하면 0.06이 되지만, 0.06은 개발 중이 아니기 때문에 완전히 우연의 일치이다.[8] perversion 번호의 소수 부분은 정수 또는 부동 소수점일 수 있으며, 각 부분에 비슷한 의미가 있다.[8] 현재 사전 이스케이프는 1.-94.-2로, "사전 이스케이프 1.-94 전에 2개의 사전-사전 이스케이프"를 의미한다.[8]
3. 특징
INTERCAL은 다른 모든 컴퓨터 언어와는 완전히 다르게 설계되었다. 다른 언어에서 흔히 사용되는 연산은 INTERCAL에서는 이해하기 어렵고 불필요한 구문을 갖는다.[5]
INTERCAL은 프로그래머에게 미적으로 더욱 불쾌하게 보이도록 설계된 많은 다른 기능을 가지고 있다. "READ OUT", "IGNORE", "FORGET"과 같은 구문과 "PLEASE"와 같은 수식어를 사용한다. 이 마지막 키워드는 컴파일러가 프로그램을 거부하는 두 가지 이유를 제공한다. "PLEASE"가 충분히 자주 나타나지 않으면 프로그램이 충분히 정중하지 않다고 간주되고, 오류 메시지가 이를 알린다. 반대로 너무 자주 나타나면 프로그램이 과도하게 정중하다는 이유로 거부될 수 있다. 이 기능은 원래의 INTERCAL 컴파일러에 존재했지만, 문서화되지 않았다.[11]
의도적으로 난해하고 장황한 구문에도 불구하고, INTERCAL은 그럼에도 불구하고 튜링 완전성을 갖추고 있다. 충분한 메모리가 주어진다면, INTERCAL은 튜링 기계가 해결할 수 있는 모든 문제를 해결할 수 있다. 그러나 INTERCAL의 대부분 구현은 이를 매우 느리게 수행한다. 65536보다 작은 모든 소수를 계산하는 에라토스테네스의 체 벤치마크는 1992년에 썬 마이크로시스템즈(Sun Microsystems) SPARCstation 1에서 테스트되었다. C로 작성된 경우 0.5초 미만이 걸렸지만, INTERCAL로 작성된 동일한 프로그램은 17시간 이상이 걸렸다.[9]
INTERCAL 매뉴얼은 모든 비영숫자 ASCII 문자에 특이한 이름을 부여합니다. 작은따옴표와 큰따옴표는 각각 '스파크'와 "토끼 귀"이다. 다른 많은 프로그래밍 언어에서 등호(INTERCAL의 "반 메쉬")로 표현되는 할당 연산자는 INTERCAL에서 "각도"와 "웜"으로 구성된 왼쪽 화살표, <-
이며, 분명히 "받는다"로 읽힌다.
3. 1. 문법
인터칼은 `WRITE IN` 명령어를 사용하여 입력을 받고 `READ OUT` 명령어를 사용하여 출력한다. 이 방식은 일반적인 형식을 사용하지 않는다. INTERCAL-72에서는 `WRITE IN` 명령어가 숫자를 영어로 표기된 형태로 입력받고 (예: SIX FIVE FIVE THREE FIVE), `READ OUT` 명령어가 이를 "망가진" 로마 숫자로 출력한다.[5] 더 최근 버전들은 자체적인 I/O 시스템을 가지고 있다.[4][11]주석은 NOT 또는 N'T를 포함하는 반전된 구문 식별자를 사용하여 구현할 수 있다. 이러한 식별자는 줄이 처음에는 ABSTAIN 상태가 되도록 하여 아무런 효과가 없도록 한다.[5] 구문이 유효하지 않더라도 줄을 ABSTAIN할 수 있다. 구문 오류는 런타임에 발생하며, 이때에만 줄이 un-ABSTAIN 상태가 된다.[5]
3. 2. 자료 구조
INTERCAL-72(인터칼-72)(INTERCAL의 초기 버전)에는 16비트(bit) 정수 (.
로 표시되며, "spot"이라고 함), 32비트 정수(:
, "twospot"), 16비트 정수의 배열 (,
, "tail"), 32비트 정수의 배열(;
, "hybrid")의 네 가지 자료형만 있었다.[5] 16비트 정수의 경우 .1
에서 .65535
까지 번호가 매겨진 각 유형별로 65535개의 변수를 사용할 수 있다. 이러한 각 변수에는 스택이 있어 INTERCAL 용어로 STASH되고 RETRIEVEd될 수 있다.[5]더 현대적인 버전의 INTERCAL은 적절한 수정과 함께 동일한 데이터 구조를 유지해 왔다. 진법을 수정하는 TriINTERCAL은 16비트 유형 대신 10-트라이트 유형을 사용할 수 있으며,[11] CLC-INTERCAL은 새로운 유형을 추가하는 대신 기본 데이터 유형으로 더 많은 정보를 저장하여 "수업 및 강의"와 같은 자체 데이터 구조를 구현한다.[4]
배열은 스칼라 변수인 것처럼 할당하여 차원을 지정한다. 상수도 사용할 수 있으며,
#
("mesh") 다음에 상수 자체가 십진법 숫자로 표시된다. 0에서 65535 사이의 정수 상수만 지원된다.[5]3. 3. 연산자
INTERCAL-72에는 5개의 연산자만 존재한다.[4][5][11] 구현에 따라 어떤 문자가 어떤 연산을 나타내는지는 다르며, 많은 구현에서 둘 이상의 문자를 사용하므로 여러 연산자에 대해 다양한 표현이 가능하다.연산자 | INTERCAL-72 문자 | C-INTERCAL 문자 | CLC-INTERCAL 문자 |
---|---|---|---|
INTERLEAVE / MINGLE | c 백스페이스 / | ¢ , $ , c 백스페이스 / | ¢ |
SELECT | ~ | ~ | ~ |
AND | & | & | & |
OR | V | V | V |
XOR | V 백스페이스 - | V 백스페이스 - , ? , ∀ | V 백스페이스 - , ¥ |
대부분의 다른 언어와 달리 AND, OR, XOR은 단항 연산자이며, 인수의 연속된 비트에 대해 작동한다. 결과의 최상위 비트는 입력의 최하위 비트와 최상위 비트에 적용된 연산자이고, 결과의 두 번째 최상위 비트는 최상위 비트와 두 번째 최상위 비트에 적용된 연산자이며, 결과의 세 번째 최상위 비트는 두 번째 최상위 비트와 세 번째 비트에 적용된 연산자이다. 연산자는 변수 이름이나 상수를 지정하는 구두점과 변수를 지정하는 숫자 사이에 배치되거나, 그룹화 표시 내부에 배치된다.[5]
SELECT 및 INTERLEAVE (MINGLE이라고도 함)는 중위 이항 연산자이다. SELECT는 두 번째 피연산자의 "1" 비트에 해당하는 첫 번째 피연산자의 비트를 가져와 "0" 비트에 해당하는 비트를 제거하고, 최하위 비트 방향으로 이동하고 0으로 채운다(따라서 51 (2진수 1'''1'''0'''0'''1'''1''') SELECT 21 (2진수 10101)은 5 (2진수 '''101''')이다). MINGLE은 첫 번째와 두 번째 피연산자의 비트를 교대로 사용한다(두 번째 피연산자의 최하위 비트가 결과의 최하위 비트가 되도록).[5]
연산자 우선 순위는 없으며, 그룹화 표시를 사용하여 우선 순위를 명확히 해야 한다. 사용 가능한 그룹화 표시는 ` ' ` ("스파크")와 ` " ` ("토끼 귀")가 있으며, 프로그래머는 표현식을 명확하게 만들기 위해 이러한 표시를 사용해야 한다.[5]
3. 4. 제어 구조
INTERCAL-72의 주요 제어 구조는 NEXT, RESUME, FORGET이다.[5] `DO (''line'') NEXT`는 지정된 줄로 분기하며, 호출 스택에서 NEXT가 없었을 경우 실행될 다음 줄을 기억한다. `DO FORGET ''expression''`은 호출 스택의 상단에서 ''expression'' 항목을 제거하고, `DO RESUME ''expression''`은 호출 스택에서 ''expression'' 항목을 제거하고 마지막으로 기억된 줄로 점프한다.[5]C-INTERCAL은 `DO COME FROM (''line'')`으로 작성된 COME FROM 명령어를 제공한다.[4] CLC-INTERCAL 및 최신 C-INTERCAL 버전은 계산된 COME FROM ( `DO COME FROM ''expression''`)과 COME FROM과 유사하지만 반환 주소를 NEXT STACK에 저장하는 NEXT FROM도 제공한다.[4]
프로그램 흐름에 영향을 미치는 다른 방법으로, 원래 INTERCAL-72에서 사용 가능했던 변수에 IGNORE 및 REMEMBER 명령어를 사용하는 방법이 있다.[5] 이로 인해 변수에 대한 쓰기가 무시되거나 다시 적용된다. 또한 줄 또는 구문 유형에 ABSTAIN 및 REINSTATE 명령어를 사용하여, 줄이 아무런 효과를 갖지 않거나 다시 효과를 갖도록 할 수 있다.[5]
INTERCAL의 모든 구문은 "구문 식별자"로 시작한다. INTERCAL-72에서는 `DO`, `PLEASE` 또는 `PLEASE DO`가 사용될 수 있으며, 이들은 모두 프로그램에서 동일한 의미를 갖는다. 이 중 하나를 과도하게 사용하면 프로그램이 거부될 수 있다.[11] 식별자에 `NOT` 또는 `N'T`를 추가한 반전 형태를 사용할 수 있다.[5] 현대적인 변종인 Backtracking INTERCAL은 구문 식별자로 `MAYBE`(PLEASE 또는 DO와 결합될 수도 있음)를 사용하는 변형도 허용하며, 이는 선택 지점을 도입한다.[10] 식별자 앞에는 선택적으로 괄호 안에 정수인 줄 번호를 지정할 수 있으며, 식별자 뒤에는 `%50` 형식으로 실행될 줄의 백분율(기본값은 100%)을 지정할 수 있다.[5]
4. 변종
C-INTERCAL은 원래 INTERCAL에 몇 가지 기능을 추가하고 수정한 버전이다.[14] C-INTERCAL은 COME FROM 문과 튜링 텍스트 모델을 기반으로 하는 텍스트 I/O 방식과 같은 몇 가지 새로운 기능을 도입했다.[11]
C-INTERCAL의 저자는 삼진법을 기반으로 하고 INTERCAL의 연산자 집합을 일반화한 TriINTERCAL 변형을 만들었다.[11][20]
Threaded Intercal은 멀티스레딩을 지원하도록 COME FROM의 기능을 확장한 변형이다.[12][21]
CLC-INTERCAL에는 INTERCAL 서버를 포함한 네트워킹 기능, 양자 컴퓨터를 위한 다중 값 계산을 가능하게 하는 퀀텀 인터칼 등의 기능이 포함되어 있다.
.NET INTERCAL은 .NET Framework을 대상으로 하는 구현으로, 독립 실행형 바이너리 라이브러리의 생성과 다른 프로그래밍 언어와의 상호 운용을 지원한다.[13]
5. 예제
전통적인 헬로 월드 프로그램은 일반적인 프로그래밍 언어와 인터칼이 얼마나 다른지 보여준다. C 언어에서는 "Hello, world!\n"를 출력하는 프로그램을 다음과 같이 작성할 수 있다.
```c
#include
int main(void) {
printf("Hello, world!\n");
return 0;
}
```
C-INTERCAL에서 이에 해당하는 프로그램은 더 길고 읽기 어렵다.
```basic
DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP
5. 1. 헬로 월드 프로그램
전통적인 헬로 월드 프로그램은 일반적인 프로그래밍 언어와 인터칼이 얼마나 다른지 보여준다. C 언어에서는 "Hello, world!\n"를 출력하는 프로그램을 다음과 같이 작성할 수 있다.
```c
#include
int main(void) {
printf("Hello, world!\n");
return 0;
}
```
C-INTERCAL에서 이에 해당하는 프로그램은 더 길고 읽기 어렵다.
```basic
DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP
6. 영향 및 평가
인터칼은 "A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics"라는 기사에서 "여기에 들어오는 자, 모든 정신을 버려라: 인터칼"이라는 제목으로 다루어진다.[14] 난해한 프로그래밍 언어 중 하나로, 코드 난독화, 이상한 언어, 코드 미학 등의 주제에서 언급된다.
컴파일러는 "ick"라는 이름으로 패러디되며, 이해할 수 없는 코드는 컴파일 오류 대신 건너뛰는 "관대한" 특성 때문에 버그를 찾기 어렵다.[14] 주석은 컴파일할 수 없는 텍스트를 프로그램 아무 곳에나 삽입하는 방식으로 추가하는데, 유효한 코드 조각이 실수로 포함되지 않도록 주의해야 한다.[14]
레브 브라티셴코(Lev Bratishenko)는 "Technomasochism"에서 인터칼 컴파일러를 지배자로 묘사한다.[15] `PLEASE` 키워드가 충분히 자주 나타나지 않으면 프로그램은 거부되고, 너무 자주 나타나면 징징거린다고 거부된다.[15] 이러한 `PLEASE` 키워드의 사용 빈도에 따른 컴파일러의 반응은 프로그래밍 언어의 독특한 특징이다.
7. 대중 문화
니트롬이 제작한 가상의 비디오 게임 콘솔인 니트롬 인조이먼트 시스템(Nitrome Enjoyment System)에는 인터칼로 프로그래밍된 게임이 있다.
참조
[1]
웹사이트
The A-Z of Programming Languages: INTERCAL
http://www.techworld[...]
Techworld
2008-07-04
[2]
웹사이트
The INTERCAL Resources Page
http://www.catb.org/[...]
Catb.org
2012-03-10
[3]
웹사이트
Alex Smith Biography
https://www.wolframs[...]
[4]
웹사이트
Clc-Intercal
http://clc.intercal.[...]
Clc-Intercal
2010-04-01
[5]
웹사이트
INTERCAL reference manual
http://oops.se/~urba[...]
2012-03-10
[6]
웹사이트
Princeton and Atari Syntax – C-INTERCAL 0.27 Revamped Instruction Manual
http://c.intercal.or[...]
2012-11-12
[7]
웹사이트
HISTORY file for C-INTERCAL
https://gitlab.com/e[...]
2019-06-12
[8]
웹사이트
README file for CLC-INTERCAL
https://sources.debi[...]
2020-05-05
[9]
뉴스
Intercal -- the Language From Hell
http://catb.org/~esr[...]
1992-09
[10]
웹사이트
Backtracking in Intercal
http://www.cse.unsw.[...]
Cse.unsw.edu.au
2006-04-11
[11]
웹사이트
C-INTERCAL supplemental reference manual
http://www.progsoc.u[...]
[12]
웹사이트
Threaded Intercal
http://www.cse.unsw.[...]
Cse.unsw.edu.au
2004-06-09
[13]
웹사이트
Official home of Simple Component Intercal for .NET
https://github.com/j[...]
2021-09-30
[14]
conference
A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics
http://nickm.com/cis[...]
[15]
journal
Technomasochism
http://cabinetmagazi[...]
2009-01-01
[16]
문서
The Original INTERCAL Manual
http://www.muppetlab[...]
[17]
문서
INTERCAL Resources on the Web
http://www.muppetlab[...]
[18]
뉴스
INTERCAL — the Language from Hell
http://www.catb.org/[...]
Computer Shopper
1992-09
[19]
문서
10.1145/358027.358043
[20]
문서
Wimps don't read this message (long) -- alt.lang.intercal
http://groups.google[...]
[21]
문서
Threaded Intercal
http://www.cse.unsw.[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com