Tag: 编译器构造

Peterson的算法对各种优化标志的行为

我想检查gcc和icc的行为以获得各种优化选项。 采用彼得森的2线程互斥算法。 如果交换了lock方法中第a行和第b行(在注释中)的执行顺序,则此算法可能会失败。 使用icc或带有-O0标志的gcc进行编译会产生正确的结果。 使用带有-O3标志的icc进行编译会产生不正确的结果。 使用带有-O3标志的gcc进行编译不会产生任何结果。 程序挂起。 所以我的猜测是-O3标志,gcc和icc都优化了锁定方法,并假设线a和线b之间没有依赖关系。 因此两者产生了错误的结果 这样的依赖很难让编译器找到,所以有没有办法(像ivdep这样的编译器)告诉编译器特定代码块中的依赖关系,这样我们仍然可以在代码的其他部分使用-O3标志 锁定方法: void lock(int me) { int other; other = 1-me; flag[me] = 1; //Line a victim = me; //Line b while(flag[other]==1 && victim == me) { } } 如果交换了行a和行b的执行顺序,则为MUTEX违规的示例: T0 0 sets victim=0 T1 1 sets victim=1 T2 1 sets flag[1]=1 T3 1 checks flag[0]. […]

编译器编程:最基本的成分是什么?

我有兴趣编写一个非常简约的编译器。 我想写一小段软件(用C / C ++),它符合以下标准: ELF格式的输出(* nix) input是单个文本文件 类C语法和语法 没有链接器 没有预处理器 非常小(最大1-2 KLOC) 语言特色: 本机数据类型:char,int和float 数组(适用于所有本机数据类型) 变量 控制结构(if-else) function 循环(会很好) 简单代数(div,add,sub,mul,布尔表达式,位移等) 内联asm(用于系统调用) 谁能告诉我怎么开始? 我不知道编译器包含哪些部分(至少在某种意义上我不能直接启动)以及如何对它们进行编程。 谢谢你的想法。

C / C ++:转到for循环

我有点不寻常的情况 – 我想使用goto语句跳转到循环中,而不是跳出它。 有充分的理由这样做 – 这段代码必须是某个函数的一部分,它在第一次调用后进行一些计算,返回请求新数据并需要再继续调用一次。 无法使用函数指针(明显的解决方案),因为我们需要与不支持函数指针的代码进行互操作。 我想知道下面的代码是否安全,即它将由所有符合标准的C / C ++编译器正确编译(我们需要C和C ++)。 function foo(int not_a_first_call, int *data_to_request, …other parameters… ) { if( not_a_first_call ) goto request_handler; for(i=0; i<n; i++) { *data_to_request = i; return; request_handler: …process data… } } 我已经研究过标准,但关于这种用例的信息并不多。 我也想知道从便携性角度来看,替换等价物是否有益。 提前致谢。 UPD :感谢所有评论过的人! 对所有评论者:)是的,我明白我不能跳过局部变量的初始化器,我必须在每次调用时保存/恢复i 。 关于强大的原因:)这段代码必须实现反向通信接口。 反向通信是一种试图避免使用函数指针的编码模式。 有时必须使用它,因为遗留代码需要您使用它。 不幸的是,r-comm-interface无法以很好的方式实现。 您不能使用函数指针,也无法轻松地将工作拆分为多个函数。

8051系列最好的C编译器是什么?

我们正在开始一个基于8051微控制器的新项目。 问题: 什么是最好的C编译器使用? 有没有开源8051编译器,它们有多好?

C 8位16位32位编译器之间的区别

这个问题可能是多余的,但我没有找到确切的答案。 C 8位16位32位编译器之间的区别是什么。 不同编译器为同一代码生成.exe的差异如何………..

带参数“-S -save-temps”的gcc将中间文件放在当前目录中

参数-S -save-temps工作正常,只要我不在具有相同名称的文件上使用它们。 考虑以下情况:我有一个带有主目录的项目和一个名为subDir的子目录,在这两个目录中都放置了名为subDir文件。 如果我现在调用gcc -S -save-temps file.cpp subDir/file.c将只生成一个名为file.i中间文件。 这是预期的行为,正如gcc的man文件告诉我的那样,当使用-save-temps时,中间文件将始终放在当前路径中。 我的问题是,我正在研究我事先不知道的项目。 很有可能,有人在他的Makefiles中构建了上面提到的例子。 在那种情况下,我会被卡住,因为我需要两个中间文件。 对我正在构建的系统说几句话(为了更好地理解):我的工具使用make –just-print来收集调用,一个项目的make文件调用。 我扫描这些调用以进行编译器调用并添加-save-temps和-S选项。 目的是获取在编译项目过程中使用的每个预处理文件。 你是否有任何想法,即使上面提到的例子应该出现,我怎么能得到每个预处理的文件?

哪个MinGW文件用作C ++编译器

我刚刚安装了MinGW,在bin文件夹中我可以看到编译程序的7个.exe文件: C ++。exe文件 克++。exe文件 的mingw32-C ++。exe文件 的mingw32-G ++。exe文件 gcc.exe 的mingw32-gcc.exe mingw32的-GCC-4.4.1.exe 我的小程序(testprog.cpp)正确编译每个程序; a.exe文件在bin文件夹中生成,并且运行正常。 他们和我应该使用哪一个有什么区别? 另外,在每次成功编译后,如何自动将输出文件的名称从a.exe更改为testprog.exe?

是否可以使用python编译c代码?

我想构建一个python程序,它将.c文件的路径作为输入,然后编译它。 如果编译成功,程序将输出OK到屏幕,否则输出BAD。 我一直试图谷歌,但找不到任何东西。 我一直在尝试使用编译程序的参数在python中运行cmd,但它不起作用。 澄清 – 我已经在我的机器中有一个非常具体的编译器,我想运行它。 我不希望python充当编译器。 只需获取代码,在其上运行我的编译器,然后查看答案是什么。 它应该在使用python 2.4的Linux服务器上运行。 谢谢

为什么以这种方式使用函数参数’foo’:*(&foo)?

Linux内核0.12中的代码片段使用如下函数参数: int do_signal(int signr, int eax /* other parameters… */) { /* … */ *(&eax) = -EINTR; /* … */ } 代码的目的是将-EINTR放到eax所在的内存中,但是我不知道为什么如果只分配给eax它将不起作用: eax = -EINTR 编译器如何在eax和*(&eax)之间产生差异?

哪些C99function被视为有害或不受支持

我通常在C89中编写C代码,现在C99的一些function(如intxx_t或__VA_ARGS__或snprintf )非常有用,甚至可能至关重要。 在我更多地从C89到C99的要求之前,我想知道哪些C99function得到了广泛支持,哪些function得不到广泛支持甚至被认为是有害的。 我知道我们可以检查我们的目标编译器支持,但这会缩小我们的支持范围,因为这是开源软件,我更希望得到更广泛的支持。 例如,我们使用Solaris(suncc)编译器和gcc,但是我们可能会有其他编译器移动,而我们可以通过很少的努力保持兼容性。 例如,我从未在Windows上工作,也不了解Windows编译器,但保持Windows兼容性会很好。