NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Loop:紧凑的 JVM 多核语言

  • 2012-07-15
  • 本文字数:2860 字

    阅读完需:约 9 分钟

作为一种紧凑简洁的 JVM 编程语言, Loop 很明显地受到了 Haskell、Scheme、Ruby 和 Erlang 的影响,而且它也同时尝试着将函数式语言和面向对象语言的优秀特性实用且一致地整合在一起。

程序会在传输到 JVM 中进行编译,而且会尽可能地优化,这样在解释执行的时候就不会产生性能损失;所有的这一切优化都是为了产生高效的可执行代码。

Loop 的源码文件结构一般如下:

复制代码
module declaration
import declarations
functions & type definitions
free expressions

下面是一个 Loop 程序的例子:

复制代码
module mymodule
require othermod
require yet.another
class Pair ->
 left: 0
 right: 0
main ->
 new Pair()   # 注释可以放在任何地方
#自由表达式必须放在最后
print('mymodule is go!')

InfoQ 和 Loop 的创建者 Dhanji R. Prasanna 进行了一次小型的问答互动,在这之前,有必要对 Dhanji 做一下介绍,他是前 Google 工程师,JAX-RS 规范的作者之一,“依赖注入:设计模式”的作者,Manning 出版社已经将这本书付梓。

InfoQ:Loop 相比其他的 JVM 语言来说有何不同?

Dhanji:我不想做一个面面俱到的特性比较,不过我觉得,若是阐述 Loop 的设计理念,这将能更好地回答你的这个问题,Loop 是为了让开发者有一个一致、简单而且快乐的编程经历。所有的特性都是经过精心设计,并且设计过程中我非常仔细地考虑了特性之间的交互,不仅仅是句法上,而且还包括了语义。在其他的语言中,你可能有很多方法来完成一件事情,这已经几乎成为一种语言的特性,但是我觉得,多数其他实现都是不需要的。在 Loop 中,我尝试着对如何完成一件事情做出种种限制,这样便能够保持语言的简洁和简单,从而得到一个富有魅力的,感觉舒适的语法。要知道,阅读和编写代码应该是一个简单愉快的过程。

另外一个区别就是 Loop 源代码直接编译成为 JVM 字节码,但是这个编译过程是在传送到 JVM 的过程中完成。也就是说它看起来非常像是一门脚本语言(而且像 Lisp 一样是 REPL(读取,求值,打印,循环)式),但是它的性能实际上要比真正的解释型语言要好。我可以让其他人做基准测试来验证,不过现在看来,在我做的简单测试中,Loop 的速度非常快。我也在启动优化上花费了很多时间和精力,因此它的启动速度能够完全达到 JVM 的极限,我可以毫不夸张的说,启动速度这个特性通常被大多数 JVM 语言给忽略了。

Loop 也是紧密地和 Java 结合在一起。在 Loop 程序中可以很方便地调用 Java 方法或者使用 Java 对象。Lists、Sets 和 Maps 都只是 java.util 的成员,但是做了一些扩展(也简单地扩展了 String)。这和其他的语言有区别,它们是维护了了两个不同的库来对 Java 库进行扩展。

最后,Loop 从一开始就内建了对并发的支持,而且将不可变和状态的共享作为不可或缺的特性。

InfoQ:你提到了许多 Loop 的特性都受到了例如 Haskell、Scheme 和 Ruby 这样的语言的影响,你可以简单介绍一些例子吗?

Dhanji:当然,不过要知道,当你说“受到影响”的时候,人们总是趋向于认为“直接抄袭”,并且会仔细地检查你是不是有什么地方抄错了,应付这种想法是非常艰难的。从我看来,直接受到影响的部分是语法。尤其是 Haskell 的模式匹配,以及“where”和“do”语句块,Scheme 的类型系统、模块,TCO(尾调用优化)以及词法结构(闭包),当然还有 Ruby 的符号以及自由形式的脚本。 这里有一个句法结构的典型例子,你可以看到 Loop 是如何受到这些影响的,看看函数调用可以以一种后缀的形式来使用:

复制代码
print(36)
# 可以写为:
36.print()

这看起来的确很像是 Ruby 的函数调用,但是事实上,这是多态(重载)的函数的简单使用。我发现这种形式能够增强某些代码的可读性,尤其是“扩展”已经存在的 Java 对象时候。当然,我们也要权衡这种调用的利弊,不过我相信当 Loop 成熟之时,这个特性将会得到大量应用。

更进一步地说,Loop 也还在函数设计的过程中受到了来自于 Haskell 和 Scheme(尤其是后者)的语义影响。一个典型的例子便是从状态性,面向封装的设计转为一个无状态,声明式的设计。像 Scheme,Loop 在 IO 的设计上也并不是非常优秀,但是另一方面来看,这也加强了并发程序的不可变性。这个加强之处很明显地受到了 Haskell 哲学的影响。

不仅如此,Haskell 还影响了如何将声明式的代码更易编写和阅读上。我非常喜欢这个哲学理念:代码应该读起来像是一个解,而不是像一个如何在洗衣房洗衣的说明列表;或者说,我们应该强调程序“做什么”而不是“怎么样”,Loop 毫无疑问地受到了这种理念的影响。

InfoQ:看起来 Loop 也花费了非常多的精力在并发支持和内建的消息传递接口上。你可以跟我们解释一下和其他流行的并发技术,Loop 的并发支持有什么不同吗?

