惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Justin Shen

[.Net 4.0]泛型的协变,以及高阶函数对泛型的影响 Part 1 随笔 - WCF and Data Service - Justin Shen 元数据 有多少东西需要学习? [电子书下载]Dissecting a C# Application: Inside SharpDevelop [MSDNTV]Don Box再次出击 :) 追踪你的时间使用状况 听说《csdn开发高手》停刊了 在nant中改变编译的目标平台 让使用MSN就像访问网页一样容易! System.String是不可变的字符串吗? 对中国计算机大学教育的一些牢骚 [VS2005]做了两个Code Expansion用的Code Snippet。 VC2005中依然没有Refactoring和Code Expansion. [VS2005 Tip]定制Code Expansion。 [C++/CLI]在栈上声明Reference Type [C++/CLI] 析构函数等于IDisposable::Dispose()方法 用80386汇编来编写asp.net页面。 关于C#泛型中的new()约束
面向对象语言中的Environment和Binding
Justin Shen · 2007-12-16 · via 博客园 - Justin Shen

第一次接触C#的编译,从现在看来确实和过程化语言的编译在Symbol Table的构建上有很大的差异。

MONO的C#编译器中,仿照System.Reflection以及System.Reflection.Emit中的构架,建立了自己的TypeManager,用相同的机制来完成对源代码中的类型和方法的解析以及代码生成。使用RootContext类型来统筹和驱动整个编译的过程。语法分析阶段产生的Parse Tree实际和类型系统被整合在了一起。可以看到ParseTree中的Class类型,实际间接继承自TypeContainer类型。

相对的,在ROTOR的编译器中。Parse Tree的结点在Allnodes.h中定义,而另外有独立的SYM系统,使用的方式似乎更为复杂一些。

在过程化语言的编译过程中,因为类型可能和变量重名,我们通常准备两个Environment(即查找用的Symbol Table),一个对应类型,另一个对应变量和函数。

而在面向对象的语言里,对于一个Identifier的查找,与过程化语言很不一样。
初步考虑仍然使用两套Environment,其中之一为一个类型系统(TypeManager),保存所有已经被解析之后的代码中的类型信息,按照以下的树型方式保存:
Namespace
 |-- Class/Struct/Interface
          |-- Method
          |-- Property
          |-- Member
为了提高作Name Resolving和Type Checking的效率,底层的数据结构可能需要结合HashTable和Tree

因为C#支持引用先于定义(C++的前置声明对编译器来说就是福音啊),因此解析时可能要按照以下的顺序:

解析所有类型的名称 (此时类型的其它信息一概未知,但光有名字的信息已经足以在下步做类型检查了)
   |---> 解析所有的数据成员和方法的声明 (使用上一步中的信息对成员的类型、方法返回类型、方法参数类型做类型检查)
               |---> 解析方法的定义

在解析方法的定义中,将使用到另一套Environment(VariableEnv),这个Environment中,包含了所有的本地变量的Binding,Binding中的信息非常简单,只需要表明该Variable的类型即可。VariableEnv和过程化语言编译中使用的Symbol Table类似,有成熟的算法可以参考,Block之中作用域的扩展和相互屏敝也类似。

对于以下的代码:

MyClass t = new MyClass();
t.Foo();

在解析t.Foo();的时候,首先在VariableEnv查找t的Binding,从而得知类型为MyClass,然后在TypeManager中查找MyClass的方法中,是否有Foo()的定义。

初步设想,当中间代码生成结束之后,把得到的Intermediate Representation(IR)挂接到TypeManager中的Method部分中去,TypeManager中的信息已经足够可以用来做后阶段真正的IL生成了。此时,从Parse Tree到IR的转换也就完成了。

题外话:方法重载的检查其实相对简单,当在解析方法定义的时候,根据参数的类型,在TypeManager中查找相应的方法即可。即使在面向过程的语言之中,对以下的代码:

public void foo();
public void foo(int i);

加入到Environment中的时候,我们只要保证foo->foo(int i)的Binding不会屏敝掉之前加入的foo->foo()的Binding即可。这个既可以通过存放的数据结构来实现也可以通过查找的算法来加以保证。