【问题标题】:Difference between Scala REPL and Clojure REPL - compile speedScala REPL 和 Clojure REPL 之间的区别 - 编译速度
【发布时间】:2015-05-22 03:16:52
【问题描述】:

我尝试使用相同的算法运行两个阶乘函数,一个在 Scala 中,另一个在 Clojure 中:

// Scala:
def factorial(n:Int) = (1 to n).foldLeft(1: BigInt)(_*_)

--

;; Clojure:
(defn factorial [x]
  (reduce * (range 1N (inc x))))

我第一次将函数输入到 REPL 时,Clojure 会评估(函数定义,不计算阶乘),没有任何明显的延迟;而 scala 只是暂停了一小会儿。 (虽然非常非常短,但仍然很明显。)

当我应用函数计算阶乘时,两者都很快返回结果。

我想对 REPL 有一个基本的了解。这两个REPL有什么区别吗? Scala REPL 是真正的 REPL 吗?

【问题讨论】:

    标签: scala clojure read-eval-print-loop


    【解决方案1】:

    REPL 具有相当特定的含义。 “真正的 REPL”将符合以下模式:Read Eval Print Loop。只需几行就可以在 clojure 中构建一个 REPL:

    (loop []
      (let [string (read-line)
            data (read-string line)
            result (eval data)]
        (println result)
        (recur)))
    

    在这里您可以看到真正 repl 的主要部分。 read-line 从控制台读取一些文本。 read-string 将该字符串转换为数据(列表、向量、数字等)。 eval 评估返回结果的数据,println 打印结果。

    有些人会争辩(我同意)只有遵循这四个步骤的系统才有资格被称为 repl。有些人还会指出 Scala 不是同义词,因此不能真正拥有 repl。

    我所说的谐音,是指编译器在由语言的阅读器生成并由语言的核心构造操作的相同数据结构上运行。例如,这是完全有效的 Clojure 代码:

     (eval (list (symbol "+") 41 1))) ; evals to 42
    

    这就是关于“真实”REPL 的争论的要点。只有像 lisp(也许还有 prolog?)这样的同音语言才能拥有真正的 REPL。所有其他人都应该真正被命名为“交互式解释器”。

    就速度而言。这可能是由于编译器的复杂性。 Clojure 编译器只有大约 10k 行漂亮的线性代码。单程,没什么特别的。 Scala 编译器非常先进,支持静态类型和多次传递。像 Clojure 这样的语言不需要这些额外的特性,而且它们确实会降低编译器的速度。

    【讨论】:

    • 嗯。我会认为,如果命令行交互涉及单独的读取、评估和打印步骤,那么对于 REPL 来说就足够了,无论该语言是否同音。如果它在执行之前进行编译,我不会称它为解释器。当然,在“一次执行一个表达式,一个接一个”和“将大段代码翻译和优化成某种‘机器’语言,然后执行”之间存在各种中间情况。但是,我认为这些都不重要!
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 2016-10-16
    • 1970-01-01
    • 2011-07-23
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多