在Julia中,为什么@printf是一个macros而不是一个函数?
在Julia中,打印格式化string的语法如下所示:
@printf("Hello %d\n", 5)
为什么@printf
是一个macros而不是一个函数? 是否可以接受不同数量的论据?
采取可变数量的参数对于正常的Julia函数不是问题[ 1 ]。 @printf
是一个macros,它可以在编译时parsing和解释格式string,并为该特定的格式string生成自定义代码。 人们可能没有意识到C的printf
函数每次调用printf
时都会重新parsing并重新解释格式化string。 事实上,它是如此快速的事实代表了一个疯狂的指针编程小小的奇迹。 真的,看看你最近的libc的printf
实现。 这完全是坚果。
Julia使用了一种不同的方法: @printf
是一个将格式化string转换为特定于该格式规范的高效代码的macros。 如果你仔细想一想,printf样式的格式string实际上只是表示一个函数的一种方式,它需要一个固定的数量和types的参数,并以特定的方式打印出来。 请注意,我说格式string是一个函数,而不是printf本身,它在概念上是一个函数发生器,将格式转换成格式化程序。 在C语言中,这被全部塞进一个运行时函数中,这是一个不匹配的事实,因为这是C语言中唯一合理的select。事实上,由于这个原因,直到最近才开始自己拍摄通过将错误的数字或types的parameter passing给C的printf。 现在只有更好的了,因为编译器是专门用来理解printf格式的语义的。
从理论上讲,Julia的@printf
可以比C更快,因为它产生了自定义的代码,但实际上,我有足够的时间匹配C,更不用说殴打它了。 但我认为这是由于我们的I / O系统的当前devise以及我如何使用它,而不是固有的限制。 虽然I / O的东西是彻底改变的,但是当发生这种情况时,我们可以通过利用@printf
是一个macros的事实,在格式化的打印中实际上击败C.
这是为了performance。 printf
macros使用一个常量格式的string(例如"Hello %d\n"
)并为该string生成优化的代码。