蚊章汇 - Lisp
type: channel
link: https://linuxcn.bwsl.wang/tag/Lisp/
items: 上古的 MIT Lisp 机器系统软件的最后一个版本恢复成功
items: 硬核观察 #960 某个在应用中利用零日漏洞的团队已被解散
items: 一起来学习 Lisp 编程语言吧！
items: 《代码英雄》第三季（7）：与机器对话
items: Lisp 是怎么成为上帝的编程语言的

上古的 MIT Lisp 机器系统软件的最后一个版本恢复成功
type: item
date: 2023-04-04T17:11:00+08:00
description: 这是非常重要的、上古的计算机上运行的，古老软件的新版本。LM-3 项目宣布了 MIT CADR Lisp 机器 （ Lisp Machine ） 系统软件的第 100 版，这是它的最后一个版本。它既是一个新的版本，也是一个非常 古老的版本。前两天，IBM 的 Eric Moore 在 LinkedIn 上发布了关于这个版本的 消息，他帮助了这项恢复工作。该项目的一个更详细的 帖子 描述了这个软件是什么，以及它是从哪里恢复的。为什么这很重要？好吧，这款软件和它所运行的机器，是一场 “重要战斗” 的标志和纪念物。那场战斗是一场战争的一个阶段：一场以 “针锋相对的方式” 制造计算机的战争。“历史是由胜利者书写的”，温斯顿·丘吉尔 不是 第一个这样说的人。这场战争和大多数战争一样，是两个 “对手阵营” 之间的战争。一方认为，制造计算机的正确方法是用最好的语言编写最好的软件，如果有必要的话，还要设计精工巧做的计算机来运行这些软件。另一方认为制造计算机的正确方法是制造小而快、容易而简单的软件和硬件，完成大多数人当时需要的工作。同样，像大多数战争一样，这场战争是漫长而险恶的，双方都有一些肮脏的内斗。最终，有一方取得了决定性的胜利，但已经花了太长的时间，胜利者大多是开始战斗的那些人的后代和亲属。如今，他们甚至根本不记得有这么一场战争，而胜利的一方最终吸收了很多失败一方的想法和技术。最终的结果是，软件并不小而快，也不容易而简单。胜利的一方忘记了他们在战斗，也忘记了与之战斗的对手。当胜利者忘记他们已经胜利了，也忘记了他们在战斗，这意味着失败者可以写一些最好的战争总结。一篇著名的报道是写自 1991 年的文章，名为《Lisp：好消息，坏消息，如何大获全胜》，其中说：这两种哲学被称为 “ 做正确的事 （ The Right Thing ） ” 和 “ 差点则更好 （ Worse is Better ） ”。“做正确的事” 是麻省理工学院/斯坦福的设计风格。另一边呢？早期的 Unix 和 C 就是使用这种设计流派的例子，我将把这种设计策略的使用称为“新泽西方式”。这篇文章只有短短几页，但如果你现在没有时间，用一句话可以概况，即 “差点则更好”。换句话说，一方从麻省理工学院和斯坦福大学开始，他们最终设计了一种叫做 Lisp 机器 （ Lisp Machine ） 的计算机。另一方建立了 Unix 和后来专用的工作站，以快速运行 Unix，这需要可以快速运行编译的 C 代码的特殊处理器，它被称为 RISC 芯片。英特尔和 AMD 将 RISC 的一些技术和方法改编为 486 和奔腾芯片，AMD 则改编为皓龙和 x86-64，结果是 x86 电脑最终将 RISC 工作站赶出了市场。不过，今天，由于高端的 苹果芯片 Mac 和低端的 RISC-V，RISC 正在复兴当中。但是，x86、RISC 和 CISC，以及 基于 Algol 的整个语言家族，包括从 BASIC 到 C++、到 Pascal、到 Go，基本上都是胜利一方的派别。而另一方现在几乎都被遗忘了，但有两个大的例子。一个是已故伟大的 约翰·麦卡锡 （ John McCarthy ） 创造的 Lisp，以及 整个基于 Lisp 的操作系统 所运行的 Lisp 机器。另一个是 Smalltalk 和施乐公司的 Alto。麻省理工学院第一次尝试建造运行 Lisp 的计算机是一台 1974 年的原型机，名为 CONS，它以 Lisp 的一个关键词命名。1979 年，它更成功的后代被称为 CADR。CADR 计算机后来成为两家商业 Lisp 机器公司 LMI 和 Symbolics 的首批产品的基础，后者拥有互联网上的第一个 .com 域名。这些公司的成立，以及它们的软件的分拆，开始了 一个叫 理查德·斯托曼 （ Richard Stallman ） 的年轻黑客的职业生涯。这条蓝色的导火索启动了 Emacs、GNU 项目，以及 自由软件运动 （ Free Software movement ） 。该项目建立了 GCC 等工具，这些工具被用来创建 Linux，而 Linux 本身也启动了 开源运动 （ Open Source movement ） 。这次恢复的软件是麻省理工学院 CADR Lisp 机器的系统软件的最终版本。该软件是从麻省理工学院 技术广场磁带 （ Tapes of Tech Square ） （ToTS）收藏中的备份磁带上提取的，但它花了十年的时间来提取数据，对其进行清理，并使其在 35 年后首次运行。这是一个庞大的 工程。是的，如今可以运行这个软件，至少在软件模拟器上可以运行，比如最初由 Brad Parker 开发的 usim。它的源代码和一些历史都在 GitHub 上。via: http…

