从图灵机到高级语言
我们在讨论语言的时候,经常会听到一个词叫图灵完备。图灵完备的语言在表达能力上是相等的。
但是图灵机的描述是计算机尚未出现的年代,其所用纸带,读写头的表述方式并不方便理解。
在这里我尝试一下,从一种和图灵机相似的简单语言出发,描述出现代高级语言的特征。
语言定义
1:可以定义数组(对应图灵机的无限长纸带,也可定义为默认存在一无限长数组)
2:可以读写数组数据(对应图灵机读写头)
3:支持条件跳转(对应图灵机状态转移)
OK,就这些,我们试着用它等价出现代高级语言。
通过读写变量和条件跳转,可以实现与非运算。
与非运算可实现与运算,或运算,非运算,加法运算,加法可叠加出乘法,加法逆运算就是减法,同理也可得除法。
条件跳转 等价 if 语句。
条件跳转 配合数组变量可实现 for 和 while循环。
数组变量假定有0,1两个状态,为bool类型。
8个数组变量叠加一起为char,然后可叠加出short,int。对最高位的条件判断可以区分signed和unsigned。更改二进制的运算约定,可以实现浮点数。
继续叠加,可得出C语言的数组,结构体。
约定好把参数放在数组固定位置,可跳转到一个特殊地点从约定位置取数,计算完后把结果存在另外一个约定位置再跳回来,实现了函数。
找一个特定变量记录栈顶,数组就变成了栈。普通函数+栈可以实现递归。
用数组变量记录数组内的位置,得到了数据指针。
用数组变量来决定状态转移的位置,得到了函数指针。
至此,C语言的特征已经基本有了。
我们用C语言来推更高级的语言,我们定义高级变量和高级函数,我们约定每个高级变量都用结构体表示,里面有用字符串提供的变量名,长度等相关信息。
函数也是被包含在结构体内,里面有函数名称,所属类,是否私有,参数表等特征描述。
所有高级变量的定义和操作都有一个统一的函数,负责检查是否可丢弃,实现垃圾回收。
所有的函数调用都掉一个统一的函数入口,传递函数名,参数表,那个统一的入口遍历所有的函数结构体,去找对应的函数,通过包含函数的结构体,可以负责权限检查,变量匹配,多态等。
把高级变量和函数结构体组合在一起,我们可以推出类的特征。我们在类里面加上指向其他类的指针,可以描述出继承关系。
我们把高级变量统一化,在高级变量的结构体里加上类型,结合对常量的判断,可以实现动态推导。