Strict Standards: Non-static method Soojung::addReferer() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/settings.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/lifthrasiir/sites/sapzil.info/soojung/settings.php:79) in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Counter.class.php on line 63

Strict Standards: Non-static method Entry::getEntry() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/entry.php on line 51

Strict Standards: Non-static method Soojung::entryIdToFilename() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Entry.class.php on line 182

Strict Standards: Non-static method Soojung::queryFilenameMatch() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Soojung.class.php on line 55
TokigunStudio3 | 블로그: [특집 코너] 이 프로그래밍 언어... 쓸 수 있을까?

내용으로 바로 넘어 가기


TokigunStudio3

1 / 3283   


더 이상 이 블로그는 운영되지 않습니다. 새 블로그로 가 주세요.

[특집 코너] 이 프로그래밍 언어... 쓸 수 있을까?

2005/01/14 AM 12:57 | 컴퓨터/프로그래밍 언어 | 5 comments | 1 trackbacks | AllBlog: vote, to pocket

esoteric programming language(이하 esolang)들에 흥미를 느껴서 슬슬 접근해 본 게 벌써 2년 가까운 시간이 되었다. 내가 지금까지 한 번이라도 쳐다 본 esolang에는 다음과 같은 것이 있다. (생략한 것도 무지 많다. 내 기억으로는 50개 정도는 본 것 같다)

