在 Julia 中,为什么@printf 是宏而不是函数?

在 Julia 中,打印格式化字符串的语法如下:

@printf("Hello %d\n", 5)

为什么 @printf是宏而不是函数?它是否能够接受不同数量的论点?

13692 次浏览

这是为了表演。printf宏采用常量格式字符串(例如。并为该字符串生成优化的代码。

对于普通的 Julia 函数[ 1] ,获取可变数量的参数不是问题。@printf是一个宏,它可以在编译时解析和解释格式字符串,并为该特定格式字符串生成自定义代码。人们可能没有意识到 C 的 printf函数重新解析和重新解释格式字符串 每次你调用 printf。事实上,它的速度和它的速度一样快,这是疯狂的指针编程的一个小小的奇迹。说真的,看看最近的 libc 的 printf实现就知道了。这太疯狂了。

Julia 使用了不同的方法: @printf是一个宏,它将格式字符串转换为特定于该格式规范的有效代码。如果您仔细想想,printf 风格的格式字符串实际上只是一种表示函数的方式,该函数接受固定数量和类型的参数,并以特定的方式打印它们。注意,我说过 格式化字符串是一个函数,而不是 printf 本身,它在概念上是一个函数生成器,将格式转换为格式化程序。事实上,所有这些都被塞进 C 语言的运行时函数中是有点不匹配的,因为这是 C 语言中唯一合理的选择。事实上,正因为如此,直到最近,通过向 C 的 printf 传递错误的参数数目或类型,很容易给自己招来麻烦。现在这只是更好,因为编译器已经进行了特殊处理,以理解 printf 格式的语义。

从理论上讲,Julia 的 @printf可以比 C 快,因为它生成的是定制代码,但在实践中,我很难匹配 C,更不用说击败它了。但我认为这是由于我们目前的 I/O 系统设计和我如何使用它,而不是一个固有的限制。不过,I/O 方面的工作需要进行一次彻底的改进,当这种情况发生时,我们可以利用 @printf是宏这一事实,在格式化打印方面击败 C。