Hi,广大VB爱好者,大家好!
2011年就确定要写一个自己的脚本平台。但是一直没有下定决心来做。
今年因为一个项目,下定决心来做这件事。
首先解释下Cobra,这个名字中文是眼镜蛇的意思,当初遇到这个单词时,一眼就记住了,两个词根,Co和Bra,中文是啥意思,自己琢磨吧,特容易记哈,屌丝特喜欢!
确定了名字后,问了下度娘,发现已经有一门语言叫Cobra,还好基本没啥名气。所以就不换了。
Cobra,我们的设计初衷是,类似.net,可以在一个虚拟机上运行几个语言,目前只支持VB.NET语言,未来会扩充支持Java、C#语法。
简要介绍Cobra的特性:
1、完全面向对象
接口、继承、多态等
有包(库)、命名空间的概念。
2、支持结构和枚举。
3、支持API调用,暂时不支持回调。
4、支持调用ActiveXDll
ActiveXDll中的类可以被实例化并调用,而且支持其事件处理。
实例化的类,可以被Cobra类继承扩展。
5、Cobra类,可以作为普通类实例在VB等支持COM的语言中使用。
6、强类型。
作者对强类型,有强烈的认同感,另外,由于能力有限,目前还不清楚怎么解决弱类型情况下的运行速度问题。
所以暂时不支持后期绑定,后续版本会有所支持。
7、关于数据类型。
数据类型和VB完全一样,可以互传。
8、数组。
支持动态数组和静态数组。
另外不支持多维数组,在作者的编程生涯中,从未使用过多维数组,故舍弃支持。
9、支持中文。
所有关键字,都可以设置别名,别名可以是中文。
10、速度。
速度还算不错,比按键精灵的那个脚本平台快几十倍。
当然了,跟专业的脚本平台比,速度还有很大的提升空间。
11、与宿主通信。
宿主程序可以获得脚本编译中产生的错误,可以准确支持行号、列号,以及错误的原因。
脚本执行中,可以获取脚本的事件,哪个对象的哪个函数被调用了,参数是几个,值分别是多少。
可以快速访问Cobra栈上面的变量。
因为Cobra支持ActiveX调用,也就是说,脚本代码中可以引用Cobra本身,从而是实现动态编译、执行。更多特性,期待产品完成后,大家亲自体验。好了,先大体介绍到这里。
目前Cobra还在开发中,后续动态将陆续在本帖中贴出,欢迎大家提意见和建议。Cobra团队
2014-5-22

