这是一个基于 Kotlin Multiplatform 实现的 Kotlin/CLR 编译器, 旨在将 Kotlin 代码最终编译为 .NET CIL, 使得 Kotlin 开发者可以在 .NET 平台上使用 Kotlin 语言进行开发
compiler编译器核心, 使用 Kotlin/JVM 编写, 依赖官方的 kotlin-compiler-embeddablesrc/commonMain/kotlin编译器核心代码Library.ktKotlin/CLR 标准库编译入口MainCLR.ktKotlin/CLR 编译入口MainJVM.kt官方 Kotlin/JVM 编译入口
csharpC# 部分AssemblyResolver使用 C# 基于 Roslyn API 实现的程序集解析器, 用于解析 .dll 文件并传递给 Kotlin/CLR 编译器kotlin-stdlibKotlin 标准库的 C# 实现, 用于提供 Kotlin 标准库的支持KotlinCLR一个常规的 C# 项目, 用于测试和演示KotlinCLR/gen包含从kotlin编译而来的 C# 代码
kotlin一个使用 Kotlin/CLR 的 Kotlin 项目, 用于测试和演示homekotlin-homelib标准库resolver程序集解析器
stdlibKotlin/CLR 编写的标准库, 暂未使用, 作为未来的标准库实现
如果切换版本, 请清理缓存目录以避免编译错误(~/.kfc/cache)
- 前往 Actions(非稳定版) / Release(稳定版) 下载编译器成品(zip/tar)和
Kotlin-home - 解压编译器, 进入 bin 目录, 在 bin 目录下打开终端
- 运行 compiler 脚本并传递参数
- 参数为需要编译的 kotlin 源码/目录
-kotlin-home选项提供解压后的kotlin-home路径-d选项提供输出路径-dotnet-home选项提供 dotnet 根目录-dotnet-version选项提供 dotnet 版本(x.y.z)- 完整的命令应该类似
compiler.bat kotlin/src -d out -kotlin-home home -dotnet-home "C:/Program Files/dotnet" -dotnet-version 9.0.5 - 更多选项请参考
compiler.clr.CLRCompilerArguments和org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
[email protected]Frontend IR(前端中间表示形式) 未经过处理的原始树[email protected]FIR 经过处理后的树[email protected]Kotlin IR 未经过降级的原始树[email protected]KIR 经过降级后的树[email protected]Backend IR 未经过清理的树[email protected]BIR 经过清理的树xxx.cs编译产物 C# 源文件
- 使用 Intellij IDEA 打开本项目, 使用 Rider / Visual Studio 打开
csharp子目录 - 使用 Rider / Visual Studio 构建
AssemblyResolver项目, 并将生成的所有文件及文件夹放入home/resolver目录下 - 使用 Rider / Visual Studio 构建
kotlin-stdlib项目, 并将生成的kotlin-stdlib.dll放入home/lib目录下 - 打开
compiler/src/commonMain/kotlin/Debug.kt文件, 修改 dotnetHome 和 dotnetVersion 为符合你本地环境 - 使用 Intellij IDEA 运行 Gradle 任务
:compiler:jvmRun -DmainClass=DebugKt即可将kotlin目录内的源码编译至csharp/KotlinCLR/gen目录下 - 使用 Rider / Visual Studio 运行
KotlinCLR项目
- 使用官方 kotlin-compiler-embeddable, 复用官方编译器组件进行 Configuration, Frontend, Fir2Ir 编译
- 编写 Kotlin/CLR 后端编译器将 Kotlin IR 降级并生成 C# 源码
- 使用 C# 编写的 AssemblyResolver 解析 .dll 文件, 并将其传递给 Kotlin/CLR 编译器
- 使用 C# 编写的标准库和 AssemblyResolver 为 Kotlin/CLR 提供标准库
- 通过 ClrSymbolProvider 提供 C# 的符号解析, 使得 Kotlin/CLR 可以使用 .NET 的类型和方法
短期内编译到 C# 可以更快见效, 性价比更高, 未来会直接生成 CIL
编译器还没搓完, 部分语法还没支持, 编译 Kotlin 标准库会报错(x