硬核观察 #960 某个在应用中利用零日漏洞的团队已被解散
type: item
date: 2023-04-04T02:26:56+08:00
description: 某个在应用中利用零日漏洞的团队已被解散之前我们报道过，某个主流电商应用利用零日漏洞达成不可卸载、窃取用户信息等恶意功能，后被谷歌 下架。此事也被其它安全团队独立 验证。据外媒报道，该公司有上百人负责挖掘安卓漏洞，并利用这些漏洞。最初带有恶意功能的版本只针对农村和小城镇的用户，以避免被发现。通过收集用户活动的大量数据，它得以提供更具有个性化的推送通知和广告，吸引用户打开应用并下单。此事曝光发酵后，该团队被解散，大部分人员被分流。并释出了新的版本移除了漏洞利用代码，但底层代码仍保留在其中。安全专家表示，他们从未看到过一个主流应用会那样做。消息来源：CNN老王点评：我的理解是，这就是“知行合一”。上古的 LISP 机系统软件 v100 恢复成功这是 MIT CADR Lisp 机的系统软件的最后一个版本。因此，这既是一个新的版本，也是一个非常古老的版本。这款软件和它所运行的机器是一场“重要战斗”的标志和纪念物，那场战斗是一场以敌对方式制造计算机的战争。战斗的双方，MIT/斯坦福一方认为，制造计算机的正确方法是用最好的语言编写最好的软件，如果有必要的话，还要设计特殊的花哨的计算机来运行这些软件；新泽西一方认为制造计算机的正确方法是制造小而快、容易和简单的软件和硬件，做大多数人在当时需要的事情。结果我们都知道了，MIT Lisp 机已经湮没在历史中；而胜利方开发出了 Unix 和 C，建立了 RISC、CISC、X86 指令架构，和基于 Algol 的整个语言家族，包括从 BASIC 到 C++ 到 Pascal 到 Go。被恢复的是 MIT CADR Lisp 机的系统软件的最终版本，从备份磁带上花费了十年的时间提取和清理，并使其在 35 年后首次运行。消息来源：The Register老王点评：真是尘封的历史文物。Tor 合作推出的新浏览器不使用洋葱网络Tor 项目正在推出一个注重隐私的浏览器 Mullvad 浏览器，它并不是连接到去中心化的洋葱网络。该浏览器的主要目标是使广告商和其他公司更难在互联网上追踪你。默认情况下，该浏览器通过屏蔽元数据，使网站更难对你进行 “指纹” 识别。此外，它还阻止了第三方 Cookie 和跟踪器，并预装了一些插件来进一步减少你的指纹。消息来源：The Verge老王点评：虽然装插件也可以实现，但是开箱即用还是会方便。只是这种浏览器有时候并不太方便。

