写点什么

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:093026
用户头像

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

关注

评论

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

荣耀游戏中心新增礼包配置项丨开发加油站

荣耀开发者服务平台

荣耀开发者服务平台 荣耀HONOR 荣耀手机 荣耀游戏中心

督办产品新特性来袭,助力企业高效工作

inBuilder低代码平台

数字化转型的关键:MES系统成功部署的六大阶段与避坑指南

万界星空科技

数字化转型 制造业 mes 生产管理MES系统 软件实施

新能源行业用到堡垒机的场景简单分析

行云管家

网络安全 信息安全 堡垒机

下周二见!奇虎360数据专家亲授:DolphinScheduler on K8s 生产级部署避坑指南!

白鲸开源

开源 Kubernetes 云原生 Apache DolphinScheduler 奇虎360

谙流 ASK × 中国联通:2.25 小时→秒级,存算分离革新数据传输

AscentStream

大数据

为什么跨国企业需要对社交媒体进行监控?

沃观Wovision

社交媒体 海外舆情监控

社交媒体监测如何塑造品牌的国际化传播路径?

沃观Wovision

ChatGPT治好了我的拖延症,自由职业如何用AI实现无痛时间管理(附完整提示词)

田威AI

自由职业 时间管理 自律 ChatGPT flowping

CAD批量测线功能真好用,从1段1段加,到1键全搞定!

在路上

cad cad看图 CAD看图王

把数套数据传输通道一键“折叠”成 SeaTunnel:同程工程师周晓晨的实战笔记

白鲸开源

大数据 开源 Apache SeaTunnel

今年国内智能眼镜出货量预计达 290.7 万台;ElevenLabs 推出商用 Eleven Music API丨日报

声网

Wispr Flow 创始人:我曾亲手扼杀硬件梦想,仅剩 5 人团队在裁员阴影下找到 PMF

声网

《SQLAlchemy 2 In Practice》读后感

codists

Python

CAD如何快速测量及结果求和?用好这个功能让你事半功倍

在路上

cad cad看图 CAD看图王

中烟创新连续两年被认定为国家级科技型中小企业

中烟创新

收藏!史上最全 Apache SeaTunnel Source 连接器盘点 (2025版),一篇通晓数据集成生态

白鲸开源

大数据 数据同步 数据集成 Apache SeaTunnel Connector

YashanDB容器化环境下的部署和监控方法

数据库砖家

AI智能体开发的技术框架

北京木奇移动技术有限公司

AI技术 AI智能体 软件外包公司

新闻速递 | Altair 成功协办2025中国工业设计工程大会“工程仿真与创新设计学术论坛”

Altair RapidMiner

人工智能 AI 仿真 CAE 工业设计

百度智能云助力构建新型电力系统“超级大脑”

科技热闻

华瑞指数云发布AI原生数据平台WADP:统一的通用存储架构,重构AI时代数据基座

科技热闻

区块链Web3开发上线

北京木奇移动技术有限公司

区块链开发 软件外包公司 web3开发

邀请函|2025 Altair 教育赋能行动:《有限元基础》课程共建

Altair RapidMiner

人工智能 AI 仿真 CAE 工业设计

YashanDB日志系统详解及性能优化技巧

数据库砖家

海外舆情监测中的“沉默大多数”:非活跃用户态度的挖掘方法

沃观Wovision

舆情监测系统 海外舆情监测

再获国际权威机构认可|绿盟抗D解决方案斩获业界首个Frost & Sullivan竞争战略领导奖

科技热闻

英特尔通用快接头互插互换联盟启航,构建液冷生态互操作新标准

科技热闻

2025行云管家成功通过等保三级认证

行云管家

等保 行云管家

YashanDB容量规划教程,满足企业不断增长的数据需求

数据库砖家

每年省200万?VMware隐性成本拆解与超融合替代实战

智驱前线

vmware 超融合

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