amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 3310|回复: 28

有没有人搞脚本引擎开发的?有兴趣的进来讨论一下。

[复制链接]
发表于 2012-5-20 10:14:40 | 显示全部楼层 |阅读模式
有没有人搞脚本引擎?我正在开发一个脚本引擎OniuScript,准备用於我接下来准备开发的USB-CNC控制系统,以便让系统更灵活的控制机械。

因为机械和硬件驱动都不是我的强项,所以我只专注控制系统(控制软件和控制板),加入了脚本引擎之后,可以让整个系统都可以和机械“实时交互”。
目前我设计的OniuScript,语法基於Pascal,但并不全是。大概是60%取自於Pascal,20%取之於C++,20%取之於Lua(也是脚本语言)。

Pascal 语法我个人认为很不错,但我最讨厌是的赋值语句(比如 a := 1;),因为经常会跟C语言混了,特别是在软硬件一起开发的时候,这毛病经常患。
但除了这个,其它的都很不错。

C/C++ 语法中, += , -= , *= , /= 这几个操作不错,我也要了,但它的 ++ , -- 这两个操作符我没要,因为不是我所需的。

Lua 是个脚本,原本我想直接使用它作为我内定的脚本引擎,因为它的Table元素很强大,这个元素我要了。但我很不喜欢它的变量方式,特别是Local变量域,
所以就仅仅取了它的Table。


我的OniuScript,已经快到第四阶段了。
第一阶段,是词法分析,已经通过。
第二阶段,是语法分析,已经通过。
第三阶段,是生成我的汇编OniuASM,目前已经完成95%,现在是边测边改善,接近完工。
第四阶段,是编写虚拟机,并在宿主系统(比如USB-CNC)中执行。


一旦脚本引擎完工,我就可以策划我的USB-CNC了。不过,我还有个怪念头,就是想把脚本引擎加到STM32里面去,虽然可行,但时间不知道要耗多久,所以仅仅是想想而已^o^。
发表于 2012-5-20 10:29:50 | 显示全部楼层
很不错,强烈支持!
发表于 2012-5-20 10:46:42 | 显示全部楼层
高!
字数补丁!
发表于 2012-5-20 11:15:25 | 显示全部楼层
完全自己写脚本解析容易有BUG,村长可以考虑一下ANTLR,它是开源的,除了java,也有C和C++的生成器,可以省去词法分析和语法分析的工作量,不容易出错,修改也容易。这样主要的工作量放在虚拟机上即可。
脚本引擎放到STM32里,可能性能比较差,我觉得你的USB-CNC更加好,只要USB速度能满足你的要求。
 楼主| 发表于 2012-5-20 11:34:11 | 显示全部楼层
我没有用ANTLR,而是用GOLD,它比ANTLR更适合,因为它可以生成多种语言的“规则”,所以,基本上我是不需要自己去分析词法和语法的。
但为了配合生成的汇编,语法规则是需要边测边调整才行。
发表于 2012-5-20 13:29:37 | 显示全部楼层
GOLD没用过,网上搜了一下,赞誉之辞甚多,尤其是支持的语言很多,令人心动。它的官网怎么进不去,是不是被屏蔽了?
发表于 2012-5-20 14:00:14 | 显示全部楼层
村长你干脆在Android下开发个上位机吧,我感觉比PC上更有前途,尺寸变大或变小都更方便。
 楼主| 发表于 2012-5-21 08:26:51 | 显示全部楼层
jpchen 发表于 2012-5-20 14:00
村长你干脆在Android下开发个上位机吧,我感觉比PC上更有前途,尺寸变大或变小都更方便。 ...

对安卓手机才有系统,对开发安卓软件兴趣不大。
发表于 2012-5-21 09:09:06 | 显示全部楼层
aleyn 发表于 2012-5-21 08:26
对安卓手机才有系统,对开发安卓软件兴趣不大。

相对于在STM32上来说,我觉得在安卓手机或平板上做会更加好点,毕竟做PC+STM32两套的话,不如做安卓上的一套。另外安卓设备的性价比是越来越好了,比自己做一套完整系统只会更便宜。
以后操作雕刻机只要掏出手机往上一接,就可以直接操作和修改,做完拔了就走,多爽啊

GOLD的官方网站今天终于能进去了,抽风的中国电信


