写点什么

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

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

关注

评论

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

软件测试开发/全日制丨自动化测试定位策略 学习笔记

测试人

软件测试 测试开发

大数据开发与低代码:加速数据处理与解决方案开发

EquatorCoco

数据库 低代码 大数据开发

走进龙芯中科交流会圆满结束!深入探讨未来合作规划 | 理事长走进系列

OpenAnolis小助手

合作伙伴 龙蜥社区 龙芯中科 理事

自动化接口测试工具 AREX 0.6.2 版本发布

AREX 中文社区

开源 自动化测试 接口测试

普及旗舰音质,一加 Buds 3正式发布 售价499元

编程猫

Databend 的算力可扩展性

Databend

lazada商品列表数据接口(lazada.item_search)丨lazada API接口

tbapi

lazada商品详情数据接口 lazada商品数据接口 lazada API接口 lazada商品列表数据接口

Vue3构建的低代码可视化平台

高端章鱼哥

Vue 低代码 前端框架 JNPF

老生常谈:Web 与低代码开发

快乐非自愿限量之名

Web 前端开发 低代码 开发

全新升级!腾讯云大数据ES Serverless服务开启日志分析新体验

腾讯云大数据

ES

官宣|硬核阵容曝光!PolarDB开发者大会全议程公布

阿里云瑶池数据库

数据库 阿里云 云原生 开发者大会

爬虫工具(tkinter+scrapy+pyinstaller)

快乐非自愿限量之名

工具 爬虫 爬虫工具

低代码:实现数据可视化的强大助手

不在线第一只蜗牛

数据库 低代码 数据可视化

喜讯丨上海和今信息科技有限公司入选2023年上海市专精特新中小企业名单

ModelWhale

人工智能 科技 专精特新企业

OmniPlan Pro 4 for Mac(项目流程管理工具) v4.6完美激活版

mac

项目管理软件 苹果mac Windows软件 OmniPlan Pro

软件开发隐藏报价和虚假信息,合约如何来提高安全性

软件开发-梦幻运营部

Lazada商品详情API(lazada.item_get)获取商品的评论和评分信息

技术冰糖葫芦

API

2023 年最先进认证方式上线,Authing 推出 Passkey 无密码认证

Authing

身份认证 Authing 无密码认证 Passkey

图形工作站有必要么?图形工作站电脑特点

青椒云云电脑

图形工作站 移动图形工作站

SEO内容页面性能优化全攻略

九凌网络

优化独立站网页布局,提升30%用户留存

九凌网络

DAPP代币燃烧质押项目系统开发丨详情开发

l8l259l3365

云桌面有什么技术特点?应用场景是什么?

青椒云云电脑

桌面云 云桌面 云桌面解决方案

移动图形工作站分类、结构和功能

青椒云云电脑

图形工作站

OpenTiny 2023年度共建者榜单大曝光!!!

OpenTiny社区

开源 前端

体育直播平台系统源码:如何有效防止后门、恶意代码和漏洞

软件开发-梦幻运营部

构建企业级AI中台,实现业务场景价值闭环

ModelWhale

AI 数字化转型 中台架构 AI中台

玩转低代码可视化平台,软件开发如此简单!

互联网工科生

软件开发 低代码 可视化开发 JNPF

和鲸解放军总医院连续生理数据分析引擎入选爱分析数据智能最佳实践案例

ModelWhale

人工智能 大数据 数字化转型 企业管理 数智化

一文解释Linux的内存分页管理

伤感汤姆布利柏

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