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




王海洋

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