哪些编程语言特性适用于开发实时编码框架?
我想要构建一个“实时编码框架”。
我应该解释一下什么是“实时编码框架”。我将通过比较实时编码和传统编码来解释这一点。
一般来说,在传统编程中,你编写代码,有时会进行编译,然后启动可执行文件或在某种解释器中打开脚本。如果你想修改应用程序,你必须重复这个过程。实时编码框架使得在应用程序运行时可以更新代码并根据需要重新加载。也许每次包含代码的文件发生更改时都会重新加载,或者通过某些其他操作。代码的更改将在应用程序运行时反映出来。不需要关闭程序,重新编译和重新启动它。
在这种情况下,应用程序是一个拥有更新/绘制循环的窗口化应用程序,最可能使用OpenGL进行图形处理,使用音频库进行声音处理( SuperCollider?),并理想情况下使用网络库。
当然,我有喜欢使用的语言,不过我不确定它们中的任何一种是否适合这种架构。理想情况下,我会使用Python、Lua、Ruby或其他高级语言。然而,最近有个朋友建议使用Clojure可能是一个选择,所以我也在考虑它。
我不仅想知道哪些语言适合这种框架,而且想知道通常的语言特性会使这种框架成为可能。
原文链接 https://stackoverflow.com/questions/7884010
唯一需要让这个方法可行的是一种动态绑定的形式,例如,在 Erlang 中是消息传递或在其他许多语言中是 eval
。
如果你有动态绑定,那么你可以改变消息的目标而不影响消息本身,或者改变消息而不影响目标——只要你在发送消息时定义了目标,并且在发送消息时为目标定义了消息。
在更改目标时,你只需向旧版本提供服务直到新版本到位,然后进行小的锁定更新以过渡到新版本。同样,当更改消息时,你只需提供旧版本,直到新版本可用。
但要使代码可以随时热替换,仍然需要进行设计——应用程序必须具有足够的模块化,以便更改组件的实现不会导致中断,这只能通过细心编程来实现。
很好在开发环境上有“实时编码”,但是直接与部署的服务器交互会更加接近“真实”。为此,您需要具备网络意识的REPL(交互式解释器)。
在这方面,clojure提供了一个很好的解决方案,即通过socket repl。这使您可以远程附加到在已部署的Tomcat服务器上正在运行的代码版本。然后,您可以附加您最喜欢的启用swank的开发工具并进行编码改进。
Clojure 是一种几乎拥有你所需的所有实时编码语言要素的语言。主要亮点包括:
- 交互式 REPL - 这样你就可以直接与正在运行的程序进行交互。即使我在做“传统编程”,我也倾向于交互式编写代码,并将我喜欢的部分稍后复制到源文件中。Clojure 就是为这种方式而设计的 - 在运行时,你的程序中的几乎所有部分都是可检查、可修改和可替换的。
- 出色的并发支持 - 你可以使用像
(future (some-function))
这样的代码轻松启动并发后台任务。更重要的是,Clojure 的 STM 和高性能不可变数据结构的重点强调将处理更微妙的并发方面(例如,当正在渲染数据结构时, 如果我更新了一个正在运行的数据结构会发生什么?) - 库可用性 - 它是一种 JVM 语言,因此你可以从 Java 生态系统中获取所需的所有音频、视觉、IO 或计算工具。用一两行 Clojure 封装它们很容易,这样你就能获得你需要的函数的简洁接口。
- 宏 - 由于 Clojure 是一种homoiconic 语言,你可以利用 Lisp 的强大宏来扩展语言。你可以在实时环境中有效地构建你想使用的确切语法,让编译器在幕后完成全部代码的创建工作。
- 动态类型 - 这方面的好处可以争论来争论去,但在快速、简洁地编写代码时,这无疑是巨大的优势。
- 活跃社区和许多酷项目 - 你很可能会在 Clojure 社区中找到许多对类似实时编码技术感兴趣的人。
你可能会发现以下几个链接有趣:
- Paul Graham 论 Lisp - 击败平均水平
- 使用 Overtone 声音合成器的 Live Clojure 编码示例(一个 SuperCollider 的前端)
在谷歌应用引擎上的 Python 有远程 api shell。虽然这不是一个完整的实时编码套件,但是在 Emacs 上使用 Swank-Clojure 的 Clojure 在整合“实时编码”到日常开发中方面已经有了更多实际使用,但是很多人并没有意识到在某些 Python 环境中是可以实现的。
$ PYTHONPATH=. remote_api_shell.py -s dustin-getz.appspot.com
App Engine remote_api shell
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)]
The db, users, urlfetch, and memcache modules are imported.
dustin-getz> import models
dustin-getz> models.BlogPost(title='a modern take on automated testing', link='https://docs.google.com/document/pub?id=1DUxQogBg45rOTK4c5_SfEHiQcvL5c207Ivcy-gDNx2s', dont_publish_feed=False).put()
dustin-getz> items = models.BlogPost.all().filter('dont_publish_feed =', False).order('-published_date').fetch(100)
dustin-getz> len(items)
58
dustin-getz> for item in items[:5]: print item.title
a modern take on automated testing
Notes: Running a startup on haskell
the [un]necessity of superstar middle management in bigcos
"everything priced above its proper value"
stages of growth as a software engineer
我在 ZeroBrane Studio IDE 中实现了一项 Lua 实时编码功能。它与你描述的完全相同,当代码发生更改时,重新加载应用程序。我正在努力改进,以在运行时修改值,避免完全重新加载应用程序。这是一个纯 Lua 解决方案,不需要对 VM 进行任何修改。
您可以在这里查看当前实现的实时编码演示:http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style。
在使用/要求的语言功能方面,我依赖于:
- 中断/恢复正在运行的应用程序的能力(基于 debug.hook 和 error() 调用),
- 与(未修改的)应用程序远程交互的能力(基于 debug.hook、支持 select() 检测从主机机器发送新请求的 TCP 交互,以及基于协程在主应用程序和实时编码模块之间切换),以及
- 将新代码注入应用程序的能力(此机制也使用 co-routines,但我确定还有其他选择)。还有一种可能性是注入一个修改后的代码片段,但它需要在函数级别上完成,如果这个函数是本地函数,你也需要将其包含在内,以此类推。
我正在为PyDev的Python编辑器开发实时编码功能。这个想法启发自Bret Victor在“以原则发明”演讲中的一个实例。我已经实现了程序状态显示以及海龟图形,当你在Eclipse中输入Python代码时,它们都会进行更新。
这个项目是托管在GitHub上的,我已经发布了一个演示视频,以及一个教程。
我使用的Python的主要功能是抽象语法树和动态代码执行。我获取用户的代码,将其解析成树,然后对任何赋值语句、循环迭代和函数调用进行仪表化。一旦我对树进行了仪表化,我就执行它并显示报告或绘制所请求的海龟图形。
我没有实现其他回答中讨论的交换功能。相反,我总是运行代码直到完成或超时。我将实时编码视为测试驱动开发的增强,而不是用于在实时应用程序上进行操作。然而,我会思考一下交换出实时应用程序的一部分会让我做什么。
Smalltalk
可能是最好的选择。因为与其他语言不同,它有一个完整的 IDE
用于实时编码,而不仅仅是一个 REPL
(交互式解释器)。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
Tcl已经有了这样一个功能。例如,你可以编写一个GUI程序,创建一个具有交互式提示符的单独窗口。从那里,你可以重新加载你的代码,输入新的代码等。
你可以用任何GUI工具包来完成这个功能,但有些要比其他工具包更难实现。使用Python应该很容易,但缩进的问题使得交互使用具有挑战性。我相信大多数其他动态语言都可以轻松实现这个功能。
试着这样考虑:如果你的工具包允许你打开多个窗口,那么就没有理由为什么其中一个窗口不能是交互式提示符。你所需要的就是打开一个窗口的能力和运行输入代码的"eval"命令作为一个字符串。