% 난해한 프로그래밍 언어 개론과 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 코드 모음:
*
*