今天的主人公名为——Melang。
这是一款使用C语言开发的“新”的脚本语言,然而其已经默默问世了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('coroutine.mln', i);
}
while (1) {
fd = net.tcp_accept(listenfd);
mq.send('test', fd);
}
/* filename: coroutine.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)与工作协程(coroutine.m)。
主协程(server.m)创建了4个工作协程(coroutine.m),然后就进入死循环等待客户端TCP的建立。
工作协程(coroutine.m)则是在死循环中,从主协程处收到已建立的TCP套接字,然后从TCP上收取请求,然后发送HTTP响应,最后关闭套接字。
下面,我们可以在命令行中使用如下命令启动脚本:
$ melang server.m -t=2
这里,-t=2的含义是,让解释器启动两个线程来处理这5个协程(1-server + 4-coroutine)。
启动后,就可以使用curl或者ab之类的工具进行访问了。
小结
综上,Melang是一个:
- 脚本语言
- 抢占式任务调度语言
- 协程并发语言
- 同步代码异步执行的语言
除此之外,Melang还融合了响应式编程、运算符重载、反射、注入等等特色。
感谢您的阅读!