11# Nushell代码执行原理
22
3- 在[ 用Nu的方式思考] ( ./thinking_in_nu.md#think-of-nushell-as-a-compiled-language ) 中,我们建议您 "将Nushell视为编译型语言",这是因为Nushell代码的处理方式。我们还介绍了一些由于这种处理方式而在Nushell中无法工作的代码示例。
3+ 在[ 用Nu的方式思考] ( ./thinking_in_nu.md#think-of-nushell-as-a-compiled-language ) 中,我们建议你 "将Nushell视为编译型语言",这是因为Nushell代码的处理方式。我们还介绍了一些由于这种处理方式而在Nushell中无法工作的代码示例。
44
5- 其根本原因是Nushell严格分离了 ** _ 解析和评估_ ** 阶段,并 ** _ 禁止类似` eval ` 的功能_ ** 。在本节中,我们将详细解释这意味着什么、为什么这样做以及其影响。解释尽可能简单,但如果您之前使用过其他编程语言可能会更容易理解 。
5+ 其根本原因是Nushell严格分离了 ** _ 解析和评估_ ** 阶段,并 ** _ 禁止类似` eval ` 的功能_ ** 。在本节中,我们将详细解释这意味着什么、为什么这样做以及其影响。解释尽可能简单,但如果你之前使用过其他编程语言可能会更容易理解 。
66
77[[ toc]]
88
@@ -64,7 +64,7 @@ fn main() {
64642 . ` 机器码 ⇒ CPU ⇒ 结果 `
6565
6666::: important
67- 您可以看到编译 -运行序列与解释器的解析-评估序列没有太大区别。您从源代码开始 ,将其解析(或编译)为某种状态(例如字节码、IR、机器码),然后评估(或运行)IR以获得结果。您可以将机器码视为另一种类型的IR ,将CPU视为其解释器。
67+ 你可以看到编译 -运行序列与解释器的解析-评估序列没有太大区别。你从源代码开始 ,将其解析(或编译)为某种状态(例如字节码、IR、机器码),然后评估(或运行)IR以获得结果。你可以将机器码视为另一种类型的IR ,将CPU视为其解释器。
6868
6969然而,解释型语言和编译型语言之间的一个重大区别是解释型语言通常实现 _ ` eval ` 函数_ ,而编译型语言则没有。这意味着什么?
7070:::
@@ -96,7 +96,7 @@ print("Hello, World!")
9696eval("print('Hello, Eval!')")
9797```
9898
99- 运行该文件(` python hello_eval.py ` )时,您会看到两条消息 :_ "Hello, World!"_ 和 _ "Hello, Eval!"_ 。具体过程如下:
99+ 运行该文件(` python hello_eval.py ` )时,你会看到两条消息 :_ "Hello, World!"_ 和 _ "Hello, Eval!"_ 。具体过程如下:
100100
1011011 . 整个程序被解析
1021022 . (第3行) ` print("Hello, World!") ` 被求值
@@ -115,7 +115,7 @@ Nushell不允许这样做。
115115如上所述,由于在解释过程中没有` 求值函数 ` 来修改字节码,解释型语言的解析/求值过程与C++和Rust等编译型语言的编译/运行过程(在高层面上)几乎没有区别。
116116
117117::: tip 关键点
118- 这就是为什么我们建议您 _ "将Nushell视为编译型语言"_ 。尽管它是一种解释型语言,但由于缺少` 求值函数 ` ,它具有传统静态编译型语言的一些特征性优点和限制。
118+ 这就是为什么我们建议你 _ "将Nushell视为编译型语言"_ 。尽管它是一种解释型语言,但由于缺少` 求值函数 ` ,它具有传统静态编译型语言的一些特征性优点和限制。
119119:::
120120
121121我们将在下一节深入探讨这意味着什么。
@@ -160,7 +160,7 @@ hello()
160160
161161此外,解析完成后,我们可以确定字节码(IR)在求值过程中不会改变。这使我们对结果字节码(IR)有深入的了解,能够进行强大可靠的静态分析和IDE集成,这在更动态的语言中可能难以实现。
162162
163- 总的来说,在扩展Nushell程序时,您可以更放心错误会被更早发现 。
163+ 总的来说,在扩展Nushell程序时,你可以更放心错误会被更早发现 。
164164:::
165165
166166## Nushell交互式解释器(REPL)
@@ -196,7 +196,7 @@ hello()
196196
197197:::
198198
199- 当您在输入命令行后按 <kbd >Enter</kbd >时,Nushell会:
199+ 当你在输入命令行后按 <kbd >Enter</kbd >时,Nushell会:
200200
2012011 . ** _ (读取)_ ** :读取命令行输入
2022022 . ** _ (求值)_ ** :解析命令行输入
@@ -328,7 +328,7 @@ const foo_contents = (open foo.nu)
328328一般来说,这些命令和结果表达式相当简单且 ** _ 没有副作用_ ** 。否则,解析器很容易进入不可恢复的状态。例如,想象尝试将无限流分配给常量。解析阶段将永远不会完成!
329329
330330::: tip
331- 您可以使用以下命令查看哪些Nushell命令可以返回常量值 :
331+ 你可以使用以下命令查看哪些Nushell命令可以返回常量值 :
332332
333333``` nu
334334help commands | where is_const
0 commit comments