* Brainfuck: esolang 가운데서 가장 잘 알려져 있고 많은 사람들이 지원을 아끼질 않는 언어. 그 자체는 8개의 명령어로 이루어진 작은 명령형 언어이다.
* Befunge: 코드에 "차원"이라는 엄청난(...) 개념을 도입한 언어. Befunge-93의 경우 36개의 명령어, Funge-98의 경우 95개의 명령어를 지원하는데 특히 Funge-98의 경우 엄청난 확장성으로 다른 esolang보다 훨씬 더 여러 용도로 사용할 수 있다.
* INTERCAL: 도저히 알 수 없는 명령 이름 센스와 알 수 없는 연산들(아니 mangle이 뭐야 mangle이)이 합쳐져서 도저히 이해할 수 없는 언어를 만든 대표적인 사례. (더 흥미로운 건 입력 결과와 출력 결과 포맷이 정해져 있다는 것... -_-) 20년 넘는 긴 역사를 자랑하는 esolang으로 그 유명한 Donald Knuth도 INTERCAL 프로그램 하나 짜서 자기 홈페이지에 공개하고 있다. -_-
* Whitespace: 공백만으로 프로그래밍을 할 수 있다는 걸 보여 주는 사례... 내가 파이썬으로 인터프리터 짠 경험이 있다. 명령 체계 자체는 3진법 sequence를 사용하고... 명령 수는 24개이다. (개인적으로는 그나마 esolang 중에서 상당히 쉬운 편에 속한다고 본다)
* Whirl: 최근에 조금 건들어 보고 있는 언어... 명령을 수행하는 ring이라는 개념을 도입하고 명령 자체는 그 ring을 회전시켜서 선택하는 형식. (그래서 홈페이지에는 건강에 매우 안 좋다고 경고문이 붙어 있다) 실제 명령은 24개이고 숫자를 바로 입력하는 방법이 없어서 ring들을 왔다 갔다 하면서 숫자를 "만들어 내야" 한다. (직접 입력 가능한 숫자는 0 아니면 1 뿐이다) 시간 나면 beersong 프로그램이나 짜 보려고 한다.
* Unlambda: 지금까지 설명한 것이 명령형 언어였다면 이 언어는 함수형 언어다. (함수형 언어인 esolang은 보기 드물다) 뭐 concept가 다른 것 말고는 크게 볼 만한 건 없지만... CUAN만은 감동이다.
* var'aq: Forth와 비슷한 스타일에 명령문 체계를 Klingon 언어(이건 스타트렉에서 나오는 인공어이다)로 재구성한 언어... 재밌는 건 영문 키워드가 따로 있고 Klingon 키워드가 따로 있다는 것이다. (후자가 정식이긴 하지만 입력이 귀찮다는 이유로 전자도 지원한다. 둘은 서로 변환 가능하다)
* 4DL: Befunge에서 유래한 4차원 좌표를 사용하는 esolang....이지만 개인적으로는 차라리 Quadfunge를 만들어 쓰고 싶다.
* Shakespeare: (일명 SPL이라고도 불림) 영문 문법을 사용하는 프로그래밍 언어. 하지만 상당히 제한적이라는 게 흠이다. (사실 자연어를 프로그래밍 언어로 쓴다는 것이 쉬운 일이 아니지만...)
* ETA: 다른 의미에서 영문 문법을 사용할 수 있는 프로그래밍 언어. (정확히는 영문 문장에 embed된다고 하는 게 맞겠다. 한국어는 안 나오냐?) 7개의 명령어를 가지고 있으며 숫자를 바로 입력하기 위한 N 명령에서는 7진법 표기를 사용한다. 프로그램의 흐름이 줄 단위로 이루어진다는 게 특징이다.
* HQ9+/HQ9++: 4개의 명령(HQ9++는 5개)으로 이루어진, 사실은 아무 짝에도 쓸모 없는 esolang. 그럼에도 불구하고 대부분의 언어에서 만들기 매우 힘든 언어를 만드는 데는 매우 편하다. (Hello world 프로그램 등등)
* Orthogonal: Befunge와 비슷한 시기에 독립적으로 만들어졌으면서 거의 비슷한 컨셉을 가진 언어. Befunge보다는 조금 더 유연한 편이다. (코드 공간을 여러 개로 나눠서 소스에 기술할 수 있다) 개인적으로는 스프레드시트를 사용한 인터프리터가 괜찮았다고 본다. (Befunge는 이렇게 하기 힘든 구조지만...)
* Reverse: 명령형 언어...지만 jump 문이 없는 특이한 언어. 무한대의 정수/실수/문자형 변수를 할당 가능하며 명령의 흐름을 바꿀 수 있는 명령은 SKIP과 REVERSE 뿐. 근데 생각해 보면 Unefunge와 거의 유사하다. -_-;;; (어려울 것 같아 보이지만 사실 크게 어려운 것도 아니다)
* COW: 소를 위한 프로그래밍 언어-_-라는 부제가 붙은 언어. Moo 비슷한 소리가 나는 세 글자 단어만 모아서 대소문자 바꾼 것들을 명령으로 쓴다. 기본적으로는 Brainfuck과 비슷한 스타일의 메모리 체계를 가지고 있으며 명령 수는 12개이지만, DDX라는 확장이 있을 때는 20개의 명령을 지원한다. (이 확장은 의외로 편리한 구석이 많다)
* Kvikkalkul: 유즈넷에 스웨덴 해군이 1960년대에 썼던 언어랍시고 올려서 알려진 언어... 물론 개뻥이라고 짐작하고 있다. INTERCAL의 영향을 받은 언어로 추정된다 (직접 두 언어의 레퍼런스를 비교해 보면 그 유사성을 알 수 있다.)
* l33t: l33t speak이라고 불리는, 영어권에서 사용되는 은어(일명 해커어... 지만 진짜 해커들은 절대 안 쓰는 말이기도 한)에서 유래한 esolang. 이 은어의 특징이 숫자가 장난 아니게 많이 들어 간다는 것인데 (우리나라의 외계어 수준으로 봐도 좋다.) 그걸 응용해서 숫자들을 명령 삼아서 동작하는 언어이다. -_-;
* Iota/Jot: Unlambda와 같이 함수형 언어지만 훨씬 더 작은(명령 수가 2개 밖에 안 된다...) 언어이다. 아직 잘 살펴 보지는 않아서 자세한 사항은 못 말하겠다.
* PATH: Befunge에서는 차원의 개념을, Brainfuck에서는 메모리 구조를 따 와서 만든 언어... 크게 주목할 만한 곳은 없음.
* Spaghetti: 문장 순서를 마음대로 꼬아 넣을 수 있는 아주 무지막지한 언어. 하지만 코드 자체가 너무 자명하다는 단점이 있기 때문에 재미는 없다.
* Choon: 출력 결과를 무려 사운드 파일(........)로 내 놓는 언어. 그 명령들 또한 악보에서 유래했다는 게 재미있다.
* URISC: Ultimate RISC의 약자로, 명령이 단 하나 뿐인 프로세서. -_-; 알고 보면 명령 자체가 조금 복합적인 요소가 있긴 하지만... (subleq라니... -_-)
* ZT: Befunge에서 차원 개념을 빌려 왔다. 코드 자체는 특이하게 생기긴 했는데 큰 재미는 없는 편.
* Java2K: 확률적으로 동작하는-_- 프로그래밍 언어. 코드 자체는 여러 개의 함수들이 얽혀 있는 문장들을 실행하게 되어 있는데, 거의 대부분의 함수가 10%의 확률로 잘못된 값을 반환한다. -_-;;;;;;

그리고 이들 중에서 가장 골때리는 언어 두 개만 고르자면:

