9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

实现 TeX 的算法:回首编程技术的过去三十年

  • 2015-01-19
  • 本文字数:1847 字

    阅读完需:约 6 分钟

Glenn Vanderburg 是 LivingSocial 的工程主管,在最近的 ClojureConj 会议上,对他使用 Clojure 实现 TeX 算法的工作做了很有趣的叙述。在那个过程中,他发现在过去三十年间,编程技术已经发生了非常大的变化。

TeX 简史

首先,一些历史可能有助于说明 TeX 的重要性。Donald Knuth 在 1982 年发布了 TeX 1.0,32 年后,它仍然代表了计算机排版的先进状态,Glenn 说。此外,TeX 一直是少数几个提供了源代码的大型项目,人们可以从中学习。

TeX 是一部鸿篇巨制:它运行快速、可移植、产出优秀的结果,并且在三十年后它还在广泛使用中,只发现了很少缺陷。

Glenn 特别提到,很有趣的是,当 Knuth 收到他的巨著《计算机编程艺术》的第一页样张,就决定开始编写TeX,因为他发现排版“丑陋得让人失望”。这样,Knuth 开始编写程序,使得他的书看起来自己能够接受。当TeX 可用之后,因为快速排序而为人所知的 Tony Hoare 建议 Knuth 发布源代码,那样从此可以为学生所用,那时是 1982 年,互联网还没有出现,也没有太多源代码示例。这个目标让 Knuth 开始有了文学编程(Literate Programming)的冲动,最终TeX 的源代码在1986 年公诸于众。直到Linux 内核出现之前,它一直是世界上被最广泛阅读的代码,Glenn 说。

TeX 内部

TeX 架构是一个处理文本的管道,它会把文本切分成多种类型的对象,如页、段落、行、词等等,最终生成一个 DVI 文件。从 TeX 出现到现在已经有超过三十年,回顾过去,我们会惊奇的发现它仍然是非常“早期”的东西,Glenn 说。

TeX 源代码中有很多现在并不被认为是好的编程风格的例子,像:

  • 全局变量;
  • 一个字母的变量;
  • goto 语句;
  • 数百行长的过程;
  • 大量宏;
  • 重复代码;
  • 局部变量重用;
  • 到处都是单线程假设;
  • 可变性代码普遍存在

阅读这样的代码就像是在访问另一个时代 […] 在那本书出版的 1986 年,它代表了非常不错的编程方式,但很多方面现在已经过时了。

当时很多方式都是因为受到了当时可用硬件的限制,只有有限的计算能力和可用内存,据 Glenn 所说,Knuth 为了减少函数调用到最小程度做了非常大的努力,而那实在是太昂贵了。这使得 TeX 的代码库高度整合,从而“抽取出任何一个部分都无法独立使用”。

TeX 积极地使用技术来改善手动的操作,我们今天可能会真的看不起那些技术,但我们更应该仰视那些技术,因为要考虑到摩尔定律,不仅仅是那个定律,还有当时的语言实现技术。

使用 Clojure 重新实现 TeX:Cló

因此,Tex 可能并非是今天指导新手程序员的最佳示例,然而,Glenn 之所以要重新实现它,是因为它能够展示出编程技术已经发生了多大改变,并且能够提供真实的示例,说明从过程化转换到函数式语言的时候,算法会发生多大改变。

据 Glenn 所说,想要理解 TeX 代码的功能很困难,大多是因为它的简洁和极度优化,正如上面所概述的。最初,他试图让自己的设计尽可能和 TeX 保持一致。正如上面所说,Tex 严格地单线程执行,而在当今计算机领域,非常重要的一个目标就是利用已经可用的多核硬件。Clojure 非常有用的一种特性是,让他可以把 TeX 的基本管道实现为一系列函数,然后他可以替换线程宏,从而从串行执行模式转换到并行执行模式。“那让我开始做一些像比较两个苹果的工作。” Cló的实现当然要比 TeX 慢很多,但转换到并行执行带来了“巨大的收益”。

Glenn 发现另一个有趣的点是,他在某些时候不得不实现和 TeX 一样的优化。然而,不久他就意识到,那会让他无法使用在函数式语言中天然存在的非常好的抽象,从而让事情比应该的情况更加复杂。这也让他觉得不知道 TeX 的 API 受到了语言模式多么大的影响,特别是普遍的不可变性和单线程的假设。

