1123活动

本文最后更新于 2024年11月24日 晚上

11.23活动

Git 工具的使用

【Git工作流和核心原理 | GitHub基本操作 | VS Code里使用Git和关联GitHub】https://www.bilibili.com/video/BV1r3411F7kn?vd_source=6ad092c4c097102be92aa2d50a2c519e

为什么需要用 Git?

  • 版本控制

    • Git 是一种分布式版本控制工具,可以记录代码的历史修改,方便回溯到任意历史版本。

    • 支持分支与合并,便于多人协作和功能开发。

  • 协作开发

    • 通过 Git 和远程仓库(如 GitHub、GitLab),团队成员可以共享代码。

    • 提供强大的冲突解决机制,避免覆盖他人代码。

  • 代码备份

    • 通过远程仓库,代码有了可靠的备份,减少因硬盘损坏或意外删除造成的损失。

怎么用?

  1. 基础命令
    • 初始化项目git init
    • 克隆远程仓库git clone <仓库地址>
    • 添加修改到暂存区git add <文件>git add .
    • 提交更改git commit -m "提交信息"
    • 查看历史记录git log
    • 创建分支git branch <分支名>
    • 切换分支git checkout <分支名>
    • 合并分支git merge <分支名>
  2. 工作流
    • Feature 分支开发
      1. 从主分支创建功能分支:git checkout -b feature-xxx
      2. 在分支上开发功能并提交更改。
      3. 合并分支到主分支:git checkout main,然后 git merge feature-xxx
    • 多人协作
      1. 每个开发者拉取最新代码:git pull origin main
      2. 提交自己的改动到远程:git push origin feature-xxx
      3. 使用 Pull Request 或 Merge Request 进行代码审查。

怎么和远程仓库协作?

  1. SSH 配置
    • 生成 SSH 密钥:ssh-keygen -t rsa -C "你的邮箱"
    • 添加公钥到远程仓库账户设置中。
    • 验证连接:ssh -T git@github.com
  2. Git 设置代理
    • 设置 HTTP 代理:git config --global http.proxy http://<代理地址>:<端口>
    • 设置 Socks 代理:git config --global http.proxy socks5://<代理地址>:<端口>
  3. 同步操作
    • 拉取代码:git pull
    • 推送代码:git push
    • 查看远程仓库:git remote -v

开源社区的参与方式

  1. 寻找感兴趣的项目
    • 在 GitHub 或 GitLab 上搜索感兴趣的开源项目。
    • 查看 README.mdCONTRIBUTING.md 了解项目的目标和贡献方式。
  2. 贡献代码
    • Fork 仓库:创建项目的个人副本。
    • 修改代码:在本地完成修改并提交。
    • 提交 PR:将修改提交到原始仓库,等待项目维护者审核。
  3. 其他贡献形式
    • 提交 issue 反馈问题。
    • 编写或优化文档。
    • 提供测试案例。

留一个作业

  • 创建 GitHub 账号,在群里/私信你的id/个人主页地址(我需要拉你进俱乐部仓库)
  • https://github.com/IppClub/legend-of-ipp这个库中的 /practice/practice24 路径下贡献一个任意的文件(体积不要太大)
    • fork
    • new branch
    • pull request

C++速通

各种语言的区别

特性 C C++ Java Python JavaScript Go Rust Ruby PHP Swift Kotlin R MATLAB
语言类型 编译型 编译型 编译型 + 虚拟机 解释型 解释型 编译型 编译型 解释型 解释型 编译型 + 解释型 编译型 + 解释型 解释型 解释型
用途 系统编程 系统编程、高性能开发 企业级开发 脚本语言、AI、数据分析 Web 前端开发 后端服务开发 系统编程、安全开发 脚本语言、Web 开发 Web 后端开发 iOS 开发 Android、多平台开发 数据分析、统计 科学计算、工程建模
运行性能 较高 较低 较低 较低 较低 较高 较高 较低 较低
学习曲线 陡峭 陡峭 平缓 平缓 平缓 平缓 陡峭 平缓 平缓 中等 中等 平缓 中等
静/动态类型 静态 静态 静态 动态 动态 静态 静态 动态 动态 静态 静态 动态 动态
垃圾回收机制 有(可选智能指针)
跨平台性 高(依赖编译器) 高(依赖编译器) 中等
并发支持 低(通过库支持)
典型应用场景 嵌入式、操作系统开发 游戏开发、图形渲染 Web 服务、企业级开发 AI、自动化脚本、科学计算 Web 前端交互 微服务、云计算 高性能计算、安全开发 Web 开发、自动化脚本 Web 后端服务 iOS 应用开发 Android 应用开发 数据统计、可视化 工程仿真与建模

扩展语言补充

特性 HTML CSS SQL Perl Lua Shell Haskell Scala Dart TypeScript C# Assembly Elixir
语言类型 标记语言 样式语言 描述语言 脚本语言 脚本语言 脚本语言 函数式编程 编译型 + JVM 编译型 + 解释型 编译型 + 解释型 编译型 + 解释型 汇编语言 编译型 + BEAM VM
用途 Web 页面结构 Web 页面样式 数据库查询 数据处理、文本操作 游戏嵌入脚本 自动化脚本 高阶数学与函数式开发 大数据、分布式计算 Web 前端、移动开发 强类型 Web 开发 企业级开发 系统级编程 并发应用开发
运行性能 N/A N/A 较低 较低 较低 较高 较高 较高 较高 极高(接近机器码)
学习曲线 平缓 平缓 平缓 中等 中等 平缓 陡峭 中等 平缓 中等 中等 陡峭 中等
静/动态类型 动态 动态 动态 静态 静态 静态 静态 静态 N/A 静态
垃圾回收机制
跨平台性
并发支持 N/A N/A
典型应用场景 Web 页面结构定义 Web 页面样式设计 数据库操作 文本处理、快速脚本 游戏逻辑嵌入 系统运维、脚本编写 数学模型、高阶函数式 数据流处理、Web 开发 Web、Flutter 开发 Web 全栈开发 游戏、桌面开发 内核开发 分布式与高并发服务

一些举例

1. C/C++: 静态类型语言

C 和 C++ 是静态类型语言,变量的类型在编译时确定,且需要显式声明。

特点:

  • 强类型检查:类型必须严格匹配,否则会导致编译错误。
  • 高性能:由于类型在编译时固定,运行时没有额外的类型检查开销。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main() {
int a = 10; // 整型变量
double b = 3.14; // 浮点型变量
char c = 'A'; // 字符型变量

// 类型错误示例
// int d = "Hello"; // 编译错误:无法将字符串赋值给整型变量

cout << "a: " << a << ", b: " << b << ", c: " << c << endl;
return 0;
}

2. Java/Python: 强类型语言,但类型系统不同

  • Java: 静态强类型语言,变量类型在编译时确定。
  • Python: 动态强类型语言,变量类型在运行时确定,但不同类型间的操作依然有严格的限制。

Java 示例代码:

1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String[] args) {
int a = 42; // 整型变量
String b = "Hello"; // 字符串变量

// 类型错误示例
// int c = b; // 编译错误:不能将字符串赋值给整型变量

System.out.println("a: " + a + ", b: " + b);
}
}

Python 示例代码:

1
2
3
4
5
6
7
a = 42               # 整型变量
b = "Hello" # 字符串变量

# 类型错误示例
# c = a + b # 运行时错误:不能将整型和字符串相加

print(f"a: {a}, b: {b}")

区别:

  • Java 需要在代码中明确指定类型,类型错误在编译阶段发现。
  • Python 的类型是动态的,可以在运行时绑定不同类型的值,但不允许不合法的操作(如整型和字符串相加)。

插入

  • Java 的编译机制
  1. 源代码 (.java) 会被编译器(javac)编译成字节码(.class 文件),这种字节码是与平台无关的。
  2. 字节码通过 Java 虚拟机(JVM) 在运行时解释执行,或者由 JVM 的 即时编译器(JIT Compiler) 转换为机器码运行。
  3. 因此,Java 是一种 编译型 + 解释型 的混合语言。

Java 编译与运行流程:

1
2
3
4
5
6
// 示例代码 (HelloWorld.java)
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}

编译过程:

1
2
javac HelloWorld.java    # 编译为字节码 (HelloWorld.class)
java HelloWorld # 由 JVM 运行字节码

Python 的编译机制

  • Python 不需要显式编译,但实际上也会经历一个编译步骤。
  1. Python 源代码 (.py) 会在运行时由 解释器 编译为字节码(.pyc 文件),这种字节码是解释器能直接执行的中间代码。
  2. Python 的字节码由 Python 虚拟机(PVM) 执行,完成实际的程序运行。
  3. 这种编译过程是透明的,用户不需要手动执行,因此 Python 通常被称为 解释型语言

Python 运行示例:

1
2
# 示例代码 (hello.py)
print("Hello, Python!")

运行过程:

1
python hello.py    # 自动编译为字节码并执行

3. JSON: 数据交换格式,弱类型

JSON 是一种轻量级的数据交换格式,用于存储和传输键值对数据。它不支持复杂的类型系统,通常被视为弱类型语言。

特点:

  • 支持基本类型:数字、字符串、布尔值、数组、对象和 null
  • 没有严格的类型约束,常用于数据序列化和传输。

示例 JSON 数据:

1
2
3
4
5
6
7
8
9
10
{
"name": "Alice", // 字符串
"age": 25, // 数字
"is_student": false, // 布尔值
"grades": [85, 90, 92], // 数组
"address": { // 嵌套对象
"city": "New York",
"zip": "10001"
}
}

使用 JSON 的代码(Python):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import json

# JSON 字符串
data = '''
{
"name": "Alice",
"age": 25,
"is_student": false,
"grades": [85, 90, 92],
"address": {
"city": "New York",
"zip": "10001"
}
}
'''

# 解析 JSON 数据
parsed_data = json.loads(data)

print(parsed_data["name"]) # 输出: Alice
print(parsed_data["grades"][0]) # 输出: 85

4. HTML: 标记语言,无类型系统

HTML 是一种标记语言,用于定义 Web 页面结构。它不支持编程语言的类型系统,所有数据内容均以字符串形式存储。

特点:

  • 定义页面的内容和结构。
  • 数据类型在解析时由其他技术(如 JavaScript)或用户代理决定。

示例 HTML 代码:

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
<title>HTML 示例</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>Age: 25</p> <!-- 数字以文本形式存储 -->
<p>Is Student: false</p> <!-- 布尔值以文本形式存储 -->
</body>
</html>

使用 HTML 的数据(JavaScript):

1
2
3
4
5
6
7
8
9
// 获取 HTML 中的数据
const ageText = document.querySelector('p:nth-child(2)').textContent;
const isStudentText = document.querySelector('p:nth-child(3)').textContent;

// 转换为对应类型
const age = parseInt(ageText.split(': ')[1]);
const isStudent = isStudentText.split(': ')[1] === 'true';

console.log(`Age: ${age}, Is Student: ${isStudent}`);


1123活动
http://ippclub.github.io/1123活动/
作者
何山
发布于
2024年11月23日
更新于
2024年11月24日
许可协议