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

标签 julia

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

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

为什么@printf是宏而不是函数?它是否可以接受不同数量的参数?

最佳答案

对于普通的 Julia 函数来说,采用可变数量的参数不是问题 [ 1 ]。 @printf 是一个宏,因此它可以在编译时解析和解释格式字符串,并为该特定格式字符串生成自定义代码。人们可能没有意识到,每次调用 printf 时,C 的 printf 函数都会重新解析和解释格式字符串。事实上,它的速度如此之快,代表了疯狂指针编程的一个小奇迹。说真的,只要看看离您最近的 libc 的 printf 实现即可。这完全是疯了。

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

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

关于julia - 在 Julia 中,为什么 @printf 是宏而不是函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19783030/

相关文章:

Julia 中的 boolean 矩阵乘法

parallel-processing - Julia 中工作人员的局部变量访问

julia - 如何在 Julia 中提供可重现的样本数据

dataframe - 如何在 Julia 中嵌套/取消嵌套数据框?

python-3.x - Cart-Pole Python 性能比较

dictionary - 如何查找项目是否包含在 Julia 的 Dict 中

julia - DataFrames.jl - leftjoin() - 保留左数据帧索引定位

types - 如何制作为参数类型字段创建默认值的构造函数

arrays - 在 Julia 中,如何初始化一个二维数组(矩阵),其中每个元素都是一个列向量?

recursion - 如何将递归函数的值返回到数组