V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
monkeyNik
V2EX  ›  分享创造

新协程并发脚本语言的问世

  •  
  •   monkeyNik ·
    Water-Melon · 2022-10-01 15:14:48 +08:00 · 1036 次点击
    这是一个创建于 790 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    感谢您的阅读!

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2251 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:52 · PVG 08:52 · LAX 16:52 · JFK 19:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.