标签: program-transformation

将C源转换为C++

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

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

我想到了一个总体战略:

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

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

注1:程序是一个编译器,可能数以百万计的其他程序依赖于它的行为不会改变,所以批量重写几乎不是一个选择.

注2:来源近20年,每年可能有30%的代码流失(线路修改+增加/以前的总线路).换句话说,它被大量维护和扩展.因此,其中一个目标是增加可持续性.

[为了这个问题,假设转换为C++是强制性的,而将它留在C中则不是一种选择.添加这个条件的重点是清除"留在C中"的答案.]

c c++ legacy refactoring program-transformation

41
推荐指数
4
解决办法
3万
查看次数

什么是AST转换?

什么是AST转换?我在阅读Groovy博客时遇到过这些话.但它一般是什么?

groovy abstract-syntax-tree program-transformation

35
推荐指数
3
解决办法
1万
查看次数

什么是尾递归消除?

Steve Yegge在一篇博客文章中提及它,我不知道这意味着什么,有人可以填写我吗?

它与尾部调用优化是一回事吗?

language-agnostic recursion tail-recursion tail-call-optimization program-transformation

33
推荐指数
2
解决办法
8449
查看次数

是否有命令行工具从C或C++文件中提取typedef,结构,枚举,变量,函数?

我希望有一个命令行工具从C或C++源文件中提取定义或声明(typedef,structure,enumeration,variable或function).另外一种替换现有定义/声明的方法也很方便(在用户提交的脚本转换提取的定义之后).是否有这样的通用工具,或者是这种工具的一些合理的近似值?

脚本性和与用户创建的脚本或程序连接的能力在这里很重要,尽管我在学术上也对GUI程序感到好奇.Unix/Linux阵营的开源解决方案是首选(尽管我对Windows和OS X工具也很好奇).主要的语言兴趣是C和C++,但更通用的解决方案会更好(我认为我们不需要超级准确的解析功能来查找,提取和替换程序源文件中的定义).

示例用例(额外 - 用于好奇心灵):

  1. 给定深度嵌套的structs和这些类型的变量(数组)初始化,假设需要通过添加或重新排序字段或以更易读的格式重写变量/数组定义来更改结构定义,而不会引入手工劳动产生的错误.这可以通过提取旧的初始化,然后使用脚本/程序编写新的初始化来替换旧的初始化来实现.
  2. 用于实现代码浏览工具 - 提取定义.
  3. 装饰代码生成(例如记录功能条目/返回).
  4. 脚本代码结构化(例如,提取这个和那个东西并放在不同的地方而不做更改 - 版本控制提交注释可以记录命令以执行此操作以使其明显且可验证没有任何改变).

替代问题:如果有一个工具来告诉定义的位置(开始和结束行就足够了 - 我们甚至可以假设我们感兴趣的所有定义/声明都在他们自己的行中),那么它只是一个简单的练习手指灵巧地写一个程序

  1. 提取定义,
  2. 替换定义,甚至
  3. 提取定义,运行由命令行选项(或编辑器)指定的程序

    • stdin(或从临时文件)接收所需的提取定义,
    • 执行转换(编辑),和
    • 输出新定义stdout(或将它们保存到给定的临时文件)

    被执行程序取代.

因此,主要的,更具挑战性的问题是找到定义的开始和结束行.

备注标签:更准确的标签比code-generationcode-transformation,但它不存在.

c refactoring automation code-generation program-transformation

12
推荐指数
1
解决办法
1964
查看次数

完全懒惰的lambda浮动通行证?

我正在阅读实现函数式语言:一个教程,并在实现完全懒惰的lambda提升的浮动传递时遇到了问题.

我想描述浮动如何使这个问题清楚,如果你熟悉它,只需跳到下面的问题.

该概念在本文的第246页介绍,主要在第256-257页实施.

let(rec)表达的情况下,它说:

我们必须在let(rec)表达本身之前放置右侧的浮动定义,因为右侧可能依赖于它们.

例如:

\a ->
  let f = \b -> b + (let $mfe = a * a in $mfe)
  in f
Run Code Online (Sandbox Code Playgroud)

变量$mfe是一个最大自由表达式(MFE),它通过前一次传递识别,当处理let f表达式时,我们f作为一个组浮出并附加到它[(1, [($mfe, a * a)])],这是从右边获得的let f.这里,第一个组件1表示组的自由级别.

当回溯到\a -> f抽象,我们发现,无论是$mfef被它约束,因此我们应该在这里安装它们:

\a ->
  let $mfe = a * a
  in
    let f = \b -> b …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming lambda-calculus program-transformation

10
推荐指数
0
解决办法
177
查看次数

"重构"有没有正式的定义?

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

UPDATE.

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

theory refactoring program-transformation

8
推荐指数
1
解决办法
461
查看次数

并行动态规划

有没有什么好的论文讨论如何采用动态程序并将其并行化?

parallel-processing dynamic-programming program-transformation

6
推荐指数
2
解决办法
4699
查看次数

根据穆尼克的说法重新关联

I\xe2\x80\x99m 阅读 Muchnick\xe2\x80\x99s \xe2\x80\x9cAdvanced Compiler Design & Implement\xe2\x80\x9d,其中图 12.6 列出了 20 个转换规则,如果按顺序应用,这些规则会进行常量折叠和重新关联将常量移动到一起。规则(不考虑分布性规则)是(我的语法:c文字、t术语、带有空格的运算符都在源代码中,而没有空格的运算符表示涉及文字的编译时计算):

\n\n
\nR1: c1 + c2 = c1+c2\nR3: c1 * c2 = c1*c2\nR5: c1 - c2 = c1-c2\n\nR2: t + c = c + t\nR4: t * c = c * t\nR6: t - c = (-c) + t\n\nR7: t1 + (t2 + t3) = (t1 + t2) + t3\nR8: t1 * (t2 * t3) = (t1 * t2 ) * t3 \n\nR9: (c1 + …

compiler-construction optimization program-transformation

4
推荐指数
1
解决办法
1349
查看次数

任何带C输出的C编译器?

我们都知道C编译器会吐出汇编.

然而,我正在研究我的工具只接受ANSI C的一个窄子集.那里有任何C-to-C转换器可以内联函数或扁平化结构,但写出C代码?

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

c code-translation program-transformation

3
推荐指数
1
解决办法
550
查看次数