发表于 2012-5-21 12:02:59 | 显示全部楼层
想学,没人带啊
发表于 2012-5-22 12:30:19 | 显示全部楼层
我曾经用ALTLR的C++生成器,做了一个脚本解释引擎,语法基本取自C语言,取了其中最基本的部分,不过变量采用了动态类型,这样实现起来方便。另外语言中加入了多级触发器,可多级嵌套,允许中断函数执行完毕后返回断点处,也允许中断函数执行后跳转到指定的语句,不回到原先地方。

在这个过程中,学习ANTLR花了一些时间,设计汇编语言花了一些时间,实现虚拟机花了大部分的时间,那个多级可嵌套触发器的实现搞了好久才弄好。

不知村长做的是基于栈还是基于寄存器的虚拟机?我当时为了方便起见,是用栈虚拟机来做的。
 楼主| 发表于 2012-5-22 16:58:35 | 显示全部楼层
jpchen 发表于 2012-5-22 12:30
我曾经用ALTLR的C++生成器,做了一个脚本解释引擎,语法基本取自C语言,取了其中最基本的部分,不过变量采 ...

栈和寄存器都有,因为需要支持Table和Class,所以内部还加入了指针,但在语言上不表现。
发表于 2012-5-22 17:10:23 | 显示全部楼层
aleyn 发表于 2012-5-22 16:58
栈和寄存器都有,因为需要支持Table和Class,所以内部还加入了指针,但在语言上不表现。 ...

栈和寄存器都做,工作量估计大了不少,其实用栈来实现,虽然运行速度会慢点,但是应该也够用的。
支持class会不会太复杂了,需要用到类的继承功能?我估计这个功能实现起来挺麻烦的。
 楼主| 发表于 2012-5-22 17:16:18 | 显示全部楼层
jpchen 发表于 2012-5-22 17:10
栈和寄存器都做,工作量估计大了不少,其实用栈来实现,虽然运行速度会慢点,但是应该也够用的。
支持cla ...

我只作单一的类,不做继承的,毕竟我的主要目的不是为了写出一个新的语言系统,而是为了配合宿主系统。
另外,用栈加寄存器,反而更好做一点。
发表于 2012-5-22 17:26:23 | 显示全部楼层
aleyn 发表于 2012-5-22 17:16
我只作单一的类,不做继承的,毕竟我的主要目的不是为了写出一个新的语言系统,而是为了配合宿主系统。
...

明白,就是说各种类是内部定义好的,用户使用时用几个就new几个就可以了,这个方式不错,简化版的面向对象编程。
你的寄存器是指特殊功能寄存器吧,就是说它是为了特殊功能用的,并不是通用寄存器,运算还是采用入栈和出栈的方式,如果这样的话,那还是算是用栈来实现的虚拟机。
 楼主| 发表于 2012-5-22 17:31:42 | 显示全部楼层
  1. OniuScript MyScript;
  2. var
  3.    m1,m3,m5,m6;     //全局变量
  4.    
  5. function MyFunc(p1,p2,p3,p4) //函数和参数
  6. var
  7.   R;   //局部变量
  8. begin
  9.   R = {                  //表格
  10.      F1 = p1,            //字段名 F1  值 p1
  11.      F2 = p2 * 2,        //字段名 F1  值 p2*2
  12.      'My Field' = p3 + p4 /2,  //字段名 'My Field',因为字段名有空格,所以必须用字符串形式,
  13.      [4] = p4 % 1              //字段名 4,数字字段
  14.      };
  15.   return R;           //返回值
  16. end;
  17.       
  18. main
  19.     m1 = 12+-13*14 == (9+3)^7;         // m1 = 表达式
  20.     m2 = !2009/01/01;                  // m2 = 日期
  21.     m3 = !29:10:50.999;                // m3 = 时间
  22.     m4 = !2010-11-22~23:10;            // m4 = 日期时间
  23.     m1 = {k=1,2,{9,10},!2001-01-01};   // m1 = 表格
  24.     m2 = MyFunc(1, 2.1, '4', {3,4});   // m2 = 函数
  25.    
  26.     while (m2 > 0) do m3 = m3 +1 end;  // while 循环
  27.    
  28.     a.b.c.d();                         // 类函数 或 表格函数

  29.     m3 = @MyClass;                     //m3 = 类,类在另一个脚本中定义

  30.     if m4 in {12..23} then             // 如果 m4 在 12 至 23 之间
  31.       k=!2010-11-22-!29:10:50.999;
  32.     end;
  33.    
  34.     for name, value in m3 do           //for 的另一种表现,枚举表格
  35.     begin
  36.        print('Field Name = '+name+', Value = '+value);
  37.     end;
  38.    
  39. end.
