gpt4 book ai didi

c# - 语言真的依赖于图书馆吗?

转载 作者:太空狗 更新时间:2023-10-29 18:09:24 26 4
gpt4 key购买 nike

我一直想知道如何管理从编程语言到它的库的依赖关系。以 C# 为例。当我开始学习计算时,我会假设(事实证明这是错误的)语言本身的设计独立于最终可用于它的类库。即,首先定义一组语言关键字(例如 forclassthrow)加上语法和语义,然后定义库可以使用的语言是单独开发的。那些库中的特定类,我曾经认为,不应该对语言的设计有任何影响。

但这并不奏效,或者并非一直如此。考虑 throw。 C# 编译器确保 throw 后面的表达式解析为异常类型。 Exception 是库中的一个类,因此它根本不应该是特殊的。除了 C# 编译器为其分配特殊语义外,它与其他类一样。这很好,但我的结论是语言的设计确实取决于类库中特定元素的存在和行为。

此外,我想知道如何管理这种依赖关系。如果我要设计一种新的编程语言,我将使用什么技术将 throw 的语义映射到非常特殊的类 Exception

所以我的问题有两个:

  • 我是否认为语言设计与其基类库的设计紧密耦合?
  • 如何在编译器和运行时管理这些依赖关系?使用了哪些技术?

谢谢。

编辑。感谢那些指出我的第二个问题非常模糊的人。我同意。我想学习的是编译器存储了关于它需要的类型的什么样的引用。例如,它是否通过某种唯一 ID 找到类型?发布新版本的编译器或类库时会发生什么?我知道这仍然很模糊,我不希望有一个精确的、单段的答案;相反,最欢迎指向文献或博客文章的指针。

最佳答案

What I am trying to learn is what kind of references the compiler stores about the types it needs. For example, does it find the types by some kind of unique id?

显然,C# 编译器在源代码和元数据中维护了一个内部数据库,其中包含所有可用的类型;这就是编译器被称为“编译器”的原因——它编译一组数据关于源和库。

当 C# 编译器需要检查抛出的表达式是否派生自或等同于 System.Exception 时,它会假装在 System 上执行全局命名空间查找,然后执行查找 Exception,找到类,然后将生成的类信息与为表达式推导的类型进行比较。

编译器团队之所以使用这种技术,是因为无论我们是在编译您的源代码并且 System.Exception 在元数据中,还是在编译 mscorlib 本身和 System .Exception 在源代码中。

当然,作为性能优化,编译器实际上有一个“已知类型”列表,并提前填充该列表,这样它就不必每次都进行查找。可以想象,您必须查找内置类型的次数非常多。一旦列表被填充,System.Exception 的类型信息就可以从列表中读出,而无需进行查找。

What happens when a new version of the compiler or the class libraries is released?

发生的事情是:一大群开发人员、测试人员、经理、设计师、作家和教育 worker 聚在一起,花费数百万工时确保编译器和类库在发布之前都能正常工作。

这个问题再一次含糊不清。发布新的编译器需要做什么? 大量工作,这是必须要做的。

I am aware that this is still pretty vague, and I don't expect a precise, single-paragraph answer; rather, pointers to literature or blog posts are most welcome.

我写了一篇博客,其中包括 C# 语言及其编译器的设计。它位于 http://ericlippert.com .

关于c# - 语言真的依赖于图书馆吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16426411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com