Questions tagged «compiler-construction»

标记“编译器构造”应应用于有关编译器编程的问题或有关编译器详细内部工作的问题。请勿使用有关*使用*特定编译器或编译错误的问题。

16
C和C ++中的静态变量存储在哪里?
静态变量存储在可执行文件的哪个段(.BSS,.DATA等)中,因此它们不会发生名称冲突?例如: foo.c: bar.c: static int foo = 1; static int foo = 10; void fooTest() { void barTest() { static int bar = 2; static int bar = 20; foo++; foo++; bar++; bar++; printf("%d,%d", foo, bar); printf("%d, %d", foo, bar); } } 如果我同时编译两个文件并将其链接到重复调用fooTest()和barTest的主文件,则printf语句将独立增加。这是有道理的,因为foo和bar变量是转换单元的本地变量。 但是在哪里分配存储空间? 明确地说,假设您拥有一个可以以ELF格式输出文件的工具链。因此,我相信,有有将一些空间,对于那些静态变量的可执行文件保留。 出于讨论目的,假设我们使用GCC工具链。


4
C#编译器如何检测COM类型?
编辑:我已经将结果写为博客文章。 C#编译器在某种程度上神奇地对待COM类型。例如,此语句看起来很正常... Word.Application app = new Word.Application(); ...直到您意识到这Application是一个界面。在接口上调用构造函数?ik!实际上,这会转换为的调用Type.GetTypeFromCLSID(),另一个是的调用Activator.CreateInstance。 此外,在C#4中,您可以使用非引用参数作为ref参数,并且编译器仅添加一个局部变量以通过引用传递,并丢弃结果: // FileName parameter is *really* a ref parameter app.ActiveDocument.SaveAs(FileName: "test.doc"); (是的,缺少许多参数。可选参数不是很好吗?:) 我正在尝试调查编译器的行为,但未能伪造第一部分。我可以毫无问题地完成第二部分: using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; [ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")] public interface Dummy { void Foo(ref int x); } class Test { static void Main() { Dummy dummy = null; dummy.Foo(10); …

11
解析一个.py文件,读取AST,对其进行修改,然后写回修改后的源代码
我想以编程方式编辑python源代码。基本上,我想读取一个.py文件,生成AST,然后写回修改后的python源代码(即另一个.py文件)。 有多种方法可以使用标准python模块(例如ast或)来解析/编译python源代码compiler。但是,我认为它们都不支持修改源代码(例如删除此函数声明)然后写回修改后的python源代码的方法。 更新:我要这样做的原因是我想为python 编写一个Mutation测试库,主要是通过删除语句/表达式,重新运行测试并查看中断。


3
C#编译器使用哪种语言编写?
我在http://referencesource.microsoft.com/上查看了源代码,似乎所有源代码都在C#中。 我还查看了新的C#编译器平台(Roslyn)的源代码,它也在C#中。那怎么可能?C#语言编译器是用C#编写的吗?还是我缺少明显的东西?如果C#编译器是用C#编写的,那么它如何工作?

2
sjlj vs dwarf vs seh有什么区别?
我找不到足够的信息来确定应该使用哪个编译器来编译我的项目。在不同的计算机上有多个程序可以模拟一个过程。在Linux上,我正在使用GCC。一切都很棒。我可以优化代码,它可以快速编译并使用不太多的内存。 我使用MSVC和GCC编译器做自己的基准测试。稍后的版本会生成稍快的二进制文件(针对每个子体系结构)。尽管编译时间比MSVC多得多。 因此,我决定使用MinGW。但是找不到有关MinGW中异常处理方法及其实现的任何解释。我可以对不同的操作系统和体系结构使用不同的发行版。 注意事项: 编译时间和内存对于我的用法并不重要。唯一重要的是运行时优化。我需要我的程序足够快。慢速编译器是可以接受的。 操作系统:Microsoft Windows XP / 7/8 / Linux 架构:Intel Core i7 / Core2 /和运行XP的非常老的i686:P





9
递归函数可以内联吗?
inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); } 当我阅读此书时,发现上面的代码如果编译器未正确处理,将导致“无限编译”。 编译器如何决定是否内联函数?

4
错误:可写原子属性无法将合成的setter / getter与用户定义的setter / getter配对
我最近尝试编译一个较旧的Xcode项目(过去可以正常编译),现在我看到很多这种形式的错误: error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter 导致这些错误的代码模式始终如下所示: // Interface: @property (retain) NSObject * someProperty; // Implementation: @synthesize someProperty; // to provide the getter - (void)setSomeProperty:(NSObject *)newValue { //.. } 我可以看到为什么会生成错误。我告诉编译器合成我的属性访问器(getter和setter),然后紧接着我手动覆盖setter。那个代码总是闻起来有点臭。 那么,执行此操作的正确方法是什么?如果我使用@dynamic而不是@synthesize,则也必须编写getter。那是唯一的方法吗?

22
Windows的C编译器?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我可以使用gcc作为C编译器在Linux上很好地工作,但需要Windows解决方案。有任何想法吗?我从Bloodshed看过Dev-C ++,但在寻找更多选择。

13
如何在编译时驱动C#,C ++或Java编译器来计算1 + 2 + 3 +…+ 1000?
在最近的一次采访中,有人问我一个非常奇怪的问题。面试官问我如何仅使用编译器功能来计算1 + 2 + 3 + ... + 1000。这意味着我不允许编写程序并执行它,但是我只应该编写一个程序,该程序可以驱动编译器在编译时计算此和,并在编译完成时打印结果。作为提示,他告诉我,我可能会使用编译器的泛型和预处理器功能。可以使用C ++,C#或Java编译器。有任何想法吗??? 这个问题与此处未询问任何循环的求和无关。另外,应该注意,总和应该在编译期间计算。使用C ++编译器指令仅打印结果是不可接受的。 阅读有关发布的答案的更多信息后,我发现使用C ++模板在编译过程中解决问题称为metaprogramming。这是Erwin Unruh博士在标准化C ++语言的过程中偶然发现的一项技术。您可以在meta-programming的Wiki页面上阅读有关此主题的更多信息。似乎可以使用Java注释用Java编写程序。您可以在下面查看maress的答案。 关于用C元编程++一个很好的书是这一个。如果有兴趣的话值得一看。 Boost的MPL 这个链接是一个有用的C ++元编程库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.