如何创造一门前端自己的计算机语言




王海洋

haiyang5210123@123gmail.com

主要内容   

  • 语言的基本定义
  • 图灵完备性简介
  • 自然语言语法及词法分析
  • 计算机语言语法及词法分析
  • 十分钟创造一门新语言

语言的基本定义

语言用来传递已知或未知事物的 含义 。语言,就广义而言,是用于 沟通 的一套 方式 ,有其 符号 与 处理规则 ,一般称为 语法/文法 。 符号通常称为文字,会以视觉、声音或者触觉方式来进行传递。

何谓计算机语言?

计算机语言(computer language)指用于 人 与 计算机 之间通讯的语言,是人与计算机之间 传递信息 的媒介。其概念比通用的编程语言要更广泛。例如,HTML是置标语言,也是计算机语言,但并不是编程语言。

编程语言(英语:programming language),是用来定义 计算机程序 的形式语言。它是一种被标准化的交流技巧,用来向计算机发出 指令 。语法是说明编程语言中,哪些符号或文字的 组合方式 是正确的。

何谓高级语言?

高级语言(High-level programming language)是高度封装了的 编程语言 ,与低级语言相对。它是以 人类的日常语言 为基础的一种编程语言,使用一般人易于接受的文字来表示,使程序 编写员 编写更容易,亦有较高的 可读性 ,以方便对电脑认知较浅的人亦可以大概明白其内容。

图灵完备性简介

当代计算机学家和数学家已经证明,任何一门拥有 变量赋值 和 基本运算 、 条件判断 、 循环 和 解析器 的计算机语言都是一个图灵完备系统。

几种常见的图灵完备语言

  • C 语言
  • C++ 语言
  • JAVA语言
  • Python语言
  • Ruby语言
  • Javascript语言

图灵完备语言的特性

计算机软硬件架构 是基于 图灵完备思想 建立起来的,因此这些语言在底层原理上都是类似的。从非常严格的理论角度来说, 一种语言 能实现的东西 另一种语言 也能够完整实现。

世界上最小的图灵完备语言

Brainfuck 是一种极小化的计算机语言,它是由 Urban Müller 在1993年创建的。Müller的目标是建立一种简单的、可以用最小的编译器来实现的、 符合图灵完备思想 的编程语言。这种语言由八种状态构成,为Amiga机器编写的编译器(第二版)只有 240字节 大小!

自然语言词法与语法分析

语言随机分断

友
兴地玩
的小
游
凉的树
戏
一
在阴
下高
年
级
荫
朋


根据词法分断

在阴凉的
小朋友
树荫下
游戏
一年级的
玩
高兴地

语法分析(主谓宾、定补状)

【一年级的】 【小朋友】 【在树荫下】 【高兴地】 【玩】 【游戏】
定语 主语 地点状语 状语 谓语 宾语

【主语】消防员小伙小猫狮子女孩
【谓语】打开了 摆着叼着咬住看着
【宾语】消防栓 造型老鼠野猪玫瑰花

计算机语言词法与语法分析

什么是词法分析?

词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为 标记(token) 序列的过程。进行词法分析的程序或者函数叫作 词法分析器 (lexical analyzer,简称lexer),也叫扫描器(scanner)。

词法分析器一般以函数的形式存在,供 语法分析器 调用。

分析语言表达式的组成

将 sum=33+22; 标记化后结果如下:

元素 标记类型
sum标识符
= 赋值操作符
33 数字
+ 加法操作符
22 数字
; 语句结束

主要解析过程

第一步 将字符串分割成单个字符

sum=33+22 转换后 s, u, m, =, 3, 3, +, 2, 2

第二步 词法分析

s, u, m, =, 3, 3, +, 2, 2 词法分析后 sum, =, 33, +, 22

第三步 语法分析(生成抽象语法树)

