使用kotlinc、kotlin、java命令进行kotlin程序运行 kotlinc xxx.kt可以生成 XxxKt.class 文件; 这个文件可以用kotlin命令执行:kotlin XxxKt 用java程序执行这个class文件是不行的, 会出现如下错误: ``` D:\kotlinc\workspace>java HelloKt Exception in thread "main" java.lang.NoClassDefFoundError Source) at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more ``` 需要使用kotlinc 命令:kotlinc hello.kt -include-runtime -d hello.jar 生成jar文件; 然后可以用java -jar hello.jar运行java程序;
. ├── bin │ ├── kotlin │ ├── kotlin.bat │ ├── kotlinc │ ├── kotlinc-js │ ├── kotlinc-js.bat │ ├── kotlinc-jvm │ ├── kotlinc-jvm.bat │ └── kotlinc.bat ├── build.txt ├── lib │ ├── allopen-compiler-plugin.jar 我们来看一下kotlinc的命令: #! "${DIR}"/kotlinc "$@" 我们可以看出,直接是依赖kotlinc。 /.bashrc, 命令行输入kotlinc, 即可REPL环境,我们可以看到如下输出: $ kotlinc Welcome to Kotlin version 1.1.2-2 (JRE 1.8.0_40
它位于 IDEA 所安装目录下的 plugins/Kotlin/kotlinc/bin 子目录中,一般来说如果已安装 JDK 并已设置好 JAVA_HOME环境变量,只需将上述子目录设置为命令搜索路径即可通过 kotlinc 命令来运行 Kotlin REPL。 对于 Windows 在安装 JDK 并设置好 JAVA_HOME 之后,可以打开安装目录下的相应子目录,然后直接双击 kotlinc.bat 来运行 REPL。 /bin 这样的目录中(Windows 下在 %USERPROFILE%\.IdeaIC2017.1\config\plugins\Kotlin\kotlinc\bin 目录中)。 然后就可以在命令行通过 kotlinc 命令来运行 Kotlin REPL 了(Windows 下还是可以找到对应的 kotlinc.bat 双击运行)。
. ├── bin │ ├── kotlin │ ├── kotlin.bat │ ├── kotlinc │ ├── kotlinc-js │ ├── kotlinc-js.bat │ ├── kotlinc-jvm │ ├── kotlinc-jvm.bat │ └── kotlinc.bat ├── build.txt ├── lib │ ├── allopen-compiler-plugin.jar 我们来看一下kotlinc的命令: #! "${DIR}"/kotlinc "$@" 我们可以看出,直接是依赖kotlinc。 /.bashrc, 命令行输入kotlinc, 即可REPL环境,我们可以看到如下输出: $ kotlinc Welcome to Kotlin version 1.1.2-2 (JRE 1.8.0_40
经常用终端的人都知道,终端命令有很多选项可以指定,这里我们以相关的kotlinc为例,我们可以在终端这样指定选项 1 2 3 4 5 kotlinc -Werror . 上面的命令执行中断,不会导致class文件生成 编译选项有哪些 Kotlin的编译选项分为标准选项和高级选项 如下是一些标准选项的内容(使用kotlinc -help获取) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 kotlinc -help Usage: kotlinc-jvm compiler arguments from the given file, containing one argument or file path per line 如下是更加高级的选项(使用kotlinc -X Usage: kotlinc-jvm <options> <source files> where advanced options include: -Xadd-compiler-builtins
JetBrains/kotlin/releases/tag/v1.3.21, 进入网页,找到kotlin compiler, 点击下载,解压并把kotlin.bat所在目录(Kotlin compiler\kotlinc \bin)加入环境变量2.设置配置文件打开sublime text 3, Tools--build system--new build system, 设置配置文件:{ "cmd": ["kotlinc
$ kotlinc -script list_folders.kts <path_to_folder> 参考文章: https://stackoverflow.com/questions/34974039 You can use the command line compiler: kotlinc -script foo.kts <args> Or you can invoke the script directly
Gradle 插件,完成对工程信息的获取和产物加载代码的插入,达到对工程代码 0 入侵的效果 外部依赖部分:完成整个流程所需要的外部依赖程序,包括文件监控的 watchman、完成源码编译的 javac、kotlinc 简单的讲就是:使用 kotlinc 在一次编译中所有的文件的集合。 因为每次 kotlinc 编译文件之后都会生成一个 xxx.module 的文件,这个文件会记录本次编译所有的类的信息,在编译 internal 修饰的方法时,会进行可见性检查。 举一个例子:A、B 两个类使用 kotlinc 一起编译后,两个算是一个模块,但是如果 kotlinc 分别两个文件编译就不算一个模块。 B 中方法 A 的 internal 方法 sayHello() error: cannot access 'sayHello': it is internal in 'A' 这个问题在官方文档和 kotlinc
比如说kotlinc这个程序,我们知道,Kotlin基于Java虚拟机(JVM),通过Kotlinc编译器生成的JVM字节码与Java编译的字节码基本相同,也因此与Java可以完全兼容,并且语法更加简洁 } Compile the application using the Kotlin compiler $ kotlinc hello.kt -include-runtime -d hello.jar If you want to see all available options run $ kotlinc -help Run the application. $ kotlinc hello.kt -d hello.jar Since binaries compiled this way depend on the Kotlin runtime you $ kotlinc -script list_folders.kts <path_to_folder_to_inspect> 使用 Intelli IDEA开发Kotlin程序 Kotlin是JVM
Kotlin脚本编程 Kotlin脚本的扩展名为kts,运行命令为kotlinc -script <脚本文件名.kts> HelloWorld示例 下面我们来看一个HelloWorld示例: 新建名称为 可以看到脚本程序不需要主函数,Kotlin脚本以args参数接收用户输入(args是一个Array<String>类型的数组) 在命令行执行:kotlinc -script Main.kts 高寒 得到脚本运行结果为 ).start() process.waitFor() process.inputStream.reader().use { println(it.readText()) } 在命令行中执行kotlinc
Path 下添加 bin 可以通过在命令提示行中输入 kotlinc –version 指令进行验证是否安装成功。 启动 REPL 可以通过 Kotlin 编译器提供的 kotlinc 命令或 IntelliJ IDEA 工具中选择 Tools → Kotlin → Kotlin REPL 菜单。 打开命令提示行输入 kotlinc 命令。 Kotlin REPL 提供一些前面带有冒号(:)的管理指令,例如 “:quit” 指令是退出 REPL,“:help” 指令是帮助。
第4章 kotlin代码执行过程 4.1 kotlinc执行原理分析 4.2 kotlin代码执行过程 4.3 Kt.class与Java.class区别 ---- 《Kotlin极简教程》正式上架:
A(val id:Int,val name: String = "zhangsan", val age: Int = 8) 如果 A 与 B 类在一个模块里面同时参与编译是不会有任何问题的,因为 kotlinc 通过 Decompile 发现, B_1.0 模块的 new 初始化在 A_2.0 没有这个构造,这是 kotlin 的一个特性,对于设置了默认参数的方法,kotlinc 会再生成一个方法,然后新增两个参数 这个地方的主要问题是,kotlinc 不仅会对默认参数的方法生成 synthetic method,还会对调用处进行更改,如果调用处缺省默认参数,调用处就会被 kotlinc 强行增加标志位,然后改成调用
为了验证假设,我们分别用kotlinc 和groovyc 将之前的代码编译成class 文件,然后再使用javap 指令进行反汇编。 编译/反编译KotlinTest.kt: # $ kotlinc KotlinTest.kt # $ javap -c KotlinTest.kt Compiled from "KotlinTest.kt =null){ callback.on() } } kotlinc 编译器在编译过程中将操作符?. 完完全全地替换成if (callback != null) {} 代码块。 Android gradle plugin (AGP) 我们发现每次使用前都需要手动添加代理关系实在麻烦,能否像javac 或者kotlinc 那样在编译过程或者构建过程中使用自动化的方式代替手动添加呢
认识AGP 简介 AGP即Android Gradle Plugin,主要用于管理Android编译相关的Gradle插件集合,包括javac,kotlinc,aapt打包资源,D8/R8等都是在AGP 编译成二进制文件 链接:合并所有已经编译的文件,生成R.java和resource.arsc AIDL文件编译 将项目中aidl文件编译为java文件 Java与Kotlin文件编译 通过Javac和Kotlinc 回复:当java,kotlin混编的时候,先执行kotlinc将kotlin文件编译成class字节码,再执行javac将java文件编译成class字节码。 为什么kc比javac先执行? 方法的名字进行混淆,使用更短更无规律的字符替代名字 preverify:对字节码进行校验,是 ProGuard 对前面所有优化的一个正确性校验 题外话 从这一步可以看到三方库的二进制文件是不会参与javac/kotlinc :0.0.2, 02版本C中仅有funY 1个接口方法 A,B单独编译都没问题,但是如果A,B被引入到app module中就有问题了 这个时候,A,B,C都是二进制形式,不会参与javac/kotlinc
Apple clang version 16.0.0 (clang-1600.0.26.4) R 版本:Rscript (R) version 4.4.2 (2024-10-31) Kotlin 版本:kotlinc-jvm ) Fortran 版本:GNU Fortran(Homebrew GCC 14.2.0_1)14.2.0 R 版本:Rscript(R)版本 4.4.2(2024-10-31) Kotlin 版本:kotlinc-jvm
为了验证这个假设,我们分别用kotlinc 和groovyc 将之前的代码编译成class 文件,然后再使用javap 指令进行反汇编。 编译/反编译`KotlinSample.kt`: # $ kotlinc KotlinSample.kt # $ javap -c KotlinSample.kt Compiled from "KotlinSample.kt =null){ callback.on() } } 由此可见:kotlinc 编译器在编译过程中将操作符?. 完完全全地替换成if (callback ! 集成Android gradle plugin (AGP) 我们发现每次使用前都需要手动添加代理关系实在麻烦,能否像javac 或者kotlinc 那样在编译过程或者构建过程中使用自动化的方式代替手动添加呢
我们使用时会是下面的样子 1 2 3 //the old way SingleExtKt.toSingle("Kotlin"); ObservableExtKt.toObservable(Arrays.asList("Kotlinc better way using @file:JvmMultifileClass RxUtil.toSingle("Kotlin"); RxUtil.toObservable(Arrays.asList("Kotlinc
在我们的代码被 CPU 执行之前,有以下几个重要的编译器:javac/kotlinc、D8、R8 和 ART 。 其中的每一步都有机会做优化,但是它们做了吗? kotlinc fun multiply(value: Int) = value * 2 fun divide(value: Int) = value / 2 fun shiftLeft(value: Int) = value shl 1 fun shiftRight(value: Int) = value shr 1 在 Kotlin 1.4-M1 版本下通过 kotlinc 将 Kotlin 编译成 $ kotlinc Example.kt $ javap -c ExampleKt Compiled from "Example.kt" public final class ExampleKt { 编译(Kotlin 1.4-M1) : $ kotlinc Example.kt $ javap -c ExampleKt Compiled from "Example.kt" public final
源代码文件:Java、Kotlin 资源文件:Xml(布局、String、Drawable等)、图片 4.4.1 源代码编译 对于 Java 和 Kotlin 源代码的编译,需要使用到 javac 和 kotlinc # 执行kotlinc/javac 命令 sh kotlinc{or javac} \ -classpath \ ${projectPath}/build/intermediates/classes/$ 但是上面代码中的 import 并不是一个普通的形式,这样的语法如果直接使用标准 kotlinc 进行编译,会出现找不到 import 错误。 sh kotlinc -Xplugin=lib/android-extensions-compiler.jar -P plugin:org.jetbrains.kotlin.android:package 6.3 Kotlinc 环境变量问题 在使用 Android Studio 开发过程中,Kotlin 编译所需的依赖包都是由 IDE 自动管理,但是 Savitar 是使用 Shell 实现,这样的情况下面就需要关心这个编译工具的问题了