CONTENTS xvii
Type Inference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1134
JIT Code Generaon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
System Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1136
101.6Calling Convenons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1136
Julia Nave Calling Convenon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1136
JL Call Convenon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1137
C ABI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1137
101.7High-level Overview of the Nave-Code Generaon Process . . . . . . . . . . . . . . . . . . . . . 1137
Representaon of Pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1137
Representaon of Intermediate Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1137
Union representaon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1138
Specialized Calling Convenon Signature Representaon . . . . . . . . . . . . . . . . . . . . . . . 1138
101.8Julia Funcons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1139
Method Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1139
Funcon calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1139
Adding methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1139
Creang generic funcons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1140
Closures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1140
Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1140
Builns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1140
Keyword arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Compiler eciency issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1142
101.9Base.Cartesian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
Principles of usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
Basic syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
101.10Talking to the compiler (the :meta mechanism) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1147
101.11SubArrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
Indexing: cartesian vs. linear indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
Index replacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
SubArray design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1149
101.12isbits Union Opmizaons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
isbits Union Structs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
isbits Union Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
101.13System Image Building . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
Building the Julia system image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
System image opmized for mulple microarchitectures . . . . . . . . . . . . . . . . . . . . . . . . 1154
101.14Working with LLVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1155
Overview of Julia to LLVM Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1155
Building Julia with a dierent version of LLVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1155
Passing opons to LLVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156
Debugging LLVM transformaons in isolaon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156
Improving LLVM opmizaons for Julia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156
The jlcall calling convenon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
GC root placement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
101.15prin() and stdio in the Julia runme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Libuv wrappers for stdio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Interface between JL_STD* and Julia code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
prin() during inializaon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
Legacy ios.c library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
101.16Bounds checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Eliding bounds checks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Propagang inbounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162