| # 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. |