- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直想知道如何管理从编程语言到它的库的依赖关系。以 C# 为例。当我开始学习计算时,我会假设(事实证明这是错误的)语言本身的设计独立于最终可用于它的类库。即,首先定义一组语言关键字(例如 for
、class
或 throw
)加上语法和语义,然后定义库可以使用的语言是单独开发的。那些库中的特定类,我曾经认为,不应该对语言的设计有任何影响。
但这并不奏效,或者并非一直如此。考虑 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/
我想知道如果一个人需要并行处理项目 A、B 和 C,其中 A 依赖于 B,B 依赖于 C,那么完美的工作流程是什么。 目前,我将所有内容都放在一个存储库中,这加快了早期开发速度。所以我的工作目录如下所
尝试测试这款外观精美的 gem - http://icelab.com.au/articles/welcome-to-the-omnisocial/ - 这 promise 可以将 Twitter 和
因为每个版本flutter_localizations来自 SDK 取决于 intl 0.17.0而 fstore 依赖于 intl ^0.16.1 , 禁止来自 SDK 的 flutter_loca
类似于Typescript: Type of a property dependent on another property within the same object我想要一种属性依赖的类型。
我需要计算分页的结果数。 演示查询 select A.order_id, IF( E.assign_date IS NOT NULL AND E.assign_dat
我的表中有一个项目列表,其中包含字段 votes_up 和 votes_down 以及其他字段。现在我想根据这两个字段的功能根据受欢迎程度订购商品。问题在于受欢迎程度的算法取决于 votes_up 的
cloud_firestore:^0.14.4firebase_auth: ^0.18.4+1smooth_star_rating: ^1.0.4地理点:^0.7.1geoflutterfire: ^
是否可以定义两个不同的 PatternLayouts 并依赖于它使用第一个或第二个的应用程序 LogLevel? 示例: 如果我使用默认的 ERROR 级别运行我的应用程序,它应该打印如下日志语句:
我有一个函数 template void frobnicate()做的东西。我需要 T 成为少数几个选择类型之一,并且我需要一些关于这些类型的信息。我通过提供特征来做到这一点: template st
我目前正在开发我的一个项目,它是一个类似于 MSPaint 的 WPF 应用程序。但是,我不使用铅笔工具或类似的工具,而是使用对象(矩形、圆形、三角形等)进行绘画。我使用 Prism 和 MVVM 模
我在 ftable 周围写了一个包装器因为我需要计算许多变量的频率和百分比的平面表: mytable <- function(...) { tab <- ftable(...,
如果可以在 Gradle 中使用来自其他项目的任务,我想尝试一下。假设 ProjectB 是一个 src/main/groovy 包含 com.MyTask 的项目,有父 ProjectA 在 Pro
我需要测试一些依赖于当前上下文的静态方法。现在,我当然可以使用 HttpContextWrapper 从我自己的代码中删除这种依赖性。问题在于我在这些方法中使用的第 3 方 API。他们依赖于 Htt
我正在尝试创建一个通用的结构,具有通用实现特征的界限。特征本身是通用的。这是在 Rust 1.49.0 中。 如果我这样做: trait Foo {} struct Baz> { x: F,
如果 Makefile 本身被更改,一个安全的赌注是将所有目标视为过时的。 有没有聪明的方法来添加这种依赖?有没有其他选择? 最佳答案 一个安全的赌注,但一个可怕的想法。示例:您正在使用 automa
我有一种情况,我需要根据远程文件在 make 中执行规则。这是我正在尝试做的一个例子(实际的 Makefile 在这里不相关的方式要复杂得多): URL = http://cdn.sstatic.ne
这是我的第一个 Spring 应用程序,所以请原谅我对此事的无知。 我在 @Autowired 依赖项上遇到 NullPoinerException。 14:08:48,415 SEVERE [com
我在编程方面没有太多经验,所以这是我的问题: 我正在尝试编写一个转换器应用程序。最后,您可以输入一个数字。然后我有两个组件UIPickerView .使用第一个组件,您可以选择输入格式(例如 °Cel
假设我在 Haxe 中有以下类: class Pair { public var first:U = null; public var second:V = null; pub
在很多与向服务器发送请求相关的问题的回答中,我看到提倡使用 Javascript/AJAX。 从某种意义上说,我仍然是一个纯粹主义者,因为我首先尝试开发无需使用 Javascript/AJAX 即可完
我是一名优秀的程序员,十分优秀!