免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: shecx
打印 上一主题 下一主题

如何在C中执行动态生成的代码 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-05-29 00:11 |只看该作者
wwwsq 发表于 2012-05-24 11:01
在A.c中调用gcc把B.c编译成B.so,然后在A.c里面dlopen("B.so")、dlsym之类的,就可以调用B.c里面的函数了。 ...



CUDA和OpenCL也是这么干的。。。

如果你想快一些,你可以使用clang。

因为有这样的问题:


#include XXXX
#include YYYY

//your code here。

你自己的代码没几行,但是因为你include别的东西,导致最后需要编译的文件很大,
clang可以先把include的处理成ast,之后你直接分析你新加的代码就是了。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
32 [报告]
发表于 2012-05-29 00:11 |只看该作者
回复 30# OwnWaterloo


    vm是已知最有效的解释器实现方式。

ruby的效率和内存问题你也知道的。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
33 [报告]
发表于 2012-05-29 00:41 |只看该作者
回复 32# starwing83

可能是以前讨论时候没说清楚吧……

比如说"gcc",就不是指将那套exe,dll,out,so,lib,a,h什么的直接搬来用。
也许中间会这么搞,但至少最终不是这么搞。
这么说吧"gcc"的意思这么说更准确:只做L->C的转换,C->native的转换就交给其他现有的工具/库去搞定。
也许是gcc,也许是gcc的后端,也许是clang/tcc,或者直接llvm。
也可以按你说的,只负责产生代码,用户自己去编译。

C->asm的工作也不是完全不做,但肯定不是最初的重点。
必须要有一个"保底"手段 —— 当对其他arch的asm不了解的时候,至少还有"gcc"(成熟的C->asm)的工具可用。



至于"interpreter"的意思也是:edit->compile->link->run->result的cycle太繁琐了,也太慢了。
native code是最终release/deliver(给他人)用。对于自己甚至可以始终用interpret。
而develop时的cycle要更短,至少是edit->run->result,甚至edit->result。

至于interpreter实现到什么程度并不是最开始的重点。但从设计vm开始就有过早优化的感觉了。这只是develop时、quick and dirty时用的东西。

甚至这东西我都想省略的,只支持native。运行时加载source就source->C->cc&ld->dll/so->GetProcAddress/dlsym……
只是想到bootstrapping可能需要这东西,作为一个副产品,就先凑合着用吧……

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
34 [报告]
发表于 2012-05-29 00:45 |只看该作者
本帖最后由 starwing83 于 2012-05-29 00:46 编辑

回复 33# OwnWaterloo


    这么说我就好接受多了……但是C功能有限,有很多东西做不出来啊(tail call、continuation神马的……)

论坛徽章:
0
35 [报告]
发表于 2012-05-29 01:01 |只看该作者
gtkmm 发表于 2012-05-29 00:11
CUDA和OpenCL也是这么干的。。。

如果你想快一些,你可以使用clang。




gcc貌似也支持预编译了。

http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

不知道速度有没有clang的快

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
36 [报告]
发表于 2012-05-29 01:04 |只看该作者
回复 35# wwwsq


    他说的其实不是预处理头文件…………这个gcc很早就有了……

他说的是,clang不仅仅是个编译器,还是一套工具库,你可以拿它将代码分析成ast存起来,然后附加上你加的代码编译出来的ast一起编译,这样速度快~~

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
37 [报告]
发表于 2012-05-29 01:06 |只看该作者
回复 34# starwing83

tail call嘛gcc肯定支持一些,这个是有保障的,因为haskell的关系……
总的来说C没有操作stack的能力……先用软件实现stack保底,然后对已知的arch用asm或者用llvm?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
38 [报告]
发表于 2012-05-29 01:07 |只看该作者
回复 37# OwnWaterloo


    那你就需要vm罗……(不然你的stack怎么实现……)

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
39 [报告]
发表于 2012-05-29 01:14 |只看该作者
回复 38# starwing83

指令是native的,就一个虚拟的stack,称为vm我觉得太不准确了。。。
就像一些人将类似arena —— 多次分配整体释放apr_pool, obstack(glibc)  —— 的东西称为gc一样。。。
这么高调很容易让人误会。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
40 [报告]
发表于 2012-05-29 01:20 |只看该作者
回复 39# OwnWaterloo


    ?C怎么搞这件事?好像很困难的样子……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP