当前位置: 首页 > 工具软件 > Mirah > 使用案例 >

Java和Ruby的融合-Mirah语言

伏业
2023-12-01

最近在OSCON举行的新兴语言训练营( 第1 天和第2 天的覆盖范围)上有许多关于处于不同开发阶段的新语言的演讲列表,这些演讲只有几周的历史,而更成熟的语言如Google Go或Newspeak ,以及名副其实的D之类的老朋友。
JRuby的Charles Nutter提出了Mirah语言,它将吸引所有喜欢Ruby语法的人。

InfoQ赶上了Charles Nutter,以了解Mirah与普通的旧JRuby和其他基于JVM的语言的区别。

InfoQ :所以Mirah(以前叫Duby)是为谁服务的?

目前,描述Mirah的最佳方法似乎是“一种更好的Java编写方法”。 因此,我想说的主要目标是希望使用更好的语法和一些其他功能替换javac的Java开发人员。

InfoQ :Mirah是每个程序员都可以/应该使用的语言吗?还是针对某些领域?

目标是创建一种语言,该语言可以执行Java可以执行的所有操作,Ruby可以执行的一些操作并且仍然尽可能轻巧(即,没有运行时库要求)。 因此,无论您在使用Java的任何地方,都应该能够使用Mirah。 事实证明,如果在Java库和大多数Java类型系统中放些糖,它们实际上并没有那么麻烦。 对我来说,最好的糖来自Ruby语法和Ruby的某些“表观”语言功能。 我们从Ruby作为语法开始,然后从Java或JVM字节码开始,然后我们将了解到它可以走多远。

InfoQ :如何使用Mirah和Mirah代码? 有编译器或解释器吗?

Mirah是一种静态类型的编译语言,但它也可以作为脚本很好地运行。 您编写的代码看起来像是“带有少量类型注释的Ruby”,然后使用“ mirah”命令将其作为脚本运行,或者使用“ mirahc”命令将其编译为JVM字节码或Java源代码。 这两个命令还具有用于执行快速命令行脚本的“ -e”标志。

InfoQ :将代码编译为JVM字节码后,有多少运行时需要处理?

除了直接引用自己的类之外,没有语言功能(对动态调用的支持除外)对您没有任何库依赖性。 语言的主要设计目标是尽可能长地避免任何特定于语言的运行时。 我们可能无法无限期地做到这一点,但这是一件好事。 一旦编写了一行代码,所有其他JVM语言都会立即要求您交付其运行时。 使用Mirah,您可以获取源代码并获取可执行代码,这就是您所提供的。 废话

InfoQ :Mirah二进制文件是否适合翻译成Android的Dex代码?

当然! Android SDK接受任何JVM字节码并将其转换为Dalvik字节码,因此您可以将Mirah编译为JVM字节码,也可以将其编译为Java源代码并使用javac进行编译。 编译Mirah代码后,(对于JVM和JVM相关工具)与Javac产生的代码基本上是无法区分的。

InfoQ :Mirah会变成Squeak的JRuby lang语吗? 就是 动态语言的受限子集,可以更容易地编译为快速代码?

那是制作Mirah的原始理由之一,而且可能在某个时候发生。 用Mirah编写JRuby扩展(或JRuby本身)可以使Java语法不适合的开发人员更容易使用。 但是,目前,我们只专注于稳定Mirah本身并构建缺失的功能。

InfoQ :Mirah是用Mirah写的(还是会在某个时候发生)?

现在,Mirah用Mirah编写了小部分内容,例如用于Ant任务的工具。 我们希望朝着自我托管的方向迈进,但这目前不是主要目标。 Mirah的代码库目前几乎都是用Ruby编写的,事实证明这是用于构建编译器的非常好的语言(和运行时)。 自托管可能会给我们吹牛的权利,但是除非在Ruby中使用工具链有了令人信服的改进,否则它可能不会很快发生。
当然,如果用Mirah重写JRuby,那么我们将以某种方式实现自我托管……Mirah将引导JRuby,而JRuby将引导Mirah。

InfoQ :Mirah和Ruby之间的差异是多少?从语言/语法的角度来看,从Ruby中添加/删除了哪些内容来构成Mirah?

