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源代码中有很多现在并不被认为是好的编程风格的例子,像:

\\

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

\

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

\

\\

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

\\

\

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

\

\\

使用Clojure重新实现TeX:Cló

\\

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

\\

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

\\

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

\\

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

\\

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

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

\\

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

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

  1. IT技术人,“三十而已”

    最近电视剧<三十而已>热播,我家的电视机自然也是被霸屏,我还是跟着妹纸看了看,开头和结局完整看完,中间看了一点,大部分都是在微信公众号上通过别人的文章看完的.我个人也已经30+了,今天也和 ...

  2. Python编程基础:第三十九节 面向对象编程Object Oriented Programming

    第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...

  3. Python编程基础:第三十八节 问答游戏Quiz Game

    第三十八节 问答游戏Quiz Game 前言 实践 前言 我们这一节还是对之前学习内容的一个综合运用,主要涉及到函数编程.字典以及列表的使用.条件语句.循环结构等等.通过本节的学习读者可以检验之前内容 ...

  4. Python编程基础:第三十六节 模块Modules

    第三十六节 模块Modules 前言 实践 前言 我们目前所有的代码都写在一个文档里面.如果你的项目比较大,那么把所有功能写在一个文件里就非常不便于后期维护.为了提高我们代码的可读性,降低后期维护的成 ...

  5. MFC与Matlab编程总结 (以《Matlab与C/C++混合编程技术(第三版)》-刘维 第五章 生成DLL为例)

    近期要完成一个任务,把人脸超分辨率的算法集成在一个系统中,嵌入人脸库及字典集等.老板的要求是有比较好的界面,目前也只能是VS那一套了,前一段时间完成的项目是用的MFC,这次也就是用MFC来完成吧.但是 ...

  6. SDN实战团技术分享(三十八):DPDK助力NFV与云计算

    DPDK最初动机很简单,网络处理器的软件解决方案,证明IA多核处理器能够支撑高性能数据包处理. 什么是DPDK?对于用户来说,它可能是一个出色的包数据处理性能加速软件库:对于开发者来说,它可能是一个实 ...

  7. Python编程基础:第三十五节 文件删除Delete a File

    第三十五节 文件删除Delete a File 前言 实践 前言 我们这一节来介绍如何删除一个文件,这里需要用到函数os.remove(path)用于删除指定路径下的文件,os.rmdir(path) ...

  8. Python编程基础:第三十四节 文件移动Move a File

    第三十四节 文件移动Move a File 前言 实践 前言 当我们需要将一个文件/文件夹移动到另一个指定路径时,就需要用到shutil.move()函数,该函数需要指定两个参数shutil.move ...

  9. Python编程基础:第三十三节 文件复制Copy a File

    第三十三节 文件复制Copy a File 前言 实践 前言 当我们需要将一个文件中的内容复制到另一个文件中时,就需要用到copyfile()函数,该函数一共有两个参数copyfile(src, ds ...

最新文章

  1. F7-Vue1.0与2.0不兼容列表
  2. 光电耦合NEC2051 的输入输出特性
  3. 数据结构:表达式之中缀转后缀
  4. python安卓附带文件_Android QPython3 可视化-文件(夹)选择:ListFile.py
  5. windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解
  6. [flask 优化] 由flask-bootstrap,flask-moment引起的访问速度慢的原因及解决办法
  7. ap心理可以用计算机吗,AP考试哪些科目需要使用计算器
  8. java命令javac java,使用命令行JAVAC编译Java
  9. ASP.NET MVC5总结(二)@HTML扩展
  10. MYSQL MVCC 实现机制
  11. composer安装及artisan运行问题【小记】
  12. 操作系统实践课程实验报告 总结篇
  13. 如何获取CSDN积分
  14. 机器学习--逐步回归算法,线性回归的特征选择算法
  15. 【面试宝典】HR最喜欢的程序员简历模板,最佳建议篇
  16. win7系统调整屏幕刷新率方法
  17. 网工浓缩笔记以及考点(第四章 无线通信网)
  18. Win10电脑开机后黑屏只有鼠标怎么办?
  19. 系综理论(Ensemble Theory)
  20. Mac系统配置环境变量保姆级教程

热门文章

  1. TRF7970A 天线
  2. PL/SQL 实现行列转换
  3. thinkphp 常用SQL执行语句总结
  4. iphone:解析html的第三库hpple初试
  5. 《企业迁云实战》——1.3 云服务的发展现状
  6. 学习PHP-感谢帅哥分享O(∩_∩)O~
  7. 我讨厌电脑!一个系统管理员的自白
  8. iterator adapter reverse_iterator
  9. oracle concat和,concat和||之間是否存在性能差異?在oracle
  10. php 5.4 +iis+mysql_IIS+FastCGI+PHP5.4.4搭建PHP环境