
æåŸã«ã ãã·ã¢èªã®ãžã¥ãªã¢èšèªã¬ã€ããç»å ŽããŸããã ããã°ã©ãã³ã°ã®çµéšãã»ãšãã©ãªã人ã®ããã«èšèªã®å®å
šãªçŽ¹ä»ãæäŸããŸãïŒæ®ãã¯äžè¬çãªéçºã«åœ¹ç«ã¡ãŸãïŒããŸããæ©æ¢°åŠç¿ã®çŽ¹ä»ãšãè³æãçµ±åããããã®äžé£ã®ã¿ã¹ã¯ããããŸãã
æ€çŽ¢äžã«ã çµæžåŠè
åãã®ããã°ã©ãã³ã°ã³ãŒã¹ã«åºäŒããŸããïŒãžã¥ãªã¢ã«å ããŠãPythonããããŸãïŒã çµéšè±å¯ãªæ¹ã¯ã ã¯ã€ãã¯ã³ãŒã¹ã«é²ãããã ã³ã³ãã¥ãŒã¿ãµã€ãšã³ãã£ã¹ãã®ããã«èããæ¹æ³ããšããæ¬ãèªãããšãã§ããŸãã
以äžã¯ãããã°Christopher Rackauckas 7 Julia Gotchasã®è³æã®ç¿»èš³ãšãã®åãæ±ãæ¹æ³ã§ãã
ãŸãããžã¥ãªã¢ã¯çŽ æŽãããèšèªã ãšèšã£ãŠã¿ãŸãããã ç§ã¯åœŒå¥³ã倧奜ãã§ããããã¯ç§ãä»ãŸã§äœ¿çšããäžã§æã匷åã§çŽæçãªèšèªã ãšèããŠããŸãã ããã¯ééããªãç§ã®ãæ°ã«å
¥ãã®èšèªã§ãã ãã ããç¥ã£ãŠããå¿
èŠããããèœãšãç©Žããããã€ããããŸãã åèšèªã«ã¯ãããããããŸããèšèªãç¿åŸããããã«æåã«ããªããã°ãªããªãããšã®1ã€ã¯ãããããäœã§ããããããã³ããããåé¿ããæ¹æ³ãèŠã€ããããšã§ãã ãã®æçš¿ã®ãã€ã³ãã¯ã代æ¿ã®ããã°ã©ãã³ã°æ¹æ³ã瀺åããæãäžè¬çãª
ããã€ããæããã«ããããšã«ããããã®ããã»ã¹ãã¹ããŒãã¢ããããã®ã«åœ¹ç«ã€ããšã§ãã
ãžã¥ãªã¢ã¯äœãèµ·ããŠããã®ããç解ããã®ã«é©ããèšèªã§ãããªããªããéæ³ã¯ããã«ãªãããã§ãã ãžã¥ãªã¢ã®éçºè
ã¯ãè¡åèŠåãæ確ã«å®çŸ©ããããšèããŠããŸããã ããã¯ããã¹ãŠã®åäœã説æã§ããããšãæå³ããŸãã ãã ããããã¯ã1ã€ã®ããšãæ£ç¢ºã«èµ·ãããå¥ã®ããšãèµ·ãããªãçç±ãç解ããããã«é ãçããªããã°ãªããªãããšãæå³ããå ŽåããããŸãã ãã®ãããããã€ãã®äžè¬çãªåé¡ã説æããã ãã§ãªããããããçºçããçç±ã«ã€ããŠã説æããŸãã ããã€ãã®éåžžã«é¡äŒŒãããã¿ãŒã³ãããããããã«æ°ã¥ããšããã«ããããã®ããããããå€ããããšã¯ãªããªããŸãã ãã®ãããJuliaã®åŠç¿æ²ç·ã¯ã MATLAB / R / Pythonã®ãããªåçŽãªèšèªã«æ¯ã¹ãŠãããã«æ¥åŸé
ã§ã ã ãã ãããããç¿åŸãããšãJuliaã®ç°¡æœããå®å
šã«æŽ»çšããŠã C / Fortranã®ããã©ãŒãã³ã¹ãåŸãããšãã§ããŸãã ããã«æ·±ãæãäžããŸãã
äºæããªãæéïŒREPLïŒç«¯æ«ïŒã«ã¯ã°ããŒãã«ã¹ã³ãŒãããããŸã
ããã¯ãæ°ãããžã¥ãªã¢ãŠãŒã¶ãŒã«ãã£ãŠå ±åãããæãäžè¬çãªåé¡ã§ãã 誰ããèšãïŒãèããããžã¥ãªã¢ã¯éãïŒããREPLãéããããã«æåãªã¢ã«ãŽãªãºã ãæžãçããŠããã®ã¹ã¯ãªãããå®è¡ããã å®è¡åŸã圌ãã¯æéãèŠãŠããã¡ãã£ãšåŸ
ã£ãŠããªãPythonã®ããã«é
ãã®ã§ããïŒããšèšããŸãã ããã¯éåžžã«éèŠã§äžè¬çãªåé¡ã§ããããããããåé¿ããæ¹æ³ãç解ããããã«ããããèµ·ããçç±ã調æ»ããããã«æéãè²»ãããŸãããã
å°ããªäœè«ïŒãžã¥ãªã¢ãéãçç±
Juliaã¯ã³ãŒãã®ã³ã³ãã€ã«ã ãã§ãªããåã®ç¹æ®åïŒã€ãŸãããããã®åã«åºæã®ã³ãŒãã®ã³ã³ãã€ã«ïŒã§ãããããšãç解ããå¿
èŠããããŸãã ç¹°ãè¿ããŸãããã³ãŒãã¯JITã³ã³ãã€ã©ãŒã䜿çšããŠã³ã³ãã€ã«ããããããJuliaã¯é«éã§ã¯ãããŸãããããããé床ã®ç§å¯ã¯ååºæã®ã³ãŒããã³ã³ãã€ã«ãããããšã§ãã
å®å
šãªã¹ããŒãªãŒãå¿
èŠãªå Žåã¯ã次åã®ã»ãããŒã®ããã«ç§ãæžããã¡ã¢ãã芧ãã ãã ã åã®ç¹ç°æ§ã¯ããžã¥ãªã¢ã®èšèšã®åºæ¬ååã§ããå€éãã£ã¹ãããã«ãã£ãŠæ±ºå®ãããŸãã ã³ãŒããæžããšãïŒ
function f(a,b) return 2a+b end
ããã¯1ã€ã®
ã«ãããªãããã§ãããå®éã«ã¯ãããã§å€æ°ã®
ãäœæãããŠããŸãã ãžã¥ãªã¢ã®èšèªã§ã¯ãé¢æ°ã¯æœè±¡åã§ãããå®éã«åŒã³åºãããã®ã¯ã¡ãœããã§ãã f(2.0,3.0)
ãåŒã³åºããšãJuliaã¯ã³ã³ãã€ã«ãããã³ãŒããå®è¡ããŸãããã®ã³ãŒãã¯2ã€ã®æµ®åå°æ°ç¹æ°ãåãã 2a + b
ãè¿ããŸãã f(2,3)
ãåŒã³åºããšããžã¥ãªã¢ã¯2ã€ã®æŽæ°ãåãã 2a + b
ãè¿ãå¥ã®ã³ã³ãã€ã«æžã¿ã³ãŒããå®è¡ããŸãã é¢æ°f
ã¯ãåã圢åŒãæã€å€ãã®ç°ãªãã¡ãœããã®æœè±¡åãŸãã¯ç¥èªã§ãããã·ã³ãã«fã䜿çšããŠããããã¹ãŠã®ç°ãªãã¡ãœãããåŒã³åºããããªæ¹åŒã¯ãè€æ°ãã£ã¹ããããšåŒã°ããŸãã ãããŠãããã¯ã©ãã«ã§ãåœãŠã¯ãŸããŸãã +
æŒç®åã¯ãå®éã«ã¯ã衚瀺ãããåã«å¿ããŠã¡ãœãããåŒã³åºãé¢æ°ã§ãã 圌女ãã³ã³ãã€ã«ããã³ãŒãã¯åœŒå¥³ã®åãç¥ã£ãŠããã®ã§ãå®éã«ãžã¥ãªã¢ã¯åœŒå¥³ã®é床ãååŸããŸãããããã£ãŠãfïŒ2.0,3.0ïŒãåŒã³åºãã³ã³ãã€ã«æžã¿ã³ãŒãã¯ã C / Fortranã§åãé¢æ°ãå®çŸ©ããããšã§åŸãããã³ã³ãã€ã«æžã¿ã³ãŒãã§ãã ãããcode_native
ãã¯ãã§ç¢ºèªããŠãã³ã³ãã€ã«ãããã¢ã»ã³ããªã確èªã§ããŸãã
@code_native f(2.0,3.0)
pushq %rbp movq %rsp, %rbp Source line: 2 vaddsd %xmm0, %xmm0, %xmm0 vaddsd %xmm1, %xmm0, %xmm0 popq %rbp retq nop
ããã¯ã C / Fortranã®é¢æ°ããæåŸ
ããããã®ãšåãã³ã³ãã€ã«æžã¿ã¢ã»ã³ããªã§ãããæŽæ°ã®ã¢ã»ã³ããªã³ãŒããšã¯ç°ãªããŸãã
@code_native f(2,3) pushq %rbp movq %rsp, %rbp Source line: 2 leaq (%rdx,%rcx,2), %rax popq %rbp retq nopw (%rax,%rax)
æ¬è³ªïŒREPL /ã°ããŒãã«ã¹ã³ãŒãã¯åã®ç¹ç°æ§ãèš±å¯ããŸãã
ããã«ãããäž»ãªãã€ã³ããããããŸããREPL/ã°ããŒãã«ã¹ã³ãŒãã¯ãåã®æå®ãèš±å¯ãããŠããªãããäœéã§ãã ãŸãããžã¥ãªã¢ã¯é¢æ°ã®ãã¹ããããã¹ã³ãŒããèš±å¯ãããããREPLã¯ã°ããŒãã«ã¹ã³ãŒãã§ããããšã«æ³šæããŠãã ããã ããšãã°ãå®çŸ©ããå Žå
function outer() a = 5 function inner() return 2a end b = inner() return 3a+b end
ãã®ã³ãŒããæ©èœããããšãããããŸãã ããã¯ãJuliaã䜿çšãããšãå€éšé¢æ°ããå
éšé¢æ°ã«ãã£ããã£ã§ããããã§ãã ãã®èãæ¹ãååž°çã«é©çšãããšãæãé«ãé åãçŽæ¥REPLã§ããé åïŒ ã¡ã€ã³ã¢ãžã¥ãŒã«ã®ã°ããŒãã«ã¹ã³ãŒãïŒã§ããããšãããããŸãã ãããããã®ç¶æ³ã§é¢æ°ãã©ã®ããã«ã³ã³ãã€ã«ãããããèããŠã¿ãŸãããã åãããšãå®è£
ããŸãããã°ããŒãã«å€æ°ã䜿çšããŸãã
a=2.0; b=3.0 function linearcombo() return 2a+b end ans = linearcombo()
ãããŠ
a = 2; b = 3 ans2= linearcombo()
質åïŒã³ã³ãã€ã©ã¯a
ãšb
ã«å¯ŸããŠã©ã®åãåãå
¥ããã¹ãã§ããïŒ ãã®äŸã§ã¯ãåãå€æŽããŠãåãé¢æ°ãåŒã³åºãããããšã«æ³šæããŠãã ããã æµ®åãæŽæ°ãé
åãå¥åŠãªãŠãŒã¶ãŒåãªã©ãè¿œå ããä»»æã®åãåŠçã§ããŸããJuliaèšèªã§ã¯ãå€æ°ãããã¯ã¹åããå¿
èŠãããã䜿çšãããã³ã«åããã§ãã¯ãããŸãã ã³ã³ãã€ã«ãããã³ãŒãã¯ã©ã®ããã«èŠãããšæããŸããïŒ
ããã°ã pushq %rbp movq %rsp, %rbp pushq %r15 pushq %r14 pushq %r12 pushq %rsi pushq %rdi pushq %rbx subq $96, %rsp movl $2147565792, %edi # imm = 0x800140E0 movabsq $jl_get_ptls_states, %rax callq *%rax movq %rax, %rsi leaq -72(%rbp), %r14 movq $0, -88(%rbp) vxorps %xmm0, %xmm0, %xmm0 vmovups %xmm0, -72(%rbp) movq $0, -56(%rbp) movq $10, -104(%rbp) movq (%rsi), %rax movq %rax, -96(%rbp) leaq -104(%rbp), %rax movq %rax, (%rsi) Source line: 3 movq pcre2_default_compile_context_8(%rdi), %rax movq %rax, -56(%rbp) movl $2154391480, %eax # imm = 0x806967B8 vmovq %rax, %xmm0 vpslldq $8, %xmm0, %xmm0 # xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7] vmovdqu %xmm0, -80(%rbp) movq %rdi, -64(%rbp) movabsq $jl_apply_generic, %r15 movl $3, %edx movq %r14, %rcx callq *%r15 movq %rax, %rbx movq %rbx, -88(%rbp) movabsq $586874896, %r12 # imm = 0x22FB0010 movq (%r12), %rax testq %rax, %rax jne L198 leaq 98096(%rdi), %rcx movabsq $jl_get_binding_or_error, %rax movl $122868360, %edx # imm = 0x752D288 callq *%rax movq %rax, (%r12) L198: movq 8(%rax), %rax testq %rax, %rax je L263 movq %rax, -80(%rbp) addq $5498232, %rdi # imm = 0x53E578 movq %rdi, -72(%rbp) movq %rbx, -64(%rbp) movq %rax, -56(%rbp) movl $3, %edx movq %r14, %rcx callq *%r15 movq -96(%rbp), %rcx movq %rcx, (%rsi) addq $96, %rsp popq %rbx popq %rdi popq %rsi popq %r12 popq %r14 popq %r15 popq %rbp retq L263: movabsq $jl_undefined_var_error, %rax movl $122868360, %ecx # imm = 0x752D288 callq *%rax ud2 nopw (%rax,%rax)
åã®ç¹æ®åãè¡ããªãåçèšèªã®å Žåãäœåãªåœä»€ããã¹ãŠå«ããã®è¥å€§åããã³ãŒãã¯å¯èœãªéãåªããŠãããããJuliaã¯é床ãäœäžããŸãã ãããéåžžã«éèŠã§ããçç±ãç解ããã«ã¯ãJuliaã§èšè¿°ããåã³ãŒããã³ã³ãã€ã«ãããããšã«æ³šæããŠãã ããã ã¹ã¯ãªããã«ã«ãŒããæžãããšããŸãããïŒ
a = 1 for i = 1:100 a += a + f(a) end
ã³ã³ãã€ã©ãŒã¯ãã®ã«ãŒããã³ã³ãã€ã«ããå¿
èŠããããŸãããåãå€æŽãããªãããšãä¿èšŒã§ããªããããä¿å®çã«ãã¹ãŠã®åã§ãããã¯ãã¹ãã©ããããå®è¡ãé
ããªããŸãã
åé¡ãåé¿ããæ¹æ³
ãã®åé¡ãåé¿ããæ¹æ³ã¯ããã€ããããŸãã æãç°¡åãªæ¹æ³ã¯ãã¹ã¯ãªãããé¢æ°ã§åžžã«ã©ããããããšã§ãã ããšãã°ãåã®ã³ãŒãã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
function geta(a) # can also just define a=1 here for i = 1:100 a += a + f(a) end return a end a = geta(1)
ããã«ããåãçµæãåŸãããŸãããã³ã³ãã€ã©ãŒã¯a
åã«ç¹åã§ãããããå¿
èŠãªã³ã³ãã€ã«æžã¿ã³ãŒããæäŸããŸãã ãã1ã€ã§ããããšã¯ãå€æ°ãå®æ°ãšããŠå®çŸ©ããããšã§ãã
const b = 5
ãããè¡ãããšã«ãããå€æ°ãå€æŽãããªãããšãã³ã³ãã€ã©ãŒã«äŒãããããçŸåšäœ¿çšãããŠããåã§å€æ°ã䜿çšãããã¹ãŠã®ã³ãŒããç¹æ®åããããšãã§ããŸãã ãžã¥ãªã¢ã§ã¯ãå®æ°ã§ã¯ãªãåã®å€ãå®éã«å€æŽã§ãããšããã¡ãã£ãšããçããããŸãã ããããã°ã const
ã䜿çšããŠãåãå€æŽããªãããšãã³ã³ãã€ã©ãŒã«äŒããããšãã§ããŸãã ãã ããããã€ãã®å°ããªçãããããšã«æ³šæããŠãã ããã
const a = 5 f() = a println(f()) # Prints 5 a = 6 println(f()) # Prints 5 # WARNING: redefining constant a
ã³ã³ãã€ã©ãŒã¯ã f () = a
ïŒ a
ã¯å®æ°ã§ããããf () = a
ãžã®çããç¥ã£ãŠããããšãèªèããŠãé¢æ°åŒã³åºããçãã«çœ®ãæãã a
å®æ°ã§ãªãå Žåa
ç°ãªãåäœããããããæåŸ
ã©ããã«åäœããŸããã
é埳ïŒã¹ã¯ãªãããREPLã§çŽæ¥æžãã®ã§ã¯ãªããåžžã«é¢æ°ã§ã©ããããŠãã ããã
Nezhdanchik 2ïŒã¿ã€ãã®äžå®å®æ§
ãã®ãããããŒã¿åã«ãšã£ãŠã³ãŒãã®ç¹æ®åãããã«éèŠã§ãããã«ã€ããŠæèŠãè¿°ã¹ããšããã§ãã 質åããããŠãã ãããããªãã®ã¿ã€ããå€ãããšã©ããªããŸããïŒ ããã®å Žåãã³ã³ãã€ã«ãããã³ãŒããå°éåããããšã¯ã§ããŸããããšæšæž¬ããå Žåãããªãã¯æ£ããã§ãã ãã®ãããªåé¡ã¯ãåã®äžå®å®æ§ãšããŠç¥ãããŠããŸãã ãããã¯ããŸããŸãªæ¹æ³ã§è¡šç€ºã§ããŸãããäžè¬çãªäŸã®1ã€ã¯ãåçŽã«å€ãåæåããããšã§ãã ããšãã°ã次ãèŠãŠã¿ãŸãããã
function g() x=1 for i = 1:10 x = x/2 end return x end
1/2
ã¯Juliaã®æµ®åå°æ°ç¹æ°ã§ããããšã«æ³šæããŠãã ããã ãããã£ãŠã x = 1
ã§éå§ããå ŽåãæŽæ°ã¯æµ®åå°æ°ç¹æ°ã«å€æŽããããããé¢æ°ã¯ãå
éšã«ãŒããã³ã³ãã€ã«ããŠãä»»æã®åã§ãããã®ããã«ããå¿
èŠããããŸãã 代ããã«ãã£ãå ŽåïŒ
function h() x=1.0 for i = 1:10 x = x/2 end return x end
次ã«ã x
ãæµ®åå°æ°ç¹æ°ã®ãŸãŸã§ããããšãç¥ã£ãŠãé¢æ°å
šäœãæé©ã«ã³ã³ãã€ã«ã§ããããã«ãªããŸãïŒã³ã³ãã€ã©ãŒãåãå€å¥ãããã®æ©èœãåæšè«ãšåŒã³ãŸãïŒã ã³ã³ãã€ã«ãããã³ãŒãããã§ãã¯ããŠãéãã確èªã§ããŸãã
ãã€ãã£ããããã¯ãã¹ pushq %rbp movq %rsp, %rbp pushq %r15 pushq %r14 pushq %r13 pushq %r12 pushq %rsi pushq %rdi pushq %rbx subq $136, %rsp movl $2147565728, %ebx # imm = 0x800140A0 movabsq $jl_get_ptls_states, %rax callq *%rax movq %rax, -152(%rbp) vxorps %xmm0, %xmm0, %xmm0 vmovups %xmm0, -80(%rbp) movq $0, -64(%rbp) vxorps %ymm0, %ymm0, %ymm0 vmovups %ymm0, -128(%rbp) movq $0, -96(%rbp) movq $18, -144(%rbp) movq (%rax), %rcx movq %rcx, -136(%rbp) leaq -144(%rbp), %rcx movq %rcx, (%rax) movq $0, -88(%rbp) Source line: 4 movq %rbx, -104(%rbp) movl $10, %edi leaq 477872(%rbx), %r13 leaq 10039728(%rbx), %r15 leaq 8958904(%rbx), %r14 leaq 64(%rbx), %r12 leaq 10126032(%rbx), %rax movq %rax, -160(%rbp) nopw (%rax,%rax) L176: movq %rbx, -128(%rbp) movq -8(%rbx), %rax andq $-16, %rax movq %r15, %rcx cmpq %r13, %rax je L272 movq %rbx, -96(%rbp) movq -160(%rbp), %rcx cmpq $2147419568, %rax # imm = 0x7FFF05B0 je L272 movq %rbx, -72(%rbp) movq %r14, -80(%rbp) movq %r12, -64(%rbp) movl $3, %edx leaq -80(%rbp), %rcx movabsq $jl_apply_generic, %rax vzeroupper callq *%rax movq %rax, -88(%rbp) jmp L317 nopw %cs:(%rax,%rax) L272: movq %rcx, -120(%rbp) movq %rbx, -72(%rbp) movq %r14, -80(%rbp) movq %r12, -64(%rbp) movl $3, %r8d leaq -80(%rbp), %rdx movabsq $jl_invoke, %rax vzeroupper callq *%rax movq %rax, -112(%rbp) L317: movq (%rax), %rsi movl $1488, %edx # imm = 0x5D0 movl $16, %r8d movq -152(%rbp), %rcx movabsq $jl_gc_pool_alloc, %rax callq *%rax movq %rax, %rbx movq %r13, -8(%rbx) movq %rsi, (%rbx) movq %rbx, -104(%rbp) Source line: 3 addq $-1, %rdi jne L176 Source line: 6 movq -136(%rbp), %rax movq -152(%rbp), %rcx movq %rax, (%rcx) movq %rbx, %rax addq $136, %rsp popq %rbx popq %rdi popq %rsi popq %r12 popq %r13 popq %r14 popq %r15 popq %rbp retq nop
ã«å¯ŸããŠ
ãã¡ããšããã¢ã»ã³ãã©ãŒã®åªæ pushq %rbp movq %rsp, %rbp movabsq $567811336, %rax # imm = 0x21D81D08 Source line: 6 vmovsd (%rax), %xmm0 # xmm0 = mem[0],zero popq %rbp retq nopw %cs:(%rax,%rax)
åãå€ãååŸããããã®èšç®æ°ã®ãã®ãããªéãïŒ
åã®äžå®å®æ§ãèŠã€ããŠå¯ŸåŠããæ¹æ³

