硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

Meta 将百万行代码从 Java 移植到 Kotlin

  • 2022-11-24
    北京
  • 本文字数:1161 字

    阅读完需:约 4 分钟

Meta将百万行代码从Java移植到Kotlin

Meta 一直在将他们的Android代码库从Java移植到Kotlin。Meta 的工程师 Omer Strulovich 解释说,在这个过程中,他们学到了许多有趣的经验教训,并积累了一些有用的方法。


Meta 之所以决定采用 Kotlin 开发 Android 应用,是因为他们看到了Kotlin相对于 Java 的优势,包括可空性和函数式编程支持、更简短的代码,以及创建特定领域语言的可能性。Kotlin 工程师还清楚地知道,他们必须将尽可能多的 Java 代码库移植到 Kotlin,以防止 Java 空指针问题潜入 Kotlin 代码库,并减少需要维护的 Java 代码。这不是一件容易的事,从一开始就需要做相当多的调研工作。


Meta 工程师必须克服的第一个障碍是,Meta 使用的几个内部优化工具无法与 Kotlin 正常兼容。例如,Meta 必须更新ReDex Android字节码优化器和语法高亮显示工具 Pygments 的词法分析器组件,并构建一个Kotlin符号处理(KSP)API,用于创建 Kotlin 编译器插件。


在代码转换方面,Meta 工程师选择使用 Kotlin 官方转换器 J2K,它可以作为编译器插件使用。除了一些特定的框架(包括 JUnit)之外,这种方法工作得非常好。但对于特定的框架,这个工具缺乏足够的知识,无法进行正确的转换。


我们已经遇到了很多需要进行小修复的情况。有些很容易做到(比如替换 isEmpty),有些需要做一些研究工作才能搞清楚(与 JUnit 规则的情况一样),还有一些是针对 J2K 本身的 bug 的变通方法,这些 bug 可能会导致出现任何问题——从构建时错误到运行时行为。


处理这种情况的正确方法包括三个步骤:首先是准备好 Java 代码,然后在 headless 模式的 Android Studio 实例中自动运行 J2K,最后对生成的文件进行后续处理,进行所有所需的重构和修复。Meta 已经开源了许多重构工具,以帮助其他开发人员完成相同的任务。


这些自动化转换过程并不能解决所有的问题,但我们能够优先解决最常见的问题。我们针对模块运行转换脚本(我们贴切地称之为 Kotlinator),优先考虑活跃和简单的模块。然后我们观察生成的代码:它们可以通过编译吗?它们是否可以顺利通过我们的持续集成管道?如果可以,我们就提交它们。如果不可以,我们就研究问题,并设计新的自动重构过程来修复它们。


Meta 已经通过这种方式移植了超过 1000 万行 Kotlin 代码,让大多数的 Meta Android 工程师切换到Kotlin来完成他们的日常工作。这个过程也验证了许多预期的结果,包括更短的生成代码和不变的执行速度。但是,从消极的方面来看,Kotlin 编译器比 Java 编译器慢得多。使用 KSP 来处理注解,改进 Java 存根生成和编译时间,这为优化带来了新的可能性,不过仍然需要持续的努力。


如果你对完整的细节感兴趣,请不要错过 Meta 的这篇关于迁移到 Kotlin 的文章。


原文链接

https://www.infoq.com/news/2022/11/meta-port-java-kotlin/


相关阅读:

Kotlin Multiplatform Mobile 进入 Beta 测试

又一巨头从 Java 迁移到 Kotlin:关键应用全部开始切换、安卓代码库超过千万行 Kotlin 代码

2022-11-24 08:0012246

评论

发布
暂无评论
发现更多内容

堡垒机可以试用吗?哪款堡垒机可以?咨询电话多少?

行云管家

网络安全 信息安全 数据安全 堡垒机

低代码领域:发展路径、市场规模及未来趋势洞察!

优秀

低代码

iOS SIGKILL 信号量崩溃抓取以及优化实践

百度Geek说

ios 12 月 PK 榜 崩溃日志

Java jar 如何防止被反编译?代码写的太烂,害怕被人发现

小小怪下士

Java 程序员 反编译

Ansible最佳实践之 AWX 使用 Ansible 与 API 通信tags

山河已无恙

12月月更

Ansible之 AWX 管理清单和凭据的一些笔记

山河已无恙

12月月更

Ansible最佳实践之AWK VS Anssible Tower 界面介绍

山河已无恙

12月月更

OneFlow源码解析:自动微分机制

OneFlow

人工智能 深度学习 框架学习

GaussDB(for Cassandra)新特性发布:支持Lucene二级索引,让复杂查询更智能

秃头也爱科技

非结构化数据暴增,企业如何稳定高效的支撑日均百亿级访问

秃头也爱科技

降价背后,函数计算规格自主选配功能揭秘

Serverless Devs

Serverless 前端 函数计算FC

App 长登录思考与实现part2

石君

App 信息安全 认证

并发编程详解:十三个工具类,十大设计模式,从理论基础到案例实战

钟奕礼

Java 程序员 java面试 java编程

HA高可用软件大致有哪些?大众用的哪款?

行云管家

高可用 ha 高可用软件

更改 HIVE 表字段数据类型有哪些注意事项?

明哥的IT随笔

hadoop hive

动不动问原理,面试官你来讲讲Spring的原理?讲出来我给你开25K

钟奕礼

Java 程序员 java面试 java编程

阿里P8面试官总结的《2023最新java面试题》,搞定90%以上的技术面

钟奕礼

Java 程序员 java面试 java编程

拿到8000元的火焰杯比赛奖金,感谢霍格沃兹测试开发学社

测吧(北京)科技有限公司

软件测试比赛

GitHub狂飙30K+star面试现场,专为程序员面试打造,现已开源可下载

钟奕礼

Java 程序员 java面试 java编程

多引擎可视化数据流实现方案

元年技术洞察

数据中台 数字化转型 专利解析 方舟企业数字化 PaaS 平台 #方舟平台

如何通过C#/VB.NET将PDF转为Word

在下毛毛雨

C# PDF word 转换

MySQL从入门到实战讲解,京东T5大牛学习笔记分享,看完我哭了!

钟奕礼

Java 程序员 java面试 java编程

Redis之String类型和Hash类型的介绍和案例应用

C++后台开发

redis 数据结构 hash 后端开发 C++开发

SAP MM 为UB类型的STO执行VL10B,报错-没有项目类别表存在(表T184L NL 0002 V)-之对策

SAP虾客

SAP MM UB类型STO VL10B T184L

广西移动圆满完成区运会通信保障任务

极客天地

基于分发与计算的GRTN全球实时传输网络

阿里云CloudImagine

互联网 科技 GRTN 全球实时网络传播 分发与计算

腾讯云数据库SaaS服务2022再升级 全面助力企业提升数据库运维能力

科技热闻

PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十]

汀丶人工智能

神经网络 图神经网络 12月日更 11月月更 12月月更

Serverless Devs 重大更新,基于 Serverless 架构的 CI/CD 框架:Serverless-cd

Serverless Devs

Serverless Serverless Devs

Ansible最佳实践之 AWX 创建管理项目的一些笔记

山河已无恙

12月月更

Ansible最佳实践之 AWX 构建高级作业工作流的创建和调度

山河已无恙

12月月更

Meta将百万行代码从Java移植到Kotlin_语言 & 开发_Sergio De Simone_InfoQ精选文章