1. พื้นฐาน
เพื่อให้เข้าใจ Brainfuck คุณต้องจินตนาการถึงอาร์เรย์ของเซลล์ที่เริ่มต้นโดย0แต่ละเซลล์
...[0][0][0][0][0]...
เมื่อโปรแกรม Brainfuck เริ่มต้นจะชี้ไปที่เซลล์ใด ๆ
...[0][0][*0*][0][0]...
หากคุณเลื่อนตัวชี้ไปทางขวาแสดง>ว่าคุณกำลังย้ายตัวชี้จากเซลล์ X ไปยังเซลล์ X + 1
...[0][0][0][*0*][0]...
หากคุณเพิ่มมูลค่าเซลล์+คุณจะได้รับ:
...[0][0][0][*1*][0]...
หากคุณเพิ่มมูลค่าเซลล์อีกครั้ง+คุณจะได้รับ:
...[0][0][0][*2*][0]...
หากคุณลดค่าเซลล์-คุณจะได้รับ:
...[0][0][0][*1*][0]...
หากคุณย้ายตัวชี้ไปทางซ้ายแสดง<ว่าคุณกำลังย้ายตัวชี้จากเซลล์ X ไปยังเซลล์ X-1
...[0][0][*0*][1][0]...
2. อินพุต
,หากต้องการอ่านตัวอักษรที่คุณใช้เครื่องหมายจุลภาค มันทำอะไร: อ่านอักขระจากอินพุตมาตรฐานและเขียนรหัส ASCII ทศนิยมไปยังเซลล์จริง
ลองดูที่ตาราง ASCII ตัวอย่างเช่นรหัสทศนิยม!คือ33ในขณะที่มีa97
ลองนึกภาพหน่วยความจำโปรแกรม BF ของคุณเป็นดังนี้:
...[0][0][*0*][0][0]...
สมมติว่าอินพุตมาตรฐานย่อมาจากaถ้าคุณใช้,ตัวดำเนินการลูกน้ำสิ่งที่ BF ทำคืออ่านaรหัส ASCII ทศนิยม97ไปยังหน่วยความจำ:
...[0][0][*97*][0][0]...
โดยทั่วไปคุณอยากจะคิดแบบนั้นอย่างไรก็ตามความจริงนั้นซับซ้อนกว่าเล็กน้อย ความจริงก็คือ BF ไม่ได้อ่านอักขระ แต่เป็นไบต์ (ไบต์คืออะไร) ให้ฉันดูตัวอย่าง:
ในลินุกซ์
$ printf ł
พิมพ์:
ł
ซึ่งเป็นลักษณะเฉพาะของโปแลนด์ อักขระนี้ไม่ได้เข้ารหัสโดยการเข้ารหัส ASCII ในกรณีนี้เป็นการเข้ารหัส UTF-8 ดังนั้นจึงเคยใช้หน่วยความจำคอมพิวเตอร์มากกว่าหนึ่งไบต์ เราสามารถพิสูจน์ได้โดยการถ่ายโอนข้อมูลฐานสิบหก:
$ printf ł | hd
ซึ่งแสดง:
00000000 c5 82 |..|
ศูนย์จะถูกชดเชย 82เป็นc5ไบต์แรกและเป็นไบต์ที่สองแทนł(ตามลำดับเราจะอ่าน) |..|เป็นการแสดงกราฟิกซึ่งไม่สามารถทำได้ในกรณีนี้
ถ้าคุณส่งłอินพุตไปยังโปรแกรม BF ของคุณที่อ่านไบต์เดียวหน่วยความจำโปรแกรมจะมีลักษณะดังนี้:
...[0][0][*197*][0][0]...
ทำไม197? 197ทศนิยมดีเป็นc5เลขฐานสิบหก ดูเหมือนจะคุ้นเคย? แน่นอน. เป็นไบต์แรกของł!
3. เอาต์พุต
ในการพิมพ์อักขระที่คุณใช้จุด.คืออะไร: สมมติว่าเราปฏิบัติตามค่าของเซลล์จริงเช่นรหัส ASCII ทศนิยมให้พิมพ์อักขระที่สอดคล้องกับเอาต์พุตมาตรฐาน
ลองนึกภาพหน่วยความจำโปรแกรม BF ของคุณเป็นดังนี้:
...[0][0][*97*][0][0]...
หากคุณใช้ตัวดำเนินการ dot (.) ในตอนนี้สิ่งที่ BF ทำคือพิมพ์:
a
เพราะaรหัสทศนิยมใน ASCII 97คือ
ตัวอย่างเช่นโปรแกรม BF เช่นนี้ (97 บวก 2 จุด):
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++ ..
จะเพิ่มมูลค่าของเซลล์ที่ชี้ได้ถึง 97 และพิมพ์ออกมา 2 ครั้ง
AA
4. ลูป
ใน BF วงประกอบด้วยวงเริ่มต้นและจุดสิ้นสุดห่วง[ ]คุณสามารถคิดว่ามันเหมือนกับใน C / C ++ ที่เงื่อนไขคือค่าเซลล์จริง
ดูโปรแกรม BF ด้านล่าง:
++[]
++ เพิ่มค่าเซลล์จริงสองครั้ง:
...[0][0][*2*][0][0]...
และ[]ก็เหมือนกับwhile(2) {}มันวนซ้ำไม่สิ้นสุด
สมมติว่าเราไม่ต้องการให้ลูปนี้ไม่มีที่สิ้นสุด เราสามารถทำได้เช่น:
++[-]
ดังนั้นทุกครั้งที่ลูปวนซ้ำมันจะลดค่าของเซลล์จริง เมื่อค่าของเซลล์จริง0สิ้นสุดการวนรอบ:
...[0][0][*2*][0][0]... loop starts
...[0][0][*1*][0][0]... after first iteration
...[0][0][*0*][0][0]... after second iteration (loop ends)
ลองพิจารณาอีกตัวอย่างหนึ่งของวง จำกัด :
++[>]
ตัวอย่างนี้แสดงให้เห็นว่าเรายังไม่เสร็จสิ้นการวนซ้ำที่เซลล์ที่ลูปเริ่มต้น:
...[0][0][*2*][0][0]... loop starts
...[0][0][2][*0*][0]... after first iteration (loop ends)
อย่างไรก็ตามเป็นแนวทางปฏิบัติที่ดีที่จะยุติจุดเริ่มต้น ทำไม? เนื่องจากถ้าลูปสิ้นสุดเซลล์อื่นเซลล์เริ่มต้นเราไม่สามารถสันนิษฐานได้ว่าตัวชี้เซลล์จะอยู่ที่ใด พูดตามตรงการปฏิบัตินี้ทำให้ Brainfuck สมองน้อยลง