* Malbolge: 이건... 인간이 프로그래밍하라고 만든 게 아니다. 제작자 자신의 의도가 최대한 어렵게 만들려는 것이었고, Malbolge로 만든 첫 프로그램이 나올 때까지는 Malbolge 자체가 발표된 후 2년이 걸렸다. -_-; 그러나 최근에 몇몇 트릭이 발표되면서 환경이 좋아지는 추세(?)이다. 웃긴 건 언어 자체 스펙과 인터프리터의 행동에 서로 다른 부분이 있다는 거... (그래서 언어 자체 스펙은 절대로 보면 안 된다. 인터프리터를 봐야 한다 -_-;) 아, Malbolge의 기본 틀을 유지하면서 훨씬 더 쉬운 Dis라는 언어도 있다.
* NULL: 이건... 제작자가 귀찮다고 인터프리터도 안 만든 언어인데 0차원 언어를 구상하다가 만들어 냈다는 말도 안 되는 언어. 하나의 정수가 프로그램을 구성하는데, 내 머리로는 도저히 이걸 가지고 프로그램을 어떻게 만드라는 건지 감이 안 잡힌다. -_-; Hello world 프로그램 만들려면 아무래도 1부터 모든 숫자를 다 실행해 봐야 할 예감이 들고 있다. 언어 자체는 14개의 명령을 가지고 있으며 기본 자료 구조는 queue이고 덤으로 무한한 크기의 숫자를 담을 수 있는 두 변수 x/y가 있는데 x가 프로그램을 담고 있다. 문제는 한 명령이 실행될 때마다 x와 y의 값이 계속 바뀐다는 것... -_-;;;;; 뭘 어쩌란 말이야 이거! (인터프리터 구현은 쉽겠군...)

NULL은 최근에 발견한 esolang인데 여러 가지로 생각할 구석이 많은 언어이다. 자세한 사항은 여기를 참고하시면 알 수 있다. 누구 이걸로 아무 프로그램이나 짜 보신 분께서는 연락 주시면 감사하겠다 -_-;;;;;;;;

덤. 지금 세어 보니까 27개라니... -_-; 많긴 많네. 다 써 내느라 죽는 줄 알았다.

TrackBack URL: http://sapzil.info/soojung/trackback.php?blogid=304

Trackback: Daybreakin Things (2005/01/14 PM 07:58)

Esoteric Programming Languages

보통 프로그래밍을 할 땐 C/C++, Visual Basic, Python 등이나 PHP, Perl, ASP, Java 등의 언어를 사용하는데, 사람들은 그런 언어뿐만 아니라 매우 많은 언어들을 만들어냈다. 일종의 지적 유희라고나 할까.. 사람들에 따라선 이런 esoteric language들을 쓸모 없다고 보는 경우도 있지만 같은 기능을 수행하는 프로그램이더라도 이 언어들에서는 매우 다양한 형태로 나타나며 어떤 것에서는 굉장히 길고 복잡하게 구현되지만 다른 것에서는 거의 한 줄 내지는 몇 바이트로 끝날 수도 있다. 대표적인 'esolang'으로는 befunge가 있는데 이는 프로그램 코드를 2차원 평면에 표현한다는 아이디어에서 출발한 것이고 잘 사용되지는 않지만 3차원, 4차원으로 표현하는 것들도 있다. 이에 대해 토끼군이 블로그에 여러 언어들을 소개해 놓았기에 링크해 둔다. trackback to :...

Comment: Daybreaker (2005/01/14 AM 01:08)

난 대략 Choon이란 언어를 공부해 보면 좋을 듯 하군. (쩝.. 지금 서울어학원 숙제 gg치고 쉬는 중이다.. -_-)
NULL이란 언어는 일종의 수열로 이루어지는 건가? 뭔가 재미있는 구석이 있을 듯.. 그리고 Befunge에서 3차원, 4차원으로 확장한 것도 이미(예상했지만) 나와 있었군.

Comment: 인클루드 (2005/01/14 AM 01:22)

//Malbolge로 만든 첫 프로그램이 나올 때까지는 Malbolge 자체가 발표된 후 2년이 걸렸다.
쿨럭; 니름도 안되는군요... OTL

Comment: 디토 (2005/01/14 AM 08:18)

Choon은 정말 재미있는데요? 결과로 나온 사운드 파일이 멋진... :)

Comment: 디토 (2005/01/14 AM 08:20)

아 그리고 이왕이면 홈페이지도 링크해주시지~

Comment: 토끼군 (2005/01/14 AM 11:19)

Daybreaker:
Quadfunge는 이론상으로는 가능하지만 Trefunge에서 이미 ASCII 영역의 명령이 모두 차 버렸기 때문에 사실상 불가능하다고 봐도 됨. 4DL은 컨셉만 비슷하고 서로 다른 언어기 때문에 가능한 거고.
NULL은... NULL은..... -_-; 예를 들어서 5 x 17 x 31 x 31 x 47 x 101같은 숫자가 하나의 프로그램을 표시하는 거다. 5, 17 등등의 factor들은 작은 순서대로 실행되고, 명령은 14개 단위로 반복되어서 배당되어 있지. 자세한 건 스펙 참고...

인클루드: 최근의 업적이라고 소개되는 것들이 "임의의 문자열을 Malbolge로 출력하는 방법"일 정도로 만들어진 프로그램이 거의 없는 실정입니다. 공식적으로 발표된 (의미 있는) Malbolge 프로그램은 열 손가락에 꼽을 정도고요.

디토: Choon은 아이디어는 괜찮은 것 같은데 자세히는 안 봐서... 흐흐... 대부분은 구글이나 위키백과에서 찾아 볼 수 있습니다. (위키백과의 List of esoteric programming language 페이지를 참고하세요)

Copyright (c) 1995-2005, Kang Seonghoon (Tokigun).