头图

今天的主人公名为——Melang

这是一款“新”的脚本语言,然而其已经默默问世了6年之久。

下面笔者就带你走进Melang world。

What is Melang

Melang是一款协程并发脚本语言。它是一款解释型,而非编译型语言。

在Melang中,每一个脚本任务都是一个协程。而多个脚本任务即可以同时在同一个线程中处理,也可以在多个线程间处理。

这与Go的协程非常相似,但是Melang中的协程并不需要主动让出cpu执行权限或者调用特定函数来间接让出CPU执行权限。而是按解释器执行一定操作后自动切换任务执行。这也就免除了开发者需要考虑切换时机的问题。

在Melang中,所有的脚本代码逻辑都是同步的。但是实际都是由解释器异步进行的。这就免除了很多对异步编程不熟悉的开发者的上手难度。

同时,为了让开发者可以更快的入手,语言的语法与C语言非常相似,因此对C熟悉的开发者将会很容易上手开发。

下面那就让我们一起Hello, world!

//hello.m
sys = import('sys');

sys.print("Hello, World!")

执行:

$ melang hello.m

你将看到:

Hello, World!

协程并发与协程池

在Melang中,每一个脚本任务都是相互隔离的。然而有时我们也需要让不同任务之间可以相互通信来彼此协作,因此Melang的库函数中提供了消息队列模块,使得这一想法成为可能。

然而基于这一机制,我们很容易衍生出一种新的池结构模型——协程池。

即,主协程可用于分配资源,而一组工作协程可以通过消息机制接收资源并各自进行处理。这与传统的线程池模型非常相似。

下面我们就来看一个使用协程池实现的最简单的HTTP服务器:

/* filename: server.m */
net = import('net');
mq = import('mq');

listenfd = net.tcp_listen('127.0.0.1', '80');
for (i = 0; i < 4; ++i) {
    eval('processor.mln', i);
}
while (1) {
    fd = net.tcp_accept(listenfd);
    mq.send('test', fd);
}
/* filename: processor.m */
sys = import('sys');
net = import('net');
mq = import('mq');

sys.print(EVAL_DATA);
while (1) {
    fd = mq.recv('test');
    ret = net.tcp_recv(fd);
    if (ret) {
        net.tcp_send(fd, "HTTP/1.1 200 OK\r\nContent-Length: 1\r\n\r\na\r\n\r\n");
    }fi
    net.tcp_close(fd);
}

这两个代码文件分别为:主协程(server.m)与工作协程(processor.m)。

主协程(server.m)创建了4个工作协程(processor.m),然后就进入死循环等待客户端TCP的建立。

工作协程(processor.m)则是在死循环中,从主协程处收到已建立的TCP套接字,然后从TCP上收取请求,然后发送HTTP响应,最后关闭套接字。

下面,我们可以在命令行中使用如下命令启动脚本:

$ melang server.m -t=2

这里,-t=2的含义是,让解释器启动两个线程来处理这5个协程(1server+4processor)。

启动后,就可以使用curl或者ab之类的工具进行访问了。

小结

综上,Melang是一个:

  • 脚本语言
  • 抢占式任务调度语言
  • 协程并发语言
  • 同步代码异步执行的语言

除此之外,Melang还融合了响应式编程、运算符重载、反射、注入等等特色。

感谢您的阅读!


用户bPbzEjV
17 声望3 粉丝