【发布时间】:2009-08-19 00:45:16
【问题描述】:
你知道是否有编译 bash 脚本的工具吗?
该工具是否只是一个翻译器(例如,将 bash 脚本转换为 C 程序的工具)并不重要,只要翻译的结果可以编译即可。
我正在寻找类似shc 的东西(这只是一个示例——我知道 shc 不能用作编译器)。还有其他类似的工具吗?
【问题讨论】:
标签: bash compiler-construction
你知道是否有编译 bash 脚本的工具吗?
该工具是否只是一个翻译器(例如,将 bash 脚本转换为 C 程序的工具)并不重要,只要翻译的结果可以编译即可。
我正在寻找类似shc 的东西(这只是一个示例——我知道 shc 不能用作编译器)。还有其他类似的工具吗?
【问题讨论】:
标签: bash compiler-construction
Google 搜索会显示CCsh,但它会花费您每台机器 50 美元的许可证费用。
文档说 CCsh 将 Bourne Shell(不是 bash ...)脚本编译为 C 代码,并且它了解如何复制 50 多个标准命令的功能,而无需 fork 它们。
但 CCsh 不是开源的,因此如果它不能满足您的需求(或期望),您将无法查看源代码来找出原因。
【讨论】:
我不认为你会找到任何东西,因为你不能真正“编译”一个 shell 脚本。您可以编写一个简单的脚本,将所有行转换为对 system(3) 的调用,然后将其“编译”为 C 程序,但这不会对您当前使用的任何内容产生重大的性能提升,并且可能无法处理变量正确。不要这样做。
“编译”一个 shell 脚本的问题是 shell 脚本只是调用外部程序。
【讨论】:
理论上,您实际上可以获得良好的性能提升。
想一想
if [ x"$MYVAR" == x"TheResult" ]; then echo "TheResult Happened" fi
(注意调用测试,然后回显,以及需要完成的解释。)
可以替换为
if ( !strcmp(myvar, "TheResult") ) printf("TheResult Happened");
在 C 中:无需启动进程,无需进行路径搜索。好东西。
【讨论】:
if [ x"$MYVAR" == x"TheResult" ] ; then echo "TheResult Happened" fi 根本没有调用任何外部命令,因为 test 和 echo 都是 bash 内置的。因此不会发生分叉,因此,从编译到 C 的性能提升不会像上面建议的那么大。