Questions tagged «compiler»

编译器是一种计算机程序,可以将以一种编程语言编写的源代码转换为另一种计算机语言。

11
我怎么知道编译器是否破坏了我的代码?如果是编译器,我该怎么办?
偶尔进行某些级别的优化时,C ++代码将无法工作。可能是编译器进行了优化而破坏了代码,也可能是包含未定义行为的代码,这些行为使编译器可以做任何感觉。 假设我有一些仅在使用更高的优化级别进行编译时会中断的代码。我怎么知道是代码还是编译器,如果是编译器怎么办?

8
编译器是否在开发之外使用?
据我所知,编译器旨在供开发人员将其代码编译为可执行(机器代码)文件。编译器不会扩展到客户端的计算机或最终用户系统。 相反,开发人员仅使用编译器将其代码转换为机器代码,然后将其传输到其他机器以用作应用程序。 编译器是否具有此过程之外的功能?如果是这样,什么时候使用它们?
14 compiler 

4
在c中打包结构是否有标准方法或标准替代方法?
当使用CI编程时,发现使用GCCs __attribute__((__packed__))属性打包结构非常有价值,因此我可以轻松地将易失性存储器的结构化块转换为字节数组,以通过总线传输,保存到存储或应用于寄存器块。打包的结构保证了当被当作字节数组对待时,它不会包含任何填充,这既浪费,可能的安全风险,又与接口硬件连接时不兼容。 没有适用于所有C编译器的打包结构的标准吗?如果不是,那么我认为这是系统编程的关键功能是一个异常现象吗?早期使用C语言的用户是否没有发现打包结构的需要,或者是否有其他选择?


3
为什么编译器不能避免自己两次导入头文件?
C ++的新手!因此,我正在阅读以下内容:http : //www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/ 护头板 因为头文件可以包含其他头文件,所以有可能最终导致头文件被多次包含的情况。 因此,我们制定了预处理程序指令来避免这种情况。但是我不确定-为什么编译器不能 ... 不能两次导入相同的东西? 鉴于标头保护符是可选的(但显然是一种很好的做法),几乎让我认为在某些情况下您确实想导入两次。尽管我根本无法想到任何这种情况。有任何想法吗?
13 c++  compiler 

6
“用C语言编写一个汇编程序。” 为什么要用高级语言编写用于低级语言的机器代码翻译器?
我的微处理器班老师给了我们一个作业,说: “用C语言编写一个汇编程序。” -我亲爱的教授 所以对我来说似乎有点不合逻辑。 如果我没搞错,汇编语言是从机器代码到高级语言之旅的第一步。我的意思是C是比汇编语言更高级的语言。那么,用C编写汇编语言有什么意义呢?在没有C语言的情况下,他们过去在做什么?他们是用机器代码编写汇编程序吗? 对我来说,用高级语言为低级语言编写机器代码翻译器没有任何意义。 假设我们已经创建了一个全新的微处理器架构,该架构甚至没有C编译器。用C编写的汇编程序能否模拟新架构?我的意思是没用吗? 顺便说一下,我知道GNU汇编器和Netwide汇编器是用C编写的。我也想知道为什么它们是用C编写的? 最后,这是我们的教授提供给我们的简单汇编程序的示例源代码: // to compile, gcc assembler.c -o assembler // No error check is provided. // Variable names cannot start with 0-9. // hexadecimals are twos complement. // first address of the code section is zero, data section follows the code section. //fout …


6
为什么编译器不内联所有内容?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 有时,编译器会内联函数调用。这意味着它们将被调用函数的代码移到调用函数中。这使事情变得更快一些,因为不需要在调用堆栈中上下移动内容。 所以我的问题是,为什么编译器不内联所有内容?我认为这将使可执行文件明显更快。 我能想到的唯一原因是可执行文件大得多,但是如今拥有数百GB内存真的重要吗?改进的性能值得吗? 还有其他原因导致编译器不仅仅内联所有函数调用吗?

1
哪些中间表示可用于推理并发?
我试图更好地理解编译器能够代表程序员对并发做出明智选择的要求。我意识到例如这个问题有很多困难的方面: 确保没有比赛条件 确保要同时运行的代码不会产生影响代码语义的副作用 给定代码中可用的并行度,确定是否有必要分散线程的开销 我的理解是,现代编译器中使用的两个主要中间表示形式是面向过程和面向对象语言的静态单一分配,以及面向功能语言的延续传递样式。使用这些中间形式似乎很难对上面列出的任何问题进行推理。即使是理论上应该在自动并行化方面机会最大的语言(诸如Haskell这样的纯功能语言,也没有副作用)在这方面也取得了有限的进展。 所以我的问题是,实际上使用了哪些中间表示来尝试解决该问题?我还不知道还有其他一些学术研究中使用的表示形式更适合此任务吗?这个问题是否是编译器前端必须从根本上通过在编译到达中间表示之前操纵抽象语法树来解决的问题?

