Questions tagged «compiler-construction»

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


2
在哪里可以学习编写词法分析器的基础知识?
我想学习如何编写词法分析器。我的大学课程有一个任务,我们必须编写一个解析器(和一个词法分析器一起使用),但这是在没有指导或反馈的情况下(超出标准)提供给我们的,所以我并没有从中学到太多。 在搜索了此主题之后,我只能找到相当高级的文章,这些文章着重于我认为比我所处的位置要走几步的领域。我想讨论一种为非常简单的语言编写词法分析器的基础知识,我可以以此为基础来研究标记更复杂的语言。 在此阶段,我对最佳实践或优化技术并不真正感兴趣,而宁愿关注重点。有什么好的资源可以帮助我入门?

10
C是开源的吗?
这可能是一个愚蠢的问题,但我一直对此感到疑惑。C(或其他任何低级语言)甚至都具有源代码,还是编译器是“完成所有工作”(包括解析)的部分?如果是这样,不同的编译器难道没有不同的C语言吗?stdlib在哪里影响因素?我真的很想知道这是如何工作的。

5
为什么这个C ++程序如此之快?
我写了一个基准测试来比较Python,Ruby,JavaScript和C ++的不同解释器/编译器的性能。不出所料,事实证明(优化的)C ++胜过脚本语言,但是这样做的原因令人难以置信。 结果是: sven@jet:~/tmp/js$ time node bla.js # * JavaScript with node * 0 real 0m1.222s user 0m1.190s sys 0m0.015s sven@jet:~/tmp/js$ time ruby foo.rb # * Ruby * 0 real 0m52.428s user 0m52.395s sys 0m0.028s sven@jet:~/tmp/js$ time python blub.py # * Python with CPython * 0 real 1m16.480s user …

9
向.NET应用程序添加脚本功能
我有一个用C#编写的小游戏。它使用数据库作为后端。这是一款纸牌游戏,我想将纸牌的功能实现为脚本。 我的意思是,我实际上具有一个接口,该接口ICard由纸牌类实现(public class Card056: ICard),并包含游戏调用的函数。 现在,为了使事物可维护/可修改,我希望将每个卡的类作为源代码存储在数据库中,并在首次使用时进行编译。因此,当我必须添加/更改卡时,只需将其添加到数据库中并告诉我的应用程序刷新,而无需进行任何程序集部署(尤其是因为我们要谈论的是每张卡1个程序集,这意味着数百个程序集) 。 那可能吗?从源文件注册一个类,然后实例化它,依此类推。 ICard Cards[current] = new MyGame.CardLibrary.Card056(); Cards[current].OnEnterPlay(ref currentGameState); 该语言为C#,但如果可以用任何.NET语言编写脚本,则可以额外获得好处。

17
Visual Studio:链接:致命错误LNK1181:无法打开输入文件
我已经在Visual Studio 2010中遇到了一个奇怪的错误,已有一段时间了。 我有一个解决方案,其中包含一个可编译为静态库的项目,以及另一个非常简单但依赖于此库的项目。 有时,在最近的几天里,重建解决方案或仅使用1-3个更改的源文件编译该解决方案后,出现以下错误: 2>LINK : fatal error LNK1181: cannot open input file 'thelibrary.lib' ========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ========== 编译thelibrary.lib成功,没有任何错误或警告的地方。 我曾尝试清洁溶液,但这并不总是有效。 怎么了

7
如何编译由GCC生成的asm?
我在玩一些汇编代码,有些事情困扰着我。 我编译这个: #include <stdio.h> int main(int argc, char** argv){ printf("Hello World\n"); return 0; } 与gcc file.c -S -o file.S此产生一个很好的小片的汇编代码: .cstring LC0: .ascii "Hello World\0" .text .globl _main _main: LFB3: pushq %rbp LCFI0: movq %rsp, %rbp LCFI1: subq $16, %rsp LCFI2: movl %edi, -4(%rbp) movq %rsi, -16(%rbp) leaq LC0(%rip), %rdi call …


5
为什么C#编译器允许空枚举?
我今天不小心定义了一个不包含任何值的枚举。像这样一个例子: public enum MyConfusingEnum{} 编译器很高兴让我定义它并成功构建了代码。 现在我显然不能使用传统意义上的代码,因为代码.. var mySadCompiler = MyConfusingEnum; 没有指定值,但有趣的是我很能说,.. var myRoundTheHousesZeroState = Activator.CreateInstance<MyConfusingEnum>(); 正如我提到的那样,它是MyConfusingEnum值为0的值类型; 我的问题是,为什么编译器允许空定义,并且在任何情况下它都可能有用?