ãã®æç¹ã§ããããŠããªãCã䜿çšããŠãããã®äžå®å®æ§ãæ¢ãå¿
èŠããªãã®ã§ããïŒããšå°ããããšãã§ããŸãã çãã¯ïŒ
- èŠã€ãããã
- 圌ãã¯åœ¹ã«ç«ã€ãããããŸããã
æ©èœçãªéå£ã§äžå®å®ã«å¯ŸåŠã§ããŸã
Juliaã¯code_warntype
ãã¯ããæäŸããŠãåã®äžå®å®æ§ã®å Žæã瀺ããŸãã ããšãã°ãäœæããg
é¢æ°ã§ããã䜿çšãããšã次ã®ããã«ãªããŸãã
@code_warntype g()
åæãååŸãã Variables: #self#::#g x::ANY #temp#@_3::Int64 i::Int64 #temp#@_5::Core.MethodInstance #temp#@_6::Float64 Body: begin x::ANY = 1 # line 3: SSAValue(2) = (Base.select_value)((Base.sle_int)(1,10)::Bool,10,(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64 #temp#@_3::Int64 = 1 5: unless (Base.box)(Base.Bool,(Base.not_int)((#temp#@_3::Int64 === (Base.box)(Int64,(Base.add_int)(SSAValue(2),1)))::Bool)) goto 30 SSAValue(3) = #temp#@_3::Int64 SSAValue(4) = (Base.box)(Int64,(Base.add_int)(#temp#@_3::Int64,1)) i::Int64 = SSAValue(3) #temp#@_3::Int64 = SSAValue(4) # line 4: unless (Core.isa)(x::UNION{FLOAT64,INT64},Float64)::ANY goto 15 #temp#@_5::Core.MethodInstance = MethodInstance for /(::Float64, ::Int64) goto 24 15: unless (Core.isa)(x::UNION{FLOAT64,INT64},Int64)::ANY goto 19 #temp#@_5::Core.MethodInstance = MethodInstance for /(::Int64, ::Int64) goto 24 19: goto 21 21: #temp#@_6::Float64 = (x::UNION{FLOAT64,INT64} / 2)::Float64 goto 26 24: #temp#@_6::Float64 = $(Expr(:invoke, :(#temp#@_5), :(Main./), :(x::Union{Float64,Int64}), 2)) 26: x::ANY = #temp#@_6::Float64 28: goto 5 30: # line 6: return x::UNION{FLOAT64,INT64} end::UNION{FLOAT64,INT64}
æåã¯ãã¿ã€ãxãAny
ãšèšãããšã«æ³šæããŠãã ããã strict type
ãšããŠæå®ãããŠããªãstrict type
ãã€ãŸããåã¹ãããã§ããã¯ã¹å/ãã§ãã¯ããå¿
èŠãããæœè±¡ã¿ã€ãã§ãã æçµçã«x
ãUNION {FLOAT64, INT64}
ãšããŠè¿ããŸããããã¯å¥ã®éå³å¯åã§ãã ããã«ãããã¿ã€ã
ãå€æŽãããåé¡ãçããŠããããšãããããŸãã 代ããã«h
code_warntype
ãèŠããšããã¹ãŠã®å³å¯ãªåãååŸããŸãã
@code_warntype h() Variables: #self#::#h x::Float64 #temp#::Int64 i::Int64 Body: begin x::Float64 = 1.0 # line 3: SSAValue(2) = (Base.select_value)((Base.sle_int)(1,10)::Bool,10,(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64 #temp#::Int64 = 1 5: unless (Base.box)(Base.Bool,(Base.not_int)((#temp#::Int64 === (Base.box)(Int64,(Base.add_int)(SSAValue(2),1)))::Bool)) goto 15 SSAValue(3) = #temp#::Int64 SSAValue(4) = (Base.box)(Int64,(Base.add_int)(#temp#::Int64,1)) i::Int64 = SSAValue(3) #temp#::Int64 = SSAValue(4) # line 4: x::Float64 = (Base.box)(Base.Float64,(Base.div_float)(x::Float64,(Base.box)(Float64,(Base.sitofp)(Float64,2)))) 13: goto 5 15: # line 6: return x::Float64 end::Float64
ããã¯ãé¢æ°ã®åãå®å®ããŠãããåºæ¬çã«æé©ãªCã³ãŒãã«ã³ã³ãã€ã«ãããããšã瀺ããŠããŸã ã ãããã£ãŠãåã®äžå®å®æ§ãèŠã€ããã®ã¯é£ãããããŸããã ããã«é£ããã®ã¯ãé©åãªãã¶ã€ã³ãèŠã€ããããšã§ãã åã®äžå®å®æ§ã解決ããçç± ããã¯ãåçã«åä»ããããèšèªãã¹ã¯ãªããã®åéãæ¯é
ããŠãããšããäºå®ã«ã€ãªãã£ãé·å¹Žã®åé¡ã§ãã å€ãã®å Žåãããã©ãŒãã³ã¹ãšä¿¡é Œæ§ã®åŠ¥åç¹ãèŠã€ããããšèããŠããŸãã
ããšãã°ãæŽæ°ãæµ®åå°æ°ç¹æ°ãšæ··åãããŠããWebããŒãžããããŒãã«ãèªã¿åãããšãã§ããŸãã Juliaã§ã¯ãé¢æ°ããã¹ãŠæŽæ°ã§ããå Žåã¯é©åã«ã³ã³ãã€ã«ããããã¹ãŠæµ®åå°æ°ç¹æ°ã§ããå Žåãé©åã«ã³ã³ãã€ã«ãããããã«é¢æ°ãèšè¿°ã§ããŸãã ãããŠãããããæ··åšããŠããå Žåã¯ïŒ ããã¯åŒãç¶ãæ©èœããŸãã ããã¯ã Python / Rã®ãããªèšèªããç§ãã¡ãç¥ã£ãŠããŠæããŠããæè»æ§/䟿å©ãã§ãã ãã ããããã©ãŒãã³ã¹ãç ç²ã«ããå ŽåãJuliaã¯ïŒ code_warntypeãä»ã㊠ïŒçŽæ¥éç¥ããŸãã
åã®äžå®å®æ§ã«å¯ŸåŠããæ¹æ³

