写点什么

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

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

关注

评论

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

在BeeWorks中,网盘和即时通讯如何互相集成?

BeeWorks

即时通讯 IM 企业级应用

出版社题库管理系统的技术架构

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

软件外包公司 出版社 题库管理系统

CommunityOverCode Asia 2025议题征集倒计时,DataOps 分论坛等你发声

白鲸开源

欢迎 Apache SeaTunnel 新晋 Committer 王超

白鲸开源

人工智能与网络安全:AI如何预防、检测和应对网络攻击?

天津汇柏科技有限公司

人工智能 网络安全 AI 人工智能

巴塞罗那对阵塞尔塔:一场事关竞逐西甲联赛冠军与冲击欧战资格的较量

新消费日报

抖音电商如何用扣子 Coze 打造 AI 客服?

火山引擎开发者社区

25年IT信息安全靠谱保障办法看这里!

行云管家

网络安全 信息安全 IT安全

广告营销行业使用堡垒机的场景简单聊聊

行云管家

网络安全 信息安全

CAD如何放大图纸

极客天地

2025 全球分布式云大会演讲实录 | 沈建发:智启边缘,畅想未来:边缘计算新场景落地与 Al 趋势新畅想

火山引擎边缘云

人工智能 边缘计算 AI 大底座 边缘智能

基于TiDB的应用多活架构

陈一之

TiDB 多活容灾 应用多活

重大升级| SecGPT V2.0:打造真正“懂安全”的大模型

云起无垠

数字先锋|文化传承新引擎:班智达科研项目云端腾飞!

天翼云开发者社区

云服务 教育数字化

云智赋能,绘就农业强国新图景!

天翼云开发者社区

智慧农业 数字孪生 农业数字化

深入研究:微店商品详情API接口详解

tbapi

微店商品详情接口 微店API 微店数据采集

Anolis OS 8.10 发布:软硬协同优化,满足多行业实际应用需求

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥操作系统 Anolis OS

CAD怎么根据浮动范围选择圆

极客天地

出版社题库管理系统的测试

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

软件外包公司 出版社 题库系统开发

行业热点丨为什么AI驱动工程对汽车设计和轻量化至关重要?

Altair RapidMiner

人工智能 AI 汽车 数字孪生 CAE

超实用!用FunctionCall实现快递AI助手

王磊

龙蜥邀您参加 2025 全国大学生计算机系统能力大赛操作系统设计赛

OpenAnolis小助手

操作系统 开源大赛

技术干货推荐:高效解决性能瓶颈与抖动之进程热点追踪

OpenAnolis小助手

操作系统 SysOM 操作系统控制台

[方法讨论]手机号码批量导入手机通讯录,导入苹果iphone通讯录华为手机小米手机等安卓手机

一码平川

AI阅读眼动就翻页,领权益解锁HUAWEI Pura X内容新体验

最新动态

本周六,龙蜥社区邀您共赴第三届 eBPF 开发者大会

OpenAnolis小助手

操作系统 龙蜥社区 eBPF开发者大会

深度探讨操作系统运维、软件选型等社区标准,龙蜥标准化 SIG MeetUp 圆满举办

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥sig 标准化 SIG 龙蜥meetup

内部聊天软件,BeeWorks-安全的企业内部通讯软件

BeeWorks

即时通讯 IM 私有化部署 局域网视频软件

ArkUI-X 5.0.4 Release:跨平台开发的全新体验

坚果

鸿蒙 HarmonyOS 坚果派

重构智能设备管理范式:火山引擎端智能解决方案上新,多重 AI 服务即刻享用!

火山引擎开发者社区

域名有哪些状态?不同的域名状态分别代表什么意思?

国科云

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