Dotty到底是什么?

What exactly is Dotty?

我正在阅读 Scala 3 并发现 dotty。我试图理解它是什么。我在某处阅读 "It is new compiler",在某处阅读 "It is part of Scala 3",在某处阅读 "Dotty is new Scala 3"。

有人可以用外行和技术术语向我解释一下 dotty 到底是什么吗?

PS: 我已经在 Whosebug 上阅读了 的标签信息,但并没有真正理解它。

Can somebody please explain to me what exactly dotty is?

正如 dotty github page 提到的:

Dotty is a research compiler that will become Scala 3

此外,请阅读 Martin Odersky 的博客 post Towards Scala 3,其中提到 Scala 2Scala 3

It’s worth emphasizing that Scala 2 and Scala 3 are fundamentally the same language. The compiler is new, but nearly everything Scala programmers already know about Scala 2 applies to Scala 3 as well, and most ordinary Scala 2 code will also work on Scala 3 with only minor changes.

所以why dotty?

Scala 3 will be a big step towards realizing the full potential of the fusion of OOP and fp in a typed setting

您可以看到它们的开发方式不同:

有关更多信息,请阅读 reddit 线程 Towards Scala 3

让我用Scala 3的基础来解释一下:

Dependent Object Types (DOT) 是 Scala 的新基础,即 Scala 3。 DOT 是一个路径相关类型的核心演算,它将 Scala 语言及其类型系统提升到一个新的水平。

根据马丁·奥德斯基 this blog 的说法:

"What do you get if you boil Scala on a slow flame and wait until all incidental features evaporate and only the most concentrated essence remains? After doing this for 8 years we believe we have the answer: it’s DOT, the calculus of dependent object types, that underlies Scala."

因此,在 Scala 3 中,DOT - Dependent Object Type 已作为 Scala 的基础实现,DOTTY 是一个项目使用 DOT 开发 Scala 3。此外,Scala 3 还开发了新的编译器,也称为 Dotty,它支持 DOT,比当前版本的 Scala 编译器更强大。从技术上讲,对于 Scala 2 及以下版本,scalac 是编译器,但对于 Scala 3,dotc 是编译器。

因此,Scala 2(下)和 Scala 3 中的语言规范相同,但是编译器是新的,可以将 DOT 脱糖。此外,以 DOT 为基础,Scala 3 中还有其他新功能,例如union types, intersection-type 等等

Is DOTTY is new programming language?

没有。 Dotty 是计划成为 Scala 3.0 的语言和编译器的项目名称,这意味着,DOTTY 是 Scala 编程语言的下一版本,具有新的编译器(也称为 Dotty)。

我希望这能让您对 dotty 有所了解。

正式地,Dotty 是一个 research compiler that will become Scala 3——也就是说,它是一个新的 Scala 编译器,它实现了 Scala 3。 Scala 3 与 Scala 2 基本上是相同的语言,但目标是 fix warts and improve support for some programming scenarios。 Dotty 支持的功能集正在发展,语言添加将最终由 SIP 委员会审查。

除其他变化外,Scala 3 的类型系统基于一个名为 DOT 演算的新基础;使用此基础会影响您可以在程序中使用哪些类型,并增加信心,如果程序通过 Dotty 的类型检查器,该程序将不会有 type 错误。

Dotty 项目包含三个想法:

  • Dotty 编程语言
  • dotc 编译器
  • TASTY 序列化格式

所有这些都贡献了很多东西:

Dotty:一种基于 DOT 微积分的语言

DOT 微积分(依赖对象类型)是由 Martin Odersky 的小组开发的一种新微积分。它专门设计用于很好地模拟类似 Scala 的语言。它取代了旧的 ν Object Calculus(即希腊字母 ν,发音类似于“新”),它也被设计用于模拟 Scala,但包含后来从 Scala 中删除的功能。 DOT就简单多了。

Dotty 是一种类型系统和语义深深植根于 DOT 演算的语言,因此 DOT 演算的性质和证明也适用于 Dotty。

Dotty:Scala 进一步发展的试验台

Dotty 不仅被设计为 DOT 微积分的超集,而且 与 Scala 非常相似,因此在 Dotty 中尝试和测试的功能可以稍后移植到 Scala .

特别是,Dotty 现在已经成为 Scala 3 的基础,这是对 Scala 的重大重新设计(例如,对于 Scala 3,Scala 将成为第一个删除 语言的泛型,这与其他语言如 Java、C♯、VB.NET 或 C++ 一直在做的完全相反)。然而,即使 Scala 3 是对 Scala 的重大重新设计,它的目的是任何在 Scala 2.13 中编译时没有警告且没有弃用的代码都可以 自动转换 到 Scala 3。 IOW : 从 Scala 2.13 到 Scala 3 的转换过程是纯机械的,不需要人工干预。

