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 目前支持的编编程语言客户端:

选择你正在使用的语言的客户端, 里边有具体的引导。

FAQ

有视频教程吗?

参考 在线视频

目前有哪些局限?

一些语言的 Dynatalk 客户端(诸如 Python)对并发的支持做得还不够, 不打算把它列入核心中, 而将其视为可扩展的能力。

同一个 supervisor 里的 agent 并不是并发执行的, 它们会彼此阻塞。

dynatalk 将并发性作为关注点从核心中分离出来。如果你需要并发执行多个 agent, 可以继承 Agent 基类, 将 _commit 重写为多线程或多进程版本(dynatalk 可能需要在 supervisor 和 agent 之间架设一个 queue)。

目前我还没有这个需求, 如果你确实需要并发功能,欢迎联系我。

我可以替换消息传输协议(MQTT)吗?

目前采用了 MQTT 作为底层的消息传输协议, 这部分被设计为可插拔的, 可以很容易替换成 RabbitMQ、ZeroMQ、websocket, 或任何你喜欢的其他消息协议…

我甚至完全使用 HTTP 实现过它(因为 Roblox 服务器只支持 HTTP)。

只需要构建一个新的 Space 替换 MQTTSpace 即可(只有数十行代码)。

目前已经有了多种基于不同消息传递机制的 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) 从以上两者中翻译而来。

参考