# 龙语言编译器 **Repository Path**: LittleMole/dragon-language-interpreter ## Basic Information - **Project Name**: 龙语言编译器 - **Description**: 龙语言是一门类似于Python的脚本语言,该项目是开发编译器(解释器),是作为发展“中国人的Python语言或Matlab”的一个基础。目前基于Go语言开发。 - **Primary Language**: Go - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2023-01-15 - **Last Updated**: 2023-01-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 龙语言解释器介绍 龙语言是一种开放源代码的脚本语言,该项目的核心技术-龙语言解释器,是作为发展"中国的Python语言或Matlab"的一个基础。暂时基于Go语言开发而成。 龙语言是一个未来面向数据分析以及常规任务处理的编程语言。当前解释器(编译器)基于Go语言开发,目的是为了借助Go语言一些基础库而减轻开发任务量,因此属于原型系统。最终目标是用C++或C语言开发一个解释器,甚至可以升级为一种能够产生本地机器码的编译器。目前已支持模块导入功能和函数定义功能。目前尚不支持垃圾回收的内存管理,但由于是Go基础上开发的,垃圾回收功能暂时依赖于Go本身的机制。 初期的语法参考了Python,去掉了Python的冒号及缩进要求,取而代之的是C语言式的花括号。 ## 软件架构 ## 安装教程 暂时均为测试版本,无需复杂的安装。尚不依赖于其它的库,当前只需要运行go build编译即可. 转件运行方式(Windows下): 交互方式:直接运行dragon.exe,将进入交互方式,输入提示符为“:”. 命令执行方式:在命令行下运行dragon.exe,若提供了命令行参数,则把命令行参数当作一个被执行的脚本文件名。 使用cgo增加了调用动态链接库的代码(CallDll.go),该代码在windows下编译难度大。您尽量在linux下编译。如果想在windows下编译成功,把calldll.go文件移除目录再编译。 Linux下: 交互方式:直接运行./dragon,将进入交互方式,输入提示符为“:”. 命令执行方式:在命令行下运行./dragon,若提供了命令行参数,则把命令行参数当作一个被执行的脚本文件名。 ## 使用说明 Dragon语言(中文:龙语言)是一个新设计的类似于Python或Matlab的一个针对科学计算的脚本语言。目前尚未定制该语言的语法,但主要参照Python语法规则以及一些常用的Python库(列表、元组、字典)。与Python的不同在于,不需要冒号来开始一个代码块,取而代之的是类似于C语言所用的花括号{}。当前支持的功能比较有限,未来会逐渐完善。现支持简单的列表操作(创建列表、添加元素、弹出元素、切片访问)、元组创建、常用数学计算(不同于Python中把数学运算全部放在了math模块下,Dragon语言将这些函数直接作为内建函数),新建函数和函数调用、模块导入。支持for循环、while循环和if-else语句。 Dragon语言的脚本文件采用.drg的扩展名。 当前的Dragon语言解释器开发仅仅是一个开始,未来需完善的包括增加类及类对象的创建、异常处理等。目前有关任意动态链接库的调用功能即将添加。当前部分代码处于原型阶段,未来还可以持续优化加速代码的执行。 Dragon语言解释器是在用Go语言开发的,由于Go是带有垃圾回收功能的,因而目前暂不用考虑垃圾回收机制。但为了增加该语言的自主性质,需要最终转化为由C++来开发解释器,那时就需要考虑内存回收问题。按照本人目前的想法,是采用一种类似于rust的内存管理机制,但采用一种更为先进的思想(本人已有思路)来管理。 ### 关键字 本语言的关键字包括def if else for while def and or not None(或nil、null) True(或true) False(或false)。 ### 变量的定义 变量名的定义规则与其它常见编程语言基本相同。 ## 基础数据类型与数据结构 包括整型、数值型(浮点数)、字符串(string)、列表(list)、元组(tuple)、数值型数组(array)、映射(map). 目前还不支持用户对类的定义和类对象的创建。未来可以增加,但作为脚本语言一般情况下不需要使用类与对象。大多数任务通过元组即可应付。 ### 整型与数值型 不带小数点的数字默认被当作是整型数,带小数点的数字默认被当作是浮点数。浮点数和整数在运算结合时只按浮点数规则运算。 ### 字符串 字符串初始化:s='addddd'、s='add"ddd'或s="ab'cde"均是合法的。 ### 列表(list) 列表与元组 与Python中的列表和元组是完全类似的结果,其元素都可以是任意的对象。 元组初始化:t=1,2,3 与 t=(1,2,3)、t=tuple(1,2,3)是等价的。 列表的元素是可以增加和删除的,列表可以是空的。但元组的初始化至少需要有两个元素,无元素的元组是没有意义的,只有一个元素的元组会把该 元素当作对象本身,而不能成为元组。 即t=()是不合法的,而t=(N)等同于是t=N 列表初始化:l=[1,2,3] 与l=list(1,2,3)是等价的 序列结果(列表、元组、数组)都可以相互转化。for循环迭代也需要在序列结构上进行 序列的切片操作:alist[0:n]、alist[:n]、alist[:]是等价的,也可以单值切片,如alist[i]。 range对象,与Python的range对象类似。 列表运算:.append和.pop,+、+=、* ### 映射(map) 类似于Python中的字典,但map与Python字典有一定差别在于:map的key必须是整数或者字符串,其对应的值则可以是任意对象;Python字典的键也可以是任意对象,但除整数和字符串外,其它对象做键的实用意义并不大。 map的初始化样例: mm=map(1:12.0,2:'two',3:34,'four':4000) 注意不能使用Python中的花括号来申明映射。map现在支持三个函数:.has_key()、keys()、values(),remove(),用于判断是否有某键存在、获取所有键、获取所有值。remove()函数用于删除键。 map通过键获取值和设置(或增加)值: m=map(); m[1]='one'; m[2]='two' 获取map对象的长度(指键值对个数),需要使用len(),如len(mymap) ### 数组 数组(array)类似于numpy中的数组,它是数值密集型的数组对象(向量),对其进行数学运算要比对单个数进行的运算高效得多。数学运算规则与常规数值对象完全相同,这一点类似于matlab。array不需要使用import之类的导入数学函数(如pow和cos,是作为内建函数),即可直接对其进行计算。 数组初始化:a=array([1,2,3]) a=array(range(100)) cosa=cos(a) 数组还可以是多维的,也就是说它既能表示多维数据集,也能表示二维矩阵。但目前还没有实现矩阵乘法、矩阵求逆以及特征值分解的算法。 ### 数学运算符 包括:+ - * / ^(次方) 等。包括了各种关系运算符,但目前支持还不够完善。 变量的赋值:支持a,b,c=1,2,3之类的在一行内完成多变量赋值,但赋值号右侧的对象可以多于左侧变量个数,仅最前面的对象会与左侧变量匹配赋值,多余的不起作用 ## 控制结构 支持if ... else 以及for循环和while循环语句。 if 条件 {...} else {...} for vari in 迭代器 { ... [break] ... [continue] ...} //这里的[]表示该项可以有,也可以无 while condition {... [break] ... [continue] ...} 无需考虑缩进,不需要加冒号,要用花括号。可以写成一行,也可以写成多行。 ## 函数与模块 数学函数较多,如三角函数。调用基础数学函数并不需要使用import。这些函数是被作为内建函数,其操作对象既可以是普通的数字,也可以是数组(即数值向量)。 ### 模块 模块是以模块名直接命名的文件(模块名+.drg). 导入模块语法:import modulename 模块是以modulename+'.drg'命名的源码文件。 调用模块函数举例: :import math (该模块是举例,并非是已有的标准库,您可以自行编写一个库) :temp=math.add(2,3) :print(temp) 5 模块的开发: 模块即为一个单独的文件,模块中可定义各种函数(用def关键词定义),同一模块中的函数可以相互自由调用,即在一个函数体中可调用另一函数。模块中还可以导入其它模块,并调用这些其它模块的函数。调用方式是必须加模块名:module.function(param) ### 函数 函数定义:与Python用的关键字相同,即def 函数名 (参数表) {函数体} 可以使用dir()函数查看现在支持的部分内建函数名称 def addnum(x,y) { return x+y } 用户定义函数可以赋值给其它变量,但内建函数则不支持这种赋值。 func0=addnum return命令本质上是一个函数,如果要返回的是一个元组,那就请您加上括号,不然解释器会识别错误。 可以算作是当前的一个bug,但是暂时不再修改此bug。 例如: return a,b,c,d //是错误的代码 return (a,b,c,d) //是正确的代码 内建函数包括cos、sin、tan、pow、erf、log、log2、exp、sign,list、tuple、range、array、print、file、min、max、mod、pair、dir、atan、asin、acos等. 未来将逐步增补。 打印函数:print(something),比如print(a,b,c) #### range(start,end,step)函数 与Python中的range函数类似,用于生成从start开始但不大于end的整数,每次增加步长为step。当只有一个参数时,表示start默认为0,唯一的参数是作为end的值。当三个参数很齐全时,第三个参数是作为step的值。 #### ones(m,[n])函数 用于生成值为1的向量,当只有一个参数m时,就会生成一个长度为m的1值向量,若有两个参数时,会生成一个mXn的1值矩阵。暂不支持生成二维以上的数组。 #### random([m],[n])函数 用于生成0~1之间的随机数,当无参数时,返回一个随机值;当有一个参数m时,会生成m个不同的随机数组成的向量;当有两个参数时,会生成mXn个随机数组成的矩阵。暂不支持生成二维以上的数组。 #### float(x)函数、int(x)函数、str(x) 用于将整数或字符串转化为浮点数、整数及字符串。 #### len(obj)函数 获取序列类对象(列表、元组、数组、映射、字符串)的长度,即元素个数。 ## Library 作为一个新开发的编程语言,尚没有库的积累。欢迎各位用户提供常用模块来充实本语言的生态。有关对任意动态链接库的调用功能在开发之中,关键技术问题已经解决,在解决了该瓶颈后,龙语言将会无所不能! 参与贡献 Fork 本仓库 新建 Feat_xxx 分支 提交代码 新建 Pull Request 码云特技 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md 码云官方博客 blog.gitee.com 你可以 https://gitee.com/explore 这个地址来了解码云上的优秀开源项目 GVP 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 码云官方提供的使用手册 https://gitee.com/help 码云封面人物是一档用来展示码云会员风采的栏目 https://gitee.com/gitee-stars/