【发布时间】:2011-01-05 13:47:39
【问题描述】:
我从事一个(即将完成的)Javascript 项目已有 14 个多月了。该项目一开始是一个我希望一夜之间完成的 hack,但随着时间的推移,Javascript 部分已经增长到 68 个单独的文件和 10,314 个非空行,遗憾的是目前依赖于 C 预处理器进行构建。
很难解释我是如何最终将 cpp 用于 Javascript 的:这只是一个 hack,我需要一些东西来给我宏扩展、ifdef、define 和包含而不需要太多的努力。经过大约 3 秒的考虑,我意识到 cpp 非常适合这项任务:
- 提供一个在发布模式下消失的 LOG() 宏。
- 提供在发布模式下消失的 ASSERT() 宏,并生成带有原始文件和行号标记的异常。
- 将 LOG() 和 ASSERT() 实现交换为允许生成“已检查”构建的代码,该构建以紧凑形式记录发生的事件,并在发生崩溃时将其报告回服务器。
- 根据与 Python 后端共享的配置文件,将 PROJECT_SOME_CONFIG_VAR_NAME 替换为“1”。
像所有真正的 hack 一样,这个 hack 现在被硬编码到项目中,以至于我真的不想考虑需要做哪些工作来替换它。我的项目正处于我想将代码库移动到它自己的专用测试服务器(而不是我的笔记本电脑)的阶段,但是在设置 Linux 实例时,我发现 4.1 之后的 GNU cpp 版本不再预处理 Javascript因错误而崩溃。
与其将特定版本的 GCC 添加到构建要求列表中,我认为现在是真正解决这个问题的好时机。但是,我的问题是,我找不到与 cpp 具有相同功能和功能的替代预处理器!我考虑过 m4,但 m4 本身就是一个痛苦的世界。我发现的其他特定于 Javascript 的预处理器缺少我目前依赖的所有功能,例如:
-
__FILE__&__LINE__ - 可变参数宏
- 包括警卫
- 令牌连接
- 条件编译
我正在认真考虑为 Javascript 实现一个全新的预处理器,它完全借用了 C 预处理器语法,因为它运行良好。我只是想知道在这样做之前是否有更好的选择。 :) 也许已经有一个类似 cpp 的通用预处理器我可以换掉?替换这 68 个文件中的所有预处理器语法所需的工作量接近于简单地重新实现预处理器所需的工作量。
我很惊讶我能在依赖 C 预处理器的情况下做到这一点;在这项任务中,它比健康的头脑更有效地理解。对我开放的另一个选择是为 Linux、Darwin-i386、Win32 静态构建 cpp-4.1 版本,并将这些二进制文件存储在项目的存储库中。
救命!
【问题讨论】:
-
好吧,我很同情。你真的一团糟,但为什么cpp会崩溃?它不应该。
-
@Stefano,这不是像分段错误那样的真正崩溃。解析器变得混乱,因为 Javascript 的一组词位和语法明显不同于 C。GCC 4.2+ 似乎有更严格的解析器。
-
出于好奇:哪个 JS 构造混淆了 C PP?
-
也许您可以修改另一个类似 CPP(例如 haskell.org/cpphs)以更好地满足您的需求。或者用 JavaScript 编写一个 JavaScript 预处理器,因为你现在已经熟悉这种语言了 ;-)
-
@Christoph,至少是单引号字符串:'David' 是有效的 Javascript,而它是无效的 C。在 4.2 之前,GCC 似乎传递了无效的令牌,但这不再是真的。 @ephemient 很可能 :) 实际上任务应该更简单,因为我不需要 C 预处理器的全部通用性和规则。
标签: javascript preprocessor c-preprocessor