为什么我是TCL式的

2020-10-27 00:57:40

我是Tcl编程的铁杆粉丝,喜欢工具命令语言(Tool Command Language),尽管现在它显然已经过时了。“当我有自由选择的时候,我倾向于使用Tcl来处理任何不需要以最快速度运行的东西(任何能以最快速度运行的东西,可能也会用C++)。”

我在彭博社的一位同事曾问我,什么时候我会放弃用tcl这样一种古老的语言编写实用程序,转而使用Python这样更现代的语言。“我或许应该回答说,我觉得你缺乏信心令人不安,但我只是说了一些蹩脚的话,大意是这样的更新会降低我在😉上的工作效率。”

在我从事计算机工作的47年里,在不同的时候,我一直对几种不同的编程语言充满热情:

Static Language Static Language(圣安德鲁斯静态语言)--这是纯函数式编程语言在任何地方的第一个实际实现,我只是碰巧在1975-6年间得到了使用它的机会。

PROLOG语言-逻辑语言中的经典编程,又是另一个完全不同但又一致的范例。

Perl语言-与上述完全相反,这是一种基于实用性而不是纯洁性的非常老套的语言,非常适合快速解决某些类型的问题,但真的根本不能很好地扩展。

TCL的工具命令语言,对我来说,这切中了上述两者之间的最佳切入点。

喜欢Tcl的程序员倾向于认为它干净、有逻辑、始终如一。然而,大多数人倾向于拒绝它,抱怨它引用地狱和各种尴尬,基本上归根结底是它与他们习惯的太不同了。实际上,Tcl有一种激进的极简主义,这使得它与大多数编程语言遵循的常见模式真的不同。大多数编程语言混合了语法和语义。每种语言构造(例如,用于条件执行的IF-THEN-ELSE)都有关于它如何编写(语法)和如何操作(语义)的单独规则。语言定义作为一个整体包括所有这些特定的语法和语义元素。

相比之下,Tcl的本质是一个非常小而简单的核心,它只定义如何定义和使用变量、数据值、一般命令和事件。唯一的语法规则是定义如何调用通用命令并将数据传入和传出它的那些规则。尽管这些都记录在MAN Tcl中,但没有针对特定命令的特殊语法。所有功能都定义为单个命令的语义。流控制是由以其他命令为参数的命令完成的。因此,If-Then-Else功能是由名为";If";的命令提供的;因此,If-Then-Else功能是由名为";If";的命令提供的。因此,If-Then-Else功能是由名为";If";的命令提供的。其参数是要测试的条件、条件为TRUE时要执行的代码以及条件为FALSE时要执行的代码(可选)。

这种设计在某些方面可能很麻烦。例如,内核没有算术表达式的语法,这被委托给命令.expr,程序员必须在需要进行一些计算的各个地方显式调用该命令。

然而,这种关注点的划分创造了一种独特的灵活性,可以动态创建或重新定义命令。举一个极端的例子,完全有可能重新定义命令来颠倒它的逻辑。更有建设性的是,在TCL添加面向对象编程的内置命令之前,许多人利用这种语言的灵活性来支持面向对象。

我怀疑这种模块化设计也使Tcl能够更顺利地发展。“自从最初设计以来,Tcl已经融入了许多创新(代码和数据的优化内部表示的缓存;Unicode支持;多线程;协程;完全虚拟化的文件系统操作;语言扩展的版本解耦等)。”对现有的运行代码几乎没有中断,这是Python仍然在努力解决的问题。

我应该说,Lisp语言与我宣称的TCL有许多相同的属性。唯一的区别是,在历史上,Lisp系统往往被认为是自己的宇宙,很少考虑与其他任何东西的互操作。另一方面,TCL一开始是一种旨在嵌入到其他软件中的扩展语言,因此在多个层次上对与其他系统的集成提供了强有力的支持。

最后我们有了Tk提供的跨平台GUI(图形用户界面)支持,这可以从其他语言使用,但与Tcl的结合最为紧密。有关那种可以轻松与Tcl/Tk组合放在一起的便捷但轻量级的工具示例,请参阅:DiskUsage。