Questions tagged «compiler-construction»

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

6
我可以对代码执行哪种模式以使其更容易转换为另一种编程语言?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 改善这个问题 我正着手做一个副项目,目标是将代码从一种编程语言转换为另一种编程语言。我开始使用的语言是PHP和Python(Python到PHP应该更容易入手),但理想情况下,我可以(相对)轻松地添加其他语言。该计划是: 这是针对Web开发的。原始代码和目标代码将位于框架的顶部(我也将不得不编写这些框架)。这些框架将包含MVC设计模式并遵循严格的编码约定。这应该使翻译更加容易。 我还在研究IOC和依赖项注入,因为它们可能使翻译过程更容易且更不易出错。 我将使用Python的解析器模块,该模块可让我摆弄抽象语法树。显然,我可以用PHP获得的最接近的是token_get_all(),这是一个开始。 从那时起,我可以构建AST,符号表和控制流程。 然后,我相信我可以开始输出代码了。我不需要完美的翻译。我仍然需要查看生成的代码并解决问题。理想情况下,翻译人员应标记有问题的翻译。 在您问“这到底是什么意思?”之前 答案是……这将是一次有趣的学习经历。如果您对如何减少这种麻烦有任何见解,请告诉我。 编辑: 我更想知道我可以对代码强制执行哪种类型的模式,而不是如何进行翻译,从而使代码的翻译(即:IoC,SOA?)更容易。

11
Java类文件的创建是否确定性的?
当使用相同的JDK(即相同的javac可执行文件)时,生成的类文件是否始终相同?取决于操作系统或硬件,会有所区别吗?除JDK版本外,是否还有其他因素导致差异?是否有任何编译器选项来避免差异?是仅在理论上可能有所不同,还是Oracle javac实际上针对相同的输入和编译器选项生成了不同的类文件? 更新1我对生成感兴趣,即对编译器输出感兴趣,而不对是否可以在各种平台上运行类文件感兴趣。 更新2 “相同的JDK”也指相同的javac可执行文件。 Update 3在Oracle编译器中的理论差异和实践差异之间的区别。 [编辑,添加解释的问题] “在不同平台上运行相同的javac可执行文件时,在什么情况下会产生不同的字节码?”

4
编译与编译
在寻找差异时,我遇到了以下定义: 编译是获取用一种语言编写的源代码并转换为另一种语言的总称。 Transpiling是一个特定术语,用于获取用一种语言编写的源代码并转换为具有相似抽象级别的另一种语言。 我了解什么是抽象。 但是在上面的定义中“相似的抽象水平”是什么意思?以及如何找到一种语言的抽象水平?

8
创建JVM编程语言
我已经使用C语言(使用lex和bison)创建了一种编译器,用于支持循环,函数内部的函数声明,递归调用等的动态类型编程语言。我还创建了一个虚拟机,该虚拟机运行由编译器创建的中间代码。 我现在正在考虑,而不是编译为自己的中间代码,而是将其编译为Java字节代码。 我看到关于创建JVM语言的问题已经存在 问但我认为答案并不十分有用。 所以这是我的问题: 我想为JVM创建一种语言是必须阅读 JVM规格书,您还能建议其他哪些书(当然,除了Dragon Book)?我最关心的是有关如何创建JVM语言的书籍或教程,而不是一般的编译器。 有许多Java库可以读取,写入和更改.class文件,例如jclasslib,bcel, gnu字节码等。您建议使用哪一个?另外,您知道执行相同工作的C库吗? 我当时正在考虑看看另一种针对JVM的语言,例如Clojure,Jython或JRuby。但是所有这些语言都是非常高级且复杂的(为它们创建编译器)。我一直在寻找一种针对JVM且其编译器是开放源代码的更简单(我不介意它是未知的还是未使用的)编程语言。有任何想法吗?

5
实现类型推断
我在这里看到了一些有关静态类型与动态类型的有趣讨论。由于编译类型检查,更好的文档代码等,我通常更喜欢静态类型。但是,我同意,例如,如果采用Java的方式完成代码,它们会使代码混乱。 因此,我将开始构建自己的功能样式语言,而类型推断是我要实现的事情之一。我确实知道这是一个很大的主题,并且我不尝试创建以前没有做过的事情,只是进行基本推理... 关于如何阅读的任何指示都可以帮助我解决这个问题?最好是一些比较实用/实用的东西,而不是更多的理论范畴论/类型理论课本。如果那里有一个实施讨论文本,以及数据结构/算法,那将是很可爱的。



6
与其他类型的循环相比,编译器会为do-while循环产生更好的代码吗?
zlib压缩库中有一条注释(Chromium项目中使用了它),这意味着在大多数编译器中,C语言中的do-while循环会生成“更好的”代码。这是它所在的代码段。 do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ https://code.google.com/p/chromium/codesearch#chromium/src/third_party/zlib/deflate.c&l=1225 是否有证据表明大多数(或任何一种)编译器会生成更好(例如,效率更高)的代码? 更新: 原始作者之一Mark Adler在评论中提供了一些上下文。

7
Linux内核如何进行自身编译?
在计算机上安装Linux系统时,我不太了解Linux内核的编译过程。 以下是使我感到困惑的一些事情: 内核是用C编写的,但是如何在不安装编译器的情况下编译内核? 如果在编译内核之前在我的机器上安装了C编译器,那么在没有安装编译器的情况下如何编译该编译器本身? 几天来我都很困惑,感谢您的回复。

7
为什么用功能语言编写编译器更容易?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 我考虑这个问题已经很长时间了,但实际上在Google上找不到答案,在Stackoverflow上也找不到类似的问题。如果有重复,对不起。 许多人似乎都说,用命令式语言编写使用OCaml和Haskell等功能语言编写的编译器和其他语言工具要高效得多,并且更容易。 这是真的?如果是的话,为什么用功能性语言而不是像C这样的命令性语言编写它们是如此高效和容易?而且-功能语言中的语言工具难道不比C等低级语言慢吗?




2
将两个GCC编译的.o目标文件合并为第三个.o文件
一个人如何将两个由GCC编译的.o目标文件组合到第三个.o文件中? $ gcc -c a.c -o a.o $ gcc -c b.c -o b.o $ ??? a.o b.o -o c.o $ gcc c.o other.o -o executable 如果您有权访问源文件,则-combineGCC标志将在编译之前合并源文件: $ gcc -c -combine a.c b.c -o c.o 但是,这仅适用于源文件,GCC不接受.o文件作为此命令的输入。 通常,链接.o文件无法正常工作,因为您无法使用链接器的输出作为输入。结果是一个共享库,并且没有静态链接到生成的可执行文件中。 $ gcc -shared a.o b.o -o c.o $ gcc c.o other.o -o executable $ …

8
为什么GDB会在行与行之间意外地跳转并将变量打印为“ <值优化输出>”?
谁能解释gdb的这种行为? 900 memset(&amp;new_ckpt_info,'\0',sizeof(CKPT_INFO)); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_** HDR),i_offset); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_ HDR),i_offset);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 …

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.