브레인퍽(BrainFuck)


요약하면 [난해한 프로그래밍 언어]라고 할 수 있습니다. 이는 1993년 우어반 뮐러(Urban Muller)가 아미넷에 올려 알려진 것이 시초라고 하며, 난해한 프로그래밍 언어 중에서 매우 오래된 녀석이라고 합니다. 브레인퍽이 정말 프로그래밍 언어라고 할 수 있는 이유는 [조건문], [루프문], [배열] 등의 기능이 정말로 존재하며, 이러한 규칙을 이용하여 정말 프로그래밍할 수 있기 때문입니다.


해당 포스트에서는 자세한 언어적 요소를 다루지는 않습니다. 다만, 간략하게 소개만 하도록 하겠습니다.


 

 브레인퍽 구조

브레인퍽은 다음과 같은 일곱 가지 명령(여덟 개의 문자)들로 이루어져 있습니다.


문자

설명

+

테이프가 가리키는 숫자를 1 증가시킵니다.

-

테이프가 가리키는 숫자를 1 감소시킵니다.

>

테이프를 한 칸 오른쪽으로 옮깁니다.

<

테이프를 한 칸 왼쪽으로 옮깁니다.

.

테이프가 가리키는 숫자를 ASCII 문자로 해석해서 출력합니다.

,

문자를 하나 읽어서 ASCII 값을 테이프가 가리키는 위치에 저장합니다. 만약 파일의 끝위치(EOF - End Of File)에서 동작하는 원리는 구현체마다 차이가납니다.

[...]

루프문입니다. 매번 현재 테이브가 가리키는 숫자(매 루프마다 바뀔 수 있습니다.)가 0인지 아닌지 체크하여 조건이 만족되면 계속 안에 들어 있는 코드를 실행합니다.


위의 구조가 상당히 복잡한 것을 알 수 있습니다.

마치 어셈블리어보다 덜 고급지면서 은근 있을 건 다 있는 녀석입니다. 허허...


브레인퍽은 사실 프로그래밍일 깡으로 하기에는 부적절한 언어입니다. 때문에 기존의 코드를 난독화를 위해 사용되기도 합니다.





 

 브레인퍽 난독화 사이트


브레인퍽의 코드를 직접 작성하는 것은 머리가 기계가 아닌 이상 굉장히 어려운 일입니다. 따라서 직접 코딩하지 않고, 복잡한 구조를 이용한 난독화 기법 적용이 있습니다. 이러한 난독화 기법을 제공해주는 사이트가 있어서 소개해보려고 합니다.


DCode - Brainfuck 링크


해당 사이트에서는 두 가지 방법의 서비스를 제공합니다.

하나는 기존의 소스코드를 브레인퍽 코드로 변환해주는 인코딩(Encoding)이 있고, 브레인퍽 소스코드를 원래의 소스로 변환해주는 기능을 가지고 있습니다.


 

 브레인퍽 인코딩

기존의 코드를 브레인퍽 코드로 변경하는 예제를 살펴보도록 하겠습니다.

위와 같은 순서로 원하는 소스코드를 입력하게 되면, 브레인퍽 소스코드로 변환됩니다.




 

 브레인퍽 디코딩

브레인퍽 코드로 변경했다면 다시 원래의 코드로 바꾸는 기능이 필요하지요. 다음과 같은 순서로 난독화한 소스코드를 입력해준다면, 다시 원래의 소스코드를 보여주는 서비스도 함께 제공합니다!




+ Recent posts