查看降低版本的Julia代码';它不在函数中

查看降低版本的Julia代码';它不在函数中,julia,Julia,我正在阅读涉及全局变量的文章,想看看Julia到底是如何翻译这段代码的。然后我意识到,code\u warntype不能以通常的方式在这里使用,因为代码不在函数中,而将其包装在函数中会破坏整个练习 是否有类似或其他版本的@code\u warntype可以直接获取一些Julia代码(例如作为文件名或普通字符串),并向我们显示该代码的键入版本?或者可能是输出代码的命令行标志?(似乎有用于生成LLVM代码或对象文件的标志,但没有用于输出只是类型推断和降低的代码的标志。)您始终可以将有问题的代码包装到

我正在阅读涉及全局变量的文章,想看看Julia到底是如何翻译这段代码的。然后我意识到,
code\u warntype
不能以通常的方式在这里使用,因为代码不在函数中,而将其包装在函数中会破坏整个练习


是否有类似或其他版本的
@code\u warntype
可以直接获取一些Julia代码(例如作为文件名或普通字符串),并向我们显示该代码的键入版本?或者可能是输出代码的命令行标志?(似乎有用于生成LLVM代码或对象文件的标志,但没有用于输出只是类型推断和降低的代码的标志。)

您始终可以将有问题的代码包装到函数中,并在该函数上调用
@code\u warntype

下面是一个链接问题的示例:

n=5000;
x=rand(n)
y=rand(n)
mn=ones(n)*1000;
function foo()
    for i in 1:n;
        for j in 1:n;
            c=abs(x[j]-y[i]);
            if(c<mn[i])
                mn[i]=c;
            end
        end
    end
end

julia> @code_warntype foo()
Variables:
  #temp#@_2::Any
  i::Any
  #temp#@_4::Any
  j::Any
  c::Any

