最近我开始对Lisp和Lispy语言产生更多兴趣,并且发现它们相当强大。
网络上到处都在说,使用Lisp、Clojure等编写代码的好处是可以在“运行时编辑程序”。
也许我缺少了什么,但这有什么意义呢?
当然,这可能会节省几秒钟,但仅此而已吗?每当我对程序进行更改时,我只需停止它,然后重新启动它,这样做已经工作了几十年。
除了节省时间之外,一定还有其他原因,那是什么呢?
能否给我提供一个令人垂涎欲滴的好案例,让我为此功能流口水? :)
期待着畅所欲言!
另一个例子是关于Clojure OpenGL库"Penumbra"的优秀演示视频,在其中程序员实时创建了一个3D俄罗斯方块游戏。他从一个空的OpenGL窗口开始,旁边是他的emacs。他定义了一个立方体对象-C-M-x-它出现在屏幕上。运行一个命令来旋转它,它立即开始旋转。运行循环定义5个在不同位置的立方体,它们立刻出现。它完全响应,完整的OpenGL工具包就在那里供您使用。添加一个新的表面纹理到您的立方体中,立即看到它出现。它变成了一个可塑的3D世界 - 代码动态修改现有的世界,而不是在每次更改时关闭和重新打开3D画布。
Penumbra Livecoding Screencast-下载高清版本以获得最佳体验。
这里还有一个关于Clojure音频库“Overtone”的精彩演示/屏幕录像。该库是一个合成器工具包,其中您有一组合成器函数来操纵声波。在演示中,开发人员编写了一些代码,以启动播放音调。然后,他花费十秒钟编写一个循环,播放该声音10次,但每次使频率更高,再次按C-M-x,您会听到音符升高。在20分钟的实时空间内,他开始了一首歌曲。看起来非常有趣。 Overtone演示链接 其他用途可能包括:网络爬虫/数据挖掘-开发和完善提取实时信息的算法,在每个步骤中查看返回的数据;机器人编程-在其实时运行时发送命令;面部/图像识别-使用像OpenCV这样的库,观察您的更改即时更新库在图像/视频中识别的内容,当您开发代码时;数学工作(Clojure具有“Incanter”用于统计);以及希望立即查看所做更改对正在处理的数据产生的影响的任何环境。有一个Lisp的营销口号:
使用Lisp和其增量式开发方法,软件系统的变更成本取决于变更的大小,而不是整个软件的规模。
即使我们拥有一个大型软件系统,对于变更的成本(时间等)始终与变更的规模相对应。如果我们添加一个新的方法或更改一个方法,所需的工作量将与编辑该方法、增量编译该方法和增量加载该方法的工作量成比例。
在许多传统的软件环境中,更改方法可能需要部分重新编译、新的链接可执行文件、重启、重新加载等操作。软件规模越大,所需的时间就越长。
对于人类来说,这意味着我们可能会失去一种心流状态。这是良好的Lisp环境的生产力的一部分:一旦程序员感到舒适并进入这种状态,可以在短时间内对软件系统进行大量更改。我想许多人都经历过这种情况,在短时间内完成了大量的工作-与面对反应迟缓的系统并面临等待时间的时候形成鲜明对比。
此外,我们和正在工作的程序之间几乎没有认知距离。 例如,如果在批处理环境中编辑一个类,则必须想象更改的效果。在Lisp中,您可以同时编辑一个类并更改对象本身。这意味着您直接更改对象的行为-而不是在批处理编辑->编译->链接->运行->测试循环之后生成一个新版本。
在Lisp系统中,您可以更改CAD系统中的类,然后它可以立即生效。 当人们询问Lisp是否适用于大型软件团队时,答案可能是,如果您进行增量式开发,则不需要大型软件团队。问题是/曾经是真正熟悉增量式开发的高水平软件开发人员非常罕见。
在许多应用程序中,存在单独的脚本语言层,有时是为原始开发人员(而不是用户)设置的。在Lisp中,这是不必要的,Lisp是自己的扩展语言。
在现实世界中,这主要用于开发,并且像许多功能一样,在正确的上下文中才值得吹嘘。
*没有保证。
目前连续部署的想法是您更改一项内容,构建所有内容(或打包它),然后部署。使用Lisp模型,实际上可以在部署过程中编辑已部署的盒子(通常是接收实际客户会话镜像的盒子)。
只是一个琐碎的注释。您实际上不会编辑正在运行的类。您会编译类的新副本并将其留在已知位置(变量)中,然后下一次使用它时,将找到并使用新副本。这不是真正的编辑正在运行,而更像是新代码立即生效,这将开发过程的范围从程序扩展到表达式(通常是函数)。
我记得有个人来自NASA谈到了他的经历。他的团队在70年代实现了一款宇宙飞船所使用的软件。当发现一些错误时,他们可以远程实时地有效修改软件。
再比如,你想象一下,有一个长时间运行的过程,需要花费数天时间,并且最终结果因为权限或其他小问题无法写入。
还有另外一个例子,在集成阶段需要进行许多小变更,而且变更数量很多。我梦想Java有这样的可能性,因为目前重新构建和重新安装我的应用需要30-40分钟(而重新构建只需10分钟)。
您可以看到真实的数据,这是一个巨大的优势。因此,您无需进行猜测。
因为你可以吗?
说真的,试用一段时间,当你回到没有REPL的旧编程语言时,你会感到痛苦。
即时反馈,轻松快速测试而不必在测试装置中设置虚假程序状态,能够检查运行程序的状态(那个变量的值是多少)。所有这些都是真正的时间节省者。
这主要用于开发中,仅仅是一个时间节省器。
但时间节省器非常重要。
一旦你习惯了它,回到旧的方式就感觉像从飞行转为在焦油中游泳。