`
hatedance
  • 浏览: 59520 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

闭门造脚本语言解释器的一点感想

阅读更多
我动手做解释器的原因是多方面的。
0 平时工作搞SSH,没机会接触cool的东西。
1 我不懂汇编,也不懂java字节码,所以只好做解释型的语言,不能做编译型的语言。
2 我工作中遇到的工作流引擎,我越发觉得那个流程图其实也是一个函数而已,只是执行速度慢,逻辑也简单,关键是执行的状态可以持久化。
3 我天天编程,对编程这块特殊的业务,可以说是业务专家。一般情况下,我认为只要需求明确,我又理解深刻,没道理做不出软件来(即使性能差些)。

于是,我开始动手,首先对业务实体进行建模,我要做的是类似java的OO语言,主要的实体就是Package,Class,Object,Method,Field,。。。,这些都是在再普通不过的实体了,参考java的reflect包,基本雷同。
有了这些实体以后,我发现剩下的就是方法内部的逻辑如何建模的问题了。我整理了一下,有2种方法去表示逻辑:
1 流程图
2 指令
我最终选择了流程图,因为我不喜欢顺序的指令集。于是又多了一些实体:FlowChart,Node,StartNode,EndNode,DecisionNode,...
好了,至此所有的静态模型基本完成了。

光有静态模型显然是不够的,激动人心的部分终于要来了。我接下来要写一个执行引擎,去执行流程图。接过我发现要解释执行流程图是很容易的。每个节点都有箭头指向下一个节点,直到EndNode结束。节点类型基本就是顺序,分支。每个节点都有一句指令,最基本的就是赋值,调用。

第三步,我要么写一个图形界面的流程设计器,要么写一个文本代码解析器。结果我选择了后者。设计器我以后也一定要做的。
我没学过编译原理,但也听说要把代码转化为一棵树。我以前用正则表达式解析过html。于是我用还是用正则表达式,把代码解析出来了。语法现在基本参照java。

至此,一个简单的脚本语言解释器成型了,我可以在java里方便的方便的调用脚本语言里的类,并得到返回结果。目前不支持多线程,不支持并发,不支持网络。只支持基本数据类型和数组。对于一般的脚本需求来说,基本能用了。我写了个Finbonacci(int n)函数测了一下,当n=10的时候,共执行了131356个节点,花了13秒, 0.101毫秒/节点。这个速度慢得相当有水平。

心得:
1 其实做语言其实并没有想象中的难。高级语言总是建立在低级语言的基础上。一个高级语言里的指令,在低级语言里也许就是有多个指令来实现。
2 虽然从没用汇编写过程序,但我现在有自信说,最基本的指令其实没几个:赋值,调用,返回,跳转,出,入栈,和数学计算(+-×/)和布尔计算。有了这些指令,理论上就可以写出任意复杂的程序了。
3 其实所谓的语法是最容易实现的部分。在文本解析器完成以后,可以把很cool的语法转化为基本指令。
4 做一个核心的解释器其实工作量不是最大,反而如果要为这个语言写基础包会有巨大的工作量。比如要支持文件系统,图形界面,网络,。。。哪一块都是工作量巨大。

回顾开发的过程,我从以下产品吸取了营养:
smalltalk的纯OO思想,几乎不用关键词,都是用对象和消息的概念来处理。
Delphi以及一个叫FastScript的脚本语言,我曾在某个项目里用过。

将来的打算:
1 我打算把这个东西继续完善,由于是流程图作为逻辑的基本表达方式,也许可以用来替代那些工作流引擎。作为企业业务建模平台。
2 由此对语言不再恐惧和敬畏,打算关注相关开源语言产品,尤其是jvm上的一些脚本语言的实现原理,因为我对c的不熟悉,阻止了我去看ruby,java等的源码。
分享到:
评论

相关推荐

    solid word课堂教学 自动闭门器

    solid Word课堂教学 自动闭门器 接触和昂黄和阻尼

    英格索兰闭门器和地弹簧.rar

    2. **工作原理**:解释闭门器和地弹簧如何通过液压或弹簧力来控制门的运动,以及它们如何帮助保持门的稳定状态。 3. **安装指南**:提供闭门器和地弹簧的安装步骤,包括所需工具、定位方法、调整技巧等,以确保正确...

    最新闭门器代理加盟闭门器代理销售合同新整理版WORD范本模板2021.docx

    《闭门器代理加盟合同详解》 闭门器代理加盟合同是企业在拓展市场、发展合作伙伴时常见的法律文件,尤其在2021年的版本中,更注重细节与公平性。本合同涉及到的主要知识点包括以下几个方面: 一、代理权限与市场...

    行业分类-设备装置-一种铰接式闭门器.zip

    铰接式闭门器是一种广泛应用于建筑行业中,用于自动关闭门扇的机械设备。它通过巧妙地结合机械力学原理和液压技术,确保门在开启后能够平稳、无声地自动关闭,从而提高了建筑的安全性和舒适性。在本文中,我们将深入...

    电信设备-闭门器及其移动配合结构.zip

    在电信设备领域,闭门器是一种重要的组成部分,它在设备机柜或门体的运作中起着关键作用。闭门器的设计与移动配合结构紧密相关,确保设备在使用过程中的安全性和稳定性。以下是对这个主题的详细阐述: 闭门器是一种...

    行业分类-设备装置-一种结构简单的气弹簧闭门器.zip

    《行业分类-设备装置-一种结构简单的气弹簧闭门器》 在当今的机械设备领域,气弹簧闭门器因其高效、稳定的特点而被广泛应用。本文将深入探讨这种结构简单的气弹簧闭门器的设计原理、工作过程及其在不同行业中的应用...

    ISC 2019闭门会议.zip

    【标题】"ISC 2019闭门会议.zip"所涵盖的是2019年ISC(互联网安全大会)闭门会议的资料合集,这是一个专注于网络安全领域的专业论坛。闭门会议通常指的是仅限受邀人员参加的会议,讨论的内容可能涉及高度敏感或策略...

    闭门器代理销售合同.docx

    《闭门器代理销售合同》是一份详细的商业合作协议,旨在规范甲乙双方在闭门器销售业务中的行为,确保双方的权益。以下是该合同的主要内容和相关知识点: 1. **代理销售市场范围**:合同首先定义了乙方作为一般代理...

    闭门器的工作原理及调试PPT学习教案.pptx

    闭门器是一种重要的建筑五金配件,其主要功能是通过液压机制控制门的关闭速度,以实现安全、平稳的关门效果,特别适用于防火和通风要求较高的场所。闭门器的工作原理和调试是理解和维护这类设备的关键。 闭门器的...

    OpenAI闭门讨论会纪要-拾象0305.zip

    ChatGPT是一种基于自然语言处理和深度学习技术的聊天机器人,它可以模拟人类的语言行为,与用户进行自然、流畅、富有逻辑的对话。ChatGPT的优点在于它可以快速地进行训练和部署,适用于各种不同的应用场景,如在线...

    OpenAI 闭门讨论会纪要-拾象0305.zip

    ChatGPT是一种基于自然语言处理和深度学习技术的聊天机器人,它可以模拟人类的语言行为,与用户进行自然、流畅、富有逻辑的对话。ChatGPT的优点在于它可以快速地进行训练和部署,适用于各种不同的应用场景,如在线...

    电子-一种电动闭门器的行程滑块限位机构

    在电子行业中,电动闭门器是一种常见的自动化装置,主要用于确保门体在开启后能自动、平稳地关闭。本文将深入探讨“一种电动闭门器的行程滑块限位机构”的设计原理、工作过程以及其在实际应用中的重要性。 首先,...

    电信设备-带有排气口自动开闭门的柜式空调器.zip

    《电信设备——带有排气口自动开闭门的柜式空调器》 在现代通信设备的运行过程中,保持设备内部温度适宜、通风良好是至关重要的。本文将深入探讨一种专为电信设备设计的柜式空调器,它配备了独特的排气口自动开闭门...

    Dahua大华闭门器安装说明书.pdf

    Dahua大华闭门器安装说明书.pdf

    电子政务-电动闭门器导轨.zip

    电子政务-电动闭门器导轨.zip

    OpenAI闭门讨论会纪要V2.pdf

    【OpenAI闭门讨论会纪要V2】的会议涵盖了OpenAI在未来的发展规划、人工智能(AI)、通用人工智能(AGI)以及AI生成内容(AIGC)等多个关键领域的讨论。以下是对这些知识点的详细解读: 1. **OpenAI与微软合作深化**...

    电子政务-滑轨式防火门电动闭门器.zip

    滑轨式防火门电动闭门器是电子政务在建筑安全领域的一个具体实例,它将科技与传统安防设备结合,确保在紧急情况下提供安全、可靠的疏散环境。 滑轨式防火门电动闭门器是一种自动化装置,主要用于安装在建筑物内的...

    行业资料-电子功用-具有双电机的闭门器测速机及其测速方法的介绍分析.rar

    《具有双电机的闭门器测速机及其测速方法》是针对电子工程领域中一个重要的设备和技术进行的深入分析。闭门器是一种常见的建筑自动化装置,主要用于控制门的开启和关闭速度,确保安全和便利。而在此文档中,重点讨论...

    电子政务-带模块式电动闭门器.zip

    电子政务-带模块式电动闭门器.zip

    OpenAI闭门讨论会V3-GPT4纪要

    内容概要:OpenAI闭门讨论会V3-GPT4是2022年2月17日OpenAI举行的一次内部技术讨论,主题为GPT-4模型的设计和应用。本文将对这次讨论会的纪要进行科普简介。 适用人群:本文适合对自然语言处理技术感兴趣的从业者、...

Global site tag (gtag.js) - Google Analytics