Redian新闻
>
哪种脚本语言适合做代码的文本分析?
avatar
g*t
2
(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,来提高速度。我相信
这种代码优化肯定是很多软工熟悉的实践。问题来了?你们软工用的什么工具?能介绍
下吗?
avatar
p*o
3
llvm

【在 g****t 的大作中提到】
: (1)
: 例如我有一段依赖于输入x的代码,现在想对输入y重新利用它,一种办法是在代码里定
: 义函数f(.),然后写下:
: 定义 f(.)
: f(x)
: f(y)
: 三段
: 另外一种方法是,选出那段代码,替换x为y,然后paste回去。这样最后代码为:
: 一块包含x的代码
: 一块包含为y的代码

avatar
g*t
4
llvm是通用一个机器模型还是可以自己定义模型?
例如我的芯片现在是买的instruction set,也能优化吗?
另外我做描述的这些事,哪种语言或者IDE方便些呢?
avatar
p*o
5
你的解决方案似乎和通常的差别比较大,没市场自然也就没人做。
一般都手写个HAL把硬件相关的东西独立出来,剩下的都是标准C/C++,用LLVM处理成
IR再编译到你的芯片。LLVM的好处是可以从IR开始加自己的东西,啥都可以,比如
emscripten和AutoESL。

【在 g****t 的大作中提到】
: llvm是通用一个机器模型还是可以自己定义模型?
: 例如我的芯片现在是买的instruction set,也能优化吗?
: 另外我做描述的这些事,哪种语言或者IDE方便些呢?

avatar
g*t
6
我去看看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做速度。所以想看看是不是可以借鉴下。
avatar
p*o
7
定制的东西可以很鲁棒也可以很不鲁棒,关键是看做芯片的公司养不养得起做
编译器的队伍。你怕赔几十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写得好的人越来越少。

avatar
d*t
9
Perl无疑

【在 g****t 的大作中提到】
: (1)
: 例如我有一段依赖于输入x的代码,现在想对输入y重新利用它,一种办法是在代码里定
: 义函数f(.),然后写下:
: 定义 f(.)
: f(x)
: f(y)
: 三段
: 另外一种方法是,选出那段代码,替换x为y,然后paste回去。这样最后代码为:
: 一块包含x的代码
: 一块包含为y的代码

avatar
g*t
10
thanks for sharing
avatar
g*t
11
thanks for information. 展开说说?
avatar
d*t
12
有啥好说的,Perl到目前为止还是最灵活,处理文本最方便的。

【在 g****t 的大作中提到】
: thanks for information. 展开说说?
avatar
v*t
13
Python应该可以

【在 g****t 的大作中提到】
: (1)
: 例如我有一段依赖于输入x的代码,现在想对输入y重新利用它,一种办法是在代码里定
: 义函数f(.),然后写下:
: 定义 f(.)
: f(x)
: f(y)
: 三段
: 另外一种方法是,选出那段代码,替换x为y,然后paste回去。这样最后代码为:
: 一块包含x的代码
: 一块包含为y的代码

avatar
r*9
14
perl啊,做txt/log分析难道不是default用它吗
avatar
G*l
15
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的代码

avatar
g*t
16
编译器或者编译器的middle ware是通用工具,对所有程序都有用,所以成本高。只要思
路清晰直接,做个类似的专门自己芯片用的tool应该不需要那么高成本。另外几十M的
赔偿其实在半导体行业算是少的。
avatar
g*t
17
谢谢回复。我学习下你说的东西再来和大家汇报。
我想的东西确实是类似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之后,所有的变量定义都
能准确定
avatar
c*6
18
3和4要做value range analysis,前端也不好做,除非你知道代码循环的写法一定就那
么几种。做源源变换不损失原来code的信息还是比较难做到的。
avatar
C*t
19
你的第四条是halting problem,判断一个程序是否为死循环。这个方法应该是
undecidable的吧。循环最大最小次数在绝大多数情况下也是没法用数学证明得出

【在 g****t 的大作中提到】
: 谢谢回复。我学习下你说的东西再来和大家汇报。
: 我想的东西确实是类似compiler middleware或者前端。但不打算generalize这个问题
: 以免导致软件太复杂。我打算先实现以下四条rule:
: 第一条是查没明确初始化的变量。给它们明确初始化
: 第二条是查混合类型的表达式。把所有变量都强制explicit 转换。
: 第三条是把所有的for循环展开。copy paste多遍。
: 第四条是把while 表达式定义的
: 不确定次数的循环,把变量的range估计出来,求解和数学证明while循环最大最小次数
: 的范围,然后加上条件。明确避免while循环次数超过这个bound.
: 这几条会把原来的c code变成新的略微降低的c code

avatar
p*o
20
四的水很深,最简单的比如单链表顺序访问,你怎么做?

【在 g****t 的大作中提到】
: 谢谢回复。我学习下你说的东西再来和大家汇报。
: 我想的东西确实是类似compiler middleware或者前端。但不打算generalize这个问题
: 以免导致软件太复杂。我打算先实现以下四条rule:
: 第一条是查没明确初始化的变量。给它们明确初始化
: 第二条是查混合类型的表达式。把所有变量都强制explicit 转换。
: 第三条是把所有的for循环展开。copy paste多遍。
: 第四条是把while 表达式定义的
: 不确定次数的循环,把变量的range估计出来,求解和数学证明while循环最大最小次数
: 的范围,然后加上条件。明确避免while循环次数超过这个bound.
: 这几条会把原来的c code变成新的略微降低的c code

avatar
g*t
21
我有预知的domain knowledge.不是General 问题。
avatar
y*u
22
python 的ast应该可以,上次看了一下,好像是基于antlr的
那C/C++/java也应该可以直接上antlr了

里定

【在 v********t 的大作中提到】
: Python应该可以
avatar
g*t
23
我多是一些数学物理类型的方程。while条件都是ADC读出来的几个传感器的电压触发一
些逻辑。传感器电压读数是有固定范围的,电压对时间的变化率也是有固定范围的。这
个系统的输入等于是可列举的。所以输出也是可列举的。所以我觉得原理上来说,所有
可能的情况是可穷尽的列出的。
简单的说,电压信号是bound在两个sin函数之间的离散信号。我觉得原理上来说,每个
for ,while都可估计出循环次数范围。到底能不能,只能一个个看了才知道。但我确切
的肯定,很多都能。
一般的c code,拆解while是没可能的。
avatar
l*g
24
处理文本,perl语言是不是最方便
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。