인터칼

INTERCAL
2010년 인터칼의 저자 중 한 명인 돈 우즈는
2005년 인터칼의 다른 저자인 Jim Lyon은

INCERCAL(Compiler Language With No Authenable 약어)은 Don Woods와 James M패러디난해한 프로그래밍 언어입니다. 1972년 프린스턴 대학교 학생 두 , 리옹[].그것은 1960년대에 제안된 언어 구조와 표기법의 확산뿐만 아니라 [1]당시의 다양한 프로그래밍 언어의 측면을 풍자한다.

인터CAL 방언에는 Eric S에 의해 유지되는 C-INTERCAL(1990년에 작성)이라는2개의 실장이 있습니다. 레이먼드[2], 알렉스 스미스,[3] CLC-INTERCAL,[4] 클라우디오 칼벨리가 관리합니다.2021년 3월 현재 두 구현 모두 Debian 소프트웨어 아카이브에서 사용할 수 있습니다.[5]

역사

저자들의 [6]원본 설명서에 따르면

컴파일러의 풀네임은 "발음 가능한 약어가 없는 컴파일러 언어"로, 명백한 이유로 "INTERCAL"로 약칭됩니다.

프린스턴의 초기 실장에서는 펀치카드EBCD사용되었습니다.IC 문자 세트ASCII를 사용하는 컴퓨터에서 INTERCAL을 실행하려면 다음 두 문자를 대체해야 합니다.$을 대신한.¢혼합 운영자로서 "하드웨어와 관련된 소프트웨어 비용 증가"를 나타낸다.?을 대신했다단항 배타적 연산자로 "배타적-or를 처음 접했을 때 평균적인 사람의 반응을 표현한다."[6]최신 버전의 C-INTERCAL에서는 오래된 연산자가 대체품으로 지원되고 있습니다.INTERCAL 프로그램은 ASCII, Latin-1 또는 UTF-8로 인코딩[7]있습니다.

버전 번호

C-INTERCAL은 기존 버전과 비교하여 메이저버전 번호와 마이너버전 번호를 교환합니다.HISTORY 파일에는[8] 버전 0.3에서 시작하여 2020년 5월 현재 0.31로 진행되었지만 0.26에서 0.27 사이의 1.26이 포함된 릴리스가 나와 있습니다.

CLC-INTERCAL 버전 번호부여 방식은 README 파일[9] 기재되어 있는 다음과 같은 방식으로 변경된 버전 0.06까지 기존 방식입니다.

* 정확성을 위해 "버전"이라는 용어가 "version"으로 대체되었습니다.

* 변위번호는 정수부분과 분수부분의 독립부호를 가진 부동소수점수로 구성됩니다.음의 분율은 프리 에스케이프를 나타냅니다(따라서 1.-94는 "1.00 이전에 갈 94개의 프리 에스케이프"를 의미합니다).또는 단순히 숫자를 더해서 0.06을 얻을 수 있습니다. 0.06은 개발되지 않았기 때문에 완전히 우연입니다.)

* 변위 번호의 소수 부분은 정수 또는 부동소수점일 수 있으며 부품에 대해서도 유사한 의미를 가집니다.현재 프리 이스케이프는 1.-94.-2로, 이는 "프리 이스케이프 1.-94에 앞서 2개의 프리 이스케이프"를 의미합니다.

세부 사항

INTERCAL은 다른 모든 컴퓨터 언어와는 완전히 다른 것을 의도하고 있었습니다.다른 언어의 일반적인 조작은 INTERCAL에서 암호화 구문과 용장 구문을 사용합니다.INTERCAL 참조 설명서:[6]

이해할 수 없는 일을 하는 사람이 존경받는다는 것은 잘 알려져 있고 자주 입증되는 사실이다.예를 들어 32비트 INTERCAL 변수에 65536 값을 저장하는 가장 간단한 방법은 다음과 같습니다.

하다 :1 <-> #0¢#256 

분별 있는 프로그래머라면 그건 말도 안 된다고 하겠죠이것이 정말로 가장 간단한 방법이기 때문에, 프로그래머는 상사가 흔히 하는 것처럼 그의 상사 앞에서 바보처럼 보이게 될 것이다.그 결과는 프로그래머가 옳았다면 그에 못지 않게 파괴적일 것이다.

