【问题标题】:What is the difference between Clojure REPL and Scala REPL?Clojure REPL 和 Scala REPL 有什么区别?
【发布时间】:2014-12-09 21:01:25
【问题描述】:

我已经使用 Scala 语言几个月了,并且已经在 Scala 中创建了几个项目。我发现 Scala REPL(至少是它的 IntelliJ 工作表实现)对于快速开发非常方便。我可以编写代码,看看它做了什么,这很好。但我只为函数(不是整个程序)执行该过程。我无法启动我的应用程序并在现场进行更改。或者至少我不知道怎么做(所以如果你知道,欢迎给我一些建议)。

几天前,我的同事向我介绍了 Clojure REPL。他使用 Emacs 进行开发过程,他可以在现场更改代码并查看结果而无需重新启动。例如,他启动了进程,如果他更改了一个函数的实现,他的代码将在不重新启动的情况下更改他的行为。我想用 Scala 语言做同样的事情。

附:我既不想讨论哪种语言更好,也不想讨论函数式编程比面向对象的更好。我想找到一个好的解决方案。如果 Clojure 是更适合该任务的语言,那就顺其自然吧。

【问题讨论】:

  • 一个用来写Clojure,一个用来写Scala。另外:stackoverflow.com/questions/2471947/…
  • 我很难知道正确的答案是什么样的?您可能会问 Scala REPL 是否可以重新定义正在运行的程序中的函数?
  • 好奇,问题很好,但题目不是。

标签: scala clojure


【解决方案1】:

简短的回答是,Clojure 被设计为使用一个非常简单的单遍编译器,它一次读取和编译一个 s 表达式或表单。无论好坏,没有全局类型信息,没有全局类型推断,也没有全局分析或优化。 Clojure 使用clojure.lang.Var 实例通过一系列从文本符号到事务值的哈希映射来创建全局绑定。 def 表单都在此全局绑定映射中的全局范围内创建绑定。因此,在 Scala 中,“函数”(方法)将被解析为给定 JVM 类上的实例或静态方法,而在 Clojure 中,“函数”(def)实际上只是对 var 绑定表中条目的引用。调用函数时,没有指向另一个类的静态链接,而是通过符号名称引用 var,然后取消引用以获取随后调用的 clojure.lang.IFn 对象的实例。

这一间接层意味着一次只能重新评估一个定义,并且重新评估对重新定义的变量的所有客户端全局可见。

相比之下,当 Scala 中的定义更改时,scalac 必须重新加载更改的文件、宏扩展、类型推断、类型检查和编译。然后由于 JVM 上类加载的语义,scalac 还必须重新加载所有依赖于已更改类中的方法的类。此外,所有作为已更改类实例的值都会变成垃圾。

这两种方法都有其优点和缺点。显然,Clojure 的方法实现起来更简单,但是由于持续的函数查找操作会在性能方面付出持续的代价,因为缺少静态类型以及您拥有什么而忘记了正确性问题。这可以说适用于在短时间内发生大量变化的上下文(交互式开发),但不太适合代码大部分是静态的上下文(部署,因此 Oxcart)。 some work I did 表明,由于缺少静态方法链接,Clojure 程序的速度下降了 16-25%。这并不是说 Clojure 慢或 Scala 快,它们只是有不同的优先级。

Scala 选择预先做更多的工作,以便编译后的应用程序能够更好地执行,这可以说更适合在很少或没有重新加载发生的情况下部署应用程序,但是当您想要进行大量小的更改时证明是一个拖累。

由于 Nicholas 对我的 GSoC 工作影响很大,所以我手头上有一些关于按出版顺序或多或少按时间顺序编译 Clojure 代码的材料。

在代码热交换方面,我想这让我很不开心,只能说“对不起,Scala 不是按照 Clojure 的方式设计的”。

【讨论】:

  • Gilad Bracha 和来自 Smalltalk 和 Lisp 世界的其他杰出人物都有这样的口头禅:“静态类型是耦合的”,这是另一个例子。这是——至少就我们目前所知——根本不可能为静态类型语言实现一个活泼的环境,而动态类型语言具有非常强大的活泼环境,请查看 MIT Lisp Machine 、Squeak/Pharo Smalltalk、Newspeak、Dan Ingall 的活泼内核或自我世界。
  • 非常感谢大家!
  • @JörgWMittag 总是在动态和静态可检查之间进行权衡。有时你想要一个,有时你想要另一个。我倾向于倾向于静态类型——主要是因为我已经看到了很多即使在 Java 中也会出现的错误,因为它的类型系统过于宽松。这并不是要否定动态类型的优势,对我来说,静态类型的优势更重要。 YMMV
  • 感谢这篇内容丰富的帖子。您在 Clojure Compilation 上提供的链接不起作用 - 请问可以更新它们吗?谢谢
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 2016-10-16
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多