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)

运行效果:

相关资料:

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

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

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

.

编程语言BrainkFuck的更多相关文章

  1. 我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗

    文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没有一个简单的了解,或一个系统的入门学习.换句 ...

  2. Bash 脚本编程语言中的美学与哲学

    我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨 Bash 脚本语言中的美学与哲学. 这不是一篇 Bash 脚本编程的教程,但是却能让人更加深入地了解 Bash ...

  3. [C#版本]有趣啊!各种编程语言实现 2 + 2 = 5

    首页新闻里面那个 [新闻头条]有趣啊!各种编程语言实现 2 + 2 = 5 其他的就不评论的,但是其中C#版的 真是逗比啊...评论中各种吐槽有木有... static void Main (stri ...

  4. Atitit 编程语言编程方法的进化演进 sp  COP ,AOP ,SOP

    Atitit 编程语言编程方法的进化演进 sp  COP ,AOP ,SOP 1.1.  Sp  oop>>COP ,AOP ,SOP1 1.2. Sp  oop 结构化方法SP(Stru ...

  5. Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx

    Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx 1. 大原则:分解+命名1 1.1. 命名规范1 1.2. 分层.DI和AOP是继OO1 1.3. 运算符可读性一般要比 ...

  6. 【转】最流行的编程语言JavaScript能做什么?

    本文转自互联网! 首先很遗憾的一点是,“PHP虽然是最好的语言”,但是它不是最流行的语言. 对不起的还有刚刚在4月TIOBE编程语言排行榜上榜的各个语言: 你们都很棒,但是你们都担当不了这个大任. 开 ...

  7. 2017年"程序媛和工程狮"绝对不能忽视的编程语言、框架和工具

      2017年"程序媛和工程狮"绝对不能忽视的编程语言.框架和工具 在过去的一年里,软件开发行业继续大踏步地向前迈进.回顾 2016 年,我们看到了更多新兴的流行语言.框架和工具, ...

  8. 中文编程语言Z语言开源正式开源!!!

    (Z语言基于.NET环境,源码中有很多高技术的代码,让更多的人知道对大家有会有很好的帮助,请管理员一点要批准放在首页) 本人实现的中文编程语言Z语言现在正式开源,采用LGPL协议. 编译器核心的网址为 ...

  9. TKT中文编程语言简介

    TKT中文编程语言简介 TKT语言是新型的类似自然语言的汉语编程语言. 它是基于新的语言设计思想创造的语言,和现存的易语言.习语言.O语言.汉编等中文编程语言没有关系. TKT语言特点一: 中文编程 ...

随机推荐

  1. 命令行执行python文件时提示ImportError: No module named 'xxx'

    背景: 最近在写接口自动化测试框架的时候发现,框架使用pycharm ide的时候可以正常跑测试用例,但是在dos窗口输入命令执行测试的时候,import项目内部的包时报错“ModuleNotFoun ...

  2. poj 1144(割点)

    题目链接:http://poj.org/problem?id=1144 题意:给出一个无向图,求关键节点的个数. 分析:双连通分量Tarjan算法直接求割点就行了,裸的模板题. AC代码: #incl ...

  3. Java:JUnit4使用详解

    对于Junit的总是一知半解不太懂,现在认真梳理一下: 此次针对的是Junit4版本,注解也是在Junit4版本才有的,之前的版本并无注解功能.而注解开发基本上被认为是一种优秀的设计,所以我们写单元测 ...

  4. Qt4程序在windows平台下打包发布

    一.打包成绿色版 将源码编译成release版,运行*.exe文件,提示缺少*.dll,在Qt安装目录中找到相应的dll文件(一般在bin目录下),将dll文件复制到exe文件目录下即可. 二.打包成 ...

  5. False Ordering LightOJ - 1109(暴力。。唉,。又是一个水题。。)

    We define b is a Divisor of a number a if a is divisible by b. So, the divisors of 12 are 1, 2, 3, 4 ...

  6. MT【146】一边柯西,一边舍弃

    (2018浙江省赛9题)设$x,y\in R$满足$x-6\sqrt{y}-4\sqrt{x-y}+12=0$,求$x$的范围______ 解答:$x+12=6\sqrt{y}+4\sqrt{x-y} ...

  7. 洛谷 P3197 [HNOI2008]越狱 解题报告

    P3197 [HNOI2008]越狱 题目描述 监狱有连续编号为\(1-N\)的\(N\)个房间,每个房间关押一个犯人,有\(M\)种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可 ...

  8. Mac上安装python3并设置SublimeREPL插件默认运行python3

    1.安装python3 $ brew search python $ brew install python3 这里安装完后不需要单独添加环境变量,程序已经处理好,可以直接运行python3命令. $ ...

  9. java之初学线程

    线程 学习线程相关的笔记,前面写过关于很多线程的使用,有兴趣的可以去了解下 线程 概念理解 并发 : 指两个或多个事件在同一个时间段内发生(交替执行). 并行 : 指两个或多个事件在同一时刻发生(同时 ...

  10. eclipse 支持 Robot framework 编辑环境

    一.配置python 环境     1. 设置pydev库         打开Help -> Install New Software, 点击'Add',设置Name为“Pydev”,Loca ...