g****t 发帖数: 31659 | 1 (1)
例如我有一段依赖于输入x的代码,现在想对输入y重新利用它,一种办法是在代码里定
义函数f(.),然后写下:
定义 f(.)
f(x)
f(y)
三段
另外一种方法是,选出那段代码,替换x为y,然后paste回去。这样最后代码为:
一块包含x的代码
一块包含为y的代码
现在问题来了,哪种脚本语言适合第二种方法这样的任务?有没有现成的工具?第二种
方法的好处是等于实现了一小部分编译器的功能。好处是,第二种方法出来的代码,和
函数定义的语法无关。将来就算语言版本换了,也不需要担心它不work。
简单说,我理解的现在的coding,先按最容易理解最有效率的方式写代码,然后编译。
这两部分任务是分开的。但我认为,写好的代码,应该有个专门的工具给它自动整理下
,或者半编译下,然后这个半编译后的版本对高度抽象复杂的语言定义依赖性较少,今
后换到别的芯片上用,也就没问题。
(2)
我碰到过的一个具体问题就是从一个芯片自有的C代码换到另一个芯片的C。这两个C有
细微不同的定义和编译器。
(例如浮点数不初始化是否自动初始化为0;
例如unsigned number和signed number比较的结果)我的想法是,如果能找个工具把这
些可疑的语法特征都还原成更基本的语法特征,那今后就省很多事。例如我可以查所有
浮点数初始化的地方,然后没有初始化的地方,都加上初始化。现在有适合这种任务的
工具吗?
(3)
总结下,给了一种语言A,以及写成的代码段source1。
我现在定义了语言A的比较靠谱和简单的子集a。
现在想把source 1通过自动查找粘贴分析的办法转成a写成的代码 source 2
这样做的好处是对未来可能的语言和编译器以及硬件变化更roubust。有这样的工具吗
?如果没有,大家认为哪种脚本语言适合这样的任务?
(4)
前面的想法,是关于提高robust的。
同样,也可以用于分析和自动重写源代码,把代码提升到超集AA,来提高速度。我相信
这种代码优化肯定是很多软工熟悉的实践。问题来了?你们软工用的什么工具?能介绍
下吗? |
p***o 发帖数: 1252 | 2 llvm
【在 g****t 的大作中提到】 : (1) : 例如我有一段依赖于输入x的代码,现在想对输入y重新利用它,一种办法是在代码里定 : 义函数f(.),然后写下: : 定义 f(.) : f(x) : f(y) : 三段 : 另外一种方法是,选出那段代码,替换x为y,然后paste回去。这样最后代码为: : 一块包含x的代码 : 一块包含为y的代码
|
g****t 发帖数: 31659 | 3 llvm是通用一个机器模型还是可以自己定义模型?
例如我的芯片现在是买的instruction set,也能优化吗?
另外我做描述的这些事,哪种语言或者IDE方便些呢? |
p***o 发帖数: 1252 | 4 你的解决方案似乎和通常的差别比较大,没市场自然也就没人做。
一般都手写个HAL把硬件相关的东西独立出来,剩下的都是标准C/C++,用LLVM处理成
IR再编译到你的芯片。LLVM的好处是可以从IR开始加自己的东西,啥都可以,比如
emscripten和AutoESL。
【在 g****t 的大作中提到】 : llvm是通用一个机器模型还是可以自己定义模型? : 例如我的芯片现在是买的instruction set,也能优化吗? : 另外我做描述的这些事,哪种语言或者IDE方便些呢?
|
g****t 发帖数: 31659 | 5 我去看看llvm,thanks for the information.
(1)
小芯片很多都不是标准C。我们是特制的。
标准c为基础的芯片我预测会今后在美国很
难生存不下去。因为人人都会,利润很少。另外标准c在很多场合over kill太多了。
我关注的主要是代码的robustness with respect to different future C
compilers and hardware changes。这方面如果出事故,赔个几十M都有可能。
所以需求是有的。
之类的书里面有详细讲这些隐含在C的不同compiler实现的坑。
但感觉指望人力避坑不是个好办法。而且现在c写得好的人越来越少。
(2)
因为速度和鲁棒性通常是duality,所以我觉得CS的人肯定已经有了compiler
middleware做速度。所以想看看是不是可以借鉴下。 |
p***o 发帖数: 1252 | 6 定制的东西可以很鲁棒也可以很不鲁棒,关键是看做芯片的公司养不养得起做
编译器的队伍。你怕赔几十M,可是你一年愿意出多少钱呢?最终的结果要么
是编译器bug越来越多,要么是前端用开源的东西比如llvm来节省人力成本。
【在 g****t 的大作中提到】 : 我去看看llvm,thanks for the information. : (1) : 小芯片很多都不是标准C。我们是特制的。 : 标准c为基础的芯片我预测会今后在美国很 : 难生存不下去。因为人人都会,利润很少。另外标准c在很多场合over kill太多了。 : 我关注的主要是代码的robustness with respect to different future C : compilers and hardware changes。这方面如果出事故,赔个几十M都有可能。 : 所以需求是有的。 : 之类的书里面有详细讲这些隐含在C的不同compiler实现的坑。 : 但感觉指望人力避坑不是个好办法。而且现在c写得好的人越来越少。
|
c****e 发帖数: 1453 | 7 I built small tool to translate a DSL to Verilog years ago. I uses http://www.boost.org/doc/libs/1_56_0/libs/spirit/doc/html/index.html. If the BNF is simple, it's quite easy. You can do lots of things without full fledged parser. |
d********t 发帖数: 9628 | 8 Perl无疑
【在 g****t 的大作中提到】 : (1) : 例如我有一段依赖于输入x的代码,现在想对输入y重新利用它,一种办法是在代码里定 : 义函数f(.),然后写下: : 定义 f(.) : f(x) : f(y) : 三段 : 另外一种方法是,选出那段代码,替换x为y,然后paste回去。这样最后代码为: : 一块包含x的代码 : 一块包含为y的代码
|
g****t 发帖数: 31659 | |
g****t 发帖数: 31659 | 10 thanks for information. 展开说说? |
|
|
d********t 发帖数: 9628 | 11 有啥好说的,Perl到目前为止还是最灵活,处理文本最方便的。
【在 g****t 的大作中提到】 : thanks for information. 展开说说?
|
v********t 发帖数: 196 | 12 Python应该可以
【在 g****t 的大作中提到】 : (1) : 例如我有一段依赖于输入x的代码,现在想对输入y重新利用它,一种办法是在代码里定 : 义函数f(.),然后写下: : 定义 f(.) : f(x) : f(y) : 三段 : 另外一种方法是,选出那段代码,替换x为y,然后paste回去。这样最后代码为: : 一块包含x的代码 : 一块包含为y的代码
|
r*****9 发帖数: 65 | 13 perl啊,做txt/log分析难道不是default用它吗 |
G***l 发帖数: 355 | 14 lz你的标题误导人了。你在标题里说文本分析,结果一堆回复perl/python的,那些做
文本处理是很好。但你这个不是文本的问题,因为你这不是单纯的文本,是有语义的。
你这个基本就是需要个compiler frontend。比如你那个c语言的问题。你要用compiler
把代码转换为abstract syntax tree。有了这个ast之后,所有的变量定义都能准确定
位到,这时候你把ast上所有变量定义后面加一个初始化,再把ast反过来写成source
code,就成了。
如果你的需求很简单,比如只是变量定义加上初始化,那用纯文本regular expression
处理就可以了,perl,python很适合,哪怕sed/awk都可以搞定。如果复杂的话就需要
parser了,你可以用antlr,yacc之类的,那些常见语言的grammar都有现成的,不过要
是你自己特定的语法的话,就要自己写lexer/parer了,用上面提到的parser
generator的工具也挺容易。
【在 g****t 的大作中提到】 : (1) : 例如我有一段依赖于输入x的代码,现在想对输入y重新利用它,一种办法是在代码里定 : 义函数f(.),然后写下: : 定义 f(.) : f(x) : f(y) : 三段 : 另外一种方法是,选出那段代码,替换x为y,然后paste回去。这样最后代码为: : 一块包含x的代码 : 一块包含为y的代码
|
g****t 发帖数: 31659 | 15 编译器或者编译器的middle ware是通用工具,对所有程序都有用,所以成本高。只要思
路清晰直接,做个类似的专门自己芯片用的tool应该不需要那么高成本。另外几十M的
赔偿其实在半导体行业算是少的。 |
g****t 发帖数: 31659 | 16 谢谢回复。我学习下你说的东西再来和大家汇报。
我想的东西确实是类似compiler middleware或者前端。但不打算generalize这个问题
以免导致软件太复杂。我打算先实现以下四条rule:
第一条是查没明确初始化的变量。给它们明确初始化
第二条是查混合类型的表达式。把所有变量都强制explicit 转换。
第三条是把所有的for循环展开。copy paste多遍。
第四条是把while 表达式定义的
不确定次数的循环,把变量的range估计出来,求解和数学证明while循环最大最小次数
的范围,然后加上条件。明确避免while循环次数超过这个bound.
这几条会把原来的c code变成新的略微降低的c code
.
。你这个基本就是需要个compiler frontend。比如你那个c语言的问题。你要用
compiler把代码转换为abstract syntax tree。有了这个ast之后,所有的变量定义都
能准确定 |
c********6 发帖数: 382 | 17 3和4要做value range analysis,前端也不好做,除非你知道代码循环的写法一定就那
么几种。做源源变换不损失原来code的信息还是比较难做到的。 |
C**********t 发帖数: 34 | 18 你的第四条是halting problem,判断一个程序是否为死循环。这个方法应该是
undecidable的吧。循环最大最小次数在绝大多数情况下也是没法用数学证明得出
【在 g****t 的大作中提到】 : 谢谢回复。我学习下你说的东西再来和大家汇报。 : 我想的东西确实是类似compiler middleware或者前端。但不打算generalize这个问题 : 以免导致软件太复杂。我打算先实现以下四条rule: : 第一条是查没明确初始化的变量。给它们明确初始化 : 第二条是查混合类型的表达式。把所有变量都强制explicit 转换。 : 第三条是把所有的for循环展开。copy paste多遍。 : 第四条是把while 表达式定义的 : 不确定次数的循环,把变量的range估计出来,求解和数学证明while循环最大最小次数 : 的范围,然后加上条件。明确避免while循环次数超过这个bound. : 这几条会把原来的c code变成新的略微降低的c code
|
p***o 发帖数: 1252 | 19 四的水很深,最简单的比如单链表顺序访问,你怎么做?
【在 g****t 的大作中提到】 : 谢谢回复。我学习下你说的东西再来和大家汇报。 : 我想的东西确实是类似compiler middleware或者前端。但不打算generalize这个问题 : 以免导致软件太复杂。我打算先实现以下四条rule: : 第一条是查没明确初始化的变量。给它们明确初始化 : 第二条是查混合类型的表达式。把所有变量都强制explicit 转换。 : 第三条是把所有的for循环展开。copy paste多遍。 : 第四条是把while 表达式定义的 : 不确定次数的循环,把变量的range估计出来,求解和数学证明while循环最大最小次数 : 的范围,然后加上条件。明确避免while循环次数超过这个bound. : 这几条会把原来的c code变成新的略微降低的c code
|
g****t 发帖数: 31659 | 20 我有预知的domain knowledge.不是General 问题。 |
|
|
y**********u 发帖数: 6366 | 21 python 的ast应该可以,上次看了一下,好像是基于antlr的
那C/C++/java也应该可以直接上antlr了
里定
【在 v********t 的大作中提到】 : Python应该可以
|
g****t 发帖数: 31659 | 22 我多是一些数学物理类型的方程。while条件都是ADC读出来的几个传感器的电压触发一
些逻辑。传感器电压读数是有固定范围的,电压对时间的变化率也是有固定范围的。这
个系统的输入等于是可列举的。所以输出也是可列举的。所以我觉得原理上来说,所有
可能的情况是可穷尽的列出的。
简单的说,电压信号是bound在两个sin函数之间的离散信号。我觉得原理上来说,每个
for ,while都可估计出循环次数范围。到底能不能,只能一个个看了才知道。但我确切
的肯定,很多都能。
一般的c code,拆解while是没可能的。 |
l*******g 发帖数: 27064 | |