vscode无法真正运行或调试smalltalk程序,因其缺乏vm、镜像加载和活对象图支持;所有“运行”实为调用pharo cli,调试功能完全不可用,仅适合语法编辑与脚本调度。

VSCode 不能运行 Smalltalk 程序——它没有 VM、不加载镜像、也不维护活对象图。所谓“配置运行”,实际只是调用外部 pharo 命令执行脚本,不是真正意义上的语言支持。
VSCode 里按 F5 不会执行 Smalltalk
你点“运行”或按 F5,VSCode 默认什么都不会发生。它不会启动 Pharo VM,也不会加载 .image 文件。所有“运行”行为都必须显式绑定到 shell 命令,且该命令最终要调用 pharo CLI 工具。
- 错误现象:
Command 'pharo' not found或终端报错No such file or directory - 根本原因:
pharo未加入系统PATH(比如 macOS 上没软链到/usr/local/bin/pharo) - 验证方式:在 VSCode 内置终端里直接运行
pharo --version,失败则说明环境未就绪 - 修复路径:下载 Pharo Launcher,用它安装一个 Pharo 版本,再按官方文档把 CLI 加入 PATH(常见位置:
~/pharo/pharo→ln -s ~/pharo/pharo /usr/local/bin/pharo)
唯一可行的“运行”方式:tasks.json 调用 pharo eval
VSCode 的 tasks.json 是你唯一能稳定触发 Smalltalk 执行的入口。它本质是封装 shell 命令,不依赖任何调试协议或语言服务器。
- 示例任务(保存为
.vscode/tasks.json):
{
"version": "2.0.0",
"tasks": [
{
"label": "run smalltalk script",
"type": "shell",
"command": "pharo my.image eval --save '${fileBasenameNoExtension}'",
"args": ["'MyClass new doSomething'"],
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": true
}
}
]
}
-
my.image必须是真实存在的、可读写的镜像路径(不能是只读副本) -
--save很关键:不加会导致修改不持久,下次启动镜像仍是原样 -
${fileBasenameNoExtension}是 VSCode 变量,但 Smalltalk 脚本名和镜像内类名无自动映射关系,需手动保持一致 - 别指望
eval支持多行或复杂上下文——它只适合单表达式,如'42 factorial'或'MyClass compile: ''^self name'''
调试?不存在的
VSCode 的调试器无法 attach 到 Pharo 进程,因为 Pharo VM 不实现 Debug Adapter Protocol (DAP)。你无法设置断点、step-into 方法、inspect 对象或查看 thisContext。
- 所谓“Smalltalk 调试扩展”都是误导性描述,它们最多提供语法高亮或 snippets
- 想 halt?只能在镜像里写
self halt,然后在 Pharo IDE 里响应——VSCode 不知道这个 halt 存在 - 对象浏览器、消息发送历史、World 事件监听等动态能力,在 VSCode 中完全不可见
- 如果你看到“attach to Smalltalk process”选项,那大概率是某扩展硬塞的无效菜单项
真正值得投入的配置只有三件事
与其折腾“运行”,不如聚焦 VSCode 实际能提升效率的地方:编辑、版本控制、脚本调度。
- 装官方
Smalltalk扩展(仅语法高亮 + snippets),别信带“debug”“run”字样的第三方包 - 确保项目使用
FileTree或GitFileTree导出为.st文件,这样 VSCode 的 Git diff 才有意义 - 把常用 CLI 封装成 tasks:比如
pharo my.image script.st(执行外部 .st 文件)、pharo --headless my.image test.st(跑测试) - 注意:所有这些操作都不改变镜像的实时状态——你改的是文件,不是内存中的对象图;VSCode 永远不知道
MyClass是否已被重编译过
Smalltalk 的动态性不在编辑器里,而在那个持续运行的镜像中。VSCode 做不到的事,不是配置问题,而是模型鸿沟——它连对象引用都存不住,更别说响应 World 事件了。