对于 Glenn 最重要的反映来自于意识到编程技术有了多大的发展。如果我们回顾 1982 年的编程技术,就会看到:

  • 计算机运行缓慢,内存非常小;
  • 大多数程序员从未见过多核处理器,CPU 的字节和比特的大小都不一样;
  • 对于浮点算法没有 IEEE 标准;
  • 可移植性意味着要支持差不多 40 个不同的操作系统,每个都拥有不同的文件系统结构、不同的目录语法、不同的 I/O 和分配 API、字符集;
  • 不可能动态载入代码;
  • 优化编译器还是研究性项目;
  • 没有开源和免费的软件,你需要从头开始实现不可想象的基本内容、常用数据结构和流程。
  • 当版本控制可用的时候,功能还非常初级;
  • 人们还从未听说过自动化测试;
  • 今天的工具非常豪华,但也是多年来小步的改进逐渐得来的。

因此,对于我们还要继续改进编程技术的工作,Glenn 邀请大家首先享受已经存在的良好基础。

查看英文原文: Implementing TeX’s Algorithms: Looking Back at Thirty Years of Programming

2015-01-19 01:195410
用户头像

发布了 340 篇内容, 共 141.8 次阅读, 收获喜欢 13 次。

关注

评论

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

做付费社群,强烈建议大家做这件事!

Immerse

运营 社群 付费

20250713动词ing,ed尾字母双写规则

codists

Python

LambdaQueryWrapper遇上@Async

京东科技开发者

设备维修不是单纯的修机器,这五个方面一定要清楚!

积木链小链

数字化转型 智能制造 设备维修

iCourt与炜衡律师事务所达成战略合作,共建“法律AI数智化实践基地”

科技汇

同济医院R语言训练营第二期开讲!上交大张维拓老师主讲

ModelWhale

R语言 同济医院 上海交通大学

智能体崛起时代,“有灵智能体”如何诠释人机协作,共绘未来工作新图景

网易伏羲

网易伏羲 群体智能 有灵众包 有灵智能体 智能货柜

智源全面开源RoboBrain 2.0与RoboOS 2.0:刷新10项评测基准,多机协作加速群体智能

智源研究院

人工智能 具身智能

MyEMS 4G 网关:打造高效协同的能源管理中枢

开源能源管理系统

开源 能源管理系统 4G网关

如何在 Elasticsearch 中构建你的智能 AI 助手?

阿里云大数据AI技术

人工智能 elasticsearch 运维 数据分析 数据库 大数据

【邀请函】网易灵动露天矿山具身智能技术发布会,7月26日上海见

网易伏羲

网易伏羲 网易灵动 工程机械智能化 无人挖掘机 无人装载机

KWDB 时序引擎核心能力——存储与读写

KaiwuDB

数据库 时序数据库

新能源锂电池制造执行系统(MES)全面解决方案

万界星空科技

mes 新能源行业 制造业工厂 新能源电池 锂电池mes

精准数据检索+数据飞轮自驱优化,彩讯AI知识库助力企业知识赋能和效率创新

彩讯股份300634

京东携手HarmonyOS SDK首发家电AR高精摆放功能

京东科技开发者

被忽视的新能源维修迷局

脑洞汽车

AI

应对VMware转型挑战!腾讯云x Omdia发布业内首个《从VMware到分布式云:企业虚拟化转型实战指南》

极客天地

Omni Recover for Mac(iPhone数据恢复工具)

兮兮立立

精准盘点,无忧管理——RFID智能盘点终端解析

斯科信息

斯科信息 RFID技术

简单了解一下等保测评与密评的几个区别

行云管家

信息安全 等保 等保评测

FinClip战略优势解析:企业级跨平台小程序框架选型指南

xuyinyin

Rigid Audio Kontakt GUI Maker for mac(Kontakt 乐器创建工具)

兮兮立立

多模态情绪分析与意图识别:打造更懂用户的智能Agent

彩讯股份300634

智能浪潮下,Alpha系统如何改写律师行业生存法则

科技汇

拖垮公司的真正元凶:低质量决策

禅道项目管理

项目管理 数据分析 数字化转型 市场分析 禅道项目管理软件

beaTunes5 for Mac(好用的iTunes管理工具)

兮兮立立

DeepSeek部署实战:模型对比、部署优化与应用场景解析

中烟创新

kimi2实测:5分钟造3D游戏+个人网站,真·国产Claude级编程体验,含Cline教程

阿星AI工作室

AI 产品经理 kimi

25年南京正规等保测评公司名单大汇总

行云管家

等保 等保评测

基于业务知识和代码库增强的大模型生成代码实践

京东科技开发者

持续领跑,华为云连续5年蝉联中国容器软件市场份额第一

华为云原生团队

云计算 容器 云原生

实现TeX的算法:回首编程技术的过去三十年_后端_Sergio De Simone_InfoQ精选文章