一起来学习 Lisp 编程语言吧！
type: item
date: 2022-06-24T20:40:00+08:00
description: 许多大型代码库中都有 Lisp 代码的身影，因此，熟悉一下这门语言是一个明智之举。早在 1958 年，Lisp 就被发明出来了，它是世界上第二古老的计算机编程语言（LCTT 译注：最古老的编程语言是 Fortran，诞生于 1957 年）。它有许多现代的衍生品，包括 Common Lisp、Emacs Lisp（Elisp）、Clojure、Racket、Scheme、Fennel 和 GNU Guile 等。那些喜欢思考编程语言的设计的人，往往都喜欢 Lisp，因为它的语法和数据有着相同的结构：Lisp 代码实际上是 一个列表的列表 a list of lists ，它的名字其实是 “ 列表处理 LISt Processing ” 的简写。而那些喜欢思考编程语言的美学的人，往往都讨厌 Lisp，因为它经常使用括号来定义范围；事实上，编程界也有一个广为流传的笑话：Lisp 代表的其实是 “大量烦人的多余括号” Lots of Irritating Superfluous Parentheses 。不管你是喜欢还是讨厌 Lisp 的设计哲学，你都不得不承认，它都是一门有趣的语言，过去如此，现在亦然（这得归功于现代方言 Clojure 和 Guile）。你可能会惊讶于在任何特定行业的大代码库中潜伏着多少 Lisp 代码，因此，现在开始学习 Lisp，至少熟悉一下它，不失为一个好主意。安装 LispLisp 有很多不同的实现。比较流行的开源版本有 SBCL、GNU Lisp 和 GNU Common Lisp（GCL）。你可以使用发行版的包管理器安装它们中的任意一个，在本文中，我是用的是 clisp（LCTT 译注：也就是 GNU Lisp，一种 ANSI Common Lisp 的实现）。以下是在不同的 Linux 发行版中安装 clisp 的步骤。在 Fedora Linux 上，使用 dnf：$ sudo dnf install clisp 在 Debian 上，使用 apt：$ sudo apt install clisp 在 macOS 上，使用 MacPorts 或者 Homebrew：# 使用 MacPorts $ sudo port install clisp # 使用 Homebrew $ brew install clisp 在 Windows 上，你可以使用 clisp on Cygwin 或者从 gnu.org/software/gcl 上下载 GCL 的二进制文件。虽然我使用 clisp 命令来运行 Lisp 代码，但是本文中涉及到的大多数语法规则，对任何 Lisp 实现都是适用的。如果你选择使用一个不同的 Lisp 实现，除了用来运行 Lisp 代码的命令会和我不一样外（比如，你可能要用 gcl 或 sbcl 而不是 clisp），其它的所有东西都是相同的。列表处理Lisp 源代码的基本单元是 “ 表达式 expression ”，它在形式上是一个列表。举个例子，下面就是一个列表，它由一个操作符（+）和两个整数（1 和 2）组成：(+ 1 2) 同时，它也是一个 Lisp 表达式，内容是一个符号（+，会被解析成一个加法函数）和它的两个参数（1 和 2）。你可以在 Common Lisp 的交互式环境（即 REPL）中运行该表达式和其它表达式。如果你熟悉 Python 的 IDLE，那么你应该会对 Lisp 的 REPL 感到亲切。（LCTT 译注：REPL 的全称是 “Read-Eval-Print Loop”，意思是 “‘读取-求值-输出’循环”，这个名字很好地描述了它的工作过程。）要进入到 REPL 中，只需运行 Common Lisp 即可：$ clisp [1]> 在 REPL 提示符中，尝试输入一些表达式：[1]> (+ 1 2) 3 [2]> (- 1 2) -1 [3]> (- 2 1) 1 [4]> (+ 2 3 4) 9 函数在了解了 Lisp 表达式的基本结构后，你可以使用函数来做更多有用的事。譬如，print 函数可以接受任意数量的参数，然后把它们都显示在你的终端上，pprint 函数还可以实现格式化打印。还有更多不同的打印函数，不过，pprint 在 REPL 中的效果就挺好的：[1]> (pprint "hello world") "hello world" [2]> 你可以使用 defun 函数来创建一个自定义函数。defun 函数需要你提供自定义函数的名称，以及它接受的参数列表：[1]> (defun myprinter (s) (pprint s)) MYPRINTER [2]> (myprinter "hello world") "hello world" [3]> 变量…

