行家好白虎 porn,我是杂烩君。
在之前转载的著述:镶嵌式中,咱们如何靠近单调肖似的任务?中,李先静前辈提到小数:让电脑去作念单调肖似的职责。
这点让我很受启发,在职责中需要这类肖似性的职责时,我也会编写代码生成器来帮我治理。最近,又完成了一个代码生成器的斥地,一键生成大部分原来需要靠膂力输出的不异代码,极地面进步了斥地恶果。
业内有名的代码生成器有好多,如:STM32CubeMX生成STM32基础库代码、project_generator生成器生成基础工程、protoc生成protobuf协数据身手代码等。
project_generator筹商著述:镶嵌式项生分红器,了解一下!
protoc器具会判辨xxx.proto文献并生成对应的xxx.pb-.c及xxx.pb-c.h:
protobuf筹商:一种更轻量的数据身手——protobuf、干货 | protobuf-c之镶嵌式平台使用
AI时间,多样AI扶植编程器具也好多,不错用来快速生成一些器具代码。比如:
MarsCode:豆包旗下的智能编程助手,提供智能代码补全等中枢才调。支撑主流编程言语及IDE,能在编码流程中提供单行或总计这个词函数的提议,同期支撑代码解说、单测生成、问题建树、技能问答等扶植功能。
GitHub Copilot:一款广为东谈主知的代码编程扶植AI器具,由GitHub和OpenAI相助斥地。基于OpenAI Codex模子,八成在多样编程环境中提供代码提议,支撑多种编程言语。通过学习多数代码库,匡助斥地者进步编码恶果和质地。
CodeGeeX:CodeGeeX是一款基于智谱AI大模子GLM的广泛智能编程助手,提供代码生成/完成、瞩生分红、代码翻译和基于东谈主工智能的聊天等功能。支撑多种编程言语,如Python、C++、Java、JavaScript等,何况适配多种主流IDE。
然而,在咱们骨子情势中,有些不异性相比高、肖似性相比高、更新迭代流程需要时常新增的一些需要复制、粘贴、然后再进行修改的代码。
以上这些代码生成的妙技对咱们的匡助可能相比有限。这时候咱们不错我方凭证我方的情势代码,定制化地写个代码自动生成的小软件/小剧本。
写代码生成器具之前白虎 porn,需要我方评估一下,这个事情是否值得作念。因为要是你花了很随性气写了一个扶植器具,界限使用的频次很少,也不是很有必要。或者在某个文献生成几行代码,这手动适配也花不了几许时辰,收益不是很大。
我以为,需要时常地修改到若干个文献的多处代码,这才相比有必要去写个代码生成器具。比如契约数据新增方面,即是个更新迭代可能会时常修改的东西吧?
只须一条数据通了,后续新增是不是皆会复制粘贴然后修改?
而且有些情势代码分层会相比细,数据传输链路可能会经过多层代码的多个文献,皆需要作念对应的修改。这手动适配起来费时勤苦,还容易搞错,复制粘贴,界限某一处健忘修改了没查验到,跑欠亨又得来往调试。
空话未几说,要是行家也遭遇这种情况,那就我方写个代码生成器具吧,然后之后就不错惬心的摸鱼了。
想路很浅薄,在哪个位置,生成什么代码。咱们不错凭证需要我方评估是否有必要斥地带图形界面的代码生成器,要是是我方使用,那就无所谓,如何省时如何来。
底下望望使用shell剧本来生成的例子。
例子
领先咱们需要想考两个点:
"生成如何样的代码?"
剧本治理的上风即是治理一些肖似性的、不异性的事情。是以要想剧本生成代码,就得在写代码时有益志地构造剧本能找到一些共性的代码。
”在哪个位置插入代码?“
这个要求从原有的代码里可能不太好服气,为了剧本能浅薄点,这个要求咱们不错我方构造:以瞩意见情势在想要插入代码的场所作念个标记。
剧本去匹配代码里的这些标记,然后插入想要插入的代码即可。
空话未几说,径直看例子:
假如咱们有这样一份代码:读取号令行的测试提醒并推论对应的测试代码。
test.c:
这个测试代码,当今惟有一个测试函数,之后每次新增测试函数,需要新增如下代码:
号令id陈设,新增陈设值。
新增测试函数函数体。
补充号令表。
补充菜单函数。
按照上头说的想路,咱们在这四个场所以瞩意见情势插入代码插入点标签:
// code_insertion_point__cmd_id// code_insertion_point__cmd_func// code_insertion_point__cmd_table// code_insertion_point__cmd_description
插入的代码?
索求人人部分,补充各异。这个例子中,为了剧本能浅薄点,咱们不错依赖于CMD_ID_TEST_RAND,因为这里的信息不错分别不同的号令,比如新的号令即是CMD_ID_XXX身手的。其它几个插入点的代码皆可依赖这个生成。假如咱们的剧真称呼为code_generator.sh,咱们祈望最终的使用方式如:
./code_generator.sh CMD_ID_XXX
shell基本学问:Shell编程必备简明基础学问!
编写shell剧本:code_generator.sh
#!/bin/bashcode_generate__cmd_id{ APPEND_STR=$1 DST_FILE_PATH=$2 sed -i "/\/\/ code_insertion_point__cmd_id/i \\$APPEND_STR" $DST_FILE_PATH}code_generate__cmd_func{ APPEND_STR=$1 DST_FILE_PATH=$2 sed -i "/\/\/ code_insertion_point__cmd_func/i \\$APPEND_STR" $DST_FILE_PATH}code_generate__cmd_table{ APPEND_STR=$1 DST_FILE_PATH=$2 sed -i "/\/\/ code_insertion_point__cmd_table/i \\$APPEND_STR" $DST_FILE_PATH}code_generate__cmd_description{ APPEND_STR=$1 DST_FILE_PATH=$2 sed -i "/\/\/ code_insertion_point__cmd_description/i \\$APPEND_STR" $DST_FILE_PATH}code_generate{ CMD_ID_STR=$1 DST_FILE_PATH="./test.c" TAB_SPACE=" " # code_insertion_point__cmd_id echo "CMD_ID_STR = ${CMD_ID_STR}" CMD_ID_APPEND_STR="${TAB_SPACE}${CMD_ID_STR}," echo "CMD_ID_APPEND_STR = ${CMD_ID_APPEND_STR}" code_generate__cmd_id "${CMD_ID_APPEND_STR}" "${DST_FILE_PATH}" # code_insertion_point__cmd_table CMD_FLAG="${CMD_ID_STR##*_}" echo "CMD_FLAG = ${CMD_FLAG}" CMD_FUNC_STR="${CMD_FLAG,,}_test_func" echo "CMD_FUNC_STR = ${CMD_FUNC_STR}" CMD_TABLE_APPEND_STR="${TAB_SPACE}{${CMD_ID_STR}, ${CMD_FUNC_STR}}," code_generate__cmd_table "${CMD_TABLE_APPEND_STR}" "${DST_FILE_PATH}" # code_insertion_point__cmd_description CMD_DSCRIPTION_APPEND_STR="${TAB_SPACE}printf(\"[%.3d] Test: %s\\\n\", ${CMD_ID_STR}, TO_CMD_ID_STR(${CMD_ID_STR}));" echo "CMD_DSCRIPTION_APPEND_STR = ${CMD_DSCRIPTION_APPEND_STR}" code_generate__cmd_description "${CMD_DSCRIPTION_APPEND_STR}" "${DST_FILE_PATH}" # code_insertion_point__cmd_func CMD_FUNC_STR_PART1="static int ${CMD_FUNC_STR}(void)\n{\n" CMD_FUNC_STR_PART2="${TAB_SPACE}printf(\"--------------------%s start!--------------------\\\n\",__FUNCTION__);\n" CMD_FUNC_STR_PART3="${TAB_SPACE}\/\/ todo: add your code\n" CMD_FUNC_STR_PART4="${TAB_SPACE}printf(\"--------------------%s end!--------------------\\\n\",__FUNCTION__);\n" CMD_FUNC_STR_PART5="${TAB_SPACE}printf(\"\\\n\");\n}" CMD_FUNC_APPEND_STR=${CMD_FUNC_STR_PART1}${CMD_FUNC_STR_PART2}${CMD_FUNC_STR_PART3}${CMD_FUNC_STR_PART4}${CMD_FUNC_STR_PART5} echo "CMD_FUNC_APPEND_STR = ${CMD_FUNC_APPEND_STR}" code_generate__cmd_func "${CMD_FUNC_APPEND_STR}" "${DST_FILE_PATH}"}code_generate $1
测试:
生成的代码:
一些代码细节,代码生成剧本弗成事前知谈,生成时不错协调备注:
// todo: add your code
便捷后续填充代码。
编译、推论:
可见,咱们写的代码生成剧本帮咱们生成的代码,推论亦然顺应预期的。
以上仅仅提供了一个浅薄的代码生成剧本的想路及很梦想情况下的demo,兑现方式可能有多种,行家不错我方想考挖掘。
性吧地址何况骨子情势中的情况会复杂得多。
荒谬是治理代码身手,要是需要剧本作念,剧本就会相比复杂了,比如:
代码中间的不定空格数?
代码加多瞩目?
......
需要下很大的功夫。未必候需要作念一些采取,比如,假如上头的号令表代码为:
此时中间的空格长度凭证号令的长度不一而是一个变化的值,剧本要行止理这个事情就需要作念不少逻辑,这会加多一些剧本的斥地时辰。
终末,再说一下:
写代码生成器具之前,需要我方评估一下,这个事情是否值得作念。因为要是你花了很随性气写了一个扶植器具,界限使用的频次很少,也不是很有必要。或者在某个文献生成几行代码,这手动适配也花不了几许时辰,收益不是很大。