난해한 프로그래밍 언어 개론과 Befunge

강 성훈 http://mearie.org/

2013년 10월 26일 미니 대안언어축제

Esoteric programming language

왜 만들었는가?

Brainfuck (1993)

“안녕, 세상아!”

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

↓

Hello, world!

Brainfuck 명령들

Malbolge (1998)

(=<`#9]~6ZY32Vw/.R,+Op(L,+k#Gh&}Cdz@aw=;zyKw%
ut4Uqp0/mlejihtfrHcbaC2^W\>Z,XW)UTSL53\HGFjW

Malbolge: 세상에서 가장 어려운 언어?

LOLCODE (2007)

(출처)

Befunge (1993)

"!dlrow olleH">:#,_@

실습 1: 직접 돌려 봅시다

http://cosmic.mearie.org/2013/10/altlang/interp

  1. 앞의 코드는 이미 입력되어 있으므로 다시 입력하지 않아도 됩니다.
  2. “한 단계씩”을 눌러 보면서 이 언어가 어떻게 동작하는지 짐작해 보세요.
  3. 각 문자들이 하는 일이 무엇일까요? 도움말을 보지 않고 추측해 보세요.

2차원 코드

  1. >가 실행되고
  2. :이 실행되고
  3. #이 실행되며 ,를 건너 뛰고
  4. _이 실행되며 왼쪽으로 움직이기 시작하고
  5. ,가 실행되고
  6. #이 실행되며 :을 건너 뛰고
  7. >이 실행되며 오른쪽으로 움직이기 시작하고
  1. _이 실행되는데 이번에는 조건이 반대라서 오른쪽으로 움직이기 시작하고
  2. @가 실행되며 프로그램이 종료!

동일한 코드:

"!dlrow olleH">v
              ,:
              ^_@

스택

변경 가능한 코드

  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. ? 명령으로 들어가는 방향과 나오는 방향이 같을 경우를 잘 생각해 보세요.

더 찾아 볼 곳들