åã®äžå®å®æ§ã«å¯ŸåŠããã«ã¯ãããã€ãã®æ¹æ³ããããŸãã ãŸããåã宣èšãããŠããŠå€æŽã§ããªãïŒåã®å®å®æ§ã確ä¿ããïŒ C / Fortranã®ãããªãã®ã奜ããªå Žåã¯ãJuliaã§ãããè¡ãããšãã§ããŸãã
local a::Int64 = 5
ããã«ãã64ãããæŽæ°ãäœæãããå°æ¥ã®ã³ãŒãã§å€æŽããããšãããšããšã©ãŒã¡ãã»ãŒãžãçæãããŸãïŒãŸãã¯æ£ããå€æãå®è¡ãããŸãããã ããå€æã¯èªåçã«äžžããããªãããããšã©ãŒãçºçããå¯èœæ§ãé«ããªããŸãïŒã ã³ãŒãã«ããããæ¯ãããããšãåå®å®æ§ãalaã C / FortranãåŸãããŸãã ãããåŠçããããã»ã©è€éã§ãªãæ¹æ³ã¯ãtypeã¹ããŒãã¡ã³ãã䜿çšããããšã§ãã ããã§ã¯ãçå·ã®å察åŽã«åãæ§æãé
眮ããŸãã äŸïŒ
a = (b/c)::Float64
ãb / cãèšç®ããåºåãFloat64ã§ããããšã確èªããŠãã ãããããã§ãªãå Žåã¯ãèªåå€æãå®è¡ããŠãã ãããå€æãç°¡åã«å®è¡ã§ããªãå Žåã¯ããšã©ãŒãåºåããŠãã ãããã ãã®ãããªãã¶ã€ã³ãé
眮ãããšãã©ã®ã¿ã€ããé¢ä¿ããŠãããã確èªããã®ã«åœ¹ç«ã¡ãŸãã ãã ããå Žåã«ãã£ãŠã¯ãåã®äžå®å®æ§ãå¿
èŠã§ãã ããšãã°ãä¿¡é Œæ§ã®é«ãã³ãŒããæã¡ãããããŠãŒã¶ãŒã次ã®ãããªããããªãã®ãäžãããšããŸãã
arr = Vector{Union{Int64,Float64}}(undef, 4) arr[1]=4 arr[2]=2.0 arr[3]=3.2 arr[4]=1
ããã¯ã4x1æŽæ°ãšæµ®åå°æ°ç¹æ°ã®é
åã§ãã é
åã®å®éã®èŠçŽ ã¿ã€ãã¯Union {Int64, Float64}
ãããã¯å
ã»ã©èŠãããã«å³å¯ã§ã¯ãªããåé¡ãåŒãèµ·ããå¯èœæ§ããããŸããã ã³ã³ãã€ã©ãŒã¯ãåå€ãæŽæ°ãŸãã¯æµ®åå°æ°ç¹æ°ã§ããããšã®ã¿ãèªèããŸãããã©ã®ã¿ã€ãã®èŠçŽ ã§ã¯ãªãããšãèªèããŸãã ããã¯ããã®é
åã䜿çšããŠç®è¡ãè¡ãã®ãåçŽã§ããããšãæå³ããŸããããšãã°ã次ã®ãšããã§ãã
function foo{T,N}(array::Array{T,N}) for i in eachindex(array) val = array[i] # do algorithm X on val end end
æäœãããã¯ã¹åããããããé
ããªããŸãã ãã ããè€æ°ã®ãã£ã¹ãããã䜿çšããŠãç¹å¥ãªæ¹æ³ã§ã³ãŒããå®è¡ã§ããŸãã ããã¯ãæ©èœããªã¢ã®äœ¿çšãšããŠç¥ãããŠããŸãã äŸïŒ
function inner_foo{T<:Number}(val::T) # Do algorithm X on val end function foo2{T,N}(array::Array{T,N}) for i in eachindex(array) inner_foo(array[i]) end end
è€æ°ã®ãã£ã¹ãããã«ããã inner_foo
åŒã³åºããšãæµ®åå°æ°ç¹æ°çšã«ç¹å¥ã«ã³ã³ãã€ã«ãããã¡ãœãããŸãã¯æŽæ°çšã«ç¹å¥ã«ã³ã³ãã€ã«ãããã¡ãœãããåŒã³åºãããŸãã ãããã£ãŠã inner_foo
é·ãèšç®ãå
¥ããŠããæ©èœããªã¢ãæäŸããå³å¯ãªåä»ãã«å£ãããããŸãæ©èœããããšãã§ããŸãã
ãããã£ãŠãJuliaã匷åãªã¿ã€ãã³ã°ããã©ãŒãã³ã¹ãšåçãªã¿ã€ãã³ã°ã®äŸ¿å©ãã®åªããçµã¿åãããæäŸããŠããããšãã確èªãã ããã åªããããã°ã©ããŒããžã¥ãªã¢ã¯ãçç£æ§ããã³/ãŸãã¯å¿
èŠã«å¿ããŠçç£æ§ãæ倧åããããã«ãäž¡æ¹ãèªç±ã«äœ¿çšã§ããŸãã
ãµãã©ã€ãº3ïŒEvalã¯ã°ããŒãã«ã«æ©èœããŸã

