介绍 Dynatalk
文章目录
Dynatalk 致力于对象之间的交流, 尤其关心不同语言/环境之间的互操作。 – Dynatalk
Make it work, make it correct, make it fast, make it cheap – Alan Kay
前言
为什么制作这样一个东西?
我喜欢在 Squeak 进行探索性编程, 但 Squeak 第三方库不够丰富。 渴望一个简单的跨语言的对象协作机制, 需要时, 可以在 Squeak 里使用 Python 或浏览器的 API。
什么情况下对你有用?
- 你想让分布在不同语言/环境之间的对象协同工作, 诸如使用图形化环境或 Python 驱动 Roblox
- 你尝试过 RPC 之类的东西, 但渴望有更多的灵活性和控制权
- 你希望有一个比 ROS 更轻量级的通信系统, 来协调机器人的不同部分。它足够简单, 可以轻易被 hack 来满足特殊需求。 但又不至于简陋到只有 pub/sub, 它提供了基础的功能: 对 Services, Actions 的支持
- 你想构建Future Park(teamLab) 那样的交互艺术项目
- 你有一个跟 CodeLab Neverland 一样的可编程空间, 想让环境中的大量可编程对象协同工作
- …
先前的经验
把事情搞得困难是简单的, 把事情搞得简单是困难的
Dynatalk 可以看作对 CodeLab Adapter 核心的重构。
它们都试图提供基于消息的对象协作机制。
CodeLab Adapter 的一个用例是用于驱动可编程空间, 这方面引起过许多人的兴趣。
CodeLab Adapter 在设计上有许多地方不令人满意, 关注点的分离做得不好, 正交性不够, 最终导致项目变得复杂, 难以持续生长, 维护成了苦差事。
Dynatalk 追求简单、一致和正交, 遵循关注点分离的原则。 它是易于理解且易于扩展的。
所有的代码目前都开源在 Github.
开始使用
Dynatalk 目前支持的编编程语言客户端:
- dynatalk-js
- dynatalk-squeak
- dynatalk-py
- dynatalk-MicroBlocks
- dynatalk-snap
- dynatalk-unity
- dynatalk-roblox
选择你正在使用的语言的客户端, 里边有具体的引导。
FAQ
有视频教程吗?
参考 在线视频
目前有哪些局限?
一些语言的 Dynatalk 客户端(诸如 Python)对并发的支持做得还不够, 不打算把它列入核心中, 而将其视为可扩展的能力。
同一个 supervisor 里的 agent 并不是并发执行的, 它们会彼此阻塞。
dynatalk 将并发性作为关注点从核心中分离出来。如果你需要并发执行多个 agent, 可以继承 Agent 基类, 将 _commit 重写为多线程或多进程版本(dynatalk 可能需要在 supervisor 和 agent 之间架设一个 queue)。
目前我还没有这个需求, 如果你确实需要并发功能,欢迎联系我。
我可以替换消息传输协议(MQTT)吗?
目前采用了 MQTT 作为底层的消息传输协议, 这部分被设计为可插拔的, 可以很容易替换成 RabbitMQ、ZeroMQ、websocket, 或任何你喜欢的其他消息协议…
我甚至完全使用 HTTP 实现过它(因为 Roblox 服务器只支持 HTTP)。
只需要构建一个新的 Space 替换 MQTTSpace 即可(只有数十行代码)。
目前已经有了多种基于不同消息传递机制的 dynatalk:
- 基于 postMessage 的 dynatalk
- Snap! 实现: dynatalk-over-postMessage
- 基于 ble 的 dynatalk
- Snap! 实现: dynatalk-over-ble
- Python 实现: dynatalk-over-ble
- 基于 websocket 的 dynatalk:
- 实施中…
强大而危险的 eval agent
能力越大,责任越大。
我喜欢 eval agent(可以执行代码的 agent), 这是 JavaScript 实现的一个例子。
通过与 eval agent 交互, 我们可以获得另一个编程语言的所有能力, 这对于探索性编程和构建原型非常方便。
但在部署是请注意风险。
设计理念是什么?
Alan Kay 创造 “OOP(面向对象)” 一词时, 包含以下三个含义:
- 一切都是对象
- 对象通过消息进行沟通
- 对象解释它所理解的消息
Smalltalk 展示了如何实施这些想法。
许多编程语言都支持面向对象风格的编程, 它们通常关注第 1 点, 而对 2, 3 点缺少关注。
Dynatalk 致力于对象之间的交流, 尤其关心不同语言/环境之间的互操作。
Dynatalk 提供的通信对象被抽象化为 Agent, 它在行为上类似于 Actor 模型。
参考 设计理念
它是如何开发的?
和 SqueakJS 类似, 最初的 Dynatalk 以探索性编程的风格在 LivelyKernel 中开发, 受益于 LivelyKernel 强大的 liveness, 开发过程高效而愉快。
最近的几个版本在 Squeak 中开发, 借助其强大的 debugger, 可以将手伸到运行堆栈的每个角落里。在 Smalltalk 中,测试驱动风格的开发充满了乐趣(在其他语言中通常是烦人的苦差事), 这种开发风格诞生自 Smalltalk 是不足为怪的。
其他语言的版本(Python、Snap!、MicroBlocks) 从以上两者中翻译而来。
参考
- Dynatalk
- Agency
- lively messenger
- MicroBlocks IDE 与 VM 的通信机制
- Squeak 的对象/消息机制
- CodeLab Adapter
- 建立在异步消息之上的同步指令
- 在 Roblox 中探索自主 Agent
- Tether: remote messaging between Smalltalks with WebSockets
- MicroBlocks 周末分享会 20240330
- CodeLab 可编程空间 背后的理念与设计原则
- JSON-RPC
文章作者 种瓜
上次更新 2024-04-03