Fortran现代化的渺茫希望

Hacker News Top 论文

摘要

本文探讨了Fortran在科学计算中受欢迎度下降的现状,并提出借助依赖类型对其进行现代化,以解决熟练Fortran程序员短缺的问题。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/06 01:59

# 一段关于Fortran现代化的渺茫希望 · Amen Zwa, Esq. 来源:https://amenzwa.github.io/stem/PL/FortranModernisation/ ## *一份关于依赖类型Fortran的提案* \[TOC\] 几十年来,IT界一直热衷于起草Fortran的讣告。然而,这门古老的语言依然存活。但近年来,Fortran用户社区开始发出警报:Fortran项目在寻找年轻程序员接替即将退休的人员时遇到了困难,因为这些年轻人不愿将自己的职业生涯奉献给这门陈旧的语言。在实现长期、大规模、高度并行的科学与工程应用方面,目前没有任何语言能与Fortran匹敌,更不用说超越了,就连C和C++也不例外。然而,现代程序员对Fortran一无所知,也毫无兴趣。简而言之,Fortran存在形象问题。 在本文中,我将探讨Fortran人气下降的原因,并讨论可能的补救措施。我在此提出的核心观点如下: - Fortran在科学并行计算中不可或缺 - 行业正面临Fortran程序员短缺的问题 - 行业没有可行的计划来充实后备队伍 我的目标读者包括以下群体: - 维护Fortran语言标准的计算机科学家 - 使用Fortran实现科学软件的科学家和工程师 - 对并行处理和科学编程感兴趣的STEM从业人员 考虑到所涉及主题的广度和深度,读者应是一位在过程式语言和函数式语言方面都有经验的并行编程老手,并且具备简单的类型理论、参数类型理论和依赖类型理论的基本知识。似乎试图为21世纪的艰苦工作强化这门中叶语言近乎疯狂。但事实并非如此。我认为Fortran现代化是值得且必要的。不过,我承认,在当下为2020年代更新Fortran不过是一个**渺茫的希望**(https://en.wikipedia.org/wiki/Forlorn_hope)。 在深入主题之前,先介绍一下我与Fortran的渊源。与20世纪80年代初的其他电气工程本科生一样,我在大学里学习了FORTRAN。我在DEC VAX-11/780上使用FORTRAN 1977。那时FORTRAN是进行**电路仿真**(https://en.wikipedia.org/wiki/Electronic_circuit_simulation)、**数字信号处理**(https://en.wikipedia.org/wiki/Digital_signal_processing)(DSP)、**有限元方法**(https://en.wikipedia.org/wiki/Finite_element_method)(FEM)、**计算流体力学**(https://en.wikipedia.org/wiki/Computational_fluid_dynamics)(CFD)以及其他工程计算的主要语言,因此我们被要求学习这门语言。但在那些日子里,我们大多数STEM从业者都试图学习每一样能接触到的编程语言。当时科学与工程中常用的语言只有少数几种:LISP、FORTRAN、C、Pascal、ML和Prolog;这些语言的良好编译器只在**小型计算机**(https://en.wikipedia.org/wiki/Minicomputer)上可用;而唯一能接触到这些庞大昂贵机器的地方是大学计算中心。稀缺创造需求,我想。我主要使用我偏好的语言进行工作:LISP、C和ML。所以,我的FORTRAN经验仅限于课堂作业。后来,在计算机科学研究生院,我的研究工作让我重新接触了Fortran 90,运行在一台带有**T3D**(https://en.wikipedia.org/wiki/Cray_T3D)附件的**CRAY Y-MP**(https://en.wikipedia.org/wiki/Cray_Y-MP)上。我与Fortran的专业联系在20世纪90年代中期离开学术界进入工业界时结束了。即使在那个年代,IT界也没有人再使用Fortran了。但出于个人兴趣,多年来我一直关注Fortran的演变。因此,我在此提出的观点源于:对旧版FORTRAN过时的亲身经验、对现代Fortran困境的当前认识,以及对许多现代和古老编程语言长达数十年的亲身实践。我承认,虽然在实用层面上我不是Fortran的粉丝,但在智力层面上我由衷钦佩Fortran的原创性、寿命和历史。 现在,让我们开始吧。 ## *昨日* 现代计算机的概念诞生于20世纪30年代末数学家的头脑中。然后,在20世纪40年代中期,现代计算机的实现由电气工程师之手完成。最初,编程是通过连接电路来完成的。随后是通过硬件开关将二进制字输入寄存器。后来,符号汇编语言被发明出来。1957年,**Backus**(https://en.wikipedia.org/wiki/John_Backus),一位杰出的计算机科学家,与他在IBM的同事创造了世界上第一门高级编程语言——**FORTRAN**(https://en.wikipedia.org/wiki/Fortran)。其目的是使科学家能够用他们的母语——数学符号——来实现科学应用,而不是用外语——汇编语言。 在过去的70年里,Fortran不断发展,吸收了数十年的进步。Fortran有许多标准化版本:1966、1977、1990、1995、2003、2008、2018和2023。截至2024年初撰写本文时,最新的标准版本是Fortran 2023(草案),它是一门完全现代化的语言,拥有强大的静态类型系统、用户定义类型、消除尾递归、对象、模块、垃圾收集以及内置的**分区全局地址空间**(https://en.wikipedia.org/wiki/Partitioned_global_address_space)(PGAS)并行编程功能。迄今为止,Fortran是唯一具有内置并行处理功能的标准化语言。 尽管年代久远,尽管几十年的累积,Fortran本质上仍然是一门简单的语言,非程序员也能快速学会使用。从这个意义上说,Fortran像Python一样易于使用。但与Python不同的是,Fortran在科学并行计算方面速度很快——甚至比强大的C还快。如今,现代Fortran仍然是大规模、高度并行应用(这是科学与工程计算的主干)的首选语言。世界上少数精英工程学院仍然向他们的工程本科生教授Fortran,即使他们的计算机科学学生可能从未听说过这门语言。在**超级计算机**(https://en.wikipedia.org/wiki/Supercomputer)上进行高性能并行科学计算方面,根本没有任何现代语言能与Fortran竞争。现代Cobol也是如此。尽管没有本科生会在大学里学习它,但许多大型金融机构仍然严重依赖Cobol来处理海量交易。在**大型机**(https://en.wikipedia.org/wiki/Mainframe_computer)上进行高吞吐量实时事务处理方面,没有现代语言能与Cobol竞争。 第一代高级编程语言出现在20世纪50年代末和60年代初:FORTRAN(1957)——第一门专门为科学计算设计的高级语言;LISP(1958)——第一门为符号计算和自动定理证明设计的函数式编程(FP)语言;ALGOL(1958)——第一门过程式编程(PP)语言;COBOL(1959)——第一门专用商业计算语言;Simula(1962)——第一门面向对象(OO)语言。这些**OG**(https://en.wikipedia.org/wiki/O.G._Original_Gangster)(原始帮派)语言以这样或那样的形式延续至今。现代FORTRAN是**Fortran 2023**(https://wg5-fortran.org/f2023.html)。现代LISP是**Common Lisp 2005**(https://www.lispworks.com/documentation/HyperSpec/Front/index.htm)。现代ALGOL本质上是所有现代PP语言,其中代表是**C 2023**(https://www.open-std.org/jtc1/sc22/wg14/)。现代COBOL是**Cobol 2023**(https://www.iso.org/obp/ui/#iso:std:iso-iec:1989:ed-3:v1:en)。现代Simula是所有现代OO语言,最流行的是**C++ 2023**(https://isocpp.org/std/the-standard)。 LISP在20世纪70年代和80年代基于规则的人工智能(AI)鼎盛时期非常流行。今天,它最著名的用途是作为无与伦比的**Emacs**(https://en.wikipedia.org/wiki/Emacs)编辑器的脚本语言。作为第一门FP语言,所有现代FP语言,如OCaml和Haskell,都是其精神后裔。ALGOL从未走出学术界,但其影响力体现在其后所有PP语言的设计中,包括Pascal、C以及其他现代系统编程语言如Rust、Odin和Zig。C仍然大量用于系统编程——编译器、库、操作系统等。它最著名的用途是Linux内核的实现。Simula也主要是一种学术研究语言。但它深刻影响了Smalltalk和C++。Smalltalk反过来又影响了Objective-C和Java。C++结合了C的效率和Simula的对象,从而将许多有用的OO概念注入了传统上属于PP领域的系统编程。如今,C++几乎用于每一个速度至关重要的应用领域。 因此,LISP、ALGOL和Simula以截然不同的形式延续着。而FORTRAN和COBOL在近七十年中基本保持不变。它们的标准委员会选择保持完全的向后兼容性。例如,Fortran 2023编译器仍然可以编译FORTRAN 1977代码——无需修改!注意,原始风格化名称“FORTRAN”随着Fortran 1990标准的发布变为了现代形式“Fortran”。顺便提一下,FORTRAN代表“formula translator”(公式翻译器),这暗示了其数学血统。向后兼容的好处是可靠性,包括寿命和可靠性两个方面。大多数错误随着时间的推移已被消除,机构可以依赖这些持久语言的存在。当然,向后兼容的缺点是,在这些古老语言诞生几十年后才出现的新概念不得不被硬塞进它们的设计中,从而在语法和语义上产生一种相当别扭的感觉。因此,这些语言的扩展(如模块和对象)尽管现代,但仍显尴尬和过时。因此,FORTRAN和COBOL在现代人眼中显得陈旧过时。 在本节的剩余部分,讨论将集中在Fortran上。但提出的论点和结论同样适用于Cobol,类推即可。 ## *今日* 不可否认,现代Fortran存在形象问题。进入IT行业的年轻程序员正确地认为这门开创性的语言很老。这种看法反映了现实。但这些年轻人错误地认为这门古老的语言仍停留在其原始的初级阶段,认为他们在Fortran上没有未来,认为他们应该只学习行业中当前流行的最新语言。这种假设不仅不正确,而且与现实相反。 IT在20世纪50年代随着现代数字计算机的出现而成为一个专业。但我们现在所熟知的现代IT直到20世纪70年代才出现,当时来自DEC、Data General、IBM和其他制造商的**小型计算机**(https://en.wikipedia.org/wiki/Minicomputer)由于集成电路(IC)的广泛使用而变得价格合理。IT的快速扩张与PP语言的兴起同时发生。C在20世纪70年代初被引入。到20世纪80年代初,它已确立了自己在行业中的主导语言地位,其统治一直持续到20世纪80年代末。C++最终在20世纪90年代初夺走了王冠。Java在不到十年后几乎一夜之间出现,并在20世纪初占据了头把交椅。20世纪10年代,在Web 2.0的推动下,JavaScript迅速崛起。今天,在20世纪20年代,Python因其在机器学习和数据科学中的流行而称王。看来,一种流行工业语言的统治期大致相当于一位罗马皇帝的统治期。这与Fortran的发展轨迹形成鲜明对比。自50多年前C兴起以来,Fortran的人气一直在稳步下降。这种下降在20世纪80年代中期加速,当时**自由软件**(https://en.wikipedia.org/wiki/Free_software)运动成为主流,许多新语言的高质量编译器免费提供。此外,大约在同一时期,**家用计算机**(https://en.wikipedia.org/wiki/Home_computer)的兴起培育了大批寻求学习新语言的新程序员。即使在人气巅峰时期,Fortran也只占据了一个狭窄但深厚的专业领域——科学计算。这些专业应用与超级计算机密不可分,而超级计算机除了最顶尖的大学、最大的公司和资金最充足的政府机构之外,其他人无法接触。这些因素的结合导致了Fortran人气的枯竭。然而,它仍然牢固地扎根于科学计算之中。问题就在于此:那些依赖Fortran的组织再也找不到愿意将职业生涯奉献给这门冒犯他们精致Python品味的古老语言的年轻程序员了。此外,如今大多数程序员从未见过超级计算机;大学不再运营传统的计算中心,因为学校的IT需求现在由云服务满足,所有学生都拥有笔记本电脑、平板电脑和手机。这些因素不利于学生探索Fortran生态系统。因此,那些依赖Fortran执行其任务的组织再也找不到新的程序员来取代即将退休或已经离开劳动力市场的日益减少的年迈程序员。 ## *明日* 如果Fortran人气的下降继续加速,很快将没有足够的程序员来维护大量现有的关键任务代码。章节标题中的“明日”并非夸张;这个问题迫在眉睫。尽管过去三十年来行业领导者对这个问题的担忧日益增加,但尚未出现全行业范围内的协同努力来解决它。事实上,目前不存在可行的计划。从像Fortran这样根深蒂固、历史悠久的语言中迁移出来至少需要二十年。因此,这种情况是不可持续的。可能的行动方案只有少数几种,但忽视问题、维持现状并非明智选择: - 手动将Fortran翻译成较新的流行语言 - 自动将Fortran翻译成较新的流行语言 - 通过在学术界和工业界系统性地推广来拥抱Fortran - 从现有的现代语言中针对Fortran进行开发 - 彻底现代化Fortran,摆脱所有对昔日旧时光的情感依恋 现在,我们将深入探讨这些选项。 ## 选项 本文旨在促进讨论,而非新Fortran的设计文档。换句话说,这里给出的建议是碎片化的想法,而非硬性规定。事实上,下面呈现的语法可能存在歧义。我的目标不是精确,而是为思考、讨论和传递对Fortran代码腐烂逼近的担忧打下基础。 ## *手动翻译* 可以手动将Fortran程序翻译成现代语言,例如C++、Java、Python或其他。当然,这种翻译

相似文章

NASA依然维护着部分70年代的旅行者号航天器代码

Hacker News Top

这篇文章审视了流行说法背后的现实——即NASA的旅行者号航天器运行着无人能读的Fortran代码,并澄清机载软件实际上是针对专用硬件的汇编语言,同时讨论了在经验丰富的工程师团队逐渐缩小的情况下维护这些70年代系统的挑战。

前沿编程智能体利用元编程适应陌生编程语言

arXiv cs.AI

本文在深奥编程语言上评估了六个前沿编程智能体,发现更强的智能体使用元编程——编写Python程序在陌生的目标语言中生成和调试代码。禁止此策略导致性能大幅下降,而提供Python辅助代码则能提升较弱的智能体。

信任你的编译器:现代C++

Hacker News Top

本文对比了旧的C++性能技巧与现代编译器的能力,表明编译器现在能够将朴素代码优化得比手工调整的技巧更好。包含在AMD Zen 5上使用Clang 21的基准测试。

迈向可理解的软件

Lobsters Hottest

本文批判了当前的编程实践和对大语言模型的依赖,反而主张通过更好的抽象、文档和软件栈来使代码更易于理解和维护。