《代码英雄》第三季（7）：与机器对话
type: item
date: 2021-01-18T20:22:00+08:00
description: 代码英雄讲述了开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。什么是《代码英雄》 代码英雄 Command Line Heroes 是世界领先的企业开源软件解决方案供应商红帽（Red Hat）精心制作的原创音频播客，讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA 等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。本文是《代码英雄》系列播客《代码英雄》第三季（7）：与机器对话的音频脚本。导读：创造一台会思考的机器在 20 世纪 50 年代似乎是科幻小说。但 John McCarthy 决定把它变成现实。他从一种叫做 LISP 的语言开始。Colin Garvey 介绍了 McCarthy 是如何创造出第一种人工智能语言的。Sam Williams 介绍了早期人们对思考机器的兴趣是如何从学术界蔓延到商业界的，以及在某些项目没有兑现承诺之后，漫长的人工智能寒冬是如何最终到来的。Ulrich Drepper 解释说，人工智能的梦想超出了当时硬件所能提供的范围。但硬件每天都在变得更强大。Chris Nicholson 指出，今天的机器有足够的处理能力来处理人工智能的资源需求 —— 以至于我们正处于人工智能研发的革命性复苏之中。最后，Rachel Thomas 确定了 LISP 之外的人工智能语言 —— 证明了人工智能现在正准备做的不同类型的任务。00:00:05 - 播音员：卡斯帕罗夫非常慌乱。虽然已经拼尽全力，但是他意识到，他已经输了。00:00:12 - Saron Yitbarek：1997 年的春天，国际象棋冠军 加里·卡斯帕罗夫 Garry Kasparov 输给了计算机程序“深蓝”。对于机器智能来说，这是历史上的关键时刻。对于某些人来说，这是一次生存危机，是对人类智慧至上的挑战。但是，对于世界上的技术专家来说，这是另一种意味上的里程碑，是 人工智能 artificial intelligence （AI）领域的一次飞跃。这表明，想要真正的智慧机器诞生，或许不是太过于疯狂的梦想。00:00:47 - 播音员：去赋予一台机器思考的能力仍然还是梦想，距离实现梦想还需要很多年的努力。此外，还需要做出不少惊人的突破。00:00:56 - Saron Yitbarek：我们是如何抵达这一步的？是什么导致了卡斯帕罗夫那场著名的失败？我们从哪里来，又该到哪里去？我是 Saron Yitbarek，这里是《代码英雄》，一档来自红帽的原创播客节目。在本季，我们都在探索编程语言的奥秘，揭开他们的历史和发展潜力。这一期让我们关注人工智能。你会使用什么语言，来让你的机器拥有自己的思想呢？我们的编程语言如何帮助我们抵达“深蓝时刻”，甚至是更远的地方？什么样的编程语言能最适配会思考的机器？这是我们半个多世纪以来一直在尝试解决的问题。因此，我们的故事要追溯到 1940 年代，那时，人工智能这个词汇还没有被创造出来。00:01:59:回顾二战结束是如何结束的，我们有这样一种感觉，那就是技术帮助同盟国赢得了战争。人们乐观地认为，科技可以成就一切。整整一代人都相信计算机的力量。在这一代人中诞生了人工智能的教父，一位出色的数学家 —— 约翰·麦卡锡 John McCarthy ，他从根本上改变了我们与机器交谈的方式。我想知道他的思想的起源，以及范式的转变是如何发生的。我的意思是，对于初学者来说，当麦卡锡和他的同事们在想象智能机器的未来时，他们到底想象了什么？00:02:43 - Colin Garvey：哇，这是一个好问题。00:02:46 - Saron Yitbarek：我和 Colin Garvey 聊了聊。他是 伦斯勒理工学院 Rensselaer Polytechnic Institute 科学与技术研究系的历史学家。以下是我们的一些聊天内容：00:02:58 - Colin Garvey：麦卡锡对提出 AI 究竟是什么这件事情非常谨慎。不过，举个例子来说，他可能在他最著名但并未实现的程序中描述过（这只是一个思路），人工智能是一个 接受建议者 advice taker 。接受建议者这个说法由麦卡锡于 1960 年的名为《 具有常识的程序 Programs with Common Sense 》的论文中提出的。在开始的时候，你觉得接受建议者可能是一个会学习的机器人，这是它被发明的本意，它算是一个可以接受建议的家用机器人。你说：“不，你这样做是错误的，要那样做。”它就会明白你的意思。00:03:44 - Saron Yitbarek：那很有帮助。00:03:45 - Colin Garvey：可能会有帮助。那时候接受建议者要…

