71

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

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

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

4

2 回答 2

125

对于普通的 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。

于 2013-11-05T08:38:37.587 回答
7

是为了表现。该printf宏采用常量格式字符串(例如"Hello %d\n")并为该字符串生成优化的代码。

于 2013-11-05T08:38:02.887 回答