Fork me on GitHub

编程语言BrainkFuck

 

BrainFuck由Urban Müller在1993年创建,是经常被吐槽的语言,不过我觉得除了名字其它都还挺正常的,没错我觉得这个语言设计的很正常没有Fuck到我的脑子,大概是因为我根本就没有脑子吧…

 

语言简介:

使用指针寻址来操作内存,运行时需要0~32767个字节的内存空间,可循环寻址,数据单位是8bit,数据范围是0~255,可循环溢出。

8种操作符:

> 将寻址指针向右移动一位

< 将寻址指针向左移动一位

+ 将寻址指针指向的内存空间值加1

- 将寻址指针指向的内存空间值减1

[ 如果寻址指针指向的内存空间的值为0,则跳转到下一个]后面第一个字符开始执行

] 如果寻址指针指向的内存空间的值不为0,则跳转到上一个[后面第一个字符开始执行

 

条件判断和循环就是通过[和]来实现的,使用当前寻址指针指向的空间存储要循环的次数,当循环次数为1的时候就相当于if条件判断为true。

想一下为什么+-><这种不干脆支持+2+3+5这种操作呢?好多个++++很麻烦的啊,其实+就相当于+1,改成别的值在语言上并不会有歧义,但是这个BrainFuck语言就是面向单字节操作的,数据单位是单字节,解释器解释代码的时候也是单字节解释的,如果支持在后面指定要加的数值的话,对于个位数还好,如果是+100这种的话解释器解释的时候就需要能够识别出100这三个连续的字符是用来组成一个数字的,不再是每个字符都可以独立解析,增加了解释器的难度,所以我觉得这个语言纯粹就是用来让人写解释器练手的。

 

解释器思路:

内存空间可以动态分配,初始大小为0,当用到的时候检查寻址指针大小与当前已经分配的内存空间大小不够再扩展内存空间。

这么变态的语言总是需要注释的吧,暂定单字符注释支持%和#两种。

 

一个简单的解释器如下:

#! /usr/bin/python3
# -*- coding: utf-8 -*-
"""
BrainFuck解释器
"""

DATA_MIN = 0
DATA_MAX = 255

MEMORY_ADDRESS_MIN = 0
MEMORY_ADDRESS_MAX = 32767


def bf_exec(code):
    code_point = 0
    memory = []
    memory_point = 0
    while code_point < len(code):
        c = code[code_point]
        code_point += 1
        if c == '+':
            memory_extend(memory, memory_point)
            memory[memory_point] = memory[memory_point] + 1 if memory[memory_point] < DATA_MAX else DATA_MIN
        elif c == '-':
            memory[memory_point] = memory[memory_point] - 1 if memory[memory_point] > DATA_MIN else DATA_MAX
        elif c == '>':
            memory_point = memory_point + 1 if memory_point < MEMORY_ADDRESS_MAX else MEMORY_ADDRESS_MIN
        elif c == '<':
            memory_point = memory_point - 1 if memory_point > MEMORY_ADDRESS_MIN else MEMORY_ADDRESS_MAX
        elif c == '[':
            if memory[memory_point] == 0:
                while code[code_point] != ']':
                    code_point += 1
        elif c == ']':
            if memory[memory_point] != 0:
                while code[code_point] != '[':
                    code_point -= 1
        elif c == '.':
            print('%c' % memory[memory_point], end='')
        elif c == '%' or c == '#':
            while code[code_point] != '\n':
                code_point += 1


def memory_extend(memory, memory_point):
    while memory_point <= MEMORY_ADDRESS_MAX and len(memory) - memory_point < 1:
        memory.append(0)


if __name__ == '__main__':
    c1 = """
    ++++++++[>+++++++++ % hello-world.
    <-]>.<+++++[>++++++<-]>-.+++++++..
    +++.<++++++++[>>++++<<-]>>.<<++++[>
    ------<-]>.<++++[>++++++<-]>.+++.
    ------.--------.>+.
    """
    bf_exec(c1)

运行效果:

image

 

 

相关资料:

1. BrainFuck解释过程在线演示: https://fatiherikli.github.io/brainfuck-visualizer/

2. http://esolangs.org/wiki/ook!

3. http://esolangs.org/wiki/Language_list

 

.

posted @ 2018-06-27 23:33  CC11001100  阅读(731)  评论(0编辑  收藏  举报