Lisp 是怎么成为上帝的编程语言的
type: item
date: 2018-11-21T01:15:00+08:00
description: 当程序员们谈论各类编程语言的相对优势时，他们通常会采用相当平淡的措词，就好像这些语言是一条工具带上的各种工具似的 —— 有适合写操作系统的，也有适合把其它程序黏在一起来完成特殊工作的。这种讨论方式非常合理；不同语言的能力不同。不声明特定用途就声称某门语言比其他语言更优秀只能导致侮辱性的无用争论。但有一门语言似乎受到和用途无关的特殊尊敬：那就是 Lisp。即使是恨不得给每个说出形如“某某语言比其他所有语言都好”这类话的人都来一拳的键盘远征军们，也会承认 Lisp 处于另一个层次。 Lisp 超越了用于评判其他语言的实用主义标准，因为普通程序员并不使用 Lisp 编写实用的程序 —— 而且，多半他们永远也不会这么做。然而，人们对 Lisp 的敬意是如此深厚，甚至于到了这门语言会时而被加上神话属性的程度。大家都喜欢的网络漫画合集 xkcd 就至少在两组漫画中如此描绘过 Lisp：其中一组漫画中，某人得到了某种 Lisp 启示，而这好像使他理解了宇宙的基本构架。在另一组漫画中，一个穿着长袍的老程序员给他的徒弟递了一沓圆括号，说这是“文明时代的优雅武器”，暗示着 Lisp 就像原力那样拥有各式各样的神秘力量。另一个绝佳例子是 Bob Kanefsky 的滑稽剧插曲，《上帝就在人间》。这部剧叫做《永恒之火》，撰写于 1990 年代中期；剧中描述了上帝必然是使用 Lisp 创造世界的种种原因。完整的歌词可以在 GNU 幽默合集中找到，如下是一段摘抄：因为上帝用祂的 Lisp 代码让树叶充满绿意。分形的花儿和递归的根：我见过的奇技淫巧之中没什么比这更可爱。当我对着雪花深思时，从未见过两片相同的，我知道，上帝偏爱那一门名字是四个字母的语言。（LCTT 译注：“四个字母”，参见：四字神名，致谢 no1xsyzy）以下这句话我实在不好在人前说；不过，我还是觉得，这样一种 “Lisp 是奥术魔法”的文化模因实在是有史以来最奇异、最迷人的东西。Lisp 是象牙塔的产物，是人工智能研究的工具；因此，它对于编程界的俗人而言总是陌生的，甚至是带有神秘色彩的。然而，当今的程序员们开始怂恿彼此，“在你死掉之前至少试一试 Lisp”，就像这是一种令人恍惚入迷的致幻剂似的。尽管 Lisp 是广泛使用的编程语言中第二古老的（只比 Fortran 年轻一岁） 1 ，程序员们也仍旧在互相怂恿。想象一下，如果你的工作是为某种组织或者团队推广一门新的编程语言的话，忽悠大家让他们相信你的新语言拥有神力难道不是绝佳的策略吗？—— 但你如何能够做到这一点呢？或者，换句话说，一门编程语言究竟是如何变成人们口中“隐晦知识的载体”的呢？Lisp 究竟是怎么成为这样的？Byte 杂志封面，1979年八月。理论 A ：公理般的语言Lisp 的创造者 约翰·麦卡锡 John McCarthy 最初并没有想过把 Lisp 做成优雅、精炼的计算法则结晶。然而，在一两次运气使然的深谋远虑和一系列优化之后，Lisp 的确变成了那样的东西。 保罗·格雷厄姆 Paul Graham （我们一会儿之后才会聊到他）曾经这么写道， 麦卡锡通过 Lisp “为编程作出的贡献就像是欧几里得对几何学所做的贡献一般” 2 。人们可能会在 Lisp 中看出更加隐晦的含义 —— 因为麦卡锡创造 Lisp 时使用的要素实在是过于基础，基础到连弄明白他到底是创造了这门语言、还是发现了这门语言，都是一件难事。最初， 麦卡锡产生要造一门语言的想法，是在 1956 年的 达特茅斯人工智能夏季研究项目 Darthmouth Summer Research Project on Artificial Intelligence 上。夏季研究项目是个持续数周的学术会议，直到现在也仍旧在举行；它是此类会议之中最早开始举办的会议之一。 麦卡锡当初还是个达特茅斯的数学助教，而“ 人工智能 artificial intelligence （AI）”这个词事实上就是他建议举办该会议时发明的 3 。在整个会议期间大概有十人参加 4 。他们之中包括了 艾伦·纽厄尔 Allen Newell 和 赫伯特·西蒙 Herbert Simon ，两名隶属于 兰德公司 RAND Corporation 和 卡内基梅隆大学 Carnegie Mellon 的学者。这两人不久之前设计了一门语言，叫做 IPL。当时，纽厄尔和西蒙正试图制作一套能够在命题演算中生成证明的系统。两人意识到，用电脑的原生指令集编写这套系统会非常困难；于是他们决定创造一门语言——他们的原话是“ 伪代码 pseudo-code ”，这样，他们就能更加轻松自然地表达这台“ 逻辑理论机器 Logic Theory Machine ”的底层逻辑了 5 。这门语言叫做 IPL，即“ 信息处理语言 Info…