CONTENTS xvii
添加方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
创建泛型函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1154
闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1154
构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1154
内置函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1154
关键字参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1154
编译器效率问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156
94.9 Base.Cartesian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156
Principles of usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156
Basic syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
94.10Talking to the compiler (the :meta mechanism) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
94.11SubArrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Indexing: cartesian vs. linear indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Index replacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
SubArray design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1163
94.12isbits Union Opmizaons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1166
isbits Union Structs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1166
isbits Union Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1166
94.13System Image Building . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1167
Building the Julia system image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1167
System image opmized for mulple microarchitectures . . . . . . . . . . . . . . . . . . . . . . . . 1168
94.14Working with LLVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1169
Overview of Julia to LLVM Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1169
Building Julia with a different version of LLVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1169
Passing opons to LLVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
Debugging LLVM transformaons in isolaon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
Improving LLVM opmizaons for Julia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
The jlcall calling convenon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1171
GC root placement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1171
94.15prin() and stdio in the Julia runme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
Libuv wrappers for stdio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
Interface between JL_STD* and Julia code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
prin() during inializaon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Legacy ios.c library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
94.16边界检查 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176
移除边界检查 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176
Propagang inbounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176
The bounds checking call hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
94.17Proper maintenance and care of mul-threading locks . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Broken Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1179
Shared Global Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1179
94.18Arrays with custom indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1180
Generalizing exisng code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1180
Wring custom array types with non-1 indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1182
94.19Module loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
Experimental features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
94.20Inference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184
How inference works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184
Debugging compiler.jl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184
The inlining algorithm (inline_worthy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184