我在这里遇到了一个令人尴尬的简单问题。我是一个小小的新手(我试图每隔5年左右尝试一次),而且我已经让Pharo 6.1运行了。我如何寻找官方标准库文档?特别是对于编译器类?比如编译和评估方法?我不知道如何使用帮助浏览器执行搜索,并且编译器类中的方法注释相当简洁和神秘。我还没有看到标准库API文档的明显链接:http://pharo.org/documentation。这些书" Pharo by Example"和#34;深入Pharo"似乎也没有涵盖那个课程。我想这个类可能与Squeak和其他小元素类似,因此链接到他们的编译器类的文档也可能有用。
谢谢!
答案 0 :(得分:5)
在编写方法(或表达式)时,有几个类合作,鉴于您对该主题的兴趣,我很想在您的学习和理解中进一步激励您。
一般来说,主要类是Scanner,Parser,Compiler和Encoder。根据方言,这些名称和实现可能略有不同,但中心思想保持不变。
Scanner解析源代码的字符流并生成令牌流。然后,这些令牌由解析器解析,解析器将它们转换为AST(抽象语法树)的节点。然后编译器访问AST的节点以在语义上分析它们。这里所有变量节点都被分类:方法参数,方法临时值,共享块,块参数,块临时值等。在此分析过程中,所有变量都绑定在相应的范围内。此时,AST不再是“抽象的”,因为它已经使用绑定信息进行了注释。最后,重新访问节点以生成编译方法的文字框架和字节码。
当然,我从这个摘要(编译指示,块闭包等)中省略了很多东西,但是考虑到这些基本思想,你现在应该准备好调试一个非常简单的例子。例如,从
开始Object compile: 'm ^3'
内化过程。
经过一段时间的踩踏,你会得到第一个有趣的代码,即方法OpalCompiler >> #compile
。如果我们删除错误处理块,这个方法本身就说明了一切:
compile
| cm |
ast := self parse.
self doSemanticAnalysis.
self callPlugins.
cm := ast generate: self compilationContext compiledMethodTrailer
^cm
首先,我们有#parse
消息,其中创建了解析节点。然后我们进行了上面提到的语义分析,最后#generate:
生成了编码。您应该调试每个方法以深入理解编译过程。鉴于你正在处理一棵树,准备好通过很多访客进行导航。
一旦您熟悉了主要想法,您可能需要尝试更详细的 - 简单示例,以查看其他对象进入场景。
答案 1 :(得分:1)
以下是一些简单的事实:
有4个评估命令
您的表达式可以包含任何文字(数字,数组,字符串,字符等)
17 "valid expression"
您的表达式可以包含任何消息。
3 + 4.
'Hello world' size.
1 bitShift: 28
您的表达式可以使用任何全局变量
Object new.
Smalltalk compiler
您的表达可以引用self
,super
,true
,nil
,false
。
SharedRandom globalGenerator next < 0.2 ifTrue: [nil] ifFalse: [self]
您的表达式可以使用在您编写的窗格的上下文中声明的任何变量。例如:
self
将绑定到当前班级self
将被检查对象绑定。您还可以在表达式中使用其实例变量。self
,实例变量,消息参数,临时值等。答案 2 :(得分:0)
尽管我已经知道,Pharo标准库没有API文档,就像您在其他编程语言中找到的那样。这似乎在Pharo用户的邮件列表中得到了证实:http://forum.world.st/Essential-Documentation-td4916861.html
...有一个ANSI标准的草稿版本:http://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf
...但这似乎不包括编译器类。