问题标签 [compiler-theory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - PIC18 ISA 中如何处理除法
一种在 C 中转换为 ASCII的扩展,我想知道在 PIC18X 上究竟是如何处理除法的。
如果我执行 DIV 操作,编译器会将其解释为多少条指令?操作完成需要多少个时钟周期?时钟周期数是否取决于我的被除数、除数或两者?
作为一个不太重要的附带问题:第一个包含专用划分硬件的 CPU 是什么?
design-patterns - 制作一个邪恶的快速编译器的关键设计选择是什么?
我想知道如何设计一个编译非常非常快的编译器。
首先,让我避免对我的问题的一些明显误解:
我不是在谈论编译器生成的代码的速度。已经有许多资源可用于学习如何优化生成的代码。我很难找到有关使编译器快速的信息。
我也没有兴趣讨论为什么 C++ 编译器通常比 Java 编译器慢(例如)。我对可以使用哪些技术来加速任何给定语言的编译器感兴趣。
我也不想听到像 Microsoft 的 Incredibuild 或 Unix 的 distcc 这样的分布式编译系统。这些系统不会给你更快的编译器,它们只是给你更多的编译器。这当然很有用,但这不是我要问的问题。我想知道如何为单个 CPU 设计一个快速编译器。
ccache 也不是我正在寻找的答案。这是一个允许您完全避免使用编译器的系统,但它不会使编译器更快。同样,这很有用;再说一次,这不是我要问的问题。
我希望我的问题现在非常清楚。但也许一些历史会使它更加清晰。
C 编译器过去非常慢。然后,在 1986 年,THINK Technologies 推出了适用于 Macintosh 的 Lightspeed C,它几乎可以立即编译程序。Lightspeed C比所有其他 C 编译器快得多,几乎没有任何可比性。(也许 Lightspeed C 不是新一代闪电般快速的编译器中的第一个,但它是我经验中的第一个。Turbo Pascal 更早 [1983] 出现,但我没有使用它的经验,所以我不知道如何它比较,速度方面。)
从那时起,许多快速编译器已经可用。似乎在 1980 年代编译器技术发生了某种飞跃,这尤其是我想要理解的。突破是什么?
答案可能很简单:使用 Lightspeed 和 Turbo 等 IDE,集成编辑器已经在 RAM 中拥有源代码。如果编译器对这些数据进行操作,它将消除磁盘 I/O,这是所有编译器中最慢的部分。如果源代码大小相对于内存大小较小,那么这可能是提高速度的一个非常重要的因素。(在那些日子里,RAM 大小要小得多,但典型的程序大小也是如此。)
是这样吗?或者是否涉及其他重要的创新?从那时起,编译器速度是否有重大改进?
syntax-highlighting - 为什么编译器不能在我键入代码时编译我的代码?
为什么编译器不能在我键入代码时编译我的代码?
从用户的角度来看,它可以像今天的语法着色一样流畅地工作。如果您停止输入足够长的时间(可能是几秒钟),则编译(未链接)将完成,并且将使用语法着色之类的东西来识别代码错误。
这不像我的 3GHz 四核怪物计算机真的忙于做其他事情。为什么不让它一直编译呢?
compiler-construction - 前瞻集的精确定义是什么?
我正在玩弄编写编译器并学习语法分析背后的理论。我发现尽管它是理解识别算法的关键概念,但网络上关于它的信息却相当贫乏。StackOverflow 似乎在解决这个问题上处于一个独特的位置。
scala - Scala "<-" 用于理解
我发现 Scala 总是对任何事情都有“自然的解释”。总是像“哦,但这只是在这个和那个对象上使用这个和那个参数调用的函数”。从某种意义上说,没有什么是真正的编译器魔法,正如我们从其他语言中所知道的那样。
我的问题是关于以下代码中使用的<-运算符:
在这个例子中,我可以看到它被重写为:
但这并不能解释我是如何进入 foreach 函数内的匿名函数的。在您编写i时,它不是一个对象,也不是一个声明的变量。那么它是什么,它是如何被转移到 foreach 内部的呢?
我的猜测是我终于发现了一些实际上是编译器魔法的东西
谢谢你的时间。
为了澄清,我的问题是: <- 运算符如何在第一行代码中工作,因为 i 不是可以作为函数调用的对象。
linux - 如何读取头块 gcc 编译器放入 .o .a 和可执行文件
我想阅读放在所有 .o .a 和可执行文件开头的标头块 gcc。那时,在 Solaris 上,有一个用于此目的的实用程序。在 linux 上,是否有类似的实用程序可用?
c - 在 C 中取消引用静态变量时究竟会发生什么?
所以可以说我有这个代码
很明显,我向函数传递了一个指向 my_static_int 的指针。但是当代码被编译时会发生什么?我考虑过的大道:
1) 当你声明一个非指针变量时,C 会自动创建它的指针并在内部做一些事情,比如 typedefs my_static_int to be *( internal_reference )
无论如何,我希望我的问题足够描述性
compiler-construction - Interesting Compiler Projects
I am looking at a semester long project in compilers that could also evolve into my graduate thesis. I do not have much experience in this field (I have written a small "translator" for Pascal as part of my undergraduate work) --- I have been more into Machine Learning, and AI. The idea is to take this up as a challenge, and learn something in the process.
I did have a look at: Interesting compiler projects , but most of the ideas seem outdated.
The same is also true of the LLVM Open Projects page --- http://llvm.org/OpenProjects.html
Since I will have a semester to work on it, I am aiming for something slightly significant. I would like to work broadly on optimisations, or parallelisation. What might be an interesting thing to work on?
compiler-construction - 自上而下的解析器希望在“代码”中有不错的案例示例左递归
你好,堆栈的流成员。
我正在学习编译器类。我确实理解 Top-Down Parser 应该避免左递归,并转换为右递归方式。
问题是,
a)我是否理解正确的 Top-Down Parser 等于 LL 而 Bottom-Up Parser 等于 LR ?
b) 我发现左递归是自称 ex) Expr :== Expr '+' Term | 可以导致无限循环查找 Expr 的项。但无论如何,任何考虑输入 C 或 Java 的示例代码?(我不想要解析器或扫描仪代码)我需要的是带有句子形式的案例代码示例,通过左递归发生无限循环。
c) 在自顶向下解析器中使用右递归实际上有什么不同?
ANS c) 无需回溯。但还有别的吗?
ANS b)x - 2 * y
还有别的东西吗?因为这个适用于回溯的解析方式。
我发现了非左递归和左递归的案例示例。
左递归语法
非左递归语法
两者都进入无限循环。
谢谢你,感谢你所有的专家。
c# - 如何在 C# 中实现按名称调用?
谁能告诉我如何在C#中实现按名称调用?