面向中文的自然语言编程

面向中文的自然语言编程:L脚本语言

解释器引擎 Github下载地址https://github.com/zhaoliangcn/LScript

解释器引擎CSDN资源下载地址

l 为什么要设计一种新的编程语言?

在编程的过程中我总在想,计算机编程这件事需要那么长时间的学习过程,能不能让这份工作更简单一些呢?有那么多的编程语言,每一种都有自己不同的语法规则和使用的局限,那能不能自己实现一个编程语言呢。

如果我们有一个语法简单,并且还支持中文的编程语言是不是能够让编程更简单这样还能够让编程更加符合一般的语言文字表达习惯。

为此,我开始从头设计实现这样的一种脚本编程语言,因为相对于c,c++这样的静态编译语言来说,脚本语言实现起来更简单。这种脚本语言命名为L语言

l L脚本语言的设计目标是:支持中文自然语言编程

也就是说L脚本语言希望更加更加接近我们平时说话写文章的语言,而不是计算机才懂的机器语言,而且它还是建立在中文基础上的,不需要精通英语就可以使用了

l L脚本语言的语法为 动作:对象,参数

我们先来看看一段C语言代码及其文字表述的含义

C语言代码

解释

int num ;

num =10;

num=num+1;

printf(“%d”,num);

定义一个整数num;

给整数num赋值为10;

将num的值加1重新赋值给num;

打印输出num;

为什么我们需要写出左边那样的代码才能让计算机运行,为什么不能写出右边的描述就能让计算机去工作呢?大部分计算机软件开发人员的回答都是:因为右边的自然语言不容易让计算机识别。

然而,真的是这样吗?

我一直在思考,是不是能够让计算机来识别自然语言呢?

我们来观察一下,在计算机编程中,每一行代码都是一个命令,而每一个命令的核心都是一个动词,其它的信息都可以理解为参数。

而自然语言中,不仅有动词,还有名词,形容词,量词等等。

它们的共同点都是有一个核心动词。

那如果我们把我们平时所写的自然语言重新调整一下格式,是不是计算机就容易识别了呢?

为了验证这样的想法,我做了一个假设,假设编程语言只有命令+参数这一种格式

,这样的语法,即接近自然语言,又容易让计算机识别

l 在L脚本语言中,只有动作,对象和字符串

我们用L脚本语言来实现上面的那段c语言代码

L脚本语言代码1

L脚本语言代码2

定义:整数,num,10

计算:算式,exp1,num=num+1

显示:num

定义:整数,num,10

计算:num=num+1

显示:num

看一下,是不是很简单,我想,不需要有编程经验都可以看得懂上面这段L脚本语言的代码

而且,这样简单的语法结构很容易让计算机来识别

编程是不是很简单呢?

当然,前面这样的一段代码没有太多现实意义,我们的L脚本语言需要更强的功能。

为此,我们需要定义更多的语言特性。

l L脚本语言的语法说明

在L脚本语言的代码中,一行代码是一个文本串,一个文本串有可能是命令,也有可能是对象,还有可能是原始的文本字符串

看起来有点混乱,但也有明确的规则

在一行代码中,行的起始必然是动作:对象

所以,一行的起始位置到":"之间的就是动作名,":"后面跟着的是对象名

对象名后面可以跟参数,也可以不跟

如果后面跟着参数,那么用","分隔开

分隔符:或:前面是命令或动作,后面是对象

分割符,或,用来把参数区分开

参数可以是字符串,也可以是对象

这样够简单吧!L脚本语言中没有太多标识符元素,而且只有两个分隔符,逗号和冒号,这样的语法很容易记忆吧。

什么是对象?对于没有接触过编程的朋友,这个需要解释一下,这个对象不是“谈对象”的“对象”对象一词是从英文 object翻译过来的,英文词典上object的含义解释是:物体、物件。其实这样很容易理解了,就是说我们在编程思考问题的时候不是考虑每一条计算指令,而是考虑在一个物体上进行什么动作。

L脚本语言也是一门面向对象的编程语言!

l 其它语言特性

L脚本语言中内置了一些全局对象,但也允许用户定义自己的对象实例 ,L脚本语言的解释引擎会自己识别参数的类型到底是什么

我们也可以把动作理解为函数

L脚本语言中内置了一个“结果”对象,这个"结果"对象中保存的是上一条语句的运行结果,这个"结果"可以是任何对象,但它是容易丢失的,如果我们想要把“结果”中保存的对象保留下来,可以通过使用“捕获”命令

L脚本语言中内置了对条件语句的支持,在这里,条件语句实际上也是一个动作,叫做"如果"语句

L脚本语言中也内置了对循环语句的支持,在这里,循环语句也是一个动作,叫做"当"语句

好了,,光说不做假把式。我们看看L脚本语言都有哪些功能吧。

l L脚本语言目前支持的功能:

支持字符串,支持字符串比较 连接取子串 赋值 查找子串

支持文件,支持文件的打开,读取,写入,获得文件大小等操作

支持数值运算,包括整数和浮点数的运算,包括算术运算、逻辑运算、位运算、移位运算

支持“表”,表其实是借鉴了LUA语言的概念,可以用它来实现动态数组,表的元素可以是任意对象,可以是函数,当然也可以是表,表的大小是可变的

支持正则表达式,可以通过内置的正则表达式实现字符串的匹配

支持函数,函数可以有任意多个参数,参数可以是任意对象,当然也可以是函数

支持“内存”对象,支持内存比较

调试器,支持单步执行,支持断点,支持对象查看,支持源码编辑

支持调用操作系统C语言API

支持库以及库的导入机制,通过L脚本语言的导入库机制,可以实现语言自身的扩展,因为可以调用操作系统提供的C语言API,所以可以由用户实现各种增强的功能

支持网络通讯,支持TCP,UDP协议,可以使用L脚本语言开发简单的网络程序,当然可以是服务器、也可以是客户端

支持时间、日期,时间比较

支持目录管理

支持简单的交互输入框

支持随机数的生成

支持注册表编辑

支持自定义类,以及类的实例化

哇!看来我们的L脚本语言还真能干,有这么多功能呢!

l 我们来看看L脚本语言都能做些什么吧

对字符串的支持:

因为L脚本语言中:和,是分隔符 所以如果希望在字符串中使用:和, 就需要用" "把字符串括起来

但是动作和对象名不可以用""括起来

为什么?这只不过是因为这样实现更加简单,所以就这样规定了

对函数的支持:

对于一个函数,首先要进行定义(声明),然后才能进行调用

定义函数有着明确的格式:

函数名可以是任意字符串,形式参数也可以是任意字符串,形式参数的个数可以是任意多个

函数体可以是任意合法的L脚本语言脚本语句

函数体以 开始:函数,函数名 的格式开始

以 结束:函数,函数名 的格式结束

调用函数时需要传入与定义函数时数量匹配的函数参数

函数的参数必须是对象

函数的参数是对象,而函数自身也是对象,所以函数的参数也可以是函数

这不就可以实现递归调用了吗?

不甚酒力,体会不了酒的美味,但却能感受知已的妙处。

面向中文的自然语言编程

相关文章:

你感兴趣的文章:

标签云: