aleyn 发表于 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^。

codefish 发表于 2012-5-20 10:29:50

很不错,强烈支持!

albert_w 发表于 2012-5-20 10:46:42

高!
字数补丁!

jpchen 发表于 2012-5-20 11:15:25

完全自己写脚本解析容易有BUG,村长可以考虑一下ANTLR,它是开源的,除了java,也有C和C++的生成器,可以省去词法分析和语法分析的工作量,不容易出错,修改也容易。这样主要的工作量放在虚拟机上即可。
脚本引擎放到STM32里,可能性能比较差,我觉得你的USB-CNC更加好,只要USB速度能满足你的要求。

aleyn 发表于 2012-5-20 11:34:11

我没有用ANTLR,而是用GOLD,它比ANTLR更适合,因为它可以生成多种语言的“规则”,所以,基本上我是不需要自己去分析词法和语法的。
但为了配合生成的汇编,语法规则是需要边测边调整才行。

jpchen 发表于 2012-5-20 13:29:37

GOLD没用过,网上搜了一下,赞誉之辞甚多,尤其是支持的语言很多,令人心动。它的官网怎么进不去,是不是被屏蔽了?

jpchen 发表于 2012-5-20 14:00:14

村长你干脆在Android下开发个上位机吧,我感觉比PC上更有前途,尺寸变大或变小都更方便。

aleyn 发表于 2012-5-21 08:26:51

jpchen 发表于 2012-5-20 14:00 static/image/common/back.gif
村长你干脆在Android下开发个上位机吧,我感觉比PC上更有前途,尺寸变大或变小都更方便。 ...

对安卓手机才有系统,对开发安卓软件兴趣不大。{:lol:}

jpchen 发表于 2012-5-21 09:09:06

aleyn 发表于 2012-5-21 08:26 static/image/common/back.gif
对安卓手机才有系统,对开发安卓软件兴趣不大。

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

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


baopengzhou 发表于 2012-5-21 12:02:59

想学,没人带啊

jpchen 发表于 2012-5-22 12:30:19

我曾经用ALTLR的C++生成器,做了一个脚本解释引擎,语法基本取自C语言,取了其中最基本的部分,不过变量采用了动态类型,这样实现起来方便。另外语言中加入了多级触发器,可多级嵌套,允许中断函数执行完毕后返回断点处,也允许中断函数执行后跳转到指定的语句,不回到原先地方。

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

不知村长做的是基于栈还是基于寄存器的虚拟机?我当时为了方便起见,是用栈虚拟机来做的。

aleyn 发表于 2012-5-22 16:58:35

jpchen 发表于 2012-5-22 12:30 static/image/common/back.gif
我曾经用ALTLR的C++生成器,做了一个脚本解释引擎,语法基本取自C语言,取了其中最基本的部分,不过变量采 ...

栈和寄存器都有,因为需要支持Table和Class,所以内部还加入了指针,但在语言上不表现。

jpchen 发表于 2012-5-22 17:10:23

aleyn 发表于 2012-5-22 16:58 static/image/common/back.gif
栈和寄存器都有,因为需要支持Table和Class,所以内部还加入了指针,但在语言上不表现。 ...

栈和寄存器都做,工作量估计大了不少,其实用栈来实现,虽然运行速度会慢点,但是应该也够用的。
支持class会不会太复杂了,需要用到类的继承功能?我估计这个功能实现起来挺麻烦的。

aleyn 发表于 2012-5-22 17:16:18

jpchen 发表于 2012-5-22 17:10 static/image/common/back.gif
栈和寄存器都做,工作量估计大了不少,其实用栈来实现,虽然运行速度会慢点,但是应该也够用的。
支持cla ...

我只作单一的类,不做继承的,毕竟我的主要目的不是为了写出一个新的语言系统,而是为了配合宿主系统。
另外,用栈加寄存器,反而更好做一点。

jpchen 发表于 2012-5-22 17:26:23

aleyn 发表于 2012-5-22 17:16 static/image/common/back.gif
我只作单一的类,不做继承的,毕竟我的主要目的不是为了写出一个新的语言系统,而是为了配合宿主系统。
...