ãžã¥ãªã¢ã®æ倧ã®åŒ·ã¿ã®1ã€ã¯ãã¡ã¿ããã°ã©ãã³ã°æ©èœã§ãã ããã«ãããã³ãŒãçæããã°ã©ã ãç°¡åã«èšè¿°ã§ããèšè¿°ããã³ä¿å®ããå¿
èŠãããã³ãŒãã®éãå¹æçã«åæžã§ããŸãã ãã¯ãã¯ãã³ã³ãã€ã«æã«å®è¡ãããïŒéåžžïŒã³ãŒããåãåºãé¢æ°ã§ãã äŸïŒ
macro defa() :(a=5) end
defa
ã€ã³ã¹ã¿ã³ã¹ãã³ãŒãa = 5
ã§çœ®ãæããŸãïŒ :(a = 5)
ã¯åŒçšç¬Šã§å²ãŸããåŒã§ãããžã¥ãªã¢ã®ã³ãŒãã¯åŒã§ãããããã¡ã¿ããã°ã©ãã³ã°ã¯åŒã®ã³ã¬ã¯ã·ã§ã³ã§ãïŒã
ããã䜿çšããŠãåžæããè€éãªãžã¥ãªã¢ããã°ã©ã ãäœæããäžçš®ã®éåžžã«ã¹ããŒããªã·ã§ãŒãã«ãããšããŠé¢æ°ã«å
¥ããããšãã§ããŸãã ãã ããçæãããã³ãŒããçŽæ¥è©äŸ¡ããå¿
èŠãããå ŽåããããŸãã Juliaã¯ããããè¡ãããã®eval
é¢æ°ãŸãã¯@eval
ãã¯ããæäŸããŸãã äžè¬ã«ã eval
ãé¿ããããã«ããå¿
èŠããããŸãããããšãã°ã 䞊åããã°ã©ãã³ã°ã®ç°ãªãããã»ã¹éã§ããŒã¿ã転éããããã®æ°ããã©ã€ãã©ãªãªã©ãå¿
èŠãªã³ãŒããããã€ããããŸã ã , , :
@eval :(a=5)
(REPL). , / . äŸïŒ
function testeval() @eval :(a=5) return 2a+5 end
, a
REPL. , , :
function testeval() @eval :(a=5) b = a::Int64 return 2b+5 end
b
â , , , , , . eval
, , REPL
.
4:
Julia , . : , .
, ? , , . äŸïŒ
a = 2 + 3 + 4 + 5 + 6 + 7 +8 + 9 + 10+ 11+ 12+ 13 a
, 90, 27. ? a = 2 + 3 + 4 + 5 + 6 + 7
, a = 27
, +8 + 9 + 10+ 11+ 12+ 13
, , , :
a = 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10+ 11+ 12+ 13
90, . , .
. â , . rssdev10
. äŸïŒ
x = rand(2,2) a = [cos(2*pi.*x[:,1]).*cos(2*pi.*x[:,2])./(4*pi) -sin(2.*x[:,1]).*sin(2.*x[:,2])./(4)] b = [cos(2*pi.*x[:,1]).*cos(2*pi.*x[:,2])./(4*pi) - sin(2.*x[:,1]).*sin(2.*x[:,2])./(4)]
, a b â , ! (2,2) , â (1-) 2. , , :
a = [1 -2] b = [1 - 2]
: 1
-2
. : 1-2
. - . :
a = [1 2 3 -4 2 -3 1 4]
2x4. , . : hcat
:
a = hcat(cos(2*pi.*x[:,1]).*cos(2*pi.*x[:,2])./(4*pi),-sin(2.*x[:,1]).*sin(2.*x[:,2])./(4))
!
â5: ,

