问题描述
如果我有这样的结构:
var sentence = 'Hello my friends';
var words = sentence.split;
var longWordLength = 0;
var longword = 'i';
function findLongWord (sentence){
for (a = 0; a < words.length; a++){
if (words[a].length > longWordLength){
longWordLength = words[a].length;
longWord = words [a];
return longWord}
}
console.log(longWord);
struct test{
float c,f,ops;
};
我现在有这样的要求,我需要修改gcc源代码,以便当他编译某种模式的结构时,他可以将其类型更改为指定的类型。
谢谢!
解决方法
您的目标非常雄心勃勃!
一种可行的方法可能是开发自己的GCC plugin来完成这项工作。
我的建议:
-
预算您的工作时间数月(也许是几年)-至少有6个月的时间才能获得“概念验证”的东西,而这在大多数代码中都是失败的碱基(以C表示)。对于C ++,请再添加一整年。
-
请仔细阅读C11标准n1570(如果目标是C)和C ++ 11标准n3337(如果目标是C ++)。仅此一项工作就可能需要您一个月的时间。
-
使您的插件成为开源软件,并将其代码迅速(例如,在LGPL许可下)快速放置在某些存储库中,例如github或gitlab。
-
定位到GCC的最新可用版本。在2020年9月,这意味着GCC 10。插件和GCC API不能兼容地从一个版本更改为另一个版本。如果您需要特别遵守GCC 8,请准备为AdaCore之类的公司花费大量资金。
-
仔细阅读documentation on GCC internals。您需要了解GENERIC表示形式。
-
非常仔细地研究GCC源代码的
gcc/tree.def
和gcc/treestruct.def
和gcc/gimple.def
文件。您需要基本了解其中的每一行。 -
非常仔细地研究GCC源代码的
gcc/passes.def
文件。同样,您需要了解该文件中的每一行。 -
学习从源代码编译GCC。您当然想用
构建它g++ -Wall -Wextra -g -O1
-
阅读this draft报告。
-
在
gcc@gcc.gnu.org
mailing list上寻求英语书面帮助,但之前有一些有效的插件。 -
考虑从这项工作中获得博士学位。这是值得的。法国的Alexandre Lissy获得了一个非常相似主题的博士学位。
如果您的代码库是C语言,请考虑使用Frama-C(或Clang)并将工具设计为C to C transpiler。
在#define float double
之后加上#undef float
这样的聪明的预处理器技巧可能就足够了。