Kotlin 代码在编译时会“缩小”吗?

Posted

技术标签:

【中文标题】Kotlin 代码在编译时会“缩小”吗?【英文标题】:Does Kotlin code gets "minified" when compiled? 【发布时间】:2020-10-18 05:35:22 【问题描述】:

在 Typescript(或 javascript)中,我总是尝试以这样一种方式编写,即如果我(或其他开发人员)必须在一年内接触我的代码,那么很容易理解正在发生的事情。所以我不会试图找到最短的代码,而是更清晰的代码。

我不担心文件的大小,因为我在生产中知道这个功能:

function myFunction(value: number) 
   if(otherFunction(number)
       return true;
   

   if(yetAtherFunction(number)
       return true;
   

   return false;

将转换为:

function myFunction(n)return!!otherFunction(n)||!!yetAtherFunction(n)

在 kotlin 上会发生类似的事情吗?

我问是因为我发现这种代码:

val myDrawable = item?.image?.let  Uri.parse(it.toString())  ?: R.drawable.my_default_image

对我来说,快速解析以了解正在发生的事情并不容易,为什么要进行 PR 或类似操作。

如果我用更冗长的方式写,它会对最终 apk 的大小产生影响吗?

重要:

澄清一下,我不是在问is it better to write in this or that way?,我是在问编译器是否尝试像 typescript/javascript minifier 那样优化输入。

【问题讨论】:

诚实地写下对你来说正确和清楚的东西。编译器已经变得非常高效,除非您发现性能问题,否则不需要预先优化。什么是“干净的代码”或“可理解的代码”是一个见仁见智的问题。 也许你在问app size?相关:How to use Kotlin with Proguard 它被编译为与您编写的语言不同的较低级别代码(字节代码),因此您的问题并不真正适用。 【参考方案1】:

在 Kotlin / Java 世界中,所有代码都必须先编译成字节码,然后才能在任何地方运行,一般来说,这基本上是一个非常优化的二进制 blob,其中不存在空格。

在 JS 等解释型语言中,客户端/浏览器会下载源代码的副本并直接运行源代码。在这些情况下,缩小非常重要,因为它通过删除逻辑冗余字符来减小客户端需要下载的文件的大小。在 TS 中,大多数客户端无法直接运行它,因此它被转译为 JS,这通常是为浏览器/客户端提供的。 (例如存在一些像 Deno 这样的例外,它有一个原生的 ts 解释器)。

您看到内联代码塞进一行的原因纯粹是为了装饰/代码风格。

额外的空格和变量名通常不会影响已编译 android 应用的大小/性能,因此您可以简单地以您认为最合适的方式编写代码。

【讨论】:

以上是关于Kotlin 代码在编译时会“缩小”吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 TypeScript 编译成缩小代码?

左侧分配是否无效,编译时会出现编译错误或评估错误

如何解决flutter项目编译Debug Kotlin报错

为啥VC++ 2010编译器在编译简单代码时会崩溃?

Kotlin 是如何专门编译的?

在 Kotlin Android 中将值传递给函数时进行编译时间检查