复制代码
 楼主| 发表于 2012-5-22 17:36:32 | 显示全部楼层
jpchen 发表于 2012-5-22 17:26
明白,就是说各种类是内部定义好的,用户使用时用几个就new几个就可以了,这个方式不错,简化版的面向对 ...

表达式运算我也是采用寄存器+栈的方式,当寄存器被占用的时候,就用PUSH和POP,之后继续用寄存器。
 楼主| 发表于 2012-5-22 17:37:45 | 显示全部楼层
  1. _MyScript:
  2.   ARA @MyScript
  3.   VAR @m1
  4.   VAR @m3
  5.   VAR @m5
  6.   VAR @m6
  7.   JMP [MyScript_Main]
  8. _MyFunc:
  9.   ARA @MyFunc
  10.   PRM @p1
  11.   PRM @p2
  12.   PRM @p3
  13.   PRM @p4
  14.   VAR @R
  15.   PUS S
  16.   PUS X
  17.   PUS Y
  18.   PUS Z
  19.   PUS A
  20.   PUS F
  21.   PUS T
  22.   GET X, @p1
  23.   NEW T, @TABLE
  24.   NEW F, T
  25.   FSN F, 'F1'
  26.   SAV F, X
  27.   GET X, @p2
  28.   MOV Y, X
  29.   GET X, 2
  30.   MUL Y, X
  31.   NEW F, T
  32.   FSN F, 'F2'
  33.   SAV F, Y
  34.   GET X, @p3
  35.   MOV Z, X
  36.   GET X, @p4
  37.   MOV Y, X
  38.   GET X, 2
  39.   DIV Y, X
  40.   ADD Z, Y
  41.   NEW F, T
  42.   FSN F, 'My Field'
  43.   SAV F, Z
  44.   GET X, @p4
  45.   MOV Y, X
  46.   GET X, 1
  47.   MOD Y, X
  48.   NEW F, T
  49.   GET A, 4
  50.   FSN F, A
  51.   SAV F, Y
  52.   SAV @R, T
  53.   GET X, @R
  54.   MOV R, X
  55. _MyFunc_Exit:
  56.   POP X
  57.   POP Y
  58.   POP Z
  59.   POP A
  60.   POP F
  61.   POP T
  62.   POP S
  63.   RET
  64. MyScript_Main:
  65.   ARA @MyScript
  66.   GET X, 12
  67.   MOV Z, X
  68.   GET X, 13
  69.   NEG X
  70.   MOV Y, X
  71.   GET X, 14
  72.   MUL Y, X
  73.   ADD Z, Y
  74.   MOV Q, Z
  75.   GET X, 9
  76.   MOV Z, X
  77.   GET X, 3
  78.   ADD Z, X
  79.   GET X, 7
  80.   EXP Z, X
  81.   EQU Q, Z
  82.   SAV @m1, Q
  83.   GET X, !2009/01/01
  84.   SAV @m2, X
  85.   GET X, !29:10:50.999
  86.   SAV @m3, X
  87.   GET X, !2010-11-22~23:10
  88.   SAV @m4, X
  89.   GET X, 1
  90.   NEW T, @TABLE
  91.   NEW F, T
  92.   FSN F, 'k'
  93.   SAV F, X
  94.   GET X, 2
  95.   NEW F, T
  96.   SAV F, X
  97.   GET X, 9
  98.   PUS T
  99.   NEW T, @TABLE
  100.   NEW F, T
  101.   SAV F, X
  102.   GET X, 10
  103.   NEW F, T
  104.   SAV F, X
  105.   MOV B, T
  106.   POP T
  107.   NEW F, T
  108.   SAV F, B
  109.   GET X, !2001-01-01
  110.   NEW F, T
  111.   SAV F, X
  112.   SAV @m1, T
  113.   GET X, 1
  114.   PUS X
  115.   GET X, 2.1
  116.   PUS X
  117.   GET X, '4'
  118.   PUS X
  119.   GET X, 3
  120.   NEW T, @TABLE
  121.   NEW F, T
  122.   SAV F, X
  123.   GET X, 4
  124.   NEW F, T
  125.   SAV F, X
  126.   PUS T
  127.   GET R, 4
  128.   CAL @MyFunc
  129.   SAV @m2, R
  130. _MyScript_1:
  131.   GET X, @m2
  132.   MOV Q, X
  133.   GET X, 0
  134.   GTN Q, X
  135.   JOF [_MyScript_1X]
  136.   GET X, @m3
  137.   MOV Z, X
  138.   GET X, 1
  139.   ADD Z, X
  140.   SAV @m3, Z
  141.   JMP [_MyScript_1]
  142. _MyScript_1X:
  143.   PUS F
  144.   FLD F, @a
  145.   FLD F, 'b'
  146.   FLD F, 'c'
  147.   FLD F, 'd'
  148.   GET R, 0
  149.   CAL F
  150.   POP F
  151.   NEW T, @MyClass
  152.   SAV @VarName, T
  153.   GET X, @m4
  154.   GET A, 12
  155.   GET B, 23
  156.   BTW X
  157.   JOF [_MyScript_2]
  158.   GET X, !2010-11-22
  159.   MOV Z, X
  160.   GET X, !29:10:50.999
  161.   SUB Z, X
  162.   SAV @k, Z
  163. _MyScript_2:
  164.   GET A, '+0'
  165. _MyScript_3:
  166.   FLD F, @m3
  167.   FLD F, A
  168.   TST F
  169.   JOT [_MyScript_3X]
  170.   FGN A, F
  171.   SAV @name, A
  172.   GET A, F
  173.   SAV @value, A
  174.   GET X, 'Field Name = '
  175.   MOV Z, X
  176.   GET X, @name
  177.   ADD Z, X
  178.   GET X, ', Value = '
  179.   ADD Z, X
  180.   GET X, @value
  181.   ADD Z, X
  182.   PUS Z
  183.   GET R, 1
  184.   CAL @print
  185.   GET A, '+1'
  186.   JMP [_MyScript_3]
  187. _MyScript_3X:
  188. _MyScript_Exit:
  189.   QUT
