我一直想知道如何管理从编程语言到其库的依赖关系。以 C# 为例。当我开始学习计算时,我会假设(事实证明这是错误的)语言本身是独立于最终可用的类库而设计的。即,首先定义语言关键字(例如for
,class
或throw
)加上语法和语义的集合,然后分别开发可以从语言中使用的库。我曾经认为,这些库中的特定类不应该对语言的设计产生任何影响。
但这不起作用,或者并非一直如此。考虑throw
。C# 编译器确保后面的表达式throw
解析为异常类型。Exception
是库中的一个类,因此它根本不应该是特殊的。除了 C# 编译器为它分配了特殊的语义之外,它将是一个与任何其他类一样的类。这很好,但我的结论是语言的设计确实取决于类库中特定元素的存在和行为。
此外,我想知道如何管理这种依赖关系。如果我要设计一种新的编程语言,我会使用什么技术将语义映射throw
到非常特殊的类Exception
?
所以我的问题有两个:
- 我认为语言设计与其基类库紧密耦合是否正确?
- 如何在编译器和运行时管理这些依赖项?使用了哪些技术?
谢谢你。
编辑。感谢那些指出我的第二个问题非常模糊的人。我同意。我想了解的是编译器存储了哪些关于它需要的类型的引用。例如,它是否通过某种唯一 id 来查找类型?当新版本的编译器或类库发布时会发生什么?我知道这仍然很模糊,并且我不希望有一个精确的单段答案;相反,最欢迎指向文学或博客文章的指针。