dotc:新颖编译器设计的试验台

dotc 编译器采用了受时态数据库启发的新颖设计。这完全独立于 DOT、Dotty 语言或 Scala。它可以()用于改进 Scala 编译器,但这些想法可以应用于任何语言的任何编译器。

dotc:新 Scala 编译器的基础

dotc 不仅仅是一般编译器设计中新想法的试验台,它也是(这是它的第二个主要目的,在成为 Dotty 的编译器之后)一个完整的重新编译的基础老化的设计 New Scala Compiler(在 Java 中编写的原始 Scala 编译器之后的当前第二个迭代)。

dotc 的设计允许许多当今现代编译器所期望的功能,而传统的批处理编译器设计并不能很好地满足这些功能。现代编译器的工作不仅仅是将一种语言转换为另一种语言(例如 Scala 到 JVML),它应该

  • 报告(人类可读、清晰易懂的)错误
  • 建议(甚至执行)这些错误的可能修复方法
  • 报告相关和有用的警告
  • 建议(甚至执行)对这些警告的可能改进
  • 执行重构
  • 提供词汇、句法和语义突出显示
  • 辅助代码完成
  • 并用不完整的代码完成所有这些,同时编写代码,瞬间

NSC 的演示编译器和工具箱可以做很多这样的事情,但 dotc 是根据这些要求从头开始设计的。

TASTY:语义树的序列化格式

Dotty 项目的第三个贡献是 TASTY。 TASTY 是一种中间编译器表示的序列化格式,具有向前和向后兼容的特点,结构紧凑,易于解析,包含重构原始程序所需的所有信息,同时保留不必要的细节。

TASTY 允许保存编译器的内部表示,然后将其加载到不同的编译器并继续编译。

你为什么要这样做?它允许您拥有介于源代码和二进制代码之间的中间分发格式(例如 .class.jar 文件)。将 Scala 代码分发为 .jars 会丢失大量有关 Scala 代码的信息。如果你想 link 这段代码与其他一些 Scala 代码,你可能 运行 会遇到问题, 尤其是 Scala 3,它从编译阶段到 link 阶段。

将其作为源代码分发,OTOH,要求用户需要拥有完整的 Scala 开发环境才能使用该库。

对于那些记得它的人来说,目标与 ANDF 在 1980 年代尝试做的有点相似。

Dotty 是 Scala 3.0 中添加的所有内容的综合名称,在过去四年中一直是 Scala 社区讨论的话题。随着所有的承诺和进展,发布的时间已经很近了。预计年底前发布。

Dotty 会有什么变化?

如果你问“Scala 3.0 是一种新语言吗”,Martin Ordersky 说“是还是没有” in “A tour of Dotty” 他有理由。如果你问我,我会说是的!!它有很多新功能。

  1. 如果您是初学者,并且只从 Scala 3 开始,您会发现新功能是一个新概念,不属于旧 Scala。
  2. 如果您处于 scala 的中级水平并且已经熟悉该语言的结构,您将看到一些已删除且不再受支持的功能。
  3. 如果您是 Scala 专家和 FP 爱好者,这里还有一个更改列表供您使用,例如类型级派生、匹配类型、隐式函数类型、元编程等等。
  4. Martin Ordersky 在上一期 ScalaDays 的“A tour of Dotty”中分享了这些更改。

重大更改!

下面给出了已删除功能的详尽列表:

  1. DelayedInit
  2. Macros
  3. Existential Types
  4. Type Projection
  5. Do-While
  6. Procedure Syntax
  7. Package Objects
  8. Early Initializers
  9. Class Shadowing
  10. Limit 22
  11. XML literals
  12. Symbol Literals
  13. Auto-Application
  14. Weak Conformance
  15. Nonlocal Returns
  16. [this] Qualifier

IDE 支持 Dotty。

在Dotty的官网上,只提到了官方IDE support for Dotty is Visual Studio. I do not know the reason why my favorite IDE (IJ) is not yet supported officially but there is a workaround. The workaround is described in the latest blog on “Dotty support on Intellij”。

我希望你能瞥见 Dotty。

“Dotty”是编程语言的名称,就像 Java、Ruby 或 ... Scala 是编程语言的名称一样。 Dotty 编译器被称为 dotc。 Dotty 语言看起来像是 Scala 语言的一个分支,使用不同类型的微积分 (DOT) 重新实现。由于使用 DOT 的经验,Dotty 放弃了一些 type-sound 没有的 Scala 功能,并添加了其他功能,使类型系统更加完整和健壮。 Dotty 语言和工具集即将成为 Scala 3。