在朱莉娅,为什么@printf是宏而不是函数?

时间:2013-11-05 06:22:20

标签: julia

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

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

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

2 个答案:

答案 0 :(得分:100)

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

Julia使用不同的方法:@printf是一个宏,它将格式字符串转换为特定于该格式规范的有效代码。如果你考虑一下,printf样式的格式字符串实际上只是一种表达一个函数的方法,该函数接受固定数量和类型的参数并以特定方式打印它们。请注意,我说格式字符串是一个函数,而不是printf本身,它在概念上是一个函数生成器,将格式转换为格式化程序。事实上,这一切都塞满了C中的运行时功能,这有点不匹配,因为它是C中唯一合理的选择。事实上,正因为如此,直到最近,它才很容易自己拍摄通过将错误的数字或类型的参数传递给C的printf而在脚中。现在这只是更好,因为编译器特别容易理解printf格式的语义。

理论上,Julia的@printf可以比C更快,因为它生成自定义代码,但在实践中,我有足够的时间匹配C,更不用说击败它了。但我认为这是由于我们的I / O系统的当前设计以及我如何使用它,而不是固有的限制。 I / O的东西虽然要进行大修,但是当发生这种情况时,我们实际上可以通过利用@printf是一个宏的事实来打败格式化的打印。

答案 1 :(得分:5)

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