compiler-construction相关内容
我正在将 uc/OS-II 从 DOS 移植到 x86(实模式).我需要: 生成实模式 16 位 x86 程序集的编译器 将生成的程序集组装成目标文件的汇编器 将目标文件链接在一起并输出可执行文件(原始二进制文件、COFF、PE 或ELF 格式很好) 一个不调用任何DOS服务的标准库(int 21h),只依赖BIOS服务. 我想知道是否有任何工具链可以做到这一点.
..
我正在构建一个使用插件的程序.不幸的是,插件框架的动态链接迫使 RTL 和 VCL 从我的项目 EXE 中退出并进入 BPL 版本,并且它们没有启用调试信息. 所以我构建了一个静态链接到我的插件的测试框架,这样我就可以在跟踪代码时实际看到我在做什么.但是现在,每次我尝试重新编译时,都会报错:“unit turbu_skills was compiled with a different ve
..
我知道在 JavaScript 中,创建这样的 for 循环:for(int i = 0; i
..
从已编译的文件中,我可以看到使用哪个编译器生成文件吗? 解决方案 还有一个很好的旧“字符串"实用程序.转储它在二进制文件中找到的所有 ascii-ish 字符串.不同的编译器在它们生成的二进制文件中嵌入了不同数量的信息,但许多实际上会包含明显的标识字符串.
..
编译器有不同的语言吗? 解决方案 一个编译器可以可能用任何语言编写.在其最基本的形式中,编译器只是将代码从一种语言转换为另一种语言.在当今大多数人使用术语“编译器"的意义上,他们指的是接收某种高级语言的源代码并将其转换为汇编或某种低级中间语言的东西(CIL).
..
我在ubuntu中使用gcc.所以,我在终端中编译和执行.但是在在线编程比赛中,他们需要如图所示的输出. 为此,如果我使用 TURBOC 我可以使用 conio.h 使用 gotoxy() 来获得 螺旋格式 的输出.但是在 Ubuntu 中,我该如何实现呢? 解决方案 使用 ncurses 库. 这是一个例子,改编自 http://www.paulgriffiths.net/程
..
我知道 -O1 会自动打开某些标志.这些标志可以手动打开.如果我不指定 -O1,应该仍然可以通过指定 -O1 打开的所有标志来获得 -O1 优化. 我试过了 -fthread-jumps -fcprop-registers -fguess-branch-probability 但它仍然不做 -O1 优化.我可以知道我何时使用 gprof,因为性能不太好. 我应该打开哪些标志来获得
..
我有一个多 R/W 锁类,它保持读、写和挂起的读、挂起的写计数器.互斥体保护它们免受多个线程的影响. 我的问题是我们是否还需要将计数器声明为 volatile,以便编译器在进行优化时不会搞砸. 或者编译器是否考虑到计数器由互斥锁保护. 我了解互斥锁是一种用于同步的运行时机制,而“volatile"关键字是编译时指示编译器在进行优化时做正确的事情. 问候,-杰. 解决方
..
我有一个 CMake 项目,它通过 \MP 标志在 Visual Studio 中支持多处理器编译. 由于只是项目构建的众多可执行文件之一,我需要将 \MP 标志设置为 false(或禁用它,因为导入 .tlb 时出错 文件),我怎样才能为这个目标设置不同的标志? add_executable(MyProgram myprogram.cpp)target_link_libraries(My
..
我听说过 C++ 模板上下文中的代码膨胀.我知道现代 C++ 编译器并非如此.但是,我想构建一个例子并说服自己. 假设我们有一个类 模板类数组 {上市:T * 数据();私人的:电文_[N];};模板T * 数组::data() {返回 elems_;} 此外,假设 types.h 包含 typedef 数组整数,100 >我的数组; x.cpp
..
我不知道有任何自我改进的编译器,但我又不是一个编译器专家. 是否有任何自我改进的编译器? 请注意,我说的是自我改进的编译器,而不是改进它所编译的代码的编译器. 任何指针表示赞赏! 旁注:如果您想知道我为什么要问,请查看 这篇文章.即使我同意大多数论点,我也不太确定以下几点: 我们有可以改进的计划他们的代码现在没有人工输入——它们被称为编译器. ...所以我的问题
..
我正在查看这个 SO 问题并开始考虑 constints 与 #defines 并意识到我实际上并不明白为什么编译器不能处理这个问题.有人可以解释一下为什么下面的代码 const int FOO = 10;int main(int argc, char** argv){开关(argc){案例 FOO: { printf("foo\n");}默认值:{ printf("default\n");}}
..
我应该使用什么编译器(我使用的是 gcj 4.x)选项来为我的 java 应用程序生成一个“exe"文件以在 Windows 中运行? 解决方案 要编译 Java 程序 MyJavaProg.java,请键入: gcj -c -g -O MyJavaProg.java 要链接它,请使用命令: gcj --main=MyJavaProg -o MyJavaProg MyJavaProg
..
在大多数 C 或 C++ 环境中,都有“调试"模式和“发布"模式编译. 查看两者之间的差异,您会发现调试模式添加了调试符号(通常是许多编译器上的 -g 选项),但它也禁用了大多数优化. 在“发布"模式下,您通常会开启各种优化. 为什么会有差异? 解决方案 没有任何优化,通过你的代码的流程是线性的.如果您在第 5 行且单步,则进入第 6 行.启用优化后,您可以获得指令重新排序、循环展开
..
从这里我知道英特尔实现了几个静态分支预测这些年的机制: 80486 年龄:始终未采取 Pentium4 时代:Backwards Takes/Forwards Not-Taken Ivy Bridge、Haswell 等较新的 CPU 变得越来越无形,请参阅 Matt G 的实验在这里. 而且英特尔似乎不想再谈论它了,因为我在英特尔文档中找到的最新材料是大约十年前写的.
..
我在这里问专家... 有人对哪种编译器最适合 iPhone 应用程序进行了性能测试吗? 因为我们可以选择: GCC 4.2 LLVM GCC 4.2 LLVM 编译器 1.5 我想知道这 3 个中哪一个提供了最好的性能... 我自己做了一些快速测试,但没有发现太大区别? 您使用的是哪个编译器? 解决方案 如果你看WWDC2010 会议视频 300,开
..
我知道关键字 inline 具有有用的属性,例如用于将模板特化保存在头文件中.另一方面,我经常读到 inline 作为编译器实际内联函数的提示几乎毫无用处.此外,该关键字不能在 cpp 文件中使用,因为编译器希望在调用时检查标有 inline 关键字的函数. 因此,我对现代编译器(即 gcc 4.43)的“自动"内联功能有点困惑.当我在 cpp 中定义一个函数时,如果编译器认为内联对函数有意
..
例如 input{margin:0}body{margin:0;background:white} 这样写会更短 input,body{margin:0}body{background:white} 或者这个 input,body{margin:0}body{margin:0;padding:0} 这样写会更短 input,body{margin:0}body{padding:0}
..
考虑一个这样的例子: if(标志)对于(条件)做一点事();别的对于(条件)do_something_else(); 如果 flag 在 for 循环内没有改变,这在语义上应该等同于: for(条件)如果(标志)做一点事();别的do_something_else(); 仅在第一种情况下,代码可能会更长(例如,如果使用了多个 for 循环,或者如果 do_something() 是一个几乎
..
大多数 UNIX C 编译器默认将可执行文件链接到名为“a.out"的文件.为什么?这是书面标准还是事实上的标准行为?如果这些编译器只产生错误消息(或使用不同的默认名称)而不是产生“a.out",会出现什么问题? 解决方案 a.out 代表汇编输出. 我认为这证明了为什么大多数编译器都默认使用这个名称.更多信息这里.
..