(View) â () , ( ), .
, , . , . , .
â "". ""
, . "" â ( ). ( () ) . , :
a = [3;4;5] b = a b[1] = 1
, a
â [1; 4; 5]
, . . b
a
. , b = a
b
a
. , , b
, , ( b
a
). , . , , :
a = rand(2,2) # Makes a random 2x2 matrix b = vec(a) # Makes a view to the 2x2 matrix which is a 1-dimensional array
b
, b
a
, b
. , , ( , ). . , . äŸïŒ
c = a[1:2,1]
( , c
a
). , , , , . , , :
d = @view a[1:2,1] e = view(a,1:2,1)
d
, e
â , d
e
a
, , ,
. ( , , â reshape
, .) , . äŸïŒ
a[1:2,1] = [1;2]
a
, a[1:2,1]
view (a, 1:2,1)
, , a
. -? , :
b = copy(a)
, b
a
, , b
a
. a
, copy! (B, a)
, a
a
( , b
). . , Vector {Vector}
:
a = [ [1, 2, 3], [4, 5], [6, 7, 8, 9] ]
. , ?
b = copy(a) b[1][1] = 10 a
3-element Array{Array{Int64,1},1}: [10, 2, 3] [4, 5] [6, 7, 8, 9]
, a[1][1]
10! ãªããããèµ·ãã£ãã®ã§ããïŒ copy
a
. a
, b
, b
. , deepcopy
:
b = deepcopy(a)
, . , , .
â6: , In-Place
MATLAB / Python / R . Julia , , , " ".
(. . , , , , ). (in-place), . ? in-place ( mutable function ) â , , . , . , :
function f() x = [1;5;6] for i = 1:10 x = x + inner(x) end return x end function inner(x) return 2x end
, inner
, , 2x
. , . , - y
, :
function f() x = [1;5;6] y = Vector{Int64}(3) for i = 1:10 inner(y,x) for i in 1:3 x[i] = x[i] + y[i] end copy!(y,x) end return x end function inner!(y,x) for i=1:3 y[i] = 2*x[i] end nothing end
. inner!(y, x)
, y
. y
, y
, , , inner! (y, x)
. , , mutable (, ""). !
( ).
, inner!(y, x)
. copy!(y, x)
â , x
y
, . , , . : x
y
. , x + inner(x)
, , , 11 . , .
, , , . - ( loop-fusion ). Julia v0.5 .
( ( broadcast ),
). , f.(x)
â , f
x
, , . f
x
, x = x + f. (x)
. :
x .= x .+ f.(x)
.=
, , ,
for i = 1:length(x) x[i] = x[i] + f(x[i]) end
, :
function f() x = [1;5;6] for i = 1:10 x .= x .+ inner.(x) end return x end function inner(x) return 2x end
MATLAB / R / Python , , , .
, , C / Fortran .
: ,
: , . , . , . , , . , .
- , C / Fortran , . - , , !
: ? , . , , ? [ , Javascript var x = 3
x
, x = 3
x
. ? , - Javascript!]