明白,就是说各种类是内部定义好的,用户使用时用几个就new几个就可以了,这个方式不错,简化版的面向对象编程。
你的寄存器是指特殊功能寄存器吧,就是说它是为了特殊功能用的,并不是通用寄存器,运算还是采用入栈和出栈的方式,如果这样的话,那还是算是用栈来实现的虚拟机。

aleyn 发表于 2012-5-22 17:31:42

OniuScript MyScript;
var
   m1,m3,m5,m6;   //全局变量
   
function MyFunc(p1,p2,p3,p4) //函数和参数
var
R;   //局部变量
begin
R = {                  //表格
   F1 = p1,            //字段名 F1值 p1
   F2 = p2 * 2,      //字段名 F1值 p2*2
   'My Field' = p3 + p4 /2,//字段名 'My Field',因为字段名有空格,所以必须用字符串形式,
    = p4 % 1            //字段名 4,数字字段
   };
return R;         //返回值
end;
      
main
    m1 = 12+-13*14 == (9+3)^7;         // m1 = 表达式
    m2 = !2009/01/01;                  // m2 = 日期
    m3 = !29:10:50.999;                // m3 = 时间
    m4 = !2010-11-22~23:10;            // m4 = 日期时间
    m1 = {k=1,2,{9,10},!2001-01-01};   // m1 = 表格
    m2 = MyFunc(1, 2.1, '4', {3,4});   // m2 = 函数
   
    while (m2 > 0) do m3 = m3 +1 end;// while 循环
   
    a.b.c.d();                         // 类函数 或 表格函数

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

    if m4 in {12..23} then             // 如果 m4 在 12 至 23 之间
      k=!2010-11-22-!29:10:50.999;
    end;
   
    for name, value in m3 do         //for 的另一种表现,枚举表格
    begin
       print('Field Name = '+name+', Value = '+value);
    end;
   
end.

aleyn 发表于 2012-5-22 17:36:32

jpchen 发表于 2012-5-22 17:26 static/image/common/back.gif
明白,就是说各种类是内部定义好的,用户使用时用几个就new几个就可以了,这个方式不错,简化版的面向对 ...

表达式运算我也是采用寄存器+栈的方式,当寄存器被占用的时候,就用PUSH和POP,之后继续用寄存器。

aleyn 发表于 2012-5-22 17:37:45