INTERCAL은 프로그래머에게 훨씬 더 심미적으로 불쾌하게 만들도록 설계된 다른 많은 기능을 가지고 있습니다. INTERCAL은 "READ OUT", "IGNORE", "FORGET"과 같은 문장과 "PLEASE"와 같은 수식어를 사용합니다.이 마지막 키워드는 컴파일러에 의해 프로그램이 거부된 두 가지 이유를 제공합니다. "PLEASE"가 자주 표시되지 않으면 프로그램이 충분히 공손하지 않은 것으로 간주되고 오류 메시지가 나타납니다. 너무 자주 나타나면 프로그램이 지나치게 공손한 것으로 거부될 수 있습니다.이 기능은 원래의 INTERCAL 컴파일러에 존재했지만 [10]문서화되어 있지 않았습니다.

이 언어의 의도적으로 둔하고 단어 있는 구문에도 불구하고, 인터칼은 튜링 완전하다: 충분한 메모리가 주어지면, 인터칼은 범용 튜링 기계가 해결할 수 있는 모든 문제를 해결할 수 있다.다만, 대부분의 INTERCAL 실장에서는, 이 처리가 매우 늦습니다.Sheve of Eratosthenes 벤치마크에서는 1992년에 Sun SPARCstation 1에서 65536 미만의 소수를 모두 계산했습니다.C에서는 30초도 걸리지 않았습니다.INTERCAL에서는 같은 프로그램이 17시간 [11]이상 걸렸습니다.

문서

INTERCAL 참조 매뉴얼의 "회로 다이어그램"은 "선택" 작업자의 작동을 설명하는 것으로 알려져 있습니다.

INTERCAL 참조 설명서에는 다음과 같은 많은 역설적, 비논리적 또는 유머러스한 지침이 포함되어 있습니다.

조심해!혼란스러운 경우를 제외하고 어떤 경우에도 메쉬와 인터리브 연산자를 혼동하지 마십시오.

설명서에는 "톤실"도 포함되어 있습니다. "4) 다른 모든 참조 설명서는 부록을 가지고 있기 때문에, 인터캘 설명서에 다른 유형의 [6]탈착식 기관이 포함되어 있어야 한다고 판단되었습니다."

INTERCAL 매뉴얼에서는 영숫자가 아닌 ASCII 문자에 특이한 이름을 붙이고 있습니다.단, 큰따옴표는 각각 "sparks"와 "rabbit ears"입니다(예외로 앰퍼샌드: Joneshons File에 기술되어 있듯이 "무엇이 더 sillier"입니다). 할당 연산자는 많은 다른 언어에서 등호(INTERCAL의 "반 메쉬")로 표시됩니다.Ges, 인터칼에 왼쪽 화살표가 있고,<-"각도"와 "벌레"로 구성되어 있으며, 명백히 "gets"로 읽힌다.

구문

입력(사용)WRITE IN명령) 및 출력(사용)READ OUTINTERCAL-72에서는 WRITE IN이 영어로 숫자로 쓰여진 숫자(예: SIX FIVE FIVE Three FIVE)를 입력하고 READ OUT은 이를 "도살된" [6]로마 숫자로 출력합니다.최신 버전에는 자체 I/O [4][10]시스템이 있습니다.

코멘트는 NOT 또는 N'T와 관련된 반전문 식별자를 사용하여 얻을 수 있습니다.이러한 경우, 행은 처음에 효과가 [6]없게 억제됩니다.(행은 유효한 구문이 없어도 자제할 수 있습니다.실행시에 구문 오류가 발생하고 행이 un-ABstained인 경우에만 발생합니다.)[6]

데이터 구조

