我一直想知道的依赖性是从编程语言的库管理。 就拿C#。 当我开始学习计算机,我会假设(错误事实证明),该语言本身是独立的类库,最终将变得可用它的设计。 也就是说,该组语言的关键字(如for
, class
或throw
)加上的语法和语义,首先定义,以及可以从该语言中使用的库单独开发。 这些库的具体类,我常想,应该不会对语言的设计产生任何影响。
但是,这并不工作,或者不是所有的时间。 考虑throw
。 C#编译器可以确保下表达throw
解析为一个异常类型。 Exception
是在库中的一类,因此它不应该是特殊的。 这将是一个类的任何其他,不同的是C#编译器为其指派特殊语义。 这是非常好的,但我的结论是,语言的设计不依赖于是否存在,并在类库特定元素的行为。
此外,我想知道这个依赖关系管理。 如果我要设计一个新的编程语言,我会用什么技术来的语义映射throw
到非常具体的类,它是Exception
?
所以我的问题有两个:
- 我在想,语言设计是紧耦合的,它的基类库的正确吗?
- 如何这些依赖从编译器进行管理和运行的时间? 什么技术使用?
谢谢。
编辑。 感谢那些谁指出我的第二个问题是很模糊的。 我同意。 我试图学习的是什么样的关于它需要的类型的引用编译器店。 例如,它找到的类型由某种独特的ID? 当编译器或者类库的新版本发布时,会发生什么? 我知道,这仍然是相当模糊的,我不指望一个精确的,单款的答案; 相反,指针文学或博客文章是最欢迎的。
我试图学习的是什么样的关于它需要的类型的引用编译器店。 例如,它找到的类型由某种独特的ID?
显然C#编译器维持源代码和元数据提供给它的所有类型的内部数据库; 这就是为什么一个编译器被称为“编译” -它编译有关源代码和库数据的集合 。
当C#编译器需要,比方说,检查时引发的表达是否源自或相同的System.Exception它假装做一个全局命名空间查询System
,然后它的查找Exception
,认定阶级,然后比较所得到的类别信息到被推导为表达式的类型。
编译器团队使用这项技术,因为它的工作方式,不管我们是否编译源代码并System.Exception
是在元数据中,或者如果我们正在编制的mscorlib本身System.Exception
是源。
当然,作为一个性能优化的编译器实际上有“已知类型”列表和早期填充该列表,以便它没有经过每次做查询的费用。 正如你可以想像,你不得不查找内置类型的次数是非常大的 。 一旦列表中填充然后类型信息System.Exception
可刚读出名单,而不必做查找。
当编译器或者类库的新版本发布时,会发生什么?
什么情况是:开发人员,测试人员,管理人员,设计师,作家和教育家一大堆扎堆花几百万工时确保编译器和类库的所有工作,他们正在释放。
这个问题,再次,不可能含糊。 什么东西有发生,使一个新的编译器版本? 大量的工作 ,这就是有发生。
我知道,这仍然是相当模糊的,我不指望一个精确的,单款的答案; 相反,指针文学或博客文章是最欢迎的。
我写一本关于博客,除其他事项外,C#语言及其编译器的设计。 这是在http://ericlippert.com 。
我会假设(也许是错误地)语言本身是独立的类库,最终将变得可用它的设计。
你的假设是,在C#中,完全错误的情况。 C#1.0中,CLR 1.0和.NET Framework 1.0都设计在一起。 由于语言,运行时和框架的演变,每个设计师密切合作,共同确保正确的资源分配,使每个能按时出货的新功能。
我不明白的地方你完全错误的假设来自; 这听起来像写一个高层次的语言非常低效的方式,并错过最后期限的好方法。
我可以看到写像C,这基本上是对汇编更舒适语法的语言,没有一个图书馆。 但是,你会怎么写可能,也就是说, async-await
而无需人的设计Task<T>
在房间里吗? 这似乎是在挫折中锻炼。
我在想,语言设计是紧耦合的,它的基类库的正确吗?
在C#的情况下,是的,绝对。 有几十个,在C#语言假定类型可供选择和详细记录,以正常工作。
我曾经花了一个非常令人沮丧小时,谁在和foreach循环的一些彻底疯了问题,开发人员之前,我发现他写下了自己IEnumerable<T>
是有比真正的略有不同方法IEnumerable<T>
解决他的问题:不这样做。
如何这些依赖从编译器进行管理和运行的时间?
我不知道如何甚至开始回答这个不可能模糊的问题。
所有(实际)编程语言具有所需功能的最小数目。 对于现代的“OO”语言,这也包括各类需要的最低数量。
如果该类型是在所需要的语言规范 ,那么就需要-不管它是如何包装。
反过来说, 不是所有的BCL的需要有一个有效的C#实现。 这是因为不是所有的BCL类型由语言规范要求。 例如, System.Exception
(见#16.2)和NullReferenceException
是必需的,但FileNotFoundException
实现C#语言是不需要的。
需要注意的是,即使规范提供最小定义为基本类型(如System.String
),它并没有定义普遍接受的方法(例如String.Replace
)。 即,几乎所有的BCL的是语言规范1的范围之内 。
..但我的结论是,语言的设计不依赖于是否存在,并在类库特定元素的行为。
我完全同意,并包括实施例(和这样的定义的限制)的上方。
..如果我来设计一个新的编程语言,我会用什么技术来“扔”的语义映射到非常特殊的类,它是“异常”?
我不会在C#规范主要看的,而是我会看看通用语言基础结构规范。 这种新的语言应为实际的原因,被设计为与现有的CLI / CLR语言进行互操作,但不一定需要“C#”。
1 CLI(和相关联的参考文献) 并限定一个最小的BCL的要求。 所以,如果采取有效的C#实现必须符合(或可能承担)的CLI,然后还有很多其他类型的考虑未在C#规范本身提及。
不幸的是,我没有第二个(和更有趣的)问题有足够的认识。