有一类问题,代码模板相同,但有少部分地方不同,一般可以写一个复杂的程序,使用不同的选项,完成不同的任务。或者,把公共的部分抽象成一个代码库,然后在不同程序中引用。但是,如果公共的部分很少,并且比较“专用”,或者因为其它原因,比较难以部署。怎么办?
实际上,有另一种完全不同的编程模式来实现:代码生成器。unix世界中最知名的代码生成器莫过于lex和yacc了。但是,不比每个代码生成器都那么复杂,比如这个代码生成器就非常简单,它只是简单地转换行记录:
#! /bin/sh
field_seperator="||"
output=b
while getopts :F:vo: arg
do
case $arg in
F ) field_seperator=$OPTARG;;
v ) ;;
o ) output=$OPTARG;;
: ) echo "$0: missing arg for -$OPTARG " >&2
exit;;
\?) echo "Invalid option -$OPTARG ignored." >&2
exit;;
esac
done
if [ $OPTIND -gt $# ]
then
# echo OPTIND=$OPTIND argc=$# >&2
echo "no program" >&2
exit
fi
program=${!#}
echo field_seperator=$field_seperator
cat > a.cpp <<+TemplateCFile
#include <vector>
#include <string.h>
#include <stdio.h>
const char field_seperator[]="||";
void split_row(char* line, std::vector<char*>& F, const char* fs)
{
char* col = line;
F.resize(0);
size_t fslen = strlen(fs);
if (fslen == 1) {
for (;;) {
F.push_back(col);
col = strchr(col, fs[0]);
if (col) {
col[0] = '\0';
col += 1;
} else
break;
}
}
else {
for (;;) {
F.push_back(col);
col = strstr(col, fs);
if (col) {
col[0] = '\0';
col += fslen;
} else
break;
}
}
}
int main(int argc, char* argv[])
{
size_t len1 = 0;
ssize_t len2;
char* line = NULL;
std::vector<char*> F;
while ((len2 = getline(&line, &len1, stdin)) != -1)
{
split_row(line, F, field_seperator);
int NF = F.size();
//--- begin user program
+TemplateCFile
echo $program >> a.cpp
cat >> a.cpp <<+TemplateCFile
//--- end user program
; // avoid user program missing ;
printf("\n");
}
if (line) free(line);
if (ferror(stdin)) {
perror("ferror(stdin)");
return 1;
}
return 0;
}
+TemplateCFile
sed -i 's/\(field_seperator\[\]=\).*";/\1"'$field_seperator'";/g' a.cpp
gcc -O2 a.cpp -lstdc++ -o $output
exit $?
可以象awk一样写程序:
# 相当于 awk -F, '{printf("%s\t%s\n", $1, $5)}'
# 使用 ',' 做列分隔符,输出第 1 和第 5 个字段,生成二进制可执行程序 myprog
./gencode.sh -F , -o myprog 'printf("%s\t%s\n", F[0], F[4])'
我当初写这个生成器的原因是发现非常简单的 awk 程序也比 C 慢 40 倍,以为这是本质上的性能差距,后来才发现不是
。
对这个简单的程序,使用awk更方便更安全,也不比C慢,但是一旦碰到其它类似问题而 awk 解决不了,这种模式就可以派上用场了。
分享到:
相关推荐
在软件开发领域,代码生成器扮演着至关重要的角色,它能够根据预设的模板或模型自动生成符合特定规范的源代码,从而减少手动编写的工作量,确保代码的一致性和准确性。 代码生成器的核心原理是元编程,即在程序运行...
【标题】"简单的Java代码生成器"涉及到的是Java编程领域中的自动化工具,它主要用于简化开发者编写重复性代码的过程。在软件开发中,特别是在Java企业级应用开发中,大量的代码是相似或者重复的,如数据库访问层...
《代码生成器2.4:高效编程的得力助手》 在编程领域,效率和生产力是开发者们关注的核心。为了提升开发效率,减少重复性工作,各种工具应运而生,其中“代码生成器2.4”是一款备受赞誉的实用软件。这款工具以其便捷...
【标题】:“毕业设计之代码生成器.zip”指的是一个压缩包文件,该文件可能是某位学生在毕业设计项目中创建的代码生成器程序。代码生成器是一种自动化工具,它能够根据用户设定的模板或者规则自动生成特定编程语言的...
《编译原理:深入理解三地址代码生成器》 ...理解并实现三地址代码生成器不仅有助于我们掌握编译器的工作原理,还能为我们提供解决实际问题的能力,如自定义编程语言的实现或对现有编译器进行改进。
Delphi代码生成器是一款工具,它能够自动化地创建Delphi编程语言的源代码,从而提高开发效率并减少手动编码的工作量。Delphi是一种基于Object Pascal的集成开发环境(IDE),常用于构建桌面应用程序,因其高效的...
本主题聚焦于"C#代码生成器类生成器",这是一个工具,它能够自动生成C#源代码,帮助开发者根据数据库表结构快速构建业务模型类。这种工具极大地提高了开发效率,减少了手动编写重复代码的时间。 首先,我们要理解...
模板引擎是代码生成器的核心部分,它可以理解并解析用户定义的模板语言,将元数据填充到模板中,生成最终的代码。模板语言通常具有简单的控制结构,如条件语句、循环等,使得用户可以定制化生成的代码结构。例如,...
在当今快速发展的信息技术领域,代码生成器已经成为提高开发效率的重要工具。动软代码生成器,作为一款专为.NET平台设计的高效软件,它允许开发者通过简单的配置就能自动生成大量底层代码,极大地减少了数据库操作中...
实体类代码生成器是一种开发工具,它主要用于自动化创建C#编程语言中的实体类代码。实体类在软件开发中扮演着重要角色,它们是业务逻辑层和数据访问层之间的桥梁,通常用于封装数据库表或API响应的数据结构。使用...
通过使用代码生成器,开发者可以避免手工创建这些类,从而减少错误并保持代码的整洁性。例如,如果有一个名为`Employees`的表,代码生成器会自动生成一个`Employee`类,包含`ID`、`Name`、`Department`等属性。 ...
本文将深入探讨“C#代码生成器”这一主题,它主要用于生成T-SQL语句和实体类代码。 C#是一种面向对象的编程语言,广泛应用于.NET框架中。代码生成器是开发工具的一部分,它可以自动生成代码,使开发者无需手动编写...
综上所述,【新版CSharp C#代码生成器】是C#开发者的得力助手,它结合了C#语言的强大功能,以及Web和Winform应用的开发需求,通过批量导出和数据库支持等功能,大大提高了代码编写的速度和质量,降低了开发难度,是...
在编程领域,代码生成器通常基于某种规则或模式来工作,这些规则可能是基于设计模式,也可能是根据数据库表结构自动创建ORM(对象关系映射)代码。例如,如果你有一个数据库表,代码生成器可以自动为你创建与之对应...
《Delphi类代码生成器——高效开发的利器》 Delphi类代码生成器是一款专为Delphi开发者设计的工具,其主要功能是根据数据库数据表的结构,自动生成相应的Delphi类代码。这款生成器旨在简化开发过程,提高开发效率,...
【多语言代码生成器】是一款高效实用的工具,专为程序员设计,旨在简化代码编写过程,提高开发效率。它支持三种主流编程语言:DELPHI、C#和Java,覆盖了桌面应用、Web开发和移动应用等多个领域的常用编程需求。 在...
C#代码生成器是一种工具,它能够自动化地创建C#编程中的实体类、存储过程以及SQL语句,极大地提高了开发效率并减少了手动编码的工作量。这类工具通常包含一系列模板和规则,开发者可以根据自己的需求定制,使得生成...
总的来说,"空间代码生成器"是网页设计新手和非专业开发者的好帮手,通过它,你可以轻松创建个性化的网页空间,而无需深入学习复杂的编程语言。只需几步简单的操作,就可以实现专业级别的网页效果,提升了网页设计的...
使用这样的代码生成器,开发者可以快速地为每个数据库表创建一个对应的C#实体类,而且可以根据需要自定义生成的代码风格和功能,比如添加数据验证规则、序列化特性、懒加载等特性。这对于大型项目尤其有用,因为手动...
在IT行业中,CAD(计算机辅助设计)和G代码生成器是机械工程和制造业的重要工具。本文将详细探讨标题和描述中提及的“7种同步轮CAD G代码生成器免费可用版”的相关知识点。 首先,我们要了解什么是同步轮。同步轮是...