% 난해한 프로그래밍 언어 개론과 Befunge % 강 성훈 % 2013년 10월 26일 미니 대안언어축제 # Esoteric programming language ![](img/esoteric.png) # 왜 만들었는가? > - 최대한 작은 언어를 만들어 보자! → **Brainfuck** > - 기존 언어에 없을 법한 특이한 기능을 써 보자! → **Befunge** > - 엄청 쓰기 어렵게 만들어보자! → **Malbolge** > - 개그를 쳐 보자! → **LOLCODE** # Brainfuck (1993) "안녕, 세상아!" ~~~~ ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++ ..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. ↓ Hello, world! ~~~~ # Brainfuck 명령들 ![](img/brainfuck.png) # Malbolge (1998) ~~~~ (=<`#9]~6ZY32Vw/.R,+Op(L,+k#Gh&}Cdz@aw=;zyKw% ut4Uqp0/mlejihtfrHcbaC2^W\>Z,XW)UTSL53\HGFjW ~~~~ # Malbolge: 세상에서 가장 어려운 언어? * [첫 Hello, world 프로그램](http://www.acooke.org/malbolge.html)까지 2년 * [루프와 조건문을 여럿 사용하는 첫 프로그램](http://www.99-bottles-of-beer.net/language-malbolge-995.html)까지 7년 * [자기 자신을 출력하는 첫 프로그램](http://www.matthias-ernst.eu/malbolgequine.html)까지 14년 # LOLCODE (2007) ![](img/lolcode.jpg) ([출처](http://cheezburger.com/1874887424)) # Befunge (1993) ~~~~ "!dlrow olleH">:#,_@ ~~~~ # 실습 1: 직접 돌려 봅시다 ![](img/befungehello.png) ---- 1. 앞의 코드는 이미 입력되어 있으므로 다시 입력하지 않아도 됩니다. 2. "한 단계씩"을 눌러 보면서 이 언어가 어떻게 동작하는지 짐작해 보세요. 3. 각 문자들이 하는 일이 무엇일까요? 도움말을 보지 않고 추측해 보세요. # 2차원 코드 ![](img/wumpustrace.jpg) ---- 1. `>`가 실행되고 2. `:`이 실행되고 3. `#`이 실행되며 `,`를 건너 뛰고 4. `_`이 실행되며 왼쪽으로 움직이기 시작하고 5. `,`가 실행되고 6. `#`이 실행되며 `:`을 건너 뛰고 7. `>`이 실행되며 오른쪽으로 움직이기 시작하고 ---- 8. ... 9. `_`이 실행되는데 이번에는 조건이 반대라서 오른쪽으로 움직이기 시작하고 10. `@`가 실행되며 프로그램이 종료! 동일한 코드: ~~~~ "!dlrow olleH">v ,: ^_@ ~~~~ # 스택 ![](img/stack.png) # 변경 가능한 코드 ![](img/selfmodify.png) 1. 스택만으로 도저히 안 되는 데이터를 저장하거나 읽을 때 2. 코드가 너무 꽉 차 있어서 빠져나올 수 없을 때 3. 코드를 이상하게 만들 때 ← ????? # 실습 2: 팩토리얼 0보다 큰 숫자 n을 입력받아서 1×2×...×n을 출력하는 프로그램을 짜 봅시다. ~~~~ 4 → 24, 10 → 3628800 ~~~~ 1. 이제부터는 도움말을 보셔도 됩니다. 2. 잘 모르겠으면 스택에 무슨 내용이 들어가야 할지 그림을 그려 봅시다. 3. `g`/`p`를 안 쓰는 방법도 있지만 쓰는 편이 더 쉽습니다. # 실습 3: 낱말 검열 소문자 영어 낱말을 입력받아서 그 중 모음(aeiou)을 `*`, `#`, `@`, `?` 넷 중 하나로 바꾸는 프로그램을 짜 봅시다. 로마자 소문자가 아닌 글자가 나오면 바로 종료하세요. ~~~~ antidisestablishmentarianism → #nt*d*s#st?bl*shm@nt@r*@n#sm ~~~~ 1. 한 번에 모든 코드를 짜려고 하지 말고 부분 부분을 짜서 합쳐 보세요. 2. 코드에 배열을 넣으려면 어떻게 해야 할까요? 3. `?` 명령으로 들어가는 방향과 나오는 방향이 같을 경우를 잘 생각해 보세요. # 더 찾아 볼 곳들 * 난해한 프로그래밍 언어 위키 * * Befunge 코드 모음: * *