开发编程语言(二):语言规划

随笔 2016-07-02

语言命名

一个编程语言都有自己的名字,C语言,Python,Java,PHP等,对于程序员来说,给变量取名字也是习以为常的.这是我的第一个编程语言,就取名为Origin吧,命名由四妹提议的,在此感谢.

语言类型

究竟是强类型(C/C++,Java)还是弱类型语言呢(javascript, PHP)?由于本人主要从事php的开发,比较喜欢弱类型语言,弱类型使用简单,更灵活多变。后续可能会和几位大牛合力开发强类型的编译型语言.

程序的结构

这是一个可以支持顶层结构的书写代码方式.所谓的顶部结构,就是函数或类的外侧.也就是说打印不再需要想javaSystem.out.prinln()了,而是可以直接print().不需要为print包裹函数或者类.

函数的定义

弱类型语言变量类型在运行时候确定,所以声明时候不需要指定数据类型:a = b + c. 函数的定义也无须指定返回值.但需要将function作为保留字:

function add(a, b) {
    c = a + b;
    print("a + b = " + c);
    return c;
}

甚至不需要像c语言一样函数定义要写在使用之前.Origin可以在任意位置声明函数.这是因为程序执行时,首先将顶层结构的语句从上往下顺序执行,函数定义部分会被跳过.只有当函数被调用时,才会执行函数内部的语句. 如果函数不存在return语句,将返回一个常量null

数据类型

初步定义一下基本数据类型:

  • 布尔型: 值只能是truefalse
  • 整数型: 其实就是底层c语言的int类型
  • 实数型: c语言的double类型
  • 字符串型: 可以用过+进行拼接,如果右侧是数值,右侧将被转为字符串

复杂数据类型:

  • 原生指针型: 可指向任意数据,这是可以直接访问内存的邪恶指针

变量

声明

Origin的变量无须声明,赋值过程就包含了声明过程,如果用了一个没有使用过的变量则会产生一个警告并赋值为null

变量的生命周期

函数内的变量会作为函数的局部变量,生命周期及作用域仅限于当前函数内部.如果函数内用到外部变量,则需要global进行修饰.

a = 5;

function fun() {
    global a;
    a = 10;
}

语句与结构控制

控制语句有if for while,强调如果只有一个语句,也要加{}包裹.为了方便,引入elseif关键字

if (a == 5) {
    //code...
}elseif (a == 6) {
    //code...
}else {
}

while (i < 10) {
    //code...
}

for (i = 0; i < 10; i = i + 1) {
    //code...
}

语句与运算符

语句

初步将以下作为Origin语言的语句:

  • 整数字面常量,如:3
  • 实数字面常量,如:1.2
  • 字符串字面常量.用双引号包裹的字符串,如:"abc"
  • 变量

运算符

运算符如表(按优先级排列): 运算符 含义
-(单目取负) 符号取反
* / % 乘 除 取余
+ - 加 减
> >= < <= 大小比较
== != 判断相等
&& 逻辑与
¦¦ 逻辑或
= 赋值

内置函数

运算符 含义
print(param) 显示变量,参数可以任意类型

支持C语言调用

考虑扩展,应该让C语言可以调用Origin解释器. main.c中调用需要#include <ORG.h>

ORG_Interpreter *interpreter;
FILE *fp;

//生成origin解释器
interpreter = ORG_create_interpreter();

//生成分析树
ORG_compile(interpreter, fp);

//运行
ORG_interpret(interpreter);

//运行完毕后的回首解释器
ORG_dispost_interpreter(interpreter);

Origin 调用C语言

开发拓展调用C语言函数也同样容易.包含#include <ORG_dev.h>

//注册一个func_test的函数
ORG_add_native_function(interpreter, "func_test", hoge_hoge_func);

本文由 hongweipeng 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!