热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Loop:紧凑的JVM多核语言

作为一种紧凑简洁的JVM编程语言,Loop很明显地受到了Haskell、Scheme、Ruby和Erlang的影响,而且它也同时尝试着将函数式语言和面向

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

\u0026#xD;\nmodule declaration\u0026#xD;\n\u0026#xD;\nimport declarations\u0026#xD;\n\u0026#xD;\nfunctions \u0026amp; type definitions\u0026#xD;\n\u0026#xD;\nfree expressions\u0026#xD;\n

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

\u0026#xD;\n

\u0026#xD;\nmodule mymodule\u0026#xD;\n\u0026#xD;\nrequire othermod\u0026#xD;\nrequire yet.another\u0026#xD;\n\u0026#xD;\nclass Pair -\u0026gt;\u0026#xD;\n left: 0\u0026#xD;\n right: 0\u0026#xD;\n\u0026#xD;\nmain -\u0026gt;\u0026#xD;\n new Pair()   # 注释可以放在任何地方\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n#自由表达式必须放在最后\u0026#xD;\nprint('mymodule is go!')\u0026#xD;\n\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n
\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n
\u0026#xD;\n

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

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

这里有一个句法结构的典型例子,你可以看到Loop是如何受到这些影响的,看看函数调用可以以一种后缀的形式来使用:

\u0026#xD;\n

\u0026#xD;\nprint(36)\u0026#xD;\n# 可以写为:\u0026#xD;\n36.print()\u0026#xD;\n\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n
\u0026#xD;\n

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

\u0026#xD;\n
Dhanji:这是一个非常好的问题。Erlang有许多非常优秀的地方值得借鉴。在Loop中实现并发有两个主要的方法,它们都是Loop原生支持,而且,如果能够相互结合使用将会非常强大:\u0026#xD;\n

- 消息驱动通道(对消息传递,队列和线程池的面向事件的抽象)

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

\u0026#xD;\nupdate(person) in @person -\u0026gt;\u0026#xD;\n this.name: person.name,\u0026#xD;\n this.age: person.age\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n
\u0026#xD;\n

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

\u0026#xD;\n

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


推荐阅读
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 万事开头难,凡事都有套路,勇敢迈出第一步就成功一大半了。本节将带领初学者们迈出属于自己的一小步。本书的开发工具采用AndroidStudio࿰ ... [详细]
  • iOS 不定参数 详解 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • 探讨Redis的最佳应用场景
    本文将深入探讨Redis在不同场景下的最佳应用,包括其优势和适用范围。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
达人多多宝_836
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有