问题标签 [program-transformation]

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 投票
11 回答
33716 浏览

c++ - 将 C 源代码转换为 C++

您将如何将相当大(>300K)、相当成熟的 C 代码库转换为 C++?

考虑到的 CI 被拆分为大致对应于模块的文件(即比典型的基于 OO 类的分解更细化),使用内部链接代替私有函数和数据,以及公共函数和数据的外部链接。全局变量广泛用于模块之间的通信。有一个非常广泛的集成测试套件可用,但没有单元(即模块)级别的测试。

我想到了一个总体策略:

  1. 编译 C++ 的 C 子集中的所有内容并使其正常工作。
  2. 将模块转换为巨大的类,以便所有交叉引用都由类名限定,但将所有函数和数据保留为静态成员,并使其正常工作。
  3. 使用适当的构造函数和初始化的交叉引用将大类转换为实例;酌情用间接访问替换静态成员访问;并让它工作。
  4. 现在,将项目作为一个错误因素的 OO 应用程序来处理,并在依赖项易于处理的情况下编写单元测试,并在它们不易于处理的情况下分解为单独的类;这里的目标是在每次转换时从一个工作程序转移到另一个工作程序。

显然,这将是相当多的工作。有没有关于这种翻译的案例研究/战争故事?替代策略?其他有用的建议?

注 1:该程序是一个编译器,可能有数百万其他程序依赖于它的行为不变,因此大规模重写几乎不是一种选择。

注意 2:源代码已有近 20 年的历史,每年可能有 30% 的代码流失(修改的行数 + 添加的行数/之前的总行数)。换句话说,它被大量维护和扩展。因此,目标之一是提高可维护性。

[为了这个问题,假设翻译成C++是强制性的,并且不能将其留在 C。添加此条件的目的是清除“将其保留在 C 中”的答案。]

0 投票
4 回答
474 浏览

refactoring - “重构”有什么正式的定义吗?

任何人都知道以更正式的方式定义重构的方法吗?

更新。

重构是一对 R = (pre; T),其中 pre 是程序必须满足的前提条件,T 是程序转换。

0 投票
3 回答
6105 浏览

parallel-processing - 并行动态规划

是否有任何好的论文讨论如何采用动态程序并将其并行化?

0 投票
2 回答
10512 浏览

language-agnostic - 什么是尾递归消除?

Steve Yegge 在一篇博文中提到了它,我不知道它是什么意思,有人能补充一下吗?

它与尾调用优化相同吗?

0 投票
1 回答
63 浏览

terminology - 这种符号代码转换叫什么?

我经常交叉这种代码转换(甚至是数学转换)。(Python 示例,但适用于任何语言。)

我有一个功能

我将它用于另一个。

导致 4

但是我想去掉函数依赖,我把函数 g 改成

也导致4

您如何称呼这种转换,将函数本地转换为标量?

0 投票
2 回答
383 浏览

automation - 是否有任何语言可以指定自动代码修改?

我正在做一些工作,我需要能够描述对一些要自动完成的程序代码的修改。

是否有任何语言可以描述这一点?

该语言应该具有接收代码中要进行修改的位置的模块或函数,并且应该允许指定可能进行的修改。
它应该允许描述修改,例如删除给定函数、在一段代码周围添加 if 条件、添加什么都不做的新函数声明等
。修改应该在解析树上完成,以便可以恢复原始代码,只有修改。
我什至不需要语言来关联解析器或实现,我所需要的只是语言本身的描述,无论是作为 BNF 语法还是非正式的。

我知道 PHP 提前编译器 phc 能够将源代码转换为 XML 表示形式并返回,从而更容易修改和恢复代码。我需要的是一种描述对 XML 的实际修改的方法,以便我可以运行一个程序,例如删除特定函数调用的所有实例,或者在每个实例周围添加 if(false)。此外,如果该语言与语言无关,尽管它不是必需的,但它会更好。

你认为这样的事情存在吗?

0 投票
1 回答
316 浏览

program-transformation - Stratgo/XT:了解基础知识

我真的试图了解了解 Stratego/XT 的第一步。我用谷歌搜索了很多,我发现的所有网络资源似乎在一开始就取得了足够大的飞跃,以至于我无法建立联系。让我解释。

我理解这样的抽象语法树:

但随后似乎(甚至在下一句中)这些文件实现了这一飞跃:

这对我来说毫无意义。有人可以解释这里发生了LetSplit什么吗?

此外,是否有一个很好的资源可以更好地加深对 Stratego/XT 的理解,它比 Stratego/XT 网站上庞大而复杂的官方“教程”更容易阅读?

谢谢!

0 投票
4 回答
14681 浏览

groovy - 什么是 AST 转换?

一般而言,什么是 AST 转换?我在阅读Groovy博客时遇到了这些词。但它一般是什么?

0 投票
5 回答
575 浏览

c - 任何带有 C 输出的 C 编译器?

我们都知道 C 编译器会输出汇编。

但是,我正在研究我的工具只接受 ANSI C 的一个狭窄子集。是否有任何 C-to-C 翻译器可以内联函数或展平结构,但写出 C 代码?

任何其他可以简化 C 代码的工具,让我听听。

0 投票
2 回答
650 浏览

android - 在 Android 上运行生成的 ARM 机器代码会产生带有 Java 位图对象的 UnsupportedOperationException

我们(http://www.mosync.com) 已经用 Android NDK 编译了我们的 ARM 重新编译器,它采用我们的内部字节码并生成 ARM 机器代码。当执行重新编译的代码时,我们看到性能有了巨大的提升,除了一个小例外,我们不能使用任何 Java 位图操作。本机系统使用一个函数来处理对重新编译的代码正在调用的 Java 端的所有调用。在 Java (Dalvik) 方面,我们绑定了 Android 功能。重新编译代码或执行机器代码时没有问题。完全相同的源代码适用于 Symbian 和 Windows Mobile 6.x,因此重新编译器似乎生成了正确的 ARM 机器代码。就像我说的,我们遇到的问题是我们不能使用 Java Bitmap 对象。我们已经验证了从 Java 代码发送的参数是正确的,我们已经尝试在 Android 自己的 JNI 系统中跟踪执行。问题是我们得到了一个 UnsupportedOperationException “大小必须适合 32 位。”。这个问题在 Android 1.5 到 2.3 上似乎是一致的。我们还没有在任何 Android 3 设备上尝试过重新编译器。

这是其他人遇到的错误吗,我想其他开发人员也做过类似的事情。