Lisp, I'm back

Lisp, I'm back.

Lisp, I'm back_第1张图片

    沉寂了很久, 打算重新开始Common Lisp的学习和研究工作。
离开的两三年里, 身边发生了很多变化, 在技术领域里把大部分时间投入到了学习其他语言(Haskell,日语!!!...)和概念(函数式, 类型系统...)里去,
每天周游在家庭生活, 公司工作和语言学习中,疲于奔命的结果是搜集了大量的Lisp论文和书,却没什么时间去看看几眼,
今年开始又有相当的时间可以自由支配, 于是最近有一种冲动想回到阔别两年的"事业"中去,
而就在上周的某个晚上我给自己进行了Project Kickoff(一大包Potato chips和Choco, Cheers!)


Lisp学习的新方法

Lisp, I'm back_第2张图片

    这次不仅仅想按照过去的方法从学习语言特性,实现以及开发应用的角度去理解Common Lisp。 它的体量庞大,历史背景的厚重是让学习曲线看起来陡峭的原因。 SBCL的一位资深开发者也曾建议想要参与SBCL开发的入门者不要试图像阅读书籍一样系统性的学习它, 这样会立刻遭到挫败。

    最近我领悟到了如何去突破这个陡峭的学习曲线, 我们应该像学习OS一样学习它。 Common Lisp那奇于他人的REPL, 解释环境中的宏展开,运行时的增量编译/加载, 庞大的标准函数和对象库,以及代码和数据的模糊界线等等,这个让人感觉如此动态多变的巨型怪兽与一般的编译型语言是如此不同,以至于让很多人或沉迷于此或望而生畏。
    我发现在这些特性中有很多是与现代OS的行为如此吻合, 确切的说它们更像现代OS行为的原始雏形(如果去看看语言发展史,你会发现早期的语言和OS并不像现在的分工这么明确)。 拿Linux系统作类比的话, REPL就像Shell, symbol对象就像文件名(inode), package就像单层目录(而且还支持创建符号连接), 函数和对象就像可执行或数据文件(在runtime里的底层编码甚至就像FS对文件的编码), 标准库里的包和对象就像系统目录和文件, intern一个symbol就像touch一个文件, compile/compile-file以及implicit compilation就像gcc, 定义(编译)一个函数就像用gcc产生一个可执行文件, 调用它无非就是输入参数执行该文件。。。
    如果你拥有一个这样的语言(OS), 你确实可以在运行语言(OS)的同时,去干预(操作)它,去重新编译它的一部分(覆盖文件)等等, 去做些其他语言所不具备的行为。当然, 说这些是OS行为的雏形是有原因的, 毕竟它缺少对安全(权限(用户), 沙箱(进程)), 稳定(用户层与系统层), 操作性(GUI) 等保证系统运行和可用的管理机制。
     因此,我们也许可以像学习和研究OS一样去了解Common Lisp,而不是一般的语言学习方法。 在学习OS时,我一般用以下的方法,
  • 了解用户界面: 学会怎么操作用户界面, 会从错误中恢复, 执行简单的操作。
    • REPL的操作方法, REPL在何时解释脚本(就像执行shell script)何时运行二进制(就像执行c程序), 何种操作是安全的何种是危险的(比如rm -rf /)
  • 了解文件系统: 文件是如何存储, 分布, 底层表示是什么; 一般的操作(CRUD, 查找...); 主要系统文件的作用。。。(从宏观角度去了解文件系统,而不是知道每个文件的内容)
    • 符号怎么索引对象的, 对象怎么存储在image里, 对象有几种类型, 它们的底层存储编码是什么, 如何查找/创建/读取/更新/删除它们
    • 目前语言有多少包/多少符号/多少对像, 标准和实现定义部分主要有哪些(特别要了解能够帮助进一步探索该系统的工具对象集和(就像知道ls, df, cd, more 这些基本命令))。
  • 了解程序调度,体系结构: 知道系统是如何执行程序的, CPU是怎么执行命令的, 以及内存是如何被利用的。
    • 学会看对象在runtime里的形态, 汇编, 反汇编它们, 知道Lisp层和Runtime层是如何交互的, 知道image被加载时和被保存时的形态
  • 学会在该系统上写程序, 知道有哪些库可以利用, 学会调式你的程序。 (从这之后应该和学习其他语言没什么太大区别了。)

Lisp研究的目标

Lisp, I'm back_第3张图片

    很多Lisp爱好者的终极目标就是Lisp Machine。 貌似有VM可以跑这些古老的运行在定制CPU上的系统,但我只看过一些视频。 现代Common Lisp的许多方面可能都留有Lisp Machine的影子(个人觉得特别是CLIM的操作), 因此许多方面类似于OS也是很容易理解的。 作为课题, 个人有几个可选项,

  • 从语言实现的角度出发, 继续研究SBCL的编译器和运行时环境, 参与SBCL的开发和port工作。
  • 从语言应用的角度, 完善McCLIM, 增加GUI的风格, 修正bug, port到其他Backend和OS上, 改善目前开源CL缺乏稳定GUI的窘迫
  • 从语言改善的角度, 将OS的许多特性移植到CL里, 提高CL的安全,稳定和可操作性。(没有必要局限于语言标准的范畴?或产生新的方言)
  • 从语言改善的角度, 将其他语言中优秀的特性移植到CL里, 并去除CL中历史遗留症, 让它进化。(基于标准的基础上,是否可以修改标准?或产生新的方言)

最后。。。

    以后会在这里定期汇报和总结学习研究结果。

你可能感兴趣的:(Lisp)