首先,我们只是专注于获取要编译的文件的基本结构:类,方法,实例变量,文字,导入。 在前进的过程中,我们添加了特定于Java的功能(如接口)和特定于Ruby的功能(如内部迭代(如Java 5的“ for”循环一样编译)和闭包(如Java匿名内部类一样编译)。我们将继续添加两种语言的功能,并可能开始借鉴其他一些功能,例如隐式转换(来自Scala)或显式不可变类(来自Clojure或Seph)。 有趣的是,仅使用编译器而不使用运行时库,我们可以做多少事情。

InfoQ :在其他Mirah(Duby)后端上有一些工作,例如用于.NET。

是的,吉米[Schementi]制作了可以输出C#源代码的杜比后端原型。 我相信它足以完成简单的流控制,基本数学和基本文字。 我希望看到工作再次开始。

InfoQ :还有其他后端吗? (本机或LLVM; Rubinius)?

我尝试了C后端,但是Ruby语法的性质意味着目标后端可能应该是面向对象的,垃圾回收的,并且在结构上类似于Ruby或Java。 例如,Go后端或ooc后端可能会工作。
Mirah还可以针对诸如Ruby本身之类的动态语言运行时,最终在编译时为这些后端带来静态类型安全。 我没有考虑过在实践中会是什么样,或者那些系统的动态特性(例如运行时可变类型)是否会挫败在它们之上构建静态语言的尝试。

InfoQ :Mirah如何与JVM绑定-否则,如何保持独立于JVM? 例如,开发人员使用什么类型? 例如。 有“ fixnum”作为类型注释-它是如何定义的?

所使用的类型名称主要由推断和代码生成阶段定义,并且可以映射到适合目标后端的任何内容。 在早期的Mirah代码中,“ fixnum”仅用作“ int”或“ long”的别名。 如今,针对JVM的Mirah代码通常直接使用“ int”或“ long”作为类型,而所有其他类型则只是JVM原语(“ float”,“ double”等),常规JDK类或第三类政党图书馆。 我们不希望您采用未修改的Mirah程序并在其他后端上运行它。 这不是语言的目标。 但是,如果您了解Mirah的一个后端,则可以轻松地在另一个后端上编写它,因为该语言的明显功能仍然相同。

InfoQ :什么是社区,您的协作者是谁?

目前,大多数编译器工作都是由Google的Ryan Brown完成的,我会尽我所能。 我们还有其他一些人正在提交补丁和添加功能,但这是一个相当年轻的项目。

InfoQ :您想指出合作者的任何项目,文章等吗?

菲尔·黑格尔伯格(Phil Hagelberg)拥有一个名为Garrett的“ Android开发游乐场”: http ://github.com/technomancy/Garrett

另一个由“ consiliens”负责的贡献者一直在修补Mirah,以支持生成GWT应用程序。 这一点特别有趣,因为GWT仅处理Java * source *,因此基本上没有办法用大多数其他JVM语言来构建GWT应用程序。

同样来自Google的John Woodell一直在整理一个名为Dubious的Web框架的基础知识: http : //github.com/mirah/dubious 。 他采用了与Mirah类似的设计方法,从“类似Rails的”应用程序的结构开始,并仅填充了将其编译为Mirah代码所需的空白。 “可疑”是在应用程序或库周围构建语言而不是强制应用程序或库符合该语言的示例。 易于理解的编译器和灵活的语法使Mirah成为可能。

InfoQ :Mirah中的数字是什么样的? 是否有数字塔,是否有可以溢出的固定大小值,是否有拳击等?

以JVM为目标时,数字塔就是JVM的塔。 您具有原始数字类型及其框式等效项,并且溢出行为类似于编写Java时的行为。

InfoQ :JVM对标记数字/即时类型的支持会有所帮助吗?

它将以与帮助Java相同的方式为我们提供帮助,因为带框的数字将大大减少构建和使用的成本。 除此之外,由于Mirah也支持Java的原始类型,因此不再急需标记数字。

InfoQ :元编程功能是什么?

元编程主要以编译时宏的形式出现,这是Mirah的许多明显功能得以实现的地方。 例如,闭包由编译器转换为等效的匿名内部类形式。 使用java.util.Iterator将java.util.Collection类型的迭代转换为外部迭代。 通过用Ruby编写编译器,创建执行这些转换的宏变得非常容易,从而使您可以设计适合自己需要的语言。

我还想添加两个关键功能,以使Mirah感觉更像Ruby:开放类,它将像在C#上的扩展方法一样进行编译; 和隐式类型转换,其行为与Scala中的行为非常相似。 这两个简单的功能可以使静态类型的语言更具动态感,并且无需交付运行时库就可以支持这两种语言。


Mirah的源代码可从GitHub获得

翻译自: https://www.infoq.com/articles/mirah-interview/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

 类似资料: