随着计算技术的日益发展,尤其是在高性能计算(HPC)和分布式系统领域,可扩展并行编程语言的重要性日益凸显。然而,在推动并行语言的创新过程中,行业内存在许多误解和质疑声音,其中之一便是认为新编程语言难以被采用,成功的并行语言必须是对现有语言的扩展。这种观点限制了思维,忽视了全新语言设计带来的潜在价值和实践证明的成功案例。本文将深入探讨这一争议,揭示新语言与语言扩展各自的优劣势,并分析为何在特定领域尤其是在可扩展的并行计算中,创建全新语言不仅合理,甚至成为必要的选择。首先,回顾历史可以发现,很多现今广受欢迎的编程语言并非简单的扩展现有语言,而是全新设计。比如Java、Python、JavaScript、C#、Go、Rust、Swift以及Julia都在诞生之初就没有依附于旧有语言,然而它们的成功证明新语言完全有可能获得广泛的采纳。
特别是在并行和分布式计算领域,其复杂性和特色与传统的串行及多线程桌面计算存在根本差异,这使得在已有语言基础上进行扩展,往往不能满足设计需求。此外,从设计角度来看,使用全新语言能够带来极大的自由度,帮助构建更贴合现代计算需求的语义模型和语法结构,避免背负传统语言的历史包袱。相比之下,语言扩展虽然表面上看似简便,可以借用现有语言的用户基础、工具链和代码生态,但实际上存在许多挑战。扩展既有语言常常意味着不得不继承其中存在的问题和不适用于当前应用场景的设计。例如,传统高性能计算领域广泛使用的Fortran、C和C++就各自携带了诸多设计限制。Fortran虽然经过长时间演化,但在现代语言设计的流畅性和易用性方面仍显不足。
C和C++拥有丰富的系统编程特性,但诸如指针与数组等复杂且容易引入错误的语义,使得它们难以直接支持大规模科学计算中的并行抽象。基于这些限制,单纯扩展这些语言容易导致设计妥协,牺牲语言的整体应用潜力和吸引力,甚至限制社区接受度。值得注意的是,所谓的“扩展”并非简单的加法,往往是从现有语言中抽取子集,去除某些功能,修改语义,重新定义部分特性,这种“超集的子集”做法虽然灵活,却可能造成语义混乱,降低代码的兼容性。从用户角度看,这种改动有时比完全新语言更具挑战,因为前提是对熟悉语言的认知被改变,增加了新的认知负担。同时,标准委员会的保守性也是限制扩展语言创新的因素之一。标准委员会承担维护语言稳定性、兼容性和长期价值的职责,因此在采纳新特性时往往审慎谨慎,采用渐进式演变策略。
这使得在现有语言框架下推行激进的设计创新变得更加困难,而全新语言在设计时则可以无拘无束地融入前沿理念,快速响应技术发展。在设计全新可扩展并行语言时,有若干关键策略能显著降低采用门槛。首先是采用清晰、熟悉的语法结构,帮助开发者迅速上手。例如Chapel语言遵循类似C语言的语法风格,但在声明语法上做了显著改进,借鉴了Python和Modula的设计,使代码更具可读性与表达力。此外,跨语言的互操作性极为重要。新语言若能够无缝调用现有代码库,大大降低了迁移成本和阻力。
Chapel通过支持调用C、Fortran和Python代码,体现了这种思路。实际上,逐行重写所有现有算法对于实现可扩展并行编程而言并不现实,良好的互操作功能让用户可以渐进式地迁移和集成,提升新语言的实用价值。合理的收益与投入比则决定用户是否愿意接受新语言。新语言应在保留旧技术优势的基础上,提供足够的生产力、安全性和性能提升,才有望推动社区产生转变。MPI等传统并行编程接口历经多年依然占据主导,部分原因在于它们较为成熟稳定,而新语言必须提供显著优势才能吸引用户。最后,搭乘技术浪潮也助力新语言推广。
类似Fortran借助优化编译器崛起,Java借力互联网普及,新兴并行语言应顺应当前普适并行计算与异构架构快速发展的大趋势,抓住人工智能、云计算、GPU加速等关键领域的需求红利,激发更广泛的兴趣与贡献。回顾Chapel设计实例,其语法设计巧妙地将并行作为第一公民,简化了常见的并行编程难题。例如传统的C语言串行循环虽然易于编写,但并行化需复杂的依赖分析,而Chapel通过设计默认并行的迭代器,使串行与并行切换变得自然且语义清晰,其类型系统和语义规则更主动防止常见的并行竞态问题。这些设计体现了“并行即设计核心”带来的根本优势。总结来看,认为可扩展并行语言必须是现有语言扩展的观念,忽略了现代计算环境的复杂需求和新语言设计的潜力。扩展既有语言的路径虽有其合理性和便利,但伴随诸多不可忽视的局限。
新语言凭借灵活设计、清晰语法、优秀互操作和紧密契合技术趋势等优势,完全有能力突破传统壁垒,推动并行编程范式的革新。面对未来计算架构的多样化,拥抱新语言、新理念,将为高性能计算和更广泛软件开发领域带来更高效、更安全、更易维护的解决方案。用创新语言迎接并行计算新时代,或许正是通向更广阔科技天地的关键所在。