Body:
  begin
      Core.SSAValue(0) = (1:Main.n)::Any
      #temp#@_2::Any = (Base.start)(Core.SSAValue(0))::Any
      3: 
      Core.SSAValue(1) = (Base.done)(Core.SSAValue(0), #temp#@_2::Any)::Any
      Core.SSAValue(2) = (Core.typeassert)(Core.SSAValue(1), Core.Bool)::Bool
      Core.SSAValue(3) = (Base.not_int)(Core.SSAValue(2))::Bool
      unless Core.SSAValue(3) goto 37
      Core.SSAValue(4) = (Base.next)(Core.SSAValue(0), #temp#@_2::Any)::Any
      i::Any = (Core.getfield)(Core.SSAValue(4), 1)::Any
      #temp#@_2::Any = (Core.getfield)(Core.SSAValue(4), 2)::Any
      #= line 2 =#
      Core.SSAValue(5) = (1:Main.n)::Any
      #temp#@_4::Any = (Base.start)(Core.SSAValue(5))::Any
      14: 
      Core.SSAValue(6) = (Base.done)(Core.SSAValue(5), #temp#@_4::Any)::Any
      Core.SSAValue(7) = (Core.typeassert)(Core.SSAValue(6), Core.Bool)::Bool
      Core.SSAValue(8) = (Base.not_int)(Core.SSAValue(7))::Bool
      unless Core.SSAValue(8) goto 35
      Core.SSAValue(9) = (Base.next)(Core.SSAValue(5), #temp#@_4::Any)::Any
      j::Any = (Core.getfield)(Core.SSAValue(9), 1)::Any
      #temp#@_4::Any = (Core.getfield)(Core.SSAValue(9), 2)::Any
      #= line 3 =#
      Core.SSAValue(10) = (Base.getindex)(Main.x, j::Any)::Any
      Core.SSAValue(11) = (Base.getindex)(Main.y, i::Any)::Any
      Core.SSAValue(12) = (Core.SSAValue(10) - Core.SSAValue(11))::Any
      c::Any = (Main.abs)(Core.SSAValue(12))::Any
      #= line 5 =#
      Core.SSAValue(14) = (Base.getindex)(Main.mn, i::Any)::Any
      Core.SSAValue(15) = (c::Any < Core.SSAValue(14))::Any
      unless Core.SSAValue(15) goto 33
      #= line 6 =#
      (Base.setindex!)(Main.mn, c::Any, i::Any)::Any
      33: 
      goto 14
      35: 
      goto 3
      37: 
      return
  end::Nothing
n=5000;
x=兰特(n)
y=兰特(n)
mn=一(n)*1000;
函数foo()
对于1:n中的i;
对于1:n中的j;
c=abs(x[j]-y[i]);
如果(c@code_)
变量:
#临时2::任何
i:有吗
#临时4::任何
j:有吗
有吗
正文:
开始
Core.SSAValue(0)=(1:Main.n)::任意
#temp#@u2::Any=(Base.start)(Core.SSAValue(0))::Any
三:
Core.SSAValue(1)=(Base.done)(Core.SSAValue(0),#temp#@u2::Any)::Any
Core.SSAValue(2)=(Core.typeassert)(Core.SSAValue(1),Core.Bool)::Bool
Core.SSAValue(3)=(Base.not_int)(Core.SSAValue(2))::Bool
除非核心价值(3)转到37
Core.SSAValue(4)=(Base.next)(Core.SSAValue(0),#temp#@u2::Any)::Any
i::Any=(Core.getfield)(Core.SSAValue(4),1)::Any
#temp#@u2::Any=(Core.getfield)(Core.SSAValue(4),2)::Any
#=第2行=#
Core.SSAValue(5)=(1:Main.n)::任意
#temp#@u4::Any=(Base.start)(Core.SSAValue(5))::Any
14: 
Core.SSAValue(6)=(Base.done)(Core.SSAValue(5),#temp#@u4::Any)::Any
Core.SSAValue(7)=(Core.typeassert)(Core.SSAValue(6),Core.Bool)::Bool
Core.SSAValue(8)=(Base.not_int)(Core.SSAValue(7))::Bool
除非核心价值(8)转到35
Core.SSAValue(9)=(Base.next)(Core.SSAValue(5),#temp#@u4::Any)::Any
j::Any=(Core.getfield)(Core.SSAValue(9),1)::Any
#temp#@u4::Any=(Core.getfield)(Core.SSAValue(9),2)::Any
#=第3行=#
Core.SSAValue(10)=(Base.getindex)(Main.x,j::Any)::Any
Core.SSAValue(11)=(Base.getindex)(Main.y,i::Any)::Any
Core.SSAValue(12)=(Core.SSAValue(10)-Core.SSAValue(11))::任意
c::Any=(Main.abs)(Core.SSAValue(12))::Any
#=第5行=#
Core.SSAValue(14)=(Base.getindex)(Main.mn,i::Any)::Any
Core.SSAValue(15)=(c::Any
将以上内容与

function foo()
    n=5000;
    x=rand(n)
    y=rand(n)
    mn=ones(n)*1000;
    for i in 1:n;
        for j in 1:n;
            c=abs(x[j]-y[i]);
            if(c<mn[i])
                mn[i]=c;
            end
        end
    end
end

julia> @code_warntype foo()
Variables:
  n<optimized out>
  x<optimized out>
  y<optimized out>
  mn::Array{Float64,1}
  #temp#@_6::Int64
  i<optimized out>
  #temp#@_8::Int64
  j<optimized out>
  c<optimized out>
  #temp#@_13::Bool
  #temp#@_16::Bool

Body:
  begin
      #= line 3 =#
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 224
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 236
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 235
      # meta: location boot.jl Type 397
      # meta: location boot.jl Type 389
      # meta: location boot.jl Type 380
      Core.SSAValue(46) = $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Float64,1}, svec(Any, Int64), :(:ccall), 2, Array{Float64,1}, 5000, 5000))
      # meta: pop locations (3)
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand! 214
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl rand! 447
      # meta: location array.jl length 137
      Core.SSAValue(53) = (Base.arraylen)(Core.SSAValue(46))::Int64
      # meta: pop location
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl _rand! 440
      # meta: location int.jl * 54
      Core.SSAValue(66) = (Base.mul_int)(8, Core.SSAValue(53))::Int64
      # meta: pop location
      # meta: location array.jl length 137
      Core.SSAValue(67) = (Base.arraylen)(Core.SSAValue(46))::Int64
      # meta: pop location
      # meta: location int.jl * 54
      Core.SSAValue(68) = (Base.mul_int)(8, Core.SSAValue(67))::Int64
      # meta: pop location
      # meta: location int.jl <= 419
      Core.SSAValue(69) = (Base.sle_int)(Core.SSAValue(66), Core.SSAValue(68))::Bool
      # meta: pop location
      unless Core.SSAValue(69) goto 31
      #temp#@_13::Bool = true
      goto 33
      31: 
      #temp#@_13::Bool = false
      33: 
      unless #temp#@_13::Bool goto 36
      goto 41
      36: 
      # meta: location boot.jl Type 281
      Core.SSAValue(71) = $(Expr(:new, :(Core.AssertionError), "sizeof(Float64) * n64 <= sizeof(T) * length(A) && isbits(T)"))
      # meta: pop location
      (Base.throw)(Core.SSAValue(71))::Union{}
      41: 
      #= line 441 =#
      # meta: location gcutils.jl
      #= line 81 =#
      Core.SSAValue(61) = $(Expr(:gc_preserve_begin, Core.SSAValue(46)))
      #= line 82 =#
      # meta: location abstractarray.jl pointer 911
      # meta: location pointer.jl unsafe_convert 65
      Core.SSAValue(74) = $(Expr(:foreigncall, :(:jl_array_ptr), Ptr{Float64}, svec(Any), :(:ccall), 1, Core.SSAValue(46)))
      # meta: pop locations (2)
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl Type 365
      Core.SSAValue(79) = $(Expr(:new, Random.UnsafeView{Float64}, Core.SSAValue(74), Core.SSAValue(53)))
      # meta: pop location
      $(Expr(:invoke, MethodInstance for rand!(::Random.MersenneTwister, ::Random.UnsafeView{Float64}, ::Random.SamplerTrivial{Random.CloseOpen01{Float64},Float64}), :(Random.rand!), :(Random.GLOBAL_RNG), Core.SSAValue(79), :($(QuoteNode(Random.SamplerTrivial{Random.CloseOpen01{Float64},Float64}(Random.CloseOpen01{Float64}()))))))::Random.UnsafeView{Float64}
      #= line 83 =#
      $(Expr(:gc_preserve_end, Core.SSAValue(61)))
      # meta: pop locations (7)
      #= line 4 =#
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 224
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 236
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 235
      # meta: location boot.jl Type 397
      # meta: location boot.jl Type 389
      # meta: location boot.jl Type 380
      Core.SSAValue(109) = $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Float64,1}, svec(Any, Int64), :(:ccall), 2, Array{Float64,1}, 5000, 5000))
      # meta: pop locations (3)
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand! 214
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl rand! 447
      # meta: location array.jl length 137
      Core.SSAValue(116) = (Base.arraylen)(Core.SSAValue(109))::Int64
      # meta: pop location
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl _rand! 440
      # meta: location int.jl * 54
      Core.SSAValue(129) = (Base.mul_int)(8, Core.SSAValue(116))::Int64
      # meta: pop location
      # meta: location array.jl length 137
      Core.SSAValue(130) = (Base.arraylen)(Core.SSAValue(109))::Int64
      # meta: pop location
      # meta: location int.jl * 54
      Core.SSAValue(131) = (Base.mul_int)(8, Core.SSAValue(130))::Int64
      # meta: pop location
      # meta: location int.jl <= 419
      Core.SSAValue(132) = (Base.sle_int)(Core.SSAValue(129), Core.SSAValue(131))::Bool
      # meta: pop location
      unless Core.SSAValue(132) goto 88
      #temp#@_16::Bool = true
      goto 90
      88: 
      #temp#@_16::Bool = false
      90: 
      unless #temp#@_16::Bool goto 93
      goto 98
      93: 
      # meta: location boot.jl Type 281
      Core.SSAValue(134) = $(Expr(:new, :(Core.AssertionError), "sizeof(Float64) * n64 <= sizeof(T) * length(A) && isbits(T)"))
      # meta: pop location
      (Base.throw)(Core.SSAValue(134))::Union{}
      98: 
      #= line 441 =#
      # meta: location gcutils.jl
      #= line 81 =#
      Core.SSAValue(124) = $(Expr(:gc_preserve_begin, Core.SSAValue(109)))
      #= line 82 =#
      # meta: location abstractarray.jl pointer 911
      # meta: location pointer.jl unsafe_convert 65
      Core.SSAValue(137) = $(Expr(:foreigncall, :(:jl_array_ptr), Ptr{Float64}, svec(Any), :(:ccall), 1, Core.SSAValue(109)))
      # meta: pop locations (2)
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl Type 365
      Core.SSAValue(142) = $(Expr(:new, Random.UnsafeView{Float64}, Core.SSAValue(137), Core.SSAValue(116)))
      # meta: pop location
      $(Expr(:invoke, MethodInstance for rand!(::Random.MersenneTwister, ::Random.UnsafeView{Float64}, ::Random.SamplerTrivial{Random.CloseOpen01{Float64},Float64}), :(Random.rand!), :(Random.GLOBAL_RNG), Core.SSAValue(142), :($(QuoteNode(Random.SamplerTrivial{Random.CloseOpen01{Float64},Float64}(Random.CloseOpen01{Float64}()))))))::Random.UnsafeView{Float64}
      #= line 83 =#
      $(Expr(:gc_preserve_end, Core.SSAValue(124)))
      # meta: pop locations (7)
      #= line 5 =#
      # meta: location array.jl ones 398
      # meta: location array.jl ones 396
      # meta: location array.jl ones 395
      # meta: location boot.jl Type 389
      # meta: location boot.jl Type 380
      Core.SSAValue(170) = $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Float64,1}, svec(Any, Int64), :(:ccall), 2, Array{Float64,1}, 5000, 5000))
      # meta: pop locations (2)
      Core.SSAValue(151) = $(Expr(:invoke, MethodInstance for fill!(::Array{Float64,1}, ::Float64), :(Base.fill!), Core.SSAValue(170), 1.0))::Array{Float64,1}
      # meta: pop locations (3)
      mn::Array{Float64,1} = $(Expr(:invoke, MethodInstance for *(::Array{Float64,1}, ::Int64), :(Main.:*), Core.SSAValue(151), 1000))::Array{Float64,1}
      #= line 6 =#
      #temp#@_6::Int64 = 1
      128: 
      # meta: location range.jl done 457
      # meta: location int.jl + 53
      Core.SSAValue(197) = (Base.add_int)(5000, 1)::Int64
      # meta: pop location
      # meta: location promotion.jl == 433
      Core.SSAValue(198) = (#temp#@_6::Int64 === Core.SSAValue(197))::Bool
      # meta: pop locations (2)
      Core.SSAValue(4) = (Base.not_int)(Core.SSAValue(198))::Bool
      unless Core.SSAValue(4) goto 193
      # meta: location range.jl next 456
      # meta: location int.jl + 53
      Core.SSAValue(203) = (Base.add_int)(#temp#@_6::Int64, 1)::Int64
      # meta: pop location
      Core.SSAValue(246) = #temp#@_6::Int64
      # meta: pop location
      #temp#@_6::Int64 = Core.SSAValue(203)
      #= line 6 =#
      #temp#@_8::Int64 = 1
      147: 
      # meta: location range.jl done 457
      # meta: location int.jl + 53
      Core.SSAValue(229) = (Base.add_int)(5000, 1)::Int64
      # meta: pop location
      # meta: location promotion.jl == 433
      Core.SSAValue(230) = (#temp#@_8::Int64 === Core.SSAValue(229))::Bool
      # meta: pop locations (2)
      Core.SSAValue(9) = (Base.not_int)(Core.SSAValue(230))::Bool
      unless Core.SSAValue(9) goto 191
      # meta: location range.jl next 456
      # meta: location int.jl + 53
      Core.SSAValue(235) = (Base.add_int)(#temp#@_8::Int64, 1)::Int64
      # meta: pop location
      Core.SSAValue(245) = #temp#@_8::Int64
      # meta: pop location
      #temp#@_8::Int64 = Core.SSAValue(235)
      #= line 7 =#
      # meta: location array.jl getindex 661
      Core.SSAValue(236) = (Base.arrayref)(true, Core.SSAValue(46), Core.SSAValue(245))::Float64
      # meta: pop location
      # meta: location array.jl getindex 661
      Core.SSAValue(237) = (Base.arrayref)(true, Core.SSAValue(109), Core.SSAValue(246))::Float64
      # meta: pop location
      # meta: location float.jl - 395
      Core.SSAValue(238) = (Base.sub_float)(Core.SSAValue(236), Core.SSAValue(237))::Float64
      # meta: pop location
      # meta: location float.jl abs 517
      Core.SSAValue(239) = (Base.abs_float)(Core.SSAValue(238))::Float64
      # meta: pop location
      #= line 9 =#
      # meta: location array.jl getindex 661
      Core.SSAValue(240) = (Base.arrayref)(true, mn::Array{Float64,1}, Core.SSAValue(246))::Float64
      # meta: pop location
      # meta: location float.jl < 450
      Core.SSAValue(241) = (Base.lt_float)(Core.SSAValue(239), Core.SSAValue(240))::Bool
      # meta: pop location
      unless Core.SSAValue(241) goto 189
      #= line 10 =#
      # meta: location array.jl setindex! 699
      (Base.arrayset)(true, mn::Array{Float64,1}, Core.SSAValue(239), Core.SSAValue(246))::Array{Float64,1}
      # meta: pop location
      189: 
      goto 147
      191: 
      goto 128
      193: 
      return
  end::Nothing
函数foo()
n=5000;
x=兰特(n)
y=兰特(n)
mn=一(n)*1000;
对于1:n中的i;
对于1:n中的j;
c=abs(x[j]-y[i]);
如果(c@code_)
变量:
N
x
Y
mn::数组{Float64,1}
#温度#@u6::Int64
我
#temp#@u8::Int64
J
C
#温度13::布尔
#温度16:Bool
正文:
开始
#=第3行=#
#meta:location/buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 224
#meta:location/buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl兰德236
#meta:location/buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl兰德235
#meta:location boot.jl类型397
#meta:location boot.jl类型389
#meta:location boot.jl 380型
SSAValue(46)=$(Expr(:foreigncall,:(:jl_alloc_array_1d),数组{Float64,1},svec(Any,Int64),:(:ccall),2,数组{Float64,1},5000,5000))
#元:流行位置(3)
#meta:location/buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand!214
#meta:location/buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl rand!447
#meta:location array.jl长度137
Core.SSAValue(53)=(Base.arraylen)(Core.SSAValue(46))::Int64
#梅塔:流行位置
#meta:location/buildworker/worker/package\u linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl_rand!440
#meta:location int.jl*54
Core.SSAValue(66)=(Base.mul_int)(8,Core.SSAValue(53))::Int64
#梅塔:流行位置
#meta:location array.jl长度137
Core.SSAValue(67)=(Base.arraylen)(Core.SSAValue(46))::Int64
#梅塔:流行位置
#meta:location int.jl*54
Core.SSAValue(68)=(Base.mul_int)(8,Core.SSAValue(67))::Int64
#梅塔:流行位置

#meta:location int.jl你在找@code\u lowered吗?在这种情况下,我如何将代码发送到
@code\u lowered
?当然,这是一个简单的选择,但是:(a)它实际上不会生成与没有函数包装时相同的代码。这种情况下的差异可能是最小的和可预测的,但在更复杂和多样的代码中,它将很难跟踪;和(b)它没有显示为函数外的行生成的代码,这也可能比本例中更复杂。我们越是试图缓解问题-(b)通过将内容包装到函数内,问题就越严重-(a)变成。我原则上同意你的观点,但在实践中,我还没有遇到过对我的解决方案不满意的情况。那么,我将把这个问题留给那些对如何计算未封装在函数中的代码有更深入了解的人。我明白,对于实际的生产代码,我不需要更多的东西呃,但在这种情况下,出于教学和学术目的,我对这个感兴趣