_MyScript:
ARA @MyScript
VAR @m1
VAR @m3
VAR @m5
VAR @m6
JMP
_MyFunc:
ARA @MyFunc
PRM @p1
PRM @p2
PRM @p3
PRM @p4
VAR @R
PUS S
PUS X
PUS Y
PUS Z
PUS A
PUS F
PUS T
GET X, @p1
NEW T, @TABLE
NEW F, T
FSN F, 'F1'
SAV F, X
GET X, @p2
MOV Y, X
GET X, 2
MUL Y, X
NEW F, T
FSN F, 'F2'
SAV F, Y
GET X, @p3
MOV Z, X
GET X, @p4
MOV Y, X
GET X, 2
DIV Y, X
ADD Z, Y
NEW F, T
FSN F, 'My Field'
SAV F, Z
GET X, @p4
MOV Y, X
GET X, 1
MOD Y, X
NEW F, T
GET A, 4
FSN F, A
SAV F, Y
SAV @R, T
GET X, @R
MOV R, X
_MyFunc_Exit:
POP X
POP Y
POP Z
POP A
POP F
POP T
POP S
RET
MyScript_Main:
ARA @MyScript
GET X, 12
MOV Z, X
GET X, 13
NEG X
MOV Y, X
GET X, 14
MUL Y, X
ADD Z, Y
MOV Q, Z
GET X, 9
MOV Z, X
GET X, 3
ADD Z, X
GET X, 7
EXP Z, X
EQU Q, Z
SAV @m1, Q
GET X, !2009/01/01
SAV @m2, X
GET X, !29:10:50.999
SAV @m3, X
GET X, !2010-11-22~23:10
SAV @m4, X
GET X, 1
NEW T, @TABLE
NEW F, T
FSN F, 'k'
SAV F, X
GET X, 2
NEW F, T
SAV F, X
GET X, 9
PUS T
NEW T, @TABLE
NEW F, T
SAV F, X
GET X, 10
NEW F, T
SAV F, X
MOV B, T
POP T
NEW F, T
SAV F, B
GET X, !2001-01-01
NEW F, T
SAV F, X
SAV @m1, T
GET X, 1
PUS X
GET X, 2.1
PUS X
GET X, '4'
PUS X
GET X, 3
NEW T, @TABLE
NEW F, T
SAV F, X
GET X, 4
NEW F, T
SAV F, X
PUS T
GET R, 4
CAL @MyFunc
SAV @m2, R
_MyScript_1:
GET X, @m2
MOV Q, X
GET X, 0
GTN Q, X
JOF
GET X, @m3
MOV Z, X
GET X, 1
ADD Z, X
SAV @m3, Z
JMP
_MyScript_1X:
PUS F
FLD F, @a
FLD F, 'b'
FLD F, 'c'
FLD F, 'd'
GET R, 0
CAL F
POP F
NEW T, @MyClass
SAV @VarName, T
GET X, @m4
GET A, 12
GET B, 23
BTW X
JOF
GET X, !2010-11-22
MOV Z, X
GET X, !29:10:50.999
SUB Z, X
SAV @k, Z
_MyScript_2:
GET A, '+0'
_MyScript_3:
FLD F, @m3
FLD F, A
TST F
JOT
FGN A, F
SAV @name, A
GET A, F
SAV @value, A
GET X, 'Field Name = '
MOV Z, X
GET X, @name
ADD Z, X
GET X, ', Value = '
ADD Z, X
GET X, @value
ADD Z, X
PUS Z
GET R, 1
CAL @print
GET A, '+1'
JMP
_MyScript_3X:
_MyScript_Exit:
QUT

jpchen 发表于 2012-5-22 17:56:34

aleyn 发表于 2012-5-22 17:37 static/image/common/back.gif


看到,你定义了好多个通用寄存器,这样算起来快,不像我的汇编老是push和pop。
你那个类@MyClass准备支持属性和函数吗?

jpchen 发表于 2012-5-22 18:08:00

我做的那个软件不需要类,所以功能的扩展都是用库的方式来实现的,增加功能就增加相应的库函数。

aworker 发表于 2012-9-7 16:03:40

有方向,就有研究的动力。USB-CNC控制系统,很好的目标。

lcw_swust 发表于 2012-9-7 16:07:33

顶         

yurinacn 发表于 2012-11-29 08:57:25

刚看到这个帖。

以前我有个想法,在STM32等32位单片机上虚拟出一个51核,然后根据需要虚拟出专用的寄存器,中断源等。一旦虚拟的51核实现,就可以用Keil等编程实现了。

mcuprogram 发表于 2015-1-20 17:12:22

谢谢分享                                                

canopen 发表于 2015-3-22 15:48:52

lz 搞了多久啊

mangocity 发表于 2015-3-23 10:26:30

不知 v8 在内存有限的平台上表现如何?我现在的程序也想嵌入一个脚本引擎了。
v8 不行的话只能选 lua 了。

ljt80158015 发表于 2017-9-14 11:59:49


https://www.amobbs.com/thread-5679403-1-1.html

Picoc C语言解释器

szjqt 发表于 2017-9-14 14:37:38

我觉得做CNC的话可以读取现有的GCODE脚本,并且能增加一些格外的输入输出就很好了.没必要搞个全新的编程语言

aleyn 发表于 2017-9-14 14:58:12

这个贴子都已经五年了,现在脚本引擎和虚拟机都在运行和不断更新中,上面所有的想法,都已经实现了。{:lol:}

tgdiy 发表于 2019-11-16 06:56:49

村长厉害

3050311118 发表于 2019-11-18 07:51:39

python不可以吗
页: [1]
查看完整版本: 有没有人搞脚本引擎开发的?有兴趣的进来讨论一下。