JunkLang 1.字面值: 1.1 字节 数字使用罗马数字表示,可接受字符有: O 0 I 1 V 5 X 10 L 50 C 100 表示范围 O ~ CCLV 任何超出范围的字面值均为非法字面值。 对于任何超出字面值的操作,需要拆分为两步或更多步进行才可以正常。 2.符号、标识符、注释和关键字 2.1 标识符 怎么可能会有标识符这种东西( 2.2 操作符 ; 赋值 # 复制当前指针指向的值到它的下一个变量(不改变指针) - 加法 + 减法 / 乘法 & 乘方 _ 开方 % 除法 * 求余 ~ 取反 ] 指针加 [ 指针减 0 指针设置到0 ! 如果指针指向值为0则跳转到代码标签 | 无条件跳转到代码标签 ? 定义代码标签 , 注释 ^ 增加分配内存 v 减少内存分配 < 输出当前指针指向的字节 > 从控制台读取一行数字 ( 按照数字输出当前字节 ) 从控制台读取一个字节 3.运行时 3.1 运行时构成: 0字节变量空间(可以重分配,需要手动初始化) 一个长度为32bits指针,指向当前操作中的指针。 3.2 内存分配增加与减少 ^字节值 将会增加内存分配。 假设现在有2字节长度的内存,执行以下代码后: ,,,,,,,,,,,,,,,,,,,代码开始 ^CCLV ,将变量空间增加255长度 ^XVI ,将变量空间增加16字节长度 ,,,,,,,,,,,,,,,,,,,代码结束 此时内存空间长度为273字节。 v 可以减少内存长度 假设现在已有273字节长度 ,,,,,,,,,,,,,,,,,代码开始 vCCLV ,减少255字节内存 vIIXX ,减少2字节内存 ,,,,,,,,,,,,,,,,,代码结束 此时变量空间长度为0. 4.变量的访问 假设在一片长度为255的内存空间上,访问第16个字节,将其赋值为17 指针当前位置为0 则书写以下代码: ,,,,,,,,,,,代码开始 ]XVI ,移动到第16字节 ;XVII ,赋值为17 ,,,,,,,,,,,代码结束 如果指针超出内存范围则后果是未定义的。 5.数学运算 对于数学运算-+/%*;&_均是在当前指针指向的对象上运行。 如: -V 相当于C语言的(i为当前指针指向的变量): i += 5 特殊运算~ ~语法会把任何非0值变为0 会把0值变为1 如果值出现了溢出,则其后果是未定义的。 6.代码标签和跳转 我们可以使用下列方法制作一个死循环: ,,,,,,,,,代码开始 ?V ,定义代码标签,这个标签的编号是5 |V ,无条件跳转到5号标签 ,,,,,,,,,代码结束 标签编号必须是一个字节值。 每个标签编号仅可使用一次。 条件跳转: !语法和|相同,不同之处在于!语法只在当前指针值为0时执行。 7.输入和输出 使用>语法进行输入,输入值被保存到当前指针指向的地址。 使用<语法进行输出,输出的值被保存到指针指向的地址。 8.HelloWorld例子 ,分配内存 ^XI ,十一字节 ,初始化指针 0 ,赋值出HelloWorld字符串的ASCII码 ;LII ,H = 72(ASCII) ]I ,右移指针 ;CI ,e ]I ;CVIII ,l ]I ;CVIII ,l ]I ;CXI ,o ]I ;LXXXVII ,W ]I ;CXI ,o ]I ;CXIV ,r ]I ;CVIII ,l ]I ;C ,d ]I ;O ,结尾 ,将指针置0,然后向右遍历输出字符串 0 ?O < !O vXI ,释放内存 9.粗略估算圆的面积和周长 ,分配2字节的内存 ^II ,指针置0 0 ,输入到当前指针 > ,把这个值复制给另一个变量 # ,把指针移动到第二个变量,并且对其进行计算得到周长 ]I /II ,乘以2 /III ,乘以3(粗略的圆周率) < ,输出周长 ,把指针移动到第一个变量,并且把第二个变量复制给第一个变量 [I # ]I &II ,二次方 /II ,乘以3(粗略的圆周率) < ,释放内存 vII