Dhanji:这是一个非常好的问题。Erlang 有许多非常优秀的地方值得借鉴。在 Loop 中实现并发有两个主要的方法,它们都是 Loop 原生支持,而且,如果能够相互结合使用将会非常强大: - 消息驱动通道(对消息传递,队列和线程池的面向事件的抽象)

- 软件事务内存(一个用于共享可变状态的无锁的,原子性的一致性的模式)

前者将会管理好所有的细节,你所面临的只是一个抽象的概念。设置好可以并发执行的轻量级的“通道”数目,然后简单地放入一堆任务即可,当然也可以考虑将这些任务分片然后在各个片内,然后串行执行。这其实提供了一个非常简单的方法来创建真正地分片事件队列。因为通道是非常的轻量级,你可以很简单很容易地创建成千上万的通道,然后用来分片执行,例如,按照用户名分片。每个串行通道各自拥有一小块永久的内存,这将会使得增量式任务处理更加容易。

Loop 同样保证每个线程都是平均分布在这些通道中,这个所谓的公平参数是可以配置的。所有我现在介绍的特性你现在可以马上在 Loop 中找到,而且,以后每个串行通道将会有一个可以配置的线程池。

我提到了,串行通道拥有少量的永久私有内存 - 另一方面,事务内存则是一个更强大的选择,如果你熟悉数据库的话,Loop 如何使用这个技术是和数据库中的“并发优化”类似。我们再也不需要锁这个概念,即便是在写入的时候。这类内存的优化目标便是超高吞吐量的读操作和无阻塞的写操作。这个已经成为语法的一部分:

复制代码
update(person) in @person ->
 this.name: person.name,
 this.age: person.age

注意“in @person”,Loop 将会在 @person 片中执行这个事务

在这个方法中,我将会更新 @person“事务片”中的数据。“this”指针指向当前的事务片。当函数完成的时候,当前事务片将会对其他线程原子可见,或者失败之后当做完全没有执行过(类似于回滚)。其他的线程(即使不在这个事务中)都可以看到一个一致的 @person 片,然后这个片在事务执行的时候会短暂不可见,所有的线程在事务完成之后将会马上看到一个新的对象,无锁,无需等待。这最激动人心的事情便是读和写线程完全无阻塞。

这个特性仍然还是处于 Alpha 阶段,我尝试着搞定这个语义问题,但是我真的觉得通道 API 使得 Loop 中并行编程变得优美,强大而且容易理解。

你也可以在 Github 上提交你的代码为 Loop 做贡献。

查看英文原文: Loop: A Compact JVM Language for Multi-Core

2012-07-15 18:092565
用户头像

发布了 90 篇内容, 共 32.9 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

数字化转型究竟是什么意思?

高端章鱼哥

数字化

网易首款鸿蒙原生游戏《倩女幽魂》手游完成开发,商业化版本已就绪

新消费日报

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

石头财经

Kubernetes Pod配置:从基础到高级实战技巧

互联网工科生

Kubernetes

2024-01-10:用go语言,给你一个下标从 0 开始的二维整数数组 pairs 其中 pairs[i] = [starti, endi] 如果 pairs 的一个重新排列 满足对每一个下标 i

福大大架构师每日一题

福大大架构师每日一题

2023 IoTDB Summit:天谋科技高级开发工程师张金瑞《筑其形:如何轻松搞定 IoTDB 数据建模》

Apache IoTDB

软件测试/测试开发全日制|Pytest结合Excel实现数据驱动

霍格沃兹测试开发学社

如何利用 NFTScan Portfolio 功能分析钱包 NFT 持仓

NFT Research

NFT NFT\ NFTScan

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

股市老人

Go与C语言的互操作,import “C“的实例

百度搜索:蓝易云

Go 云计算 Linux C语言 云服务器

关于AI PC,英特尔CEO帕特·基辛格说了三个法则

E科讯

🛠 开源即时通讯(IM)项目OpenIM源码部署指南

Geek_1ef48b

吃惯人血馒头的 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

长安区块链

🛠 开源即时通讯(IM)项目OpenIM源码部署指南

Geek_1ef48b

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

加密眼界

docker rabbitmq-清空queue队列数据

百度搜索:蓝易云

云计算 Linux 运维 RabbitMQ 云服务器

使用JMeter安装RabbitMQ测试插件的步骤

百度搜索:蓝易云

云计算 Linux 运维 RabbitMQ Jmeter

从像素到洞见:图像分类技术的全方位解读

不在线第一只蜗牛

机器学习 深度学习 图像 项目开发

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

BlockChain先知

可编程线性霍尔传感器 IC

智趣匠

文心大模型融入荣耀MagicOS!打造大模型“端云协同”创新样板

爱编程的喵喵

Programming Abstractions in C阅读笔记:p242-p245

codists

软件测试/测试开发全日制|Pytest结合yaml实现数据驱动

霍格沃兹测试开发学社

坎昆升级在即,ZKFair 已开启 ZKF 质押

股市老人

PreparedStatement实践和批处理实践

FunTester

在线文档软件哪个好?5个好用的协同文档app推荐!

彭宏豪95

团队协作 在线文档 在线白板 在线协同文档 效率软件

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

西柚子

端侧AI的“春风化雨手”,翻开中国科技下一页

脑极体

AI

吃人血馒头 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

EOSdreamer111

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

大瞿科技

C 语言文件读取全指南:打开、读取、逐行输出

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

Loop:紧凑的JVM多核语言_后端_Dio Synodinos_InfoQ精选文章