INTERCAL-72(INTERCAL의 원래 버전)의 데이터 타입은 4개뿐이었다: 16비트 정수(로 표시됨).('스팟'이라고 함), 32비트 정수(:, "twospot", 16비트 정수 배열(,, "테일" 및 32비트 정수 배열(;, "communications" ('communications')각 유형에는 65535개의 사용 가능한 변수가 있으며 다음부터 번호가 매겨져 있습니다..1로..65535예를 들어 16비트 정수의 경우.단, 이들 변수 각각에는 푸시 및 팝이 가능한 자체 스택(INTERCAL 용어로는 STASHed 및 REARKEd)이 있어 데이터 [6]구조가 복잡해질 수 있습니다.인터칼의 더욱 현대적으로, 적절한 수정으로 같은 데이터 구조 계속;TriINTERCAL,는 대표로 되어 있는 radix을 수정할 경우"수업이나 강연"과 같은 16비트 type,[10]과CLC-INTERCAL 시행 데이터 구조의 많은, 아닌 b를10-trit 사용할 수 있고 큰 나누는asic 데이터 유형은 새로운 [4]유형을 추가하는 대신 더 많은 정보를 저장합니다.배열은 스칼라 변수인 것처럼 할당하여 치수를 지정합니다.상수도 사용할 수 있으며 다음과 같이 표시됩니다.#("community") 뒤에 10진수로 작성된 상수입니다. 0 ~65535의 정수 정수만 지원됩니다.[6]

연산자

INTERCAL-72에는 연산자가 5개밖에 없습니다.구현은 어떤 문자가 어떤 동작을 나타내는지 다양하며, 많은 문자가 여러 문자를 받아들이기 때문에 많은 연산자에 대해 여러 가지 가능성이 제공됩니다.

InterCAL[4][6][10] 연산자
교환입니다. INTERCAL-72 문자 C-INTERCAL 문자 CLC-INTERCAL 문자
인터리브/혼합 c 백스페이스 / ¢,$,c백스페이스/ ¢
선택한다. ~ ~ ~
그리고. & & &
또는 V V V
XOR V백스페이스- V백스페이스-,?, V백스페이스-,¥

대부분의 다른 언어들과 달리 AND, OR, XOR은 단항 연산자로 인수의 연속 비트에 작용합니다.결과의 가장 중요한 비트는 입력의 가장 낮은 비트와 가장 중요한 비트에 적용되는 연산자이며 결과의 두 번째로 중요한 비트는 가장 큰 비트와 두 번째로 큰 si에 적용되는 연산자입니다.gnignificant bits, 결과의 세 번째로 중요한 비트는 두 번째 및 세 번째 비트에 적용되는 연산자입니다.연산자는 변수 이름 또는 상수를 지정하는 구두점 마크와 변수를 지정하는 숫자 사이에 놓이거나 그룹화 마크(즉, C와 같은 프로그래밍 언어에서는 한 글자 늦음) 안에 놓입니다.SELECT 및 INTERLEVE(MENG라고도 함)는 infix 이진 연산자입니다.SELECT는 다음 값을 취합니다.두 번째 피연산자의 "1" 비트에 대응하고 "0" 비트에 대응하는 비트를 제거하여 최하위 비트로 이동하고 0으로 채우는 첫 번째 피연산자의 비트(따라서 51(2진수 110011) SELECT 21(2진수 10101)은 5(2진수 101)이다), MENG는 첫 번째 피연산자와 두 번째 피연산자의 비트를 번갈아 비트를 제거합니다.두 번째 피연산자의 최하위 비트가 결과의 최하위 비트입니다).연산자 우선순위는 없습니다. 그룹화 마크는 우선순위가 모호할 수 있는 우선순위를 명확히 하기 위해 사용되어야 합니다(사용 가능한 그룹화 마크는 다음과 같습니다).'("spark")는 다른 스파크와 일치하며,"다른 토끼 귀와 일치하는 ("thears ears")입니다. 프로그래머는 표현을 [6]모호하지 않게 사용할 책임이 있습니다.

제어 구조

INTERCAL 문장은 모두 "문 식별자"로 시작합니다.INTERCAL-72 에서는, 이것은 다음과 같습니다.DO,PLEASE, 또는PLEASE DO이 모든 것은 프로그램에 대해 동일한 의미를 갖습니다(단, 이들 중 하나를 너무 많이 사용하면 프로그램이 거부되거나 C-INTERCAL [10]매뉴얼에서 언급된 INTERCAL-72의 문서화되어 있지 않은 기능), 또는 반전된 형식(와NOT또는N'T([6]ID에 부가됩니다).최신 변형 모델인 INTERCAL을 역추적하면 변형 모델도 다음과 같이 사용할 수 있습니다.MAYBE(PLEASE 또는 DO와 조합될 수 있음)를 스테이트먼트 식별자로 하여 선택 [12]포인트를 도입합니다.식별자 앞에는 옵션 행 번호(괄호 안에 둘러싸인 정수)를 지정할 수 있으며 식별자 뒤에는 다음 형식으로 행이 실행될 확률을 지정할 수 있습니다.%50디폴트는 100% 입니다.[6]

INTERCAL-72에서 주요 제어구조는 NEXT, RESUM 및 FRET이다.DO (line) NEXT지정된 회선에 분기하여 콜스택의 NEXT가 없으면 실행되는 다음 회선을 기억한다(DO 이외의 식별자는 임의의 문장에서 사용할 수 있다.DO는 예로 제시된다).DO FORGET expression는 표현식 엔트리를 콜스택의 선두에서 삭제합니다(이는 엔트리가 80개를 넘었을 때 발생하는 오류를 피하기 위해 도움이 됩니다).DO RESUME expression는 콜 스택에서 식 엔트리를 삭제하고 [6]기억된 마지막 행으로 이동합니다.

C-INTERCAL은 COME FROM 명령도 제공합니다.DO COME FROM (line); CLC-INTERCAL 및 최신 C-INTERCAL 버전도 계산된 COME FROM을 제공합니다(DO COME FROM expression)그리고 NEXT FROM은 COM FROM과 비슷하지만 반환 주소도 NEXT [4]스택에 저장합니다.

원래 인터CAL-72에서 사용 가능했던 프로그램 흐름에 영향을 주는 다른 방법은 변수에 대한 IGNORE 및 REMORE 명령을 사용하는 것입니다(변수에 대한 쓰기가 사일런트 무시되고 다시 유효하게 됩니다).또한 행의 TEAST 및 RESTORE 명령을 사용하는 것입니다.r 문장의 유형에 따라 행이 각각 [6]영향을 받지 않거나 다시 영향을 받습니다.

안녕 세계

기존의 "Hello, world!" 프로그램은 INTERCAL이 표준 프로그래밍 언어와 얼마나 다른지 보여줍니다.C에서는 다음과 같이 읽힙니다.

#실패하다 <stdio.h>  인트 주된(무효) {     인쇄물(안녕, 세상아!\n");      돌아가다 0; } 

C-INTERCAL의 동등한 프로그램은 더 길고 읽기 어렵습니다.

하다 ,1 <-> #13 부탁합니다. 하다 ,1 후보선수 #1 <-> #238 하다 ,1 후보선수 #2 <-> #108 하다 ,1 후보선수 #3 <-> #112 하다 ,1 후보선수 #4 <-> #0 하다 ,1 후보선수 #5 <-> #64 하다 ,1 후보선수 #6 <-> #194 하다 ,1 후보선수 #7 <-> #48 부탁합니다. 하다 ,1 후보선수 #8 <-> #22 하다 ,1 후보선수 #9 <-> #248 하다 ,1 후보선수 #10 <-> #168 하다 ,1 후보선수 #11 <-> #24 하다 ,1 후보선수 #12 <-> #16 하다 ,1 후보선수 #13 <-> #162 부탁합니다. 읽어주세요 나가. ,1 부탁합니다.  업. 

사투리

원래의 Woods-Lyon INTERCAL은 입력/출력 기능이 매우 제한적이었습니다. 유일하게 허용되는 입력은 숫자가 입력된 숫자였고, 유일한 출력은 로마 숫자의 확장 버전이었습니다.

인터넷에서 이용할 수 있는 C-INTERCAL 재실장 덕분에 이 언어는 난해한 프로그래밍 [13]언어 애호가들에게 더욱 인기를 얻고 있습니다.C-INTERCAL 방언은 원래의 INTERCAL과 몇 가지 차이가 있으며, COME FROM 문이나 튜링 텍스트 [10]모델에 기반한 텍스트 I/O 수행 수단과 같은 몇 가지 새로운 기능을 도입했습니다.

C-INTERCAL의 저자들은 또한 Ternary 숫자 체계와 INTERCAL의 [10]연산자 집합을 일반화하면서 TriINTCAL 변형을 만들었다.

더 최근의 변형은 스레드 인터칼로,[14] COME FROM의 기능을 확장하여 멀티스레딩을 지원합니다.

CLC-INTERCAL은 INTERCAL 서버 등 네트워킹 기능을 위한 INAT이라는 라이브러리를 갖추고 있습니다.또, 최초의 양자 컴퓨터에 대응하고 있다고 생각되는 방법으로 다치 계산을 가능하게 하는 Quantum Intercal 등의 기능도 갖추고 있습니다.

2017년 초 a. 대상으로 한 NET 실장.NET Framework는 GitHub에 등장했습니다.이 구현은 독립형 바이너리 라이브러리의 작성과 다른 프로그래밍 언어와의 상호 운용을 지원합니다.[15]

영향과 논의

"A Box, Darkly: Ordumbization, Weird Languages, Code Athemics"[13]라는 기사에서 INTERCAL은 "모든 제정신을 버리고, 여기에 들어온 ye: INTERCAL"이라는 제목으로 설명되어 있습니다.컴파일러와 코멘트 전략은 다음과 같은 "이상한" 기능 중 하나입니다.

적절한 이름인 "ick"라는 컴파일러가 패러디를 계속합니다.컴파일러가 이해할 수 없는 것은 모두 건너뜁니다.일반 언어에서는 컴파일 오류가 발생합니다.이 "포기" 기능은 버그를 찾는 것을 매우 어렵게 합니다.또, 프로그램 코멘트를 추가하는 독자적인 시스템도 도입하고 있습니다.프로그래머는 프로그램 아무 곳에나 컴파일할 수 없는 텍스트를 삽입할 뿐이며, 실수로 코멘트 중간에 유효한 코드가 삽입되지 않도록 주의합니다.

"Technomasochism"[16]에서 Lev Bratisenko는 INTERCAL 컴파일러를 지배자로 규정한다.

PLEASE가 충분히 자주 발생하지 않으면 프로그램은 거부됩니다.즉, 컴파일러의 설명 없이 무시됩니다.너무 자주 그랬는데 이번에도 콧물 때문에 거절당했을 거야프로그래밍 언어에서는 거의 사용되지 않지만 INTERCAL에서는 문장으로 나타나는 다른 단어와 결합하면 코드는 누군가가 애원하는 것처럼 읽힌다.

대중문화

영국의 인디 게임 개발사인 Nitrome이 만든 가상의 비디오 게임기인 Nitrome Expertion System은 INTERCAL로 프로그래밍된 게임을 가지고 있다.

레퍼런스

  1. ^ "The A-Z of Programming Languages: INTERCAL". Techworld. 2008-07-04. Retrieved 2012-03-10.
  2. ^ "The INTERCAL Resources Page". Catb.org. Retrieved 2012-03-10.
  3. ^ "Alex Smith Biography". wolframscience.com.
  4. ^ a b c d e "Clc-Intercal". Clc-Intercal. 2010-04-01. Archived from the original on 2012-12-24. Retrieved 2012-03-10.
  5. ^ "Debian -- Package Search Results -- intercal". packages.debian.org. Retrieved 2021-03-30.
  6. ^ a b c d e f g h i j k l m n o "INTERCAL reference manual". Archived from the original on 2011-07-16. Retrieved 2012-03-10.
  7. ^ "Princeton and Atari Syntax – C-INTERCAL 0.27 Revamped Instruction Manual". Archived from the original on 2012-12-24. Retrieved 2012-11-12.
  8. ^ "HISTORY file for C-INTERCAL". Archived from the original on 2020-05-05. Retrieved 2020-05-05.
  9. ^ "README file for CLC-INTERCAL". Archived from the original on 2020-05-05. Retrieved 2020-05-05.
  10. ^ a b c d e f g "C-INTERCAL supplemental reference manual". Archived from the original on 2008-02-23.
  11. ^ Stross, Charles (September 1992). "Intercal -- the Language From Hell". Computer Shopper (UK).
  12. ^ "Backtracking in Intercal". Cse.unsw.edu.au. 2006-04-11. Retrieved 2012-03-10.
  13. ^ a b Mateas, Michael; Nick Montfort. "A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics" (PDF). Proceedings of the 6th Digital Arts and Culture Conference, IT University of Copenhagen, 1–3 December 2005. pp. 144–153.
  14. ^ "Threaded Intercal". Cse.unsw.edu.au. 2004-06-09. Retrieved 2012-03-10.
  15. ^ "Official home of Simple Component Intercal for .NET". GitHub. 30 September 2021.
  16. ^ Bratishenko, Lev (Winter 2009). "Technomasochism". Cabinet (36). Retrieved 2014-05-27.

외부 링크