Brainfuck.

Are your brain alright?

 小海@夢想特急_夢城前

Index

Introduction.

An introduction of brainf*ck.

  • 對,就是深奧的語言
  • 目標:讓人難懂
    • 可用,但不易用
  • 概念上的證明
  • 例子
    • Brainfuck
    • JSFuck
    • Chicken

Esoteric Languages

  • 由 Urban Müller 在 1993 年創造
  • 只使用八種字元
    • > < + - . , [ ]
  • 目的:使編譯器最小
  • 不像它的名字,語言本身十分優雅

Brainfuck

  • 大小為 30000 個字元的一維連續空間
    • 一個字元可以儲存 0 ~ 255 的數字
    • 初始化為 0
    • 可以循環
  • 一個指針
    • 指向空間中的某一格
    • 可以移動
    • 初始化指向空間的第 0 格
  • 輸入輸出流

運作

  • > < 分別代表指針左移、指針右移
  • + - 分別代表指針指向的記憶體 +1、-1
  • . 以 ASCII 碼輸出指針指向的記憶體內容
  • , 以 ASCII 碼輸入指針指向的記憶體內容
  •  [ while 迴圈
    • 指標指向非 0 則跳到下一個指令
    • 指向 0 則跳到對應的 ] 的下一個指令
  • ] while 迴圈
    • 指標指向 0 則跳到下一個指令
    • 指向非 0 則跳到對應的 [

代碼

Hello, world

+++++ +++++ 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'

Pointer in C.

An introduction of pointer, in C.

  • 在 C 中,我們有直觀的方法寫前面的指針
  • 指標:記憶體的位址
  • 宣告

指標

char space[30000];

int main() {
    char *ptr = space;
    *ptr = 'a';
}
  • 使用 * 對指標進行取值和操作記憶體
  • 對指標 + 1 相當於右移一位
  • 陣列也是指標

如果有時間我們可以回來講

很多指標的東西

Interpreter.

A runner, actually.

void run_code(char *code_start, char *code_end) {
    char *space = (char *)calloc(max_size, sizeof(char));
    char *ptr = space;
    char *code = code_start;
    while (code < code_end) {
        switch (*code) {
            case '>':
                ptr++;
                break;

            case '<':
                ptr--;
                break;

            case '+':
                (*ptr)++;
                break;

            case '-':
                (*ptr)--;
                break;

            case '.':
                putchar(*ptr);
                break;
  
            case ',':
                *ptr = getchar();
                break;

            case '[':
                if (!(*ptr)) {
                    int lbraces = 0;
                    while ((*code) != ']' || lbraces != 1) {
                        if ((*code) == '[') lbraces++;
                        if ((*code) == ']') lbraces--;
                        code++;
                    }
                }
                break;

            case ']':
                if (*ptr) {
                    int rbraces = 0;
                    while ((*code) != '[' || rbraces != 1) {
                        if ((*code) == ']') rbraces++;
                        if ((*code) == '[') rbraces--;
                        code--;
                    }
                }
                break;
        }
        code++;
    }
    free(space);
    space = ptr = NULL;
    return;
}

TIOJ 1611

Made with Slides.com