在计算机科学中, 抽象语法树 (abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的 树状 表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种 结构 。

之所以说语法是“抽象”的,是因为这里的语法并不会表示出 真实语法 中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。

运算符优先级

先乘除,后加减,有括号先算括号。

十分钟创造一门新语言

语言表达式定义

正确表达式格式如下:<!-- xxx: xxxx --> 或 <!-- /xxx --> 
                        

变量定义

<!-- 设定: 主角是'胡歌', 身份是'小鲜肉' -->
{{主角}}是{{身份}}
                        
输出结果:
胡歌是小鲜肉
                        

条件分支

<!--设定: 年龄是14 -->
<!--假如: 年龄小于14 -->
我今年{{年龄}}岁,还在上小学
<!--又假如: 年龄等于14 -->
我今年{{年龄}}岁,刚上预初
<!--否则:-->
我今年{{年龄}}岁,我已经长大了
<!--/假如-->
                        
输出结果:
我今年14岁,刚上预初
                        

循环

<!--设定: 我是'玄奘', 组员 是 [我,'孙悟空','猪八戒','沙和尚'] -->
取经四人组:
<!--循环: 成员 in 组员-->
{{成员}}、
<!--/循环-->
                        
输出结果:
取经四人组:玄奘、孙悟空、猪八戒、沙和尚、
                        

支持简单逻辑

<!-- 设定: 我是"小明", 我爸爸是个体, 我爸爸的儿子是我, 我爷爷是个体, 我爷爷的儿子是我爸爸 

我是{{我爷爷的儿子的儿子}}
-->
                        
输出结果:
那么,我是小明
                        

发明一门语言就这么简单!

《UNIX编程艺术》两则小故事

无名师与Unix狂

一个Unix狂热者听说无名师掌握Unix大道真知,便跑来求教。无名师对他说:
“当尊者Thompson发明Unix时,他并不理解它。随后他理解了,受益了,不再发明了。“
“当尊者McIlroy发明管道时,他只知道它将传递软件,并不知道它能传递思想。”
“当尊者Ritchie发明C时,他将程序员放到缓冲溢出、堆损坏和烂指针bug的地狱中惩罚。”
“说实话,这些尊者又瞎又蠢!”
狂热者对无名师的用词极为愤怒。
“这些智者”,他抗议道,“给了我们Unix的大道。我们嘲笑他们,就是混淆是非,黑白不分。”
“你的代码全无污点和缺陷?”无名师问。
“不,”狂热者承认,“没人不犯猎。”
“这些尊者之智,”无名师说,“就是了解自身之愚。”
听到此,狂热者眼中一亮。

无名师与文本编辑器

无名师听到学徒学习的计算机机房里出来痛苦的哭啼声,他打算要弄清这是怎么回事。 他发现学徒明显的满脸痛苦,眼泪在眼圈里直打转。
“出了什么事?”大师问道。“你在哭什么?”
“Unix系统太难用了。我每天要用四种不同的编辑器才能把学习任务完成,因为它们每种都不能单独的完成这些事情。”
大师点了点头,问,
“如果让你去解决这个大麻烦,你打算怎么做?”
学生认真的思考了几分钟,表情一下子多云转晴。他兴奋的说,
“这个问题的解决方法很显然:我要开发一个有史以来最好的编辑器。这个编辑器具有目前这四种编辑器的所有功能,而且更好用,速度更快。由于有了我的这个新编辑器,世界将会变得更美好。”
大师突然举起手,照着这个学徒的脑袋上打了一巴掌。大师年迈而且体弱,学徒并没感觉到很痛,但他对发生的事很震惊。
“我做错了什么?”他问。
“愚蠢!”大师说。“你以为我还想再学一种编辑器吗?”
听到此,学徒眼中一亮。

THE END

参考资料

- http://esprima.org/demo/parse.html#
- http://www.open-open.com/lib/view/open1436509859348.html
- https://technet.microsoft.com/zh-cn/library/z3ks45k7
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence