通过实例对比不同编程语言的语法差异,帮助开发者快速了解和学习新的编程语言。
- ✅ 纯前端实现:无需构建步骤,直接在浏览器中运行
- ✅ 完全自动化:添加新语言只需修改配置文件,无需手动添加 HTML
- ✅ 代码分离管理:每种语言的示例代码存储在独立的文件中(如
.cpp,.py,.rs等) - ✅ 智能按钮生成:根据配置自动生成语言选择按钮
- ✅ 拖拽排序:支持拖拽调整语言显示顺序
- ✅ 用户偏好记忆:使用 localStorage 自动保存用户选择
- ✅ 语法高亮:使用 Prism.js 提供美观的代码高亮
- ✅ 响应式设计:适配各种屏幕尺寸
programming-language-comparison/
├── index.html # 主页面
├── app.js # 应用逻辑(自动化按钮生成和内容加载)
├── examples-config.js # 语言和示例配置
├── styles.css # 样式文件
├── _examples/ # 示例代码目录(按语言组织)
│ ├── python/ # Python 示例
│ │ ├── hello-world.py
│ │ ├── variables.py
│ │ ├── functions.py
│ │ └── ...
│ ├── rust/ # Rust 示例
│ │ ├── hello-world.rs
│ │ ├── variables.rs
│ │ └── ...
│ ├── commonlisp/ # Common Lisp 示例
│ │ ├── hello-world.lisp
│ │ └── ...
│ └── ... # 其他语言
├── README.md # 本文档
└── CONTRIBUTING.md # 贡献指南(详细说明如何添加语言)
无需安装依赖,只需要一个 HTTP 服务器:
使用 Python 3:
python3 -m http.server 8000使用 Node.js (http-server):
npx http-server -p 8000使用 Python 2:
python -m SimpleHTTPServer 8000然后在浏览器中打开: http://localhost:8000
为什么需要 HTTP 服务器?
- 项目使用 fetch API 动态加载代码文件
- fetch API 需要 HTTP/HTTPS 协议,不能使用 file:// 协议
- 选择语言: 点击语言按钮来显示/隐藏特定语言
- 调整顺序: 拖动语言按钮来调整显示顺序
- 查看对比: 滚动页面查看不同语言的语法对比
- 偏好保存: 你的语言选择和顺序会自动保存在浏览器中
详细步骤请参考 CONTRIBUTING.md
步骤 1: 在 examples-config.js 添加语言配置
const languagesConfig = {
// ... 现有语言 ...
your_language: {
name: '语言显示名称',
ext: '文件扩展名',
prism: 'prism语法ID'
}
};步骤 2: 创建示例代码文件
mkdir _examples/your_language然后为每个示例创建对应的代码文件:
_examples/your_language/hello-world.ext_examples/your_language/variables.ext_examples/your_language/functions.ext- 等等...
步骤 3: (可选)在 index.html 中添加 Prism.js 语言支持
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-{language}.min.js"></script>完成! 刷新页面,新语言会自动显示!
在 examples-config.js 中:
commonlisp: {
name: 'Common Lisp',
ext: 'lisp',
prism: 'lisp'
}创建文件:
mkdir _examples/commonlisp
# 然后添加 hello-world.lisp, variables.lisp 等文件在 index.html 中:
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-lisp.min.js"></script>步骤 1: 在 examples-config.js 添加示例配置
const examplesConfig = [
// ... 现有示例 ...
{
id: "pattern-matching",
title: "模式匹配",
description: "使用模式匹配进行数据解构"
}
];步骤 2: 为各语言添加示例代码
在每个语言目录下创建对应文件:
_examples/python/pattern-matching.py_examples/rust/pattern-matching.rs- 等等...
注意: 不是所有语言都需要实现所有特性,只添加支持的语言即可。
打开浏览器开发者工具的控制台(F12),你会看到详细的调试信息:
[语言初始化]- 语言加载和初始化信息,检测新添加的语言[按钮渲染]- 按钮生成信息,显示渲染了多少个按钮[示例加载]- 代码示例加载统计,显示每个语言加载了多少示例
问题: 添加新语言后按钮没有显示?
解决方法:
- 硬刷新页面:
Ctrl+Shift+R(Windows/Linux) 或Cmd+Shift+R(Mac) - 清除 localStorage:
// 在浏览器控制台执行 localStorage.clear(); location.reload();
- 检查配置文件语法是否正确
- 查看浏览器控制台是否有错误信息
问题: 代码没有语法高亮?
检查:
index.html中是否包含了对应语言的 Prism.js 脚本prism配置项是否正确- 网络是否正常(Prism.js 从 CDN 加载)
问题: 示例代码没有显示?
检查:
- 文件路径是否正确:
_examples/{language_id}/{example_id}.{ext} - 文件扩展名是否与配置一致
- 是否使用 HTTP 服务器(不能直接打开 HTML 文件)
在浏览器控制台执行:
// 查看所有语言配置
console.log(languagesConfig);
// 查看当前语言顺序
console.log(languageOrder);
// 查看选中的语言
console.log(Array.from(selectedLanguages));
// 查看加载的示例数据
console.log(examplesData);配置文件,定义:
- languagesConfig: 所有支持的编程语言及其配置(名称、扩展名、Prism.js ID)
- examplesConfig: 示例列表及其元数据(ID、标题、描述)
应用逻辑,负责:
- 自动生成语言按钮: 从
languagesConfig读取并生成 DOM 元素 - 动态加载代码: 使用 fetch API 从
_examples/加载示例代码 - 用户偏好管理: localStorage 保存和恢复语言选择和顺序
- 拖拽排序: 实现语言按钮的拖拽功能
- 调试日志: 输出详细的调试信息
存储所有示例代码的目录,按语言组织:
- 每个语言一个子目录
- 子目录名必须与
languagesConfig中的键名一致 - 文件名格式:
{example_id}.{ext}
HTML 主页面,包含:
- 基本页面结构
- Prism.js 语法高亮库引用
- 语言选择区域(按钮由 JS 动态生成)
- 示例显示区域(内容由 JS 动态生成)
样式文件,定义网站外观。
编辑 styles.css 文件来修改网站外观。
本项目采用完全自动化的架构设计:
- 配置驱动: 所有语言和示例通过
examples-config.js集中配置 - 按钮自动生成:
app.js读取languagesConfig,自动生成所有语言按钮 - 代码动态加载: 使用 fetch API 从
_examples/目录动态加载代码文件 - 智能处理新语言: 新添加的语言会自动选中并显示,无需手动操作
- 用户偏好记忆: localStorage 自动保存和恢复用户的语言选择和排序
-
初始化 (
DOMContentLoaded)- 从
languagesConfig读取所有语言 - 从 localStorage 恢复用户偏好(或使用默认值)
- 检测并自动选中新添加的语言
- 从
-
生成按钮 (
renderLanguageCheckboxes)- 为每个语言创建可拖拽的按钮 DOM 元素
- 绑定点击事件(切换选中状态)
- 绑定拖拽事件(调整顺序)
-
加载代码 (
loadAllExamples)- 并行 fetch 所有语言的所有示例代码
- 将代码缓存到
examplesData对象 - 输出加载统计信息
-
渲染示例 (
renderExamples)- 按照
examplesConfig的顺序渲染示例 - 按照用户的
languageOrder排列代码块 - 使用 Prism.js 进行语法高亮
- 根据
selectedLanguages显示/隐藏代码块
- 按照
- 你在
examples-config.js添加配置 - 刷新页面后,
initializeLanguageOrder()检测到新语言 - 新语言自动添加到
languageOrder末尾 - 新语言自动添加到
selectedLanguages(自动选中) renderLanguageCheckboxes()生成新的按钮loadAllExamples()加载新语言的代码文件renderExamples()显示新语言的代码块
这就是为什么添加新语言只需要:
- 修改配置(3 行)
- 添加代码文件
系统会自动处理其他所有事情!
目前支持以下 15+ 种编程语言:
| 语言 | ID | 扩展名 |
|---|---|---|
| C++ | cpp | .cpp |
| C++20 | cpp20 | .cpp |
| Python | python | .py |
| Rust | rust | .rs |
| Java | java | .java |
| C# | csharp | .cs |
| JavaScript | javascript | .js |
| TypeScript | typescript | .ts |
| Lua | lua | .lua |
| Ruby | ruby | .rb |
| Swift | swift | .swift |
| Objective-C | objectivec | .m |
| Go | go | .go |
| Zig | zig | .zig |
| Common Lisp | commonlisp | .lisp |
- Hello World
- 变量声明
- 函数定义
- 条件语句
- 循环
- 类和对象
- 继承
- 元组
- 数组/列表
- 字典/映射
- 错误处理
- 异步编程
- 内存管理
本项目是纯静态网站,可以部署到任何支持静态网站托管的平台:
- GitHub Pages: 直接推送到 gh-pages 分支
- Netlify: 拖放整个项目目录
- Vercel: 连接 Git 仓库自动部署
- Cloudflare Pages: 简单快速的静态托管
- 任何 Web 服务器: 上传所有文件到服务器根目录
无需构建步骤,所有文件都可以直接使用!
- 纯前端: HTML + CSS + JavaScript (无框架,无构建)
- 代码高亮: Prism.js
- 数据存储: localStorage (用户偏好)
- API: Drag and Drop API (拖拽排序)
欢迎贡献!常见贡献方式:
- 添加新的编程语言 → 参考 CONTRIBUTING.md
- 添加新的语法特性示例
- 改进现有示例代码
- 修复 bug
- 改进文档
- 优化样式和用户体验
MIT License
本项目使用 LLM 辅助开发。
祝你学习愉快! 如有问题,请查看 CONTRIBUTING.md 或浏览器控制台的调试信息。