clojure - Clojure 如何编译在 REPL 中运行的代码?

标签 clojure compilation read-eval-print-loop

诚实的菜鸟问题。根据 Russ Olsen 的 Getting Clojure,我知道以下内容:

(1) Clojure代码在运行前被编译为JVM字节码。

(2) Clojure 代码可以在使用函数 (read) 和 (eval) 或类似函数的 REPL 中运行,几乎可以即时得到反馈。

因此,似乎 Clojure 代码到 JVM 字节码的编译必须在 REPL 期间的某个时刻发生,大概是在(读取)阶段或之后不久。

但这是一个模糊的心理画面,我想澄清一下。

例如,很高兴知道代码在 REPL 中何时实际编译,编译创建的数据如何存储在 RAM 中,然后 由 (eval) 访问,以及其间或之后发生的任何重要步骤。

换句话说,我想更详细地了解香肠是如何制作的:

Clojure 如何编译在 REPL 中运行的代码?

(加分项:这与 Clojure 从非 REPL 源(例如 Leiningen 项目)编译代码时的做法有何不同?)

最佳答案

读取器使用字符并生成 Clojure 数据结构(列表、向量、符号等)。读取阶段肯定对 JVM 字节码一无所知。这是 eval 阶段的一部分:编译器使用这些数据结构并生成 JVM 字节码。

当运行 REPL 时,该字节码存储在 DynamicClassLoader 中 - 所有 JVM 类都必须由某个 ClassLoader 定义,而 DynamicClassLoader 是 Clojure 创建的允许从 Clojure 数据结构动态定义类的类。

当编译成类文件时,相同的字节码只是简单地以 .class 文件的形式写入磁盘,然后可能会打包到 jar 中。

关于clojure - Clojure 如何编译在 REPL 中运行的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62182986/

相关文章:

clojure - 合并合并 : can this be simplified?

Linux 与 Solaris - 编译软件

Windows 上的 R - 编译错误 -\U 没有使用十六进制数字

python - 每次我在 Python shell 中按回车键时如何运行一个函数

Clojure 指定自然数

jdbc - 来自sql数据库的日期时间结果在clojure jdbc中不相同

clojure - core.logic matche、defne 模式匹配构造使用什么语法?

c++ - 在旧版本中使用新的 c++11 功能

为 windows 编译的带有 readline 支持的 php

emacs - 如何获取对 Emacs Slime 中最后返回对象的引用