Codex + C++ Vibe Coding 教程:用感觉写代码,让 AI 处理细节
什么是 Vibe Coding?
Vibe Coding ("氛围编程"或"感觉编程")是一种全新的开发范式:你不再逐行手写代码,而是用自然语言描述你的意图和感觉 ,把代码生成、调试、重构完全交给 AI。你只需告诉 AI "感觉不对,这里应该更高效"或"我想要一种更现代 C++ 的风格",然后不断迭代直到代码"感觉对了"。这个术语由 Andrej Karpathy 提出,核心就是放弃对语法细节的控制,拥抱高层次的意图表达。
对于 C++ 这样语法复杂、陷阱众多的语言,vibe coding 尤其诱人------你可以专注在算法和架构上,让 AI 去处理指针、模板、RAII 和编译错误。
注:原版 OpenAI Codex 模型已关闭,但它的能力已全面融入
gpt-4、gpt-3.5-turbo等聊天模型。本教程将基于最新可用模型,带你体验 C++ 的 vibe coding 全流程。
1. 环境准备:搭一个"听话"的 AI 伙伴
你需要一个能和 AI 对话的 Python 脚本。这里我们用 OpenAI 的 gpt-4o(性价比高,代码能力强),同时也会介绍免费本地模型方案。
bash
pip install openai
python
import openai
import subprocess
import sys
import os
openai.api_key = "your-api-key" # 或 os.getenv("OPENAI_API_KEY")
def vibe(prompt, history=None, model="gpt-4o"):
"""把自然语言'感觉'变成 C++ 代码"""
if history is None:
history = [
{"role": "system", "content": "你是一位顶尖的现代 C++(C++17/20)专家。根据用户的描述生成完整、可编译的代码。使用 RAII、智能指针、STL 算法。如果用户说'感觉不对',就重新思考并给出改进版。只需输出纯代码,不要任何解释,除非要求。"}
]
history.append({"role": "user", "content": prompt})
resp = openai.ChatCompletion.create(
model=model,
messages=history,
temperature=0.3, # 有一点创造性,但不离谱
max_tokens=2000
)
code = resp.choices[0].message.content
history.append({"role": "assistant", "content": code})
return code, history
如果不想用付费 API,可以用本地模型(需要 16GB+ 显存或 Apple Silicon):
bash
# 安装 Ollama (https://ollama.com)
ollama pull codellama:13b # 或 deepseek-coder-v2
然后调用方式类似,只需把 vibe() 函数改为本地 HTTP 请求。
2. Vibe Coding 核心循环:意图 → 编译 → 报错 → 修复 → 感觉
真正高效的 vibe coding 是带反馈的对话。我们写一个自动编译并反馈错误的函数,让 AI 自己修:
python
def compile_and_run(code, source_file="temp.cpp", exe_file="temp.out"):
with open(source_file, "w") as f:
f.write(code)
# 编译
compile_cmd = ["g++", "-std=c++20", "-Wall", "-O2", source_file, "-o", exe_file]
comp = subprocess.run(compile_cmd, capture_output=True, text=True)
if comp.returncode != 0:
return False, comp.stderr
# 运行(不处理交互输入的程序)
run_cmd = [f"./{exe_file}"]
try:
run = subprocess.run(run_cmd, capture_output=True, text=True, timeout=5)
return True, run.stdout
except subprocess.TimeoutExpired:
return True, "[运行超时,可能死循环]"
完整 vibe 循环示例(手动迭代版):
python
history = None
feedback = ""
while True:
user_feel = input("\n描述你的感觉或需求 (输入 'exit' 退出): ")
if user_feel.lower() == "exit":
break
if feedback:
prompt = f"上一次的代码:\n{code}\n\n编译/运行反馈:{feedback}\n\n请修复问题。用户新感觉:{user_feel}"
else:
prompt = f"生成一个 C++ 程序,实现以下感觉:{user_feel}"
code, history = vibe(prompt, history)
print("\n--- 生成的代码 ---")
print(code)
# 自动编译运行
success, output = compile_and_run(code)
if success:
print("\n✅ 编译运行成功!输出:")
print(output)
feedback = ""
else:
print("\n❌ 编译/运行错误:")
print(output)
feedback = output
# 自动把错误反馈给 AI,下一轮输入时会让它修
这就是 vibe coding 的精髓:你只需要表达"感觉",编译和错误修复全自动。
3. 实战:一步步用"感觉"写出一个 C++ 线程池
第一轮:模糊的感觉
输入 :
我想要一个能管理多个线程的池子,把任务丢进去就能异步执行,然后能拿到结果。现代 C++ 风格。
AI 可能给出一个基于 std::async 的简单实现,但没用真正的线程池。你感觉"不够底层,控制力不强"。
第二轮:调整感觉
输入 :
感觉上我想要一个固定数量的工作线程,任务用 std::function 包装,返回 future。用条件变量通知。
这次 AI 生成了一个完整的线程池类,但编译报错:std::function 不能默认构造。
第三轮:自动反馈修复
脚本自动把错误信息喂给 AI,你只需要说:
输入 :
编译错误,感觉要把任务队列改成存储 std::packaged_task 的封装,然后处理好 move 语义。
AI 修改后,编译通过,但你测试时发现析构时死锁。
第四轮:凭感觉指出问题
输入 :
程序退出时卡死了,感觉是析构顺序或者条件变量通知有问题,应该在析构时先唤醒所有线程。
AI 立即在析构函数中加上了正确的停止标记和 notify_all。最终你得到了一个生产可用的线程池。
最终生成的代码可能类似:
cpp
#include <vector>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <future>
#include <memory>
class ThreadPool {
public:
explicit ThreadPool(size_t numThreads) : stop(false) {
for(size_t i = 0; i < numThreads; ++i) {
workers.emplace_back([this] {
for(;;) {
std::function<void()> task;
{
std::unique_lock lock(queueMutex);
condition.wait(lock, [this] { return stop || !tasks.empty(); });
if(stop && tasks.empty()) return;
task = std::move(tasks.front());
tasks.pop();
}
task();
}
});
}
}
template<class F, class... Args>
auto enqueue(F&& f, Args&&... args)
-> std::future<typename std::invoke_result_t<F, Args...>> {
using return_type = typename std::invoke_result_t<F, Args...>;
auto task = std::make_shared<std::packaged_task<return_type()>>(
std::bind(std::forward<F>(f), std::forward<Args>(args)...)
);
std::future<return_type> res = task->get_future();
{
std::lock_guard lock(queueMutex);
if(stop) throw std::runtime_error("enqueue on stopped ThreadPool");
tasks.emplace([task]() { (*task)(); });
}
condition.notify_one();
return res;
}
~ThreadPool() {
{
std::lock_guard lock(queueMutex);
stop = true;
}
condition.notify_all();
for(std::thread &worker: workers)
if(worker.joinable()) worker.join();
}
private:
std::vector<std::thread> workers;
std::queue<std::function<void()>> tasks;
std::mutex queueMutex;
std::condition_variable condition;
bool stop;
};
全程你没写一行具体代码,只是不断描述"感觉",AI 就把所有细节(move 语义、packaged_task、RAII 析构)都处理好了。
4. C++ Vibe Coding 专用提示词技巧
要让 AI 生成的代码有"现代 C++ 内味",可以在系统消息里持续强化:
- 风格约束 :
"用 C++20,永远用auto推导,用 range-based for,用std::expected或std::optional处理错误。" - 性能感觉 :
"这段代码应该无锁、零拷贝,请使用std::atomic和内存顺序。" - 错误处理感觉 :
"不要用异常,用std::variant或错误码返回值,感觉更稳健。" - 设计模式感觉 :
"这个工厂类应该采用 CRTP 静态多态,避免虚函数开销。"
你甚至可以说"这代码看着有点 C++98 的老气,请换成 Concepts 和 constexpr 的感觉",AI 就会立刻重构。
5. 本地免费 Vibe 方案:Code Llama / DeepSeek-Coder
如果担心 API 费用,可以完全在本地运行:
python
import requests
import json
def local_vibe(prompt):
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": "deepseek-coder-v2:16b",
"prompt": f"你是一个 C++ 专家。只输出代码,不要解释。\n{prompt}",
"stream": False
}
)
return response.json()["response"]
虽然本地模型对超长上下文的跟踪不如 GPT-4,但处理单个功能或小规模迭代完全够用,并且你可以无限免费 vibe。
6. 重要提醒:Vibe Coding 的边界
- 安全第一:绝对不要直接复制粘贴 AI 生成的网络、加密或系统底层代码到生产环境,除非你完全理解每一行。vibe 出来的代码可能有隐蔽的漏洞。
- 感觉不是测试:即使"感觉"很好,也要用单元测试和 sanitizer(AddressSanitizer, UndefinedBehaviorSanitizer)验证,尤其是 C++ 的内存问题。
- 保持理解:Vibe coding 是辅助,不是替代。每次迭代后读一读生成的代码,慢慢你也能"感觉"到真正的 C++ 精髓。
7. 结语
Codex(或现在的 GPT) + C++ + Vibe Coding 让你从繁琐的语法中解放出来,把脑力留给更高层的设计。你只需要一个趁手的"编译-修复"循环脚本,剩下的就是大胆告诉 AI 你的感觉。现在就打开终端,开始你的第一次 C++ vibe 之旅,你会惊讶地发现:原来写 C++ 也可以这么"爽"。