gpt4 book ai didi

python - 访问抽象语法树 (AST) 的好处。 Julia 是如何利用它的?

转载 作者:太空狗 更新时间:2023-10-29 22:02:19 26 4
gpt4 key购买 nike

我读到 Julia 可以访问 AST它运行的代码。这到底是什么意思?是运行时可以访问它,代码本身可以访问它,还是两者兼而有之?

在此基础上:

  1. 这是 Julia 与其他动态语言(尤其是 Python)的主要区别吗?
  2. 访问 AST 有哪些实际好处

什么是您无法在 Python 中轻松完成,但因此可以在 Julia 中完成的好示例

最佳答案

Julia 与 Python 等语言的区别在于,Julia 允许您在代码求值之前拦截代码。宏只是用 Julia 编写的函数,可让您访问该代码并在它运行之前对其进行操作。此外,它不是将代码视为字符串(如 "f(x)"),而是作为 Julian 对象提供(如 Expr(:call, :f, :x)).

有很多这允许的东西在 Python 中是不可能的。主要有:

你可以在编译时做更多的工作,提高性能

这方面的两个很好的例子是正则表达式和 printf。这两者都采用某种格式规范并以某种方式对其进行解释。现在,这些可以相当直接地实现为函数,可能如下所示:

match(Regex(".*"), str)
printf("%d", num)

问题是这些规范必须在每次运行语句时重新解释。每次解释器经过这个 block 时,正则表达式都必须重新编译成状态机,并且格式必须通过微型解释器运行。另一方面,如果我们将它们实现为宏:

match(r".*", str)
@printf("%d", num)

然后 r@printf 宏将在编译时拦截代码,然后运行它们各自的解释器then。正则表达式变成了一个快速状态机,@printf 语句变成了一个简单的println(num)。在运行时完成最少的工作,因此代码非常快。现在,其他语言能够提供快速的正则表达式,例如,通过为其提供特殊语法——但事实上它们在 Julia 中不是特例,这意味着开发人员可以在他们自己的代码中使用相同的技术。

你可以为几乎任何东西制作迷你编译器

具有宏的语言往往具有更强大的嵌入式 DSL,因为您可以随意更改语言的语义。例如,代数建模语言 JuMP.jl . Clojure 也有一些很好的例子,比如它嵌入的 logic programming language . Mathematica.jl甚至在 Julia 中嵌入了 Mathematica 的语义,因此您可以编写真正自然的符号表达式,如 @Integrate(log(x), {x,0,2})。您可以在 Python 中将其伪造到某个点(SymPy 做得很好),但没有那么干净或高效。

如果这不能说服您,请考虑有人设法实现了 interactive Julia debugger在纯 Julia 中使用宏。在 Python 中试试看。

编辑:另一个用其他语言很难做到的很好的例子是 Cartestian.jl ,它允许您跨任意维数的数组编写通用算法。

关于python - 访问抽象语法树 (AST) 的好处。 Julia 是如何利用它的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22815869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com