原始Xerox Smalltalk-80虚拟映像(C++/Qt)的解释器

2020-06-02 22:33:26

不久前,我访问了Mario Wolczko的网站(http://www.wolczko.com/st80)),当时我正在搜索与著名的Smalltalk蓝皮书相对应的原始SmallTalk-80实现(参见http://stephane.ducasse.free.fr/FreeBooks/BlueBook/Bluebook.pdf).I在90年代使用Smalltalk,并与Squeak和Pharo一起使用。但令我惊讶的是,周围没有能够运行原始施乐映像的虚拟机,Mario在此链接上提供了该链接:http://www.wolczko.com/st80/image.tar.gz.。我无法使用上述VM加载此映像,即使经过多次修改,我仍无法使Mario的VM正常工作(它现在可以编译,但在映像完全加载之前崩溃)。

自从我最近完成了一个基于LuaJIT的OBERON实现(参见https://github.com/rochus-keller/Oberon)I),我开始关心这样一个问题:使用LuaJIT作为SmallTalk-80的后端是否可行,以及与Cog相比,它将实现什么样的性能(参见https://github.com/OpenSmalltalk/opensmalltalk-vm).There)。Lua和Smalltalk之间有许多相似之处,尽管语法非常不同。我看到了两种实现变体:从Smalltalk源代码运行一切,或者从Smalltalk映像(即蓝皮书字节码)运行它。为了进一步分析施乐的实现并做出决定,我需要一个好的工具,所以我们来了。

别忘了:Smalltalk-今年(2020年)80岁生日,艾伦·凯(Alan Kay)80岁生日(5月17日)!

当然,我可以在Smalltalk中实现所有功能,就像他们在最初的Squeak和Cog VM上所做的那样。但是这些年来,我已经习惯了严格/静态类型的编程,二十多年来,C++是我的主要编程语言。还有Qt(参见https://www.qt.io/)),它是(几乎)所有东西的绝佳框架。LuaJIT是用C语言和汇编语言编写的。因此,我认为C++非常适合。

通常我从EBNF语法开始,然后使用我自己的工具将其转换为LL(1)(参见https://github.com/rochus-keller/EbnfStudio).Smalltalk不同。有可用的语法规范(甚至是ANSI标准),但是有太多的变体。因此,我只是坐下来编写了一个词法分析器,然后编写了一个解析器,并对其进行了修改,直到它可以解析http://www.wolczko.com/st80/image.tar.gz.中包含的Smalltalk-80源文件。解析器提供一个代码模型,该代码模型执行一些额外的验证并构建交叉引用列表。在我的旧32位HP EliteBook 2530p上,整个Smalltalk-80源文件可以在不到半秒的时间内解析和交叉引用。

还有一个AST和一个访问器,我将在将来的代码生成器实现中使用它们。

类浏览器有几个我的分析所需的特殊功能。当然有语法突出显示,但它也标记同一消息的所有关键字和声明的所有使用。如果您单击标识符,会有一个工具提示,其中包含它是临时变量、实例变量还是类变量等信息。如果您在按住CTRL键的同时单击一个类标识符或一个发送到显式类的消息,则它会导航到这个类和方法。还有一个列表,其中包含使用或分配变量的所有类的所有方法;其他列表显示系统中使用的所有消息模式或主要消息,以及它们在哪些类/方法中实现。还有一个浏览历史记录;您可以使用ALT+LEFT和ALT+RIGHT键后退或前进。

使用图像查看器,用户可以按http://www.wolczko.com/st80/image.tar.gz.提供的交换格式检查原始SmallTalk-80虚拟图像的内容。查看器在树中显示对象表;已知对象(如蓝皮书第4部分中所定义)和类按名称打印;给定OOP处的对象可以展开,以便可以跟随对象指针;当单击对象或其类时,详细信息以html格式显示,并带有可导航的链接;通过按住Ctrl键并单击列表项或链接,将打开以给定对象为根的列表或详细视图。有一个包含在图像中找到的所有类和元类的声明列表,以及一个引用给定OOP的交叉引用列表。方法的详细视图还显示带有描述的字节码。还有一个浏览历史记录;您可以使用ALT+LEFT和ALT+RIGHT键后退或前进。使用CTRL+G导航到给定的OOP,使用CTRL+F在详细视图中查找文本(按F3再次查找)。

这是一个简单的蓝皮书实现,用于以http://www.wolczko.com/st80/image.tar.gz.提供的交换格式理解和运行原始的SmallTalk-80虚拟映像。重点是功能和对蓝皮书的遵从性,而不是性能(尽管它执行得很好)或富有成效的工作。未实施保存快照。如果可行,我的目标是逐步将虚拟机迁移到LuaJIT后端。解释器会重现http://www.wolczko.com/st80/image.tar.gz.附带的原始施乐trace2和trace3文件。启动后的初始屏幕对应于Smalltalk 80虚拟映像版本2手册第3页上显示的屏幕截图。不过,这项工作仍在进行中;存在一些视图更新问题,不要对零星的崩溃感到惊讶。

请注意,可以按CTRL+鼠标左键模拟鼠标右键单击,按CTRL+Shift+鼠标左键模拟鼠标中键单击。如果您有两个按钮的鼠标,则还可以使用按住Shift键的同时单击鼠标右键来模拟鼠标中键单击。

中音键盘上的所有键(例如,除LF之外的https://www.extremetech.com/wp-content/uploads/2011/10/Alto_Mouse_c.jpg))均受支持;只需在本地键盘上键入所需符号的组合键即可。使用左箭头和上箭头键输入左箭头和上箭头字符。

我似乎不是唯一对蓝皮书Smalltalk-80VM感兴趣的人。今天(2020年5月18日),我在Reddit上发现了一个非常有趣的帖子:https://www.reddit.com/r/smalltalk/comments/glqbrh/in_honor_of_alans_birthday_by_the_bluebook_c/,它提到了https://github.com/dbanay/Smalltalk.。第一次提交显然是在5月12日,但大多数文件的创建日期是2月或3月,甚至是12月;所以显然这是一项相当大的工作;实现是基于C++11和SDL的,而且似乎工作得很好(甚至比这个VM快一点);我还在Dan的代码中找到了蓝皮书修复,我在其他任何地方都看不到这些修复(谢谢,Dan!)。他实施了一系列方便的功能,如使用主机进行复制粘贴,以及使用自定义映像访问文件系统/持久快照。因此,如果您准备将其用于高效率的工作,并且不在乎您不能直接加载原始的Xerox虚拟映像,那么最好看看他的实现。

以下是类浏览器、图像查看器和虚拟机的二进制版本:http://software.rochus-keller.info/St80Tools_win32.zip.Just解压驱动器上某个位置的压缩文件,然后双击St80ClassBrowser.exe或St80ImageViewer.exe;Qt库以及原始的SmallTalk-80Sources和VirtualImage文件也包括在内。

确保您的系统上安装了与您的C++编译器兼容的Qt 5.x(库和头)版本。

转到解压缩目录并执行例如QTDIR/bin/qmake StClassBrowser.pro(请参阅有关QTDIR的Qt文档)。

运行make;几秒钟后,您将在build目录中找到可执行文件。

或者,您可以使用QtCreator打开PRO文件并在那里构建它。请注意,此项目中有不同的PRO文件。

如果您需要支持或希望发布问题或功能请求,请使用https://github.com/rochus-keller/Smalltalk/issues上的Github问题列表或向作者发送电子邮件。