{{위키데이터 속성 추적}}
{{Infobox programming language
 | name=브레인퍽<br />Brainfuck
 | file_ext=.b, .bf
 | paradigm=[[난해한 프로그래밍 언어|난해한]], [[명령형 프로그래밍|명령형]], [[구조적 프로그래밍|구조적]]
 | released= 1993년 9월
 | designer=우어반 뮐러(Urban Müller)
 | typing=typeless
 | influenced_by=[[P′′]], [[난해한 프로그래밍 언어|FALSE]]
}}
[[파일:Hello World Brainfuck.png|thumb]]
'''브레인퍽'''({{lang|en|Brainfuck}})은 [[우어반 뮐러]](Urban Müller)가 [[1993년]] 경에 만든 최소주의 [[컴퓨터]] [[프로그래밍 언어]]이다. 이름에 포함된 fuck이 [[욕설]]이기 때문에 '''Brainf*ck''', '''Brainf***''', 혹은 단순히 '''BF'''라고 부르기도 한다.

== 언어의 설계 ==
뮐러는 가장 작은 [[컴파일러]]로 구현할 수 있는 간단하면서도 [[튜링 완전]]한 프로그래밍 언어를 만드는 것이 목적이었다. 이 언어는 여덟 개의 [[명령어 (컴퓨팅)|명령어]]로 구성되어 있다. [[아미가]] 컴퓨터에서 작동하는 [https://web.archive.org/web/20070313151559/http://wuarchive.wustl.edu/pub/aminet/dev/lang/brainfuck-2.lha 원래 컴파일러의 둘째 판]은 크기가 240 [[바이트]] 밖에 안 된다. 그는 다른 [[난해한 프로그래밍 언어]]이자, 컴파일러 크기가 1024바이트인 [[False (프로그래밍 언어)|False]]의 영향을 받았다.

이름이 말해 주듯이, 브레인퍽 프로그램은 이해하기 어려운 경향이 있다. 하지만 [[튜링 기계]]는 컴퓨터가 할 수 있는 모든 작업을 할 수 있고, 브레인퍽이 [[튜링 완전성|튜링 완전]]하기 때문에 브레인퍽 또한 복잡하기는 해도 컴퓨터가 할 수 있는 모든 작업을 할 수 있다.

이 언어는 프로그램 외에, 0으로 초기화된 바이트 단위의 배열과, 처음에 배열의 맨 첫 바이트를 가리키는 [[포인터 (프로그래밍)|포인터]], 그리고 입출력 스트림으로 구성된 간단한 기계 모델에 기반을 두고 있다.

=== 명령어들 ===
여덟 개의 명령어들은 각각 한 개의 문자로 구성되어 있으며 다음과 같다:

{| class="wikitable"
|-
!문자
!의미
|-
!<code>&gt;</code>
|포인터를 증가시킨다.
|-
!<code>&lt;</code>
|포인터를 감소시킨다.
|-
!<code>+</code>
|포인터가 가리키는 바이트의 값을 증가시킨다.
|-
!<code>-</code>
|포인터가 가리키는 바이트의 값을 감소시킨다.
|-
!<code>.</code>
|포인터가 가리키는 바이트의 값을 ASCII 문자로 출력한다.
|-
!<code>,</code>
|포인터가 가리키는 바이트에 입력받은 문자의 ASCII 값을 넣는다.
|-
!<code>[</code>
|포인터가 가리키는 바이트의 값이 0이면 짝이 되는 뒤쪽의 <code>]</code>로 이동한다.
|-
!<code>]</code>
|포인터가 가리키는 바이트의 값이 0이 아니면 짝이 되는 앞쪽의 <code>[</code>로 이동한다.
|}

위의 정의 대신에, <code>]</code>에 ‘짝이 되는 앞쪽의 <code>[</code>로 이동한다’는 의미를 사용할 수 있다. 이는 간단하지만 대칭적이지 못 하고 효율적이지도 않다. 이 두 정의는 모든 브레인퍽 프로그램에 대해서 동일한 행동을 보인다. 거의 사용되지 않지만 동일한 또 다른 정의로는, <code>[</code>가 ‘짝이 되는 뒤쪽의 <code>]</code>로 이동한다’는 의미를 가지고, <code>]</code>가 ‘포인터가 가리키는 바이트의 값이 0이 아니면 짝이 되는 앞쪽의 <code>[</code> 다음 명령어로 이동한다’는 의미를 가지도록 하는 것이 있다.

브레인퍽 프로그램들은 <code>ptr</code>이 <code>unsigned char*</code> 형이라 가정할 때 다음과 같은 치환을 사용해서 [[C (프로그래밍 언어)|C 언어]]로 번역할 수 있다:

{| class="wikitable"
|-
!브레인퍽
!C
|-
!<code> &gt; </code>
|<code> ++ptr; </code>
|-
!<code> &lt; </code>
|<code> --ptr; </code>
|-
!<code> + </code>
|<code> ++*ptr; </code>
|-
!<code> - </code>
|<code> --*ptr; </code>
|-
!<code> . </code>
|<code> putchar(*ptr); </code>
|-
!<code> , </code>
|<code> *ptr = getchar(); </code>
|-
!<code> [ </code>
|<code> while (*ptr) { </code>
|-
!<code> ] </code>
|<code> } </code>
|-
|}

== 해설 ==
참고로 여기서는 배열의 각각의 원소들을 바이트로 서술했기 때문에, - 명령은 필요가 없으며 255개의 + 명령으로 고칠 수 있다. 비슷하게, 만약 배열이 유한하고 환형이면, < 명령은 (배열 크기 - 1)개의 > 명령으로 고칠 수 있다. 하지만 이 언어가 튜링 완전하려면 배열의 크기와 각각의 원소들의 크기가 모두 제한이 없어야 한다. (이는 엄밀히 말할 때 현대의 PC가 튜링 완전하지 않은 이유와 동일하다.)

== 예제 ==
=== [[헬로 월드 프로그램]] ===
명령어에 쓰이는 8개의 문자(+-<>[],.)만 사용한 코드는 다음과 같다.
<syntaxhighlight lang="brainfuck">
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
</syntaxhighlight>
브레인퍽은 이 8개의 문자외에는 모두 무시하므로, 가독성을 위해 공백과 줄바꿈을 넣고 주석을 추가하여 다시 쓴 코드는 다음과 같다.
<syntaxhighlight lang="bf">
+++++ +++++ initialize counter (cell #0) to 10
[ use loop to set the next four cells to 70/100/30/10
 > +++++ ++ add 7 to cell #1
 > +++++ +++++ add 10 to cell #2
 > +++ add 3 to cell #3
 > + add 1 to cell #4
 <<<< - decrement counter (cell #0)
]
> ++ . print 'H'
> + . print 'e'
+++++ ++ . print 'l'
. print 'l'
+++ . print 'o'
> ++ . print ' '
<< +++++ +++++ +++++ . print 'W'
> . print 'o'
+++ . print 'r'
----- - . print 'l'
----- --- . print 'd'
> + . print '!'
> . print '\n'
</syntaxhighlight>
=== [[ROT13]] ===
<syntaxhighlight lang="bf">

-,+[ Read first character and start outer character reading loop
 -[ Skip forward if character is 0
 >>++++[>++++++++<-] Set up divisor (32) for division loop
 (MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
 <+<-[ Set up dividend (x minus 1) and enter division loop
 >+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward
 <[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient
 <<<<<- Decrement dividend
 ] End division loop
 ]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag
 >--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag
 ++++++++++++<[ If flag then set up divisor (13) for second division loop
 (MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
 >-[>+>>] Reduce divisor; Normal case: increase remainder
 >[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient
 <<<<<- Decrease dividend
 ] End division loop
 >>[<+>-] Add remainder back to divisor to get a useful 13
 >[ Skip forward if quotient was 0
 -[ Decrement quotient and skip forward if quotient was 1
 -<<[-]>> Zero quotient and divisor if quotient was 2
 ]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1
 ]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0
 ] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
 <[-] Clear remainder from first division if second division was skipped
 <.[-] Output ROT13ed character from copy and clear it
 <-,+ Read next character
] End character reading loop
</syntaxhighlight>

== 같이 보기 ==
비슷한 언어들의 목록:
* [[Doublefuck]], 두 개의 배열을 사용하는 브레인퍽의 변형.
* [[Brainfork (프로그래밍 언어)|Brainfork]]
* [[PATH (프로그래밍 언어)|PATH]], 브레인퍽과 [[비펀지]]를 결합한 언어.
* [[SNUSP (프로그래밍 언어)|SNUSP]], 비슷하지만 호출 스택을 가진다.
* [[L33t (프로그래밍 언어)|l33t]]
* [[L00P (프로그래밍 언어)|L00P]]
* [[Ook|Ook!]]
* [[QUOTE (프로그래밍 언어)|QUOTE]]
* [[Aura (프로그래밍 언어)|Aura]]
* [[Spoon 인터프리터|Spoon]], 오직 "0"과 "1" 문자로만 이루어진 토큰을 사용함.
* [[THRAT (프로그래밍 언어)|THRAT]], 명령 테이블에 있는 Brainfuck 명령들을 접근하기 위해 오직 두 개의 명령만을 사용함.

== 외부 링크 ==
* [http://www.muppetlabs.com/~breadbox/bf/ Brian Raiter, Muppetlabs. '''Brainfuck: An Eight-Instruction Turing-Complete Programming Language''']. 이 사이트에는 브레인퍽 [[콰인]]이 함께 들어 있다.
* [https://web.archive.org/web/20031206060451/http://esoteric.sange.fi/brainfuck/ Panu Kalliokoski. '''The Brainfuck Archive'''] - 많은 브레인퍽 프로그램, 콰인, 구현들을 제공한다.
* [https://web.archive.org/web/20041126141853/http://www.microlyrix.com/software/bfdev/ 윈도용 브레인퍽 인터프리터와 통합 개발 환경(IDE)]
* [http://home.arcor.de/partusch/html_en/bfd.html '''Brainfucked''' - Brainfuck Compiler] {{웨이백|url=http://home.arcor.de/partusch/html_en/bfd.html |date=20050303201936 }} (Windows/DOS)
* [http://home.planet.nl/~faase009/Ha_bf_Turing.html Frans Faase. '''BF is Turing Complete''']
* [http://www.hevanet.com/cristofd/brainfuck/ Daniel Cristofani. '''some Brainfuck fluff.''']
* [https://web.archive.org/web/20080529025538/http://www.brainfuck.ca/ Brainfuck.ca '''GPL로 배포되는 브레인퍽 인터프리터와 소스 변환기들''']
* [https://web.archive.org/web/20041206190913/http://www.hardtware.de/index.cgi?site=products&action=brainfuck 윈도용 브레인퍽 인터프리터와 컴파일러]
* [https://web.archive.org/web/20041010074250/http://elswanko.vm.bytemark.co.uk/~fraggle/stuffage/bf.net/ Brainfuck.Net]
* [http://www.nada.kth.se/~matslina/awib/ Also Written In Brainfuck (awib)]는 [[x86]] 플랫폼과 [[리눅스]] 실행 파일을 생성하며, 브레인퍽으로 만든 브레인퍽 컴파일러이다.
* [https://web.archive.org/web/20050104182641/http://robos.org/bfcomp/index.html Robert Östling. '''Brainfuck computer.''']
* [http://www.clifford.at/bfcpu/ Clifford Wolf. '''The Brainf*ck CPU'''과 다른 브레인퍽에 관련된 프로젝트들] {{웨이백|url=http://www.clifford.at/bfcpu/ |date=20171218061322 }}
* [https://web.archive.org/web/20050318095341/http://www.chilliwilli.co.uk/ff/ '''F*ckF*ck homepage''']
* [https://web.archive.org/web/20041217142702/http://martin.egy.nu/index.php?page=bfcomp '''A Brainfuck Computer With a Brainfuck CPU''']
* [https://web.archive.org/web/20050205181458/http://alephmobius.8m.com/dl.html '''The download page with Blue Fern, a Brainfuck IDE''']
* [https://web.archive.org/web/20041205075108/http://alx2002.free.fr/ '''A Brainfuck tutorial''' in English and French].
* [http://kidsquid.com/programs/bf/bf.html Jeffry Johnston. '''BF 프로그램들''', 기본적인 컴파일러와 어셈블러를 포함함]{{깨진 링크|url=http://kidsquid.com/programs/bf/bf.html }}

[[분류:난해한 프로그래밍 언어]]
[[분류:1993년 개발된 프로그래밍 언어]]
[[분류:영어 기반이 아닌 프로그래밍 언어]]