复制代码
发表于 2012-5-22 17:56:34 | 显示全部楼层
aleyn 发表于 2012-5-22 17:37

看到,你定义了好多个通用寄存器,这样算起来快,不像我的汇编老是push和pop。
你那个类@MyClass准备支持属性和函数吗?
发表于 2012-5-22 18:08:00 | 显示全部楼层
我做的那个软件不需要类,所以功能的扩展都是用库的方式来实现的,增加功能就增加相应的库函数。
发表于 2012-9-7 16:03:40 | 显示全部楼层
有方向,就有研究的动力。USB-CNC控制系统,很好的目标。
发表于 2012-9-7 16:07:33 | 显示全部楼层
顶         
发表于 2012-11-29 08:57:25 | 显示全部楼层
刚看到这个帖。

以前我有个想法,在STM32等32位单片机上虚拟出一个51核,然后根据需要虚拟出专用的寄存器,中断源等。一旦虚拟的51核实现,就可以用Keil等编程实现了。
发表于 2015-1-20 17:12:22 | 显示全部楼层
谢谢分享                                                
发表于 2015-3-22 15:48:52 | 显示全部楼层
lz 搞了多久啊
发表于 2015-3-23 10:26:30 | 显示全部楼层
不知 v8 在内存有限的平台上表现如何?我现在的程序也想嵌入一个脚本引擎了。
v8 不行的话只能选 lua 了。
发表于 2017-9-14 11:59:49 | 显示全部楼层
发表于 2017-9-14 14:37:38 | 显示全部楼层
我觉得做CNC的话可以读取现有的GCODE脚本,并且能增加一些格外的输入输出就很好了.没必要搞个全新的编程语言
 楼主| 发表于 2017-9-14 14:58:12 | 显示全部楼层
这个贴子都已经五年了,现在脚本引擎和虚拟机都在运行和不断更新中,上面所有的想法,都已经实现了。
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 粤ICP备09047143号 )

GMT+8, 2017-10-24 14:04

阿莫电子论坛, 原"中国电子开发网"

© 2004-2016 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表