Mik*_*eC8 64 lisp scheme clojure
我最近越来越多地使用Lisp和Lispy语言,我发现它们非常强大.
我一直在网上阅读的一件事是,在Lisp,Clojure等中编写的好处是你可以"在它运行时"编辑你的程序.
也许我错过了什么,但有什么意义呢?
当然,它可能会节省几秒钟,但就是这样吗?每当我对我的程序进行更改时,我就会停止它然后再次启动它,这已经好几十年了.
除了节省时间之外,必须有一个理由 - 它是什么?
有人能给我一个很好的案例研究,让我流口水这个功能吗?:)
期待流口水!
Ken*_*Ken 57
除了节省时间之外,必须有一个理由 - 它是什么?
不,没有.我的意思是,从来没有:使用计算机的全部理由是节省时间.没有什么是电脑无法用手做的.它只需要一点时间.
在这种情况下,我不会放弃"几秒钟",因为这是我整个编程生涯中一整天比其他任何事情都要做的事情之一.几秒钟重新编译,几秒钟重新运行,几秒钟重新创建我的程序前一次的状态 - 即使在快速工作站上,迭代之间也很容易.(它曾经更糟糕,但更快的硬件只会使它变得不那么糟糕,不好.整个文件或更糟的重新编译是I/O绑定的,并且可能永远*不匹配更细粒度编译的速度.)
在Lisp中,在已经运行的进程中重新编译单个函数几乎是即时的(即使在我5岁的笔记本电脑上,我也从未见过它甚至0.1秒),并且重启意味着我不必重新创建我的状态即使有什么东西发出信号.
这是一个工具,它为我提供超过100倍的加速速度,这是我作为程序员所做的最慢和最常见的事情之一.我不知道你还需要什么.我们可能可以弥补一些原因,但如果这不够理由,我不知道会是什么.嗯,这也很酷?:-)
(*每当有人说"从不"涉及技术的东西时,那个人总是在2年后看起来像一个完整的白痴,尽管Lisp的长寿,我肯定也不例外.)
Jer*_*man 56
有一些非常酷的用例.一个例子是GUI编程 - 当我在Emacs旁边运行时实时开发GUI应用程序时看到了这一点:我添加了一个新按钮的代码并点击"Cc Cc"来编译该单个函数,并且按钮刚刚出现在窗口!没有关闭并重新打开应用程序.然后我开始调整小部件并操纵布局,打开的窗口会立即重新排列 - 按钮会四处移动,新的文本字段会突然出现等等,一旦我执行了我所做的每一个小改动.
另一个例子是关于Clojure OpenGL库"Penumbra"的优秀截屏视频,其中程序员实时创建3D俄罗斯方块游戏.他从他的emacs旁边的一个空的OpenGL窗口开始.他定义了一个立方体对象 - CMx - 它在屏幕上.运行命令旋转它,立即开始旋转.运行一个循环,在不同的位置定义另外5个立方体,它们会出现pop-pop-pop-pop-pop.这一切都立即响应,完整的OpenGL工具包就在那里玩.向立方体添加新的曲面纹理,并立即看到它.它变成了一个可塑的3D世界 - 代码动态修改现有世界,而不是每次更改时关闭和重新打开3d画布.
Penumbra Livecoding Screencast - 下载高清版本以获得最佳体验.
关于Clojure的音频库"Overtone"也有很棒的演示/截屏视频.该库是一个合成器工具包,您可以在其中使用一组合成函数来操纵声波.在演示期间,开发人员编写了一些启动音调播放的代码.然后他花了十秒钟写了一个循环,播放了10次这个声音,但每次都让频率更高,再次CMx和你听到它,音符越来越高.在20分钟的实时空间里,他得到了一首歌.它看起来很有趣.
其他用途是,例如:Web爬行/数据挖掘 - 开发和优化用于实时提取信息的算法,查看每一步返回的数据; 机器人编程 - 在机器人生存时发送命令; 面部/图像识别 - 使用像OpenCV这样的库观察您的更改会在您开发代码时立即更新库在图像/视频中识别的内容; 数学工作(Clojure有"Incanter"统计数据); 以及您希望立即查看更改对您正在使用的数据有何影响的任何环境.
所以这是在你面前拥有REPL最有趣的方面.那些没有实际,可塑性,互动性的东西开始成为现实.GUI设计,3D图形,程序化声音制作,数据提取和转换,这些通常都是在公平的情况下完成的.但是对于Clojure(在某种程度上还有其他动态语言),它是真正有形和直接的; 一旦你编写代码就会看到每个变化,如果某些东西不起作用或你没有得到你期望的结果,你只需改变你错过的东西并立即重新执行.
Clojure非常注重这样做.野蛮的是你可以以同样的方式实时使用Java库 - 尽管Java本身不能!因此,Overtone实时使用Java合成库,尽管你从未在Java中使用,Penumbra正在使用Java OpenGL绑定等.这是因为Rich Hickey设计了Clojure,因此可以动态编译为JVM字节码.这是一种令人惊叹的语言 - Clojure为编程带来了多么有趣和高效的编程做出了巨大贡献.
Rai*_*wig 27
Lisp有一个营销口号:
使用Lisp及其增量开发方法,更改软件系统的成本取决于更改的大小,而不是整个软件的大小.
即使我们拥有一个庞大的软件系统,变更的成本(时间......)仍然与变更的大小有关.如果我们添加新方法或更改新方法,则努力仍然与编辑方法的工作有关,逐步编译方法并逐步加载方法.
在许多传统软件环境中,方法的更改可能需要部分重新编译,新的链接可执行文件,重新启动,重新加载等.软件越大,所需的时间越长.
对于人来说,这意味着,我们可能会处于流动状态.这是良好的Lisp环境生产力的一部分:一旦程序员感到舒适并进入这种流动状态,就可以在短时间内对软件系统进行大量更改.我想很多人都经历过这种情况,即工作在短时间内完成 - 与一个人坐在一个没有反应的系统前面并且我们面临等待时间的时间相反.
我们与我们正在开展的计划之间的认知距离也很小.例如,如果在批处理环境中编辑类,则必须想象更改所具有的效果.在Lisp中,您可以编辑一个类并同时更改对象本身.这意味着您可以直接更改对象的行为 - 而不是批量编辑 - 编译 - 链接 - 运行 - 测试周期后的新版本.
在Lisp系统中,您可以更改CAD系统中的类,然后可以立即激活它.当人们问,如果Lisp适用于大型软件团队,那么答案可能是大型软件团队没有必要,如果你以增量方式工作.那么问题是熟悉增量开发的真正优秀的熟练软件开发人员(很少).
在许多应用程序中,有一个单独的脚本语言层,有时用于原始开发人员(而不是用户).在Lisp中,这不是必需的,Lisp是它自己的扩展语言.
Art*_*ldt 20
在现实世界中,这主要用于开发,就像许多功能一样,它在正确的环境中唯一值得流口水.
*不是保证.
目前,持续部署的想法是你改变一件事,构建一切(或者包装它)然后进行部署.使用lisp模型,它实际上可以在部署时编辑已部署的(通常是收到真实客户会话镜像的框)框.
只是一个迂腐的笔记.你真的不编辑正在运行的类.您编译该类的新副本并将其保留在已知位置(var),然后在下次使用时找到并使用新副本.它在运行时并没有真正编辑,更像是新代码立即生效,这减少了从程序到表达式(通常是函数)的开发过程的范围.
Ole*_*liv 14
我记得来自美国宇航局的人描述了他的经历.他的团队在70年代实施了用于宇宙飞船的软件.当发现一些错误时,他们有效地远程修改了它们的软件.
或者想象一下,您需要花费很长时间才能执行,最后由于权限或其他小问题而导致无法写入结果.
又一个例子.您处于集成阶段,您必须进行许多小的更改.而且他们中的很多人.我梦想在Java中有这种可能性,因为目前我需要30-40分钟来重建和重新安装我的应用程序(在10分钟内重新生成它).
如果你看一下像Erlang这样的东西,关键是要避免停机.
它可以在手机开关之类的东西上运行,你不能只关闭它几秒钟.
但是,对于更常见的用途,这是一个"很好的"功能,但是,可能并不重要.
因为你能?
说真的,只是尝试一下,当你回到没有REPL的旧编程语言时,你会感到痛苦.
即时反馈,轻松快速测试,无需在测试夹具中设置假程序状态,能够检查运行程序的状态(该变量的值是多少).所有这些都是实时储户.