blob: d470752de56afe0e9b04edf528d812a77f278b8c [file] [view] [edit]
# Compiler's high-level structure graph
The Diagram below can be viewed with a Markdown editor with a Mermaid renderer,
e.g. GitHub; IntelliJ + "Markdown" plugin + "Mermaid Visualizer" plugin; VS Code; etc.; or just https://mermaid.ai/live
Please improve it using Mermaid syntax:
- https://mermaid.js.org/syntax/flowchart.html
- https://github.com/mermaid-js/mermaid/blob/develop/README.md
```mermaid
flowchart TD
subgraph 1st compilation stage
KotlinSources@{ shape: docs, label: "KotlinSources"}
JavaSources@{ shape: docs, label: "JavaSources"}
KLibDependencies@{ shape: lin-cyl, label: "KLib\ndependencies" }
JARDependencies@{ shape: lin-cyl, label: "JAR\ndependencies" }
MetadataDeserialization@{ shape: procs, label: "Metadata Deserializers"}
PreSerialization[Pre-serialization IR lowerings]
FIRPlugins@{ shape: subproc, label: "FIR Plugins"}
IRPlugins@{ shape: subproc, label: "IR Plugins"}
FIR2IR[FIR2IR + Actualizer]
JVMIRLowerings[IR lowerings: common and JVM-specific]
JavaSources --> FIRFrontend
KotlinSources --> FIRFrontend
KLibDependencies --> MetadataDeserialization
JARDependencies --> MetadataDeserialization
MetadataDeserialization --> FIRFrontend
FIRFrontend <--> FIRPlugins
FIRFrontend --FIR--> FIR2IR
FIR2IR --IR--> IRPlugins
IRPlugins --IR--> CompilationSwitch{Is this JVM compilation}
CompilationSwitch --Yes --> JVMIRLowerings
JVMIRLowerings --IR --> JVMBackend
CompilationSwitch --No --> PreSerialization
PreSerialization --IR --> KlibSerialization
end
subgraph C/ObjC Import
CSRC@{ shape: docs, label: "C/ObjC Sources"}
DEF@{ shape: doc, label: ".def file"}
CInterop@{ label: "CInterop 🔗" }
style CInterop fill:#e1f5fe,stroke:#01579b
CSRC --> CInterop
DEF --> CInterop
click CInterop "https://github.com/JetBrains/kotlin/blob/master/docs/native/compilation-model.md" "Click to see Native compilation model"
end
KLIB@{ shape: lin-cyl, label: "KLib" }
KlibSerialization --> KLIB
KLIB --> KLibDeserialization
CInterop --> KLIB
JAR@{ shape: lin-cyl, label: "JAR" }
JVMBackend --> JAR
subgraph 2nd compilation stage
IRLowerings[IR lowerings: common and backend-specific]
Native_Backend@{ label: "Native Backend 🔗" }
JS_Backend[JS Backend]
WASM_Backend[WASM Backend]
KLibDeserialization --IR--> IR_Linking
IR_Linking --IR--> IRLowerings
IRLowerings --IR--> Native_Backend
IRLowerings --IR--> JS_Backend
IRLowerings --IR--> WASM_Backend
end
subgraph Executables
CPU@{ shape: lin-cyl, label: "Binary:\nexe, dylib, so" }
STATIC@{ shape: lin-cyl, label: "Klib's static cache"}
JS@{ shape: lin-cyl, label: "JS bundle"}
WASM_JS@{ shape: lin-cyl, label: "WASM_JS"}
WASM_WASI@{ shape: lin-cyl, label: "WASM_WASI"}
click Native_Backend "https://github.com/JetBrains/kotlin/blob/master/docs/native/compilation-model.md" "Click to see Native compilation model"
style Native_Backend fill:#e1f5fe,stroke:#01579b
Native_Backend --> CPU
Native_Backend --> STATIC
JS_Backend --> JS
WASM_Backend --> WASM_JS
WASM_Backend --> WASM_WASI
end
```
### Diagram Explanation:
1. **1st Compilation Stage (sources+dependencies -> Jar or KLib)**:
- Begins with input source code and JAR/Klib dependencies
- Applies various stages of the compilation pipeline within Kotlin, leading to a `.jar` or `.klib` as output for the module.
2. **2nd Compilation Stage (KLibs -> executable artifact or library cache) for [Native](../native/compilation-model.md), JS, WASM backends**:
- Deserializes/links KLibs
- Performs numerous IR lowerings.
- Converts IR to backend-specific representation.
- Generates an executable artifact.