几周前,我参加了一个软件工程研讨会,重点讨论大型语言模型在编程中的作用。与会的杰出软件工程教授显然持怀疑态度,经常否认该技术的潜力。休息时,我转向一位资深教授、一位长期同事,开玩笑地说:“ChatGPT 写的 C++ 比你好!”鉴于我们多年的友情,这个评论部分是开玩笑,但它包含着坚定的信念。我真诚地相信,这些模型虽然有限,但在生成代码方面表现出了非凡的熟练程度,挑战了关于编程专业知识的传统观点。
作为技术人员,我们经常依靠小脚本来操作数据或自动执行重复性任务。与许多软件开发人员一样,我通常使用 Python、awk 或 Bash 等高级语言来实现这些目的,因为它们非常适合这项工作。
然而,我想探索生成人工智能的最新进展是否可以改变这种方法。为了测试这一点,我求助于 ChatGPT 的竞争对手 Grok,并给它布置了一个小挑战:用 C++23(与 GCC 13、LLVM 18 或更高版本兼容)编写一个简洁的程序来解析简单的 CSV 文件、识别列标签并计算每列中不同值的数量。 CSV(逗号分隔值)文件是一种用于存储表格数据的纯文本格式,其中每一行代表一行,列以逗号分隔。
姓名、年龄、城市 爱丽丝,30,纽约 鲍勃,25 岁,伦敦 查理,12岁,巴黎 大卫,40,隆格伊 大卫,35,东京
我得到了以下答案,据我所知,这是正确的。它不支持带有引号和转义字符的精美 CSV 文件,但这没关系。
// 假设 clang++ 18 或 g++ 13 // 编译:c++ -std=c++23 -o csv csv.cpp #包含<cstdlib> #包含<fstream> #包含<iostream> #包含<地图> #包含<打印> #包括<范围> #包含<流> #包含<字符串> #包含<无序集> int main ( int argc , char * argv [ ] ) { 如果( argc ! = 2 ) { std :: println ( "用法:{} <csv_file> " , argv [ 0 ] ) ; 返回EXIT_FAILURE ; } std :: ifstream文件( argv [ 1 ] ) ; if ( ! file.is_open ( ) ) { std :: println ( "错误:无法打开文件 {} \n " , argv [ 1 ] ) ; 返回EXIT_FAILURE ; } // 读取第一行的列标签 std ::字符串行; if ( ! std :: getline (文件,行) ) { std :: println ( "错误: 空文件 {} " , argv [ 1 ] ) ; 返回EXIT_FAILURE ; } // 将第一行解析为标签 std :: map < size_t , std :: string >标签; 自动单元=行| std :: ranges :: views :: split ( ',' ) ; for (自动单元格:单元格) { std ::字符串标签( cell . begin ( ) , cell . end ( ) ) ; 标签[标签.尺寸( ) ] =标签; } std :: map < std :: string 、 std :: unordered_set < std :: string >>列; while ( std :: getline (文件,行) ) { 自动单元=行| std :: ranges :: views :: split ( ',' ) ; for ( auto [ idx , cell ] : std ::范围::视图::枚举( cells ) ) { 列[标签[ idx ] ] 。 insert ( std :: string ( cell.begin ( ) , cell.end ( ) ) ) ; } } // 使用标签打印结果 for ( const auto & [标签,值] :列) { std :: println ( "列 {}: {} 不同值" , label , values .size ( ) ) ; } 返回EXIT_SUCCESS ; }
此 C++ 程序解析通过命令行参数(argc、argv)指定的 CSV 文件。第一行被解析为 std::map<size_t, std::string> 来存储列标签,将每个索引与其标签相关联。 std::ranges::views::split 范围适配器用逗号分割行,将字符串转换为一系列子字符串。同样,std::ranges::views::enumerate 在迭代过程中将每个单元格与其索引配对,从而无需手动索引跟踪即可干净地访问单元格值及其相应的列标签。 std::map<std::string, std::unordered_set> 跟踪每列的不同值,其中每个标签映射到 std::unordered_set。该程序读取后续行,用单元格值填充集合,并使用 std::println (C++23) 对每列标签和不同值计数进行格式化输出。
我并不是建议你放弃 Python 而使用 C++——这纯粹是对人工智能驱动的代码生成的一次实验性探索。也就是说,我对结果印象深刻。然而,如果没有对 C++ 的深入理解,这些人工智能工具的价值有限,因为批判性评估和完善输出的能力仍然至关重要。
注意:代码位于 GitHub 上。
原文: https://lemire.me/blog/2025/05/10/producing-useful-commands-on-the-go-using-c-and-ai/