brainfuck(brainf**k, 브레인퍽)
브레인퍽 사용법
https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%A0%88%EC%9D%B8%ED%8D%BD
브레인퍽 온라인 컴파일러
https://www.ryugod.com/pages/ide/bf
자체 개발 브레인퍽 컴파일러
https://github.com/riroan/brainfuck-python
브레인퍽을 깨달아버려서 글로 남기고자 한다.
브레인퍽은 ><+-.,[] 이 8개의 문자로 프로그래밍 할 수 있는 언어이다.
상당히 심플하고 처음에는 이해가 좀 힘들었지만 한번 이해하고 나면 사용하기 쉽다.
각 문자가 나타내는 내용은 다음과 같다.
문자 | 역할 | C문법 |
> | 포인터를 1 증가시킨다. | ++ptr; |
< | 포인터를 1 감소시킨다. | --ptr; |
+ | 포인터의 값을 1 증가시킨다. | ++*ptr; |
- | 포인터의 값을 1 감소시킨다. | --*ptr; |
. | 현재 포인터의 ASCII값을 출력한다. | putchar(*ptr); |
, | 현재 포인터에 ASCII값을 입력받는다. | *ptr=getchar(); |
[ | 현재 포인터 값이 0이라면 대응되는 ]로 이동한다. | while(*ptr){ |
] | 현재 포인터 값이 0이 아니라면 대응되는 [로 이동한다. | } |
C언어에서 포인터를 자주 사용해봤다면 익숙할것이다.
Hello world코드를 분석해보자.
Hello world의 아스키값은 [72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 10]이다.(마지막 개행 포함)
앞으로 편의상 현재 위치한 포인터를 $p_n$이라고 할 것이다. (시작은 0)
1번줄
우선 $p_0$을 반복변수로 정의한다.
$p_1$을 H로 만들고 싶은데 그러기 위해서는 +를 72번 타이핑해야하므로 불편하다.
1번줄이 반복문을 사용해서 8*9로 만드는 코드이다.
$*p_0 = -8$이고 반복문마다 $++*p_0;*p_1+=9;$가 수행된다.
마지막에 .으로 H로 출력한다.
2번줄
$*p_1 = 72$에서 $*p_1 = 101$로 만들기 위해 30을 더하고 1을 뺀 후 출력한다.
3~4번줄
각각 $*p_1$에 7, 3을 더하고 출력한다.
5번줄
$*p_2 = 32$(4*8)로 만들어서 공백을 출력한다.
6~10번줄
$*p_1$에 각각 해당하는 수를 더하고 빼서 world를 출력한다.
11번줄
마지막은 0인 반복변수 $*p_0$을 10으로 만들어 출력한다.
brainfuck은 튜링 완전 언어이므로 대응되는 아스키값을 알고 있다면 다른 언어로 만들 수 있는 프로그램을 만들 수 있을 것이다.
백준에서 brainfuck으로 채점이 가능하고 vscode에 syntax highlighter를 제공하는 갓언어이다.
생각보다 어렵지 않으니 관심이 있다면 도전해보자!
'프로그래밍 언어 > 취업 필수 언어' 카테고리의 다른 글
[프로그래밍 언어] 롤랭 (1) | 2022.12.13 |
---|---|
[프로그래밍 언어] 엄랭 (0) | 2022.04.17 |