乐趣区

关于github:新协程并发脚本语言的问世

明天的主人公名为——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 还交融了响应式编程、运算符重载、反射、注入等等特色。

感谢您的浏览!

退出移动版