解决方案 »

  1.   

    关于注释
    除了支持传统的VB注释语法,还支持以下特性
    1、行内注释,比如 a=a '这里是行内注释' +2
    2、多行注释:
    ‘/sdfsdfsdf
    sdfsdf
    sdfsdf
    sdfsdf/'
      

  2.   

    对了,这方面介绍一个不错的商业项目供参考,虽是商业的,但价格不贵,主要是卖的授权,单个授权只要199美元,关键是他是提供全部源代码的,适合你们编译原理等方面的专长研究。当然也有一点小遗憾,代码是pascal:)http://www.paxcompiler.com/
      

  3.   

    大版主来了哈。
    我是猛将兄。QQ里跟你聊过这个项目。
    Cobra大概6月中旬发布,最迟6月底发布。
    到时多指点。
      

  4.   

    贴一段代码
    这段代码可以被编译Public NameSpace NameSpacePublic                      '该NameSpace,在包外也可以访问
      '下面这行演示多行注释
      '/*你的注释 你的注释 你的注释
      你的注释
      你的注释  你的注释
      你的注释*/    
        '/*
    Public  在包内包外所有作用域都可以访问
    Friend  仅仅在当前包内可以访问
    Private 仅仅在当前包内可以访问
    */  
      
      '声明Enum  
      Public Enum dySomeEnum     '直接声明在NameSpace下的枚举,该枚举在包内包外所有作用域都可以访问
        '/*
    跟VB.NET类似,但是跟VB6不同的是Cobra允许不同枚举,他们的成员名可以相同,访问枚举成员,使用如下格式:dySomeEnum.MemberPublic
    Public  在包内包外所有作用域都可以访问
    Friend  在当前的命名空间下都可以访问
    Private 仅仅直接声明在当前NameSpace下(不能是声明在某个Module或是Class内)的函数才可以访问
    */  
        Public MemberPublic =1             '包内和包外都可见
    Friend MemberFriend =2             '仅仅在当前命名空间下可见
    Private MemberPrivate =3           '仅仅直接声明在当前NameSpace下的函数内才可见
      End Enum  
      
      '声明Type
      Public Type dySomeType     '直接声明在NameSpace下的结构,该枚举在包内包外所有作用域都可以访问
        '/*
    因为Type关键字有别名Struct,所有也可以这么声明
    Struct dySomeType
    End Struct
    Public  在包内包外所有作用域都可以访问
    Friend  在当前的命名空间下都可以访问
    Private 仅仅直接声明在当前NameSpace下(不能是声明在某个Module或是Class内)的函数才可以访问
    */  
        Public MemberPublic  As Long =1             '包内和包外都可见
    Friend MemberFriend  As Long =2             '仅仅在当前命名空间下可见
    Private MemberPrivate  As Long =3             '仅仅直接声明在当前NameSpace下的函数内才可见
      End Type
      
      '声明常量,同时演示了跨行文本
      Public Const Const_SomeConst As String="一个段落1
                                              一个段落2
      一个段落3
      一个段落4
      一个段落5
                                               Text"
        '/*
    上面的声明等同于
        Public Const Const_SomeConst As String="一个段落1" & vbCrlf & _
                                               "一个段落2" & vbCrlf & _
                                       "一个段落3" & vbCrlf & _
       "一个段落4" & vbCrlf & _
       "一个段落5" & vbCrlf & _
                                               "Text"
    */       Public Const Const_SomeConst2 As String="一个段落1 —
                                               一个段落2 —
       一个段落3 —
       一个段落4 —
       一个段落5 —
                                               Text"
        '/*
    上面的声明等同于
        Public Const Const_SomeConst2 As String="一个段落1一个段落2一个段落3一个段落4一个段落5Text"
    */     
      
      Public gLong    As Long = 15    '声明一个变量,并且赋值15    
      
      Public ’/*行内注释*/ Interface SomeInterface '这里声明了一个Interface,同时演示了行内注释
        Public Enum dyEnumInInterfaceEnum      
           A  = dySomeEnum.MemberPublic '枚举成员,它的值是 dySomeEnum.MemberPublic。
        End Enum    Public Sub SomeSub(ByRef A as long)   
           
        END SUB

    Public Property Get PropGet() As Long

    End Property
      End Interface  Public Class SomeClass   NotSerializable NotInheritable Inherit OtherNameSpace.SomeClass
        '该类不能串行化,并且不能被继承,它本身继承自 OtherNameSpace.SomeClass
        Public Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (byref var As Any) As Long    Private Sub SomeSub(Byval a As Long)
       '跟VB6一样,可以申请变量和常量,Cobra允许在过程内定义枚举和结构,还有API声明
           Local Enum dyEnumInInterfaceEnum      
             A  = dySomeEnum.MemberPublic '枚举成员,它的值是 dySomeEnum.MemberPublic。
           End Enum    End Sub  End ClassEnd NameSpace
      

  5.   

    有兴趣的人,还有觉得Cobra对你有用的人,可以参与进来。
    我希望Cobra是吸收大家的建议,开发出来的。
    每个人的建议都很重要。
      

  6.   

    你想说明白一个脚本平台?编译器、代码示例,总要给一个样本出来吧,不然,它比VBS好用多少,能说得清楚吗?
      

  7.   


    我有个建议,尽量也兼容一些Freebasic的语法,毕竟这个开源Basic已经有了一定稳定的用户群
    http://www.freebasic.net/
      

  8.   

    CSDN一般只看不回帖发帖,要发帖现注册哈,所以小号比较多哈。
    Cobra,还是定位脚本平台,跟宿主有交互。没打算做成独立的语言。
    目前不会加入比较怪异的语法。事实上,我们没想过自己发明一门自己的一语言,只是做某个现成的语言的实现。
    目前参考蓝本是VB.NET.
      

  9.   

    关于别名特性
    Dim a<甲,老大> as Long这里a是名称,甲、老大是别名
    下面的语句就可以这么写
    a=10

    甲=10是等价的。
    所有命名的地方,都支持别名。
      

  10.   

    还有一个需求,就是你个编译器的后端能否支持生成为llvm.或者说编译成javascript执行,这样就很有市场了。haxe.org就是这样的啊。
      

  11.   

    我去曾经考虑过编译到js 而且去年我们自己开发了一个浏览器级的html/css解析内核(搜网页剪刀手可以搜到相关信息) 但是这类工具已有了 谷歌的dart 微软刚出了typescript 所以我放弃了 不过未来会考虑编译成dart或是typescript 再用他们编译成js
      

  12.   

    嗯,anders弄的这个typescript 也值得关注一下
      

  13.   

    介绍一个小的特性,是关于注释。
    实例,这是Cobra里的一段代码,是解析标记的:Private Function pParseTokens(ByRef tLines As dycCodesLinesType, _  ‘所有的行
                                                               ByRef lLine As Long, _                                '当前行
                                                               ByVal sCodeLine As String, _                     '当前行的内容
                                                               ByRef tOutTokens As dycTokensType, _  '返回标记
                                                               ByRef lOutErrChar As Long, _                     ’错误发生的字符位置
                                                               ByRef sOutError As String) As Boolean     '错误信息
    End Function‘或下面的方式
    Private Function pParseTokens(ByRef tLines As dycCodesLinesType‘/*所有的行*/ ,  ByRef lLine As Long'/*当前行*/ , ByVal sCodeLine As String'/*当前行的内容*/,   ByRef tOutTokens As dycTokensType'/*返回标记*/ , ByRef lOutErrChar As Long’/*错误发生的字符位置*/, ByRef sOutError As String  '/*错误信息*/) As Boolean   
    End Function
      

  14.   

    我打错了。
    Cobra,可以不区分中英文的单引号。也就是说中文的单引号也是开始一段注释。
    当然了。这个可以作为一个选项。如果关掉,那么就是只能用英文的单引号开始一段注释。