问题标签 [compiler-construction]

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.

0 投票
8 回答
13392 浏览

c++ - C/C++ 中 PHP isset() 的对应物

PHP 有一个非常好的函数,isset($variableName)。它检查 $variableName 是否已经在程序中定义。

我们可以为 C/C++(某种符号表查找)构建类似的功能吗?

0 投票
5 回答
145 浏览

compiler-construction - 非机器字原语的倍数是个好主意吗?

假设您有一种动态语言(类似于常见的脚本语言)并想为它编写一个编译器。为类型标签之类的东西保留一些机器字是个好主意吗?特别是对于微控制器和类似设备,这是一个好主意吗?

我可以想到一些优点,例如减少类型信息的存储,更容易的内存管理(甚至可能是 gc)和更容易调试。但是这些是否可以证明普通算术运算或其他需要完整单词的运算的开销是合理的?请注意,字节码虚拟机在这方面会更糟,因为性能开销要大得多。所以不建议这样做;)

无论如何,有些人不会为微控制器级硬件编写数字密集型代码,但仍然......

0 投票
13 回答
5141 浏览

c++ - 现代编译器是否将 x * 2 操作优化为 x << 1?

C++ 编译器是否将乘以 2 操作优化x*2为位移操作x<<1

我愿意相信是的。

0 投票
5 回答
841 浏览

java - 我想要一个带有嵌入式编译器并在 linux 下工作并且不需要大量 ram 的 java 编辑器

我想要一个带有 Linux 编译器的 Java IDE,并且不需要大量的 RAM。我有 256 MB 的内存,所以我的选择有限

0 投票
12 回答
9468 浏览

c++ - Getting base name of the source file at compile time

I'm using GCC; __FILE__ returns the current source file's entire path and name: /path/to/file.cpp. Is there a way to get just the file's name file.cpp (without its path) at compile time? Is it possible to do this in a portable way? Can template meta programming be applied to strings?

I am using this in an error logging macro. I really do not want my source's full path making its way into the executable.

0 投票
11 回答
5261 浏览

c++ - C 编译器可以重新排列堆栈变量吗?

过去我从事过嵌入式系统的项目,我们重新安排了堆栈变量的声明顺序以减小生成的可执行文件的大小。例如,如果我们有:

我们将其重新排序为:

由于对齐问题,第一个导致使用了 12 个字节的堆栈空间,而第二个导致仅使用了 8 个字节。

这是 C 编译器的标准行为还是我们使用的编译器的一个缺点?

在我看来,如果编译器愿意,它应该能够重新排序堆栈变量以支持更小的可执行文件大小。有人向我建议 C 标准的某些方面阻止了这种情况,但无论哪种方式我都无法找到有信誉的来源。

作为一个额外的问题,这是否也适用于 C++ 编译器?

编辑

如果答案是肯定的,C/C++ 编译器可以重新排列堆栈变量,你能举一个绝对做到这一点的编译器的例子吗?我想查看编译器文档或类似的东西来支持这一点。

再次编辑

谢谢大家的帮助。对于文档,我能找到的最好的东西是 Naveen Sharma 和 Sanjiv Kumar Gupta 的论文GCC 中的 Optimal Stack Slot Assignment (pdf),它在 2003 年的 GCC 峰会上发表。

这里讨论的项目是使用 ADS 编译器进行 ARM 开发。在该编译器的文档中提到,像我展示的排序声明可以提高性能以及堆栈大小,因为 ARM-Thumb 体系结构如何计算本地堆栈帧中的地址。该编译器不会自动重新排列本地变量以利用这一点。此处链接的论文说,截至 2003 年,GCC 也没有重新排列堆栈帧以改善 ARM-Thumb 处理器的参考位置,但这意味着您可以。

我找不到任何可以肯定地说这曾经在 GCC 中实现过的东西,但我认为这篇论文可以证明你都是正确的。再次感谢。

0 投票
4 回答
509 浏览

compiler-construction - 添加了代码,swf 大小变小了?

...我正在研究几种理论,但我很想听听其他意见。

这已经在三台不同的机器上得到验证,两个 Windows 另一个 linux。使用的编译器是flexbuild(大概是mxmlc)和ant with mxmlc。

我们代码添加到一个小的独立单个 .as 文件项目中,编译后的 swf 文件大小减少了 20k,在 linux 机器上从 32k 减少到 12k。windows 盒子上略有不同,从 27k 到 8.5k。

通过自定义工具,我们验证了两个版本都使用原生 swf 压缩,没有大量额外的元数据,对 ant 构建脚本的唯一修改是在构建中添加一个 swc 文件。

没有删除代码(没有删除导入,没有删除变量,nada),只有添加并且非常简单,几个组件添加到阶段,启用,几个小功能等,没有修改循环,没有什么明显的将导致更少的代码。

使用源代码控制来构建旧版本仍然会导致文件更大,因此它似乎不是库或编译器中的更改。

没有代码使用 Flex 组件,只是直接“flash.etc...”类型导入。

有没有人见过这样的行为?您认为这可能是什么原因造成的?

0 投票
3 回答
15195 浏览

java - javac错误“代码太大”?

我有一个单元测试,其中我静态定义了一个非常大的字节数组(超过 8000 个字节)作为我不想每次运行单元测试时读取的文件的字节数据。

这在 Eclipse 中编译得很好,但是通过 Ant 脚本编译时出现以下错误:

任何想法为什么以及如何避免这种情况?


回答: Shimi 的回答成功了。我将字节数组移到一个单独的类中,它编译得很好。谢谢!

0 投票
4 回答
20010 浏览

java - 如何使用 Java 的 Scanner 类和正则表达式标记输入?

仅出于我自己的目的,我正在尝试在 Java 中构建一个标记器,我可以在其中定义一个常规语法并让它基于它对输入进行标记。StringTokenizer 类已被弃用,我在 Scanner 中发现了几个函数暗示我想要做什么,但还没有运气。有人知道解决这个问题的好方法吗?

0 投票
8 回答
1171 浏览

c++ - 哪些标准 c++ 类不能在 c++ 中重新实现?

我正在查看 C++0x 的计划,并std::initializer_list在用户类中实现初始化列表。如果不使用它自己,或者使用一些“编译器魔法”,这个类就无法在 C++ 中实现。如果可以,则不需要它,因为您用来实现的任何技术initializer_list都可以用于在您自己的类中实现初始化器列表。

还有哪些其他类需要某种形式的“编译器魔法”才能工作?标准库中有哪些类是第三方库无法实现的?

编辑:也许我应该说实例化而不是实现。更重要的是这个类与语言特性直接相关(你不能使用没有 的初始化列表initializer_list)。

与 C# 的比较可能会弄清楚我想知道的问题:IEnumerable 和 IDisposable 实际上是硬编码到语言功能中的。我一直认为 C++ 没有这种情况,因为 Stroustrup 试图让所有东西都可以在库中实现。那么,是否有任何其他类/类型与语言功能密不可分。