22
编译器优化会引入错误吗?
今天,我与我的一个朋友进行了讨论,我们就“编译器优化”进行了两个小时的辩论。 我捍卫了这样的观点,有时,编译器优化可能会引入错误或至少会带来不良行为。 我的朋友完全不同意,说“编译器是由聪明的人建造的,可以做聪明的事情”,因此永远不会出错。 他一点也不说服我,但是我不得不承认我缺乏现实生活中的例子来加强我的观点。 谁在这里?如果是的话,您是否有现实生活中的示例,其中编译器优化在结果软件中产生了错误?如果我误会了,我应该停止编程并学习钓鱼吗?

7
如何使用OpenSSL include编译.c文件?
我正在尝试编译一个包含以下内容的小.c文件: #include <openssl/ssl.h> #include <openssl/rsa.h> #include <openssl/x509.h> #include <openssl/evp.h> 在我拥有.c文件的同一文件夹中,我拥有带有所有这些文件(以及更多文件)的/ openssl,也在突触包管理器中,我看到安装了OpenSSL,我正在尝试使用以下方法进行编译: gcc -o Opentest Opentest.c -lcrypto 但我总是得到错误: error: openssl/ssl.h: No such file or directory error: openssl/rsa.h: No such file or directory error: openssl/x509.h: No such file or directory error: openssl/evp.h: No such file or directory 我要编译的文件只是一个.c文件,没有Makefile或./configure。 我已经尝试过: env CFLAGS=-I/path/to/openssl/ 并尝试再次编译,但我得到相同的错误。 …

2
Java编译器中“ let表达式”(LetExpr)的目的?
Java编译器似乎支持(查找)中的let表达式。com.sun.tools.javac.tree.*LetExpr JCTree中的一条评论甚至提到了一些语法 (let int x = 3; in x+2) 当然,哪种语言不会被该语言的语法接受,而在较早的编译器阶段会被拒绝。 我想知道这个构造的起源,这是我以前从未见过的。 它是在内部使用javac还是由其他工具综合使用?难道这仅仅是Java早期的一种人工产物,它是一种从未见过光的语言功能? 今天有什么可以用的吗? 一般来说,为什么存在?

11
将C#编译为Native?
我认为我对将.NET字节码编译为本机代码感到有些困惑,或者我对最终结果感到困惑。因此,在我尝试整理我认为我理解的内容时,请多多包涵,以便您可以帮助我找出我所缺少的内容。 我想做的是将用C#编写的应用程序编译为常规的本机代码,就像用C编写时那样。我的推理与性能无关,而与某种程度的保护无关。我知道我的最终目标并非不可能(甚至确实如此困难),但是我只是觉得反转x86汇编比反转Reflector给我的东西更困难。 现在,如果将我的C#应用​​程序扔到Reflector中,我基本上会得到我的源代码。通常,当我将不受管理的C / C ++应用程序放入IDAPro并使用HexRays反编译器时,我得到的反编译程度并不太相同,我不得不诉诸于x86反汇编以了解逻辑流程。我的理解是,如此出色的反编译来自Reflector,这是因为应用程序位于MSIL中,而不是HexRays尝试反编译的更简洁的本机代码。 我不担心客户端计算机仍然需要.NET运行时,我没有尝试绕过任何这些。我想像upx在我的程序上一样运行普通的软件混淆程序,并且作为.NET二进制文件执行失败。 我对这个相关问题的理解ngen可以满足我的要求。我尝试使用ngen。但是,将输出文件从C:\Windows\assemblies\...\applicationName.ni.exe目录复制到某个位置后,我可以双击,并尝试运行它会产生一个错误,提示它不是“有效的Win32应用程序”。此外,当我将其applicationName.ni.exe扔到Reflector中时,我得到的输出与从中获得的输出相同applicationName.exe。由于applicationName.ni.exe应该是本机代码,因此我希望Reflector会出错,但事实并非如此。如果这是我应该做的方式,为什么Reflector仍然给我这么好的反编译? 因此,再次总结一下我的主要问题:如何将.NET程序编译为Reflector不太容易反编译的本机二进制文件?或有什么最佳实践来保护以.NET语言编写的产品免受新手反向工程师的侵害? 如果我需要其他工具,我会选择免费的东西,而不是像Codewall这样的东西。 谢谢! 更新:我了解我在寻找的内容可能会限制该语言的某些功能,例如反射,但是我认为可以。我的代码都没有进行任何显式Assembly.Load调用或任何类似的操作。但是,无论如何都不能将它们替换为GetProcAddress/LoadLibrary通话吗?

13
如何从Visual Studio编译中排除文件?
我正在重构一个项目。我有一个完整的子文件夹,已知该文件夹已损坏。到目前为止,在测试重构时,是否有任何声明性方法可将该文件夹暂时从编译中排除? 我知道我可以删除该文件夹,但是如果可能的话,我想通过配置来完成。

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.