华为方舟编译器 PK 微软苹果谷歌编译器,到底谁胜出?
记者 | 胡巍巍
受访者 | 刘新铭
出品 | CSDN(ID:CSDNnews)
近日,华为方舟编译器终于正式开源,兑现了在 2019 年 8 月开源的承诺。
与此同时,其代码不在 GitHub,而是在自家开源平台上。这也意味着,华为开源平台同时问世。
可以说,这是华为兑现开源承诺的第一步,因此备受开发者们期待。
基于此,CSDN 采访在计算机语言设计和高级编译器优化技术方面,具有深入实践经验的刘新铭。
刘新铭,鉴释的联合创始人兼首席架构师
以下为根据采访实录整理而成的文章:
在惠普 Java 编译器技术实验室,担任主任的岁月
刘新铭在担任惠普 Java 编译器技术实验室主任时,曾参与团队建设与新技术。在惠普服务器部门任职期间,刘新铭主要负责管理 Java 性能、C / C ++ 编译器和性能分析工具等工作。
期间,刘新铭构建了一套全新的编译器中端,包括新的编译器中间表示、用于创建编译器中间表示的组件集、代码生成器和全套优化。
刘新铭认为,一个好的设计绝不会是出自一人之手,它肯定是融合了团队里每个成员的智慧。为此,刘新铭曾带领团队,和惠普的 HP-UX 团队、英特尔微处理器团队进行了深度合作。
惠普的合作伙伴们,也给刘新铭的团队,提供了数千个应用程序,以帮助他们提高惠普服务器性能,从而在服务器市场中保持竞争力。
在那段时间里,刘新铭目睹了一个完整的生态系统,如何从零开始。他每天都能看到,职业经理人在协调大量复杂的工作,也经常观察他的领导层,如何以合作共赢的态度,与合作伙伴打交道。
刘新铭从这段经历中,深刻体会到,成就一个生态,来自所有参与方的团队合作精神以及其中每个人的个人领导力。
而打造中国本土的 IT 生态,应从跨公司合作方面和开发者角度切入。对此,刘新铭强烈建议新一代开发者,应用科学和量化的方法,来完成开发工作。
编译器的历史
在刘新铭看来,编译器技术的发展,有两个主要驱动因素。
第一个驱动因素,是编程语言的演变,即编写代码以使计算机能执行人们希望它所执行的任务的能力。
它的主要目的,是为了提高编程效率,主要影响的是编译器的语言处理部分。
在计算机历史中,第一种编程语言是汇编语言。但很快,人们发现汇编语言的表达能力太弱,因为你不能要求人类来编写机器代码。
如果真有人愿意这样做,那不仅单调乏味、而且容易出错。
在上世纪 50、60 年代,相继诞生了高性能的 Fortran 和面向金融领域的 COBOL,后来又陆续推出 C、C ++、Java Script 和 Java。
第二个驱动因素,是计算机系统架构的演变。系统架构的每一次变化,都会导致编译器优化发生重大改变。
如果编译器优化处理得当,程序员将无需关注架构的复杂性,并能从硬件中获取最佳性能。以下是一些系统架构的演进:
-
从大型机到 RISC;
-
从单 CPU 到多 CPU;
-
从单核到多核;
-
从纵向扩展到横向扩充。
未来几年内,更高级别的领域特定语言(DSL)将会不断涌现,以支持领域专用架构(DSA)的可编程性。
领域特定编译器将发挥关键作用,连接两端并从 DSA 中获得最佳性能。其中一个很流行的趋势是,将有用于人工智能的 DSL。
用它编写应用程序,将会使能许多人工智能 DSA。因此,我们需要有一个非常好的人工智能领域特定语言编译器(AI-DSC),来从这些人工智能 DSA 中获得最佳性能。
当然,编译器技术的演变,也体现在其他诸多方面。上面介绍的两个驱动因素,主要是为了帮助大家一窥编译器的发展。
如何看待华为方舟编译器开源?
方舟编译器的首席架构师周志德,是刘新铭职场上和生活中的好朋友,因此从该项目启动之时,刘新铭对方舟编译器就有所了解。
刘新铭和周志德,都曾在 MIPS(知名的精简指令集计算的推行者)和 SGI(一个生产高性能计算机系统的跨国公司)公司供职。
十多年来,刘新铭和周志德共同参与了,包括开发 Open64 编译器在内的诸多项目。他们都坚持简单通用的设计原则,践行在正确的抽象层上,做正确的事情,也正因如此,他们开发的 Open64 编译器,可以提供多个中间表征层。
方舟编译器秉持了相同的设计原理,并在其中间表示中,设计了一些特定的 Java 抽象来实现 Java 特定的优化目标。
从华为已公布的内容来看,刘新铭认为,它还有很多的性能提升空间。与此同时,刘新铭认为,它在不久的将来,还会有更多发展机遇。
在刘新铭看来,方舟编译器的发布,对中国 IT 行业来说,是个好消息。并有以下值得关注的点:
1. 这不仅是首个由中国人投资、设计和开发的编译器基础设施。更多人也将了解编译器的各种细节,以及如何在每个设计细节中,以特定方式实现某些特定功能。
2. 方舟编译器还使得创建中国自己的计算机软件生态系统成为可能,甚至有可能产生新的兼具高安全性和高性能的计算机平台。
3. 方舟编译器开源的最大价值,在于它让开源社区里那些渴望改变的开发者,可以充分发挥自己创造力。华为有机会展现其开放的思想、并充分利用这一极富创造力且高度自律的社区。
对于华为的开源平台,刘新铭认为,华为创建自己的开源存储库、而非使用 Github 的原因很明显,就是为了避免美国的潜在干扰。如果华为真的有向 IT 社区,展示其对中国开源运动的无私态度,那么,这一开源代码托管平台,很有可能将成为“中国的 GitHub”。
有了方舟 Java 编译器,用户可以有哪些新体验?
Java 语言在运行时,引入了托管内存,减轻程序员在内存管理上的负担。在运行时,它使用垃圾收集(GC)来释放不再使用的内存。
经过 20 多年的改进,GC 变得越来越好。但是,如果 GC 子系统进入频繁的 GC 模式,它通常会完全占用 CPU 来执行垃圾收集。
这是 Android 应用程序速度,慢于 iPhone 应用程序的一个重要原因。方舟 Java 编译器采用了引用计数(RC),以显著减少对 GC 的需求。
这种特定的优化,构成了性能提升的主要部分。你可以想象一下,当 Android 应用程序,在被方舟编译器编译后加速了 20-30%时,用户将会有怎样的体验。当然,这一假设是建立在编译器实现并按照起初设计的方式执行的条件上。
方舟编译器和微软、Google、苹果编译器的对比
在刘新铭看来,技术水平的高低,取决于开发团队的素质,而非源代码本身。
所有这些公司,都为其编译器投资,建立了非常明确的商业目标。刘新铭举了个例子,微软始终把重点,放在开发人员对其开发平台的粘性上,并为 Windows 平台锚定应用程序可用性。
正因为这种思维模式,微软发明了 C#和 TypeScript。为了进一步增加用户粘性,他们构建了具有丰富集成开发环境(Integrated Development Environment)的专有编译器。
从某种意义上说,它们在 Wintel 桌面平台上非常成功。但是,微软编译器的专有性,使得它在云环境中并不那么成功,更不用说移动计算了。由于专注于开发人员的工作效率,Microsoft 编译器并不注重性能优化。
与微软相反,Google 的编译器投资,也有一个非常明确的商业目标,即降低其云平台的成本。通过改进编译器优化,并在少数关键的应用程序上获得性能提升,Google 减少了为满足业务需求而构建的服务器数量。
基于这样的发展重心,Google 建立了一个相对强大的编译器优化团队。就 Google 编译器优化功能的质量而言,它们在低级优化或指令级优化方面更强大。在某种程度上,他们的优化团队,受到英特尔微处理器设计变化的影响非常大。
苹果编译器团队与微软非常相似,它的商业目标是为了增加开发人员对苹果平台的粘性,包括 MacBook 和 iPhone。
无论出于何种原因,苹果推行使用 Objective C 而不是 Java 作为编程语言。由于使用 Objective C 编写的应用程序是静态编译的,因此它们的运行速度比 Java 快得多,占用空间也小得多。
与运行 Android 手机的 Java 应用程序相比,苹果具有优越的性能优势,与包括华为在内的所有 Android 手机制造商相比,苹果的利润率更高。
此外,由于 Objective C 的性能优势,苹果长久以来并不专注于性能优化,而是采用与 Microsoft 类似的方式,将预算用于提高开发人员的生产力上。
华为的方舟 Java 编译器采用 Google 的思维模式,增强了编译器的性能,旨在缩小华为手机与苹果手机上的 Java 应用程序之间的性能差距。
因此,华为建立了一支比苹果更具优化能力的团队,但远远弱于 Google。然而,由于手机的利润率不是 Google 的核心问题,Google 并没有在 Android 平台上,为优化 Java 上花费太多精力。
因此,可以说,华为在移动端 Java 优化方面,拥有比 Google 更强大的团队。而微软在移动计算领域已经出局,因此在此方面,将华为与微软进行比较毫无意义。
编译器和操作系统之间,有着怎样的关系?
自 Unix 于 1974 年诞生以来,编译器与操作系统,就一直保持着紧密联系。随着 Unix 的推出,贝尔实验室也设计了 C 语言,并用它来搭建 Unix 内核。
与早期的计算机语言不同,例如 Fortran 和 Pascal,它们将 I / O 函数作为语言的一部分,C 语言从语言定义中提取 I / O 函数,并将它们作为标准运行时 libc 库的一部分。
将功能库与语言解耦,是具有里程碑意义的决定,其促进了 Unix 操作系统的快速发展,并使之成为现代主流操作系统。
例如,线程库的创建,使并行编程成为可能。此类线程库定义了 OS 环境中如何支持该线程。
在语言方面,编译器将感知到线程语义的存在、并相应地执行优化。毕竟,操作系统和编译器,都和与系统架构紧密配合,才能获得最佳性能。凭借最佳性能,我们可以节省更多能源,而这对环境也非常有益。
除了性能之外,编译器和操作系统,通常都会为 CPU 架构错误提供补丁,例如 2018 年 1 月 3 日爆出的 Meltdown 问题。这种架构错误在所有 CPU 架构中,都是真实存在的,包括 Intel、Arm 和 Powers。
鉴释在编译器方面的研究和进展
在采访的最后,CSDN 请刘新铭聊了聊自己所在的公司鉴释科技, 据悉,鉴释正在寻求 A+ 轮融资。
在编译器方面,鉴释已经有所成就,其扩展了 Open64 优化框架,并构建出产品线中的静态分析引擎。
Open64,是由 SGI 于 2000 年开源的高性能计算编译器。它包含以高级形式呈现应用程序的中间表示和被称为 HSSA 的稀疏数据模型。
鉴释所做的框架,扩展并增强了指针分析,使得用户能够追踪指针的内容、和指针指向的数据结构的字段。
现有的 Open64 优化框架,只能追踪在复杂控制流程中的数据值。鉴释将其扩展到跨程序 / 模块边界。通过增强后的优化框架,用户可以有效地追踪复杂的内存问题。
由于编译器优化框架在设计之初,就考虑了多语言支持,因此鉴释对稀疏数据建模框架的扩展,自然也支持以多种计算机语言编写的应用程序组件。据悉,鉴释正在寻求 A+ 轮融资,想对鉴释了解更多,可点击阅读原文。
受访者简介:刘新铭,鉴释的联合创始人兼首席架构师,主导鉴释面向 DevOps 的静态代码分析工具的核心研发工作。他在开发和交付高性能计算系统(HPC)编译器和性能分析工具方面拥有数十年的丰富经验,是业界公认的静态代码分析技术专家。
感觉 CSDN 这篇文章的分享,真的讲清楚了一些事。专业。