4
是否可以在Linux上使用Intel C / C ++编译器来创建要在Windows上链接的目标文件?
为什么? 取决于您的来源,英特尔编译器很可能或最肯定会为x86架构生成最快的可执行文件(将执行时间缩短5%至100%)。 英特尔根据非商业许可证免费提供其Linux编译器(我认为我在其页面上的某处免费阅读了该文件:英特尔-非商业软件开发)。还有一个针对学生的免费非商业许可证,但是尽管为所有三个主要操作系统都提供了工具(由于信誉限制而导致链接断开),但该许可证不适用。 目标 我(作为非学生)希望能够使用英特尔编译器来提高非商业许可下的执行速度,以编译可链接以创建Windows(可能是OS)的可执行文件和动态链接库的目标文件。 X) 更多细节: 从本文档中可以推断出,英特尔编译器会创建与平台的主流编译器兼容的目标文件。 子问题: Windows和Linux(当前版本)上的gcc,g ++,cl,mingw32,icc,icpc和icl的目标文件格式是什么? mingw32交叉编译器工具链的一部分可以用来实现目标吗? 我认为生成的目标文件中的元数据是主要问题吗? 广告2: mingw32-objcopy似乎能够将Linux(可能是ELF)上的Intel编译器输出转换为与Microsoft兼容的COFF(可重定位目标文件可能除外)。有人可以确认这确实有效吗(适用于非平凡的应用程序)?

5
C静态库不受欢迎吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 共享库有两个参数: 它有助于减少磁盘空间。 共享库更新后,取决于它的所有二进制文件都会更新。 共享库主要有一个缺点: 他们可以引入依赖地狱。 在台式计算机上,第一个优点实际上不再成立。如今,浪费磁盘空间已不是什么大问题。 拥有静态二进制文件将使我们能够获得更好的程序包管理器-我的意思是,依赖关系已经成为过去。添加程序就是添加二进制文件。最后是一个文件夹,让它处理其文件。删除程序就是删除该文件。依赖关系?走了 第二个优势仍然存在,但我认为台式机上静态二进制文件的优势胜过它。我的意思是,尽管具有共享库的优势,但即使是Go这样的新语言也可以编译所有二进制文件,这是因为它具有便利性。 既然共享库的主要优点之一不再重要,那么C静态库是否仍然不受欢迎?如果是这样,为什么?
11 c  compiler 

2
用不同的编译器创建的(C)目标文件是否与二进制兼容?
我了解C ++编译器彼此不兼容。但是,我无法在C上找到关于此主题的任何东西。我知道C标准为编译器提供了很多空间,使它们能够执行合适的事情,例如,他们认为合适:例如,大多数(所有?)数据类型的大小和对齐方式是实现定义的,除了一些最小的保证。因此,两个编译器(或同一编译器的两个版本)可能在许多细节上存在分歧。 我是否认为不能保证使用不同编译器编译的两个目标文件实际上可以正确链接是正确的吗?例如,一个目标文件中指针的大小可以是32位,而在另一个目标文件中则可以是64位。但是如果是这样,为什么C库有时会以预编译形式分发?是否期望我将使用与他们相同的编译器(例如gcc),或者使用某些事实上的标准来确保二进制兼容性?带有外语接口的其他语言如何确保在与C对象文件链接时事物能够正确对齐?
11 c  compiler 


2
动态语言运行时和C#4.0之间有什么关系?
假设我想在当今存在的.NET平台上创建动态语言编译器/解释器,或者是Scheme解释器。使用动态语言运行时(DLR)还是使用C#4.0来实现我的语言的动态功能,我会更好吗?还是我都需要? 我知道在这方面还有其他工作要做,尤其是IronScheme和IronPython。这两种语言都使用DLR。我相信IronPython使用的是最新版本的DLR(大约有一年的历史了),而IronScheme使用的是早期版本的DLR的早期,经过大量修改的分支。但是创建这些编译器时C#4.0不可用。 我已经看过Rob Conery与Massive的合作,它使用C#4.0的动态功能。这是非常令人印象深刻的。但是C#是否能够承受动态语言编译器/解释器的全部工作?DLR中是否存在C#中缺少的功能,或者DLR本质上已集成到C#4.0中?如果仅使用C#4.0,我会缺少DLR的任何重要功能吗?

2
语言开发框架应该多么容易使用?
这是一系列问题的一部分,这些问题集中于一个称为抽象项目的项目,该项目旨在以框架的形式抽象语言设计中使用的概念。 可以在此处查看与它相关的与结构化类型相关的另一个页面。可以在此处找到与有关框架和适当发布位置的查询相关的元主题。 使用语言开发框架应该有多容易? 我编写了大规模的代码生成框架,其中还包括将结果发送到特定语言的编译器的功能。易用性主题来自这样一个框架示例:CodeDOM或代码文档对象模型。 它是由Microsoft编写的框架,描述了常见的代码结构,但通常忽略了很多(表达强制),并且在表示某些结构时趋于抽象,完全根据您的工作发出错误的代码:当使用的类型是通用接口时,CodeDOM不能很好地处理PrivateImplementationTypeon CodeMemberMethod。CodeDOM是我编写第一个代码生成器的最初原因。 为了简化框架,我正在尝试做的一件事是减少要做某件事所需的工作量,并着重于动作与构成这些动作的特定类型。 这是我正在编写的框架的并行比较: //Truncated... /* * * From a project that generates a lexer, this is the * state->state transition character range selection logic. * */ var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference())); //... char start = rangeElement.B.Value.Start; char end = rangeElement.B.Value.End; /* * * 'start' …

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.