在Julia最近的0.5夜中,我开始注意到名为ANY
的类型参数,这些参数被约束为Any
的子类型。这当然总是正确的,因为所有类型都是Any
的亚型
例如:
serialize(s::SerializationState, x::ANY<:Any) at serialize.jl:468
show(io::IO, x::ANY<:Any) at show.jl:85
methods(f::ANY<:Any) at reflection.jl:258
methods(f::ANY<:Any, t::ANY<:Any) at reflection.jl:247
那到底发生了什么?这是鼓励编译器在JIT时生成专用函数的某种技巧吗?
ANY
是一种向编译器暗示它不应该专门化参数的方法。否则,编译器会考虑将函数专门化为调用时使用的所有参数的特定类型,在某些情况下,这可能会导致大量不必要的代码生成。这是一种肮脏的黑客攻击,更通用的机制会更好,但它能完成任务。