2024 年 GSoC 项目构想
此页面包含我们在 2024 年 Google 编程之夏 (Google Summer of Code 2024) 期间热衷于开发的潜在项目构想的非详尽列表。如果您想以贡献者身份申请 GSoC,请按照以下步骤开始入门
- 通读此页面和 Google 编程之夏指南,
- 确定或提出您自己感兴趣的项目构想。
- 查看开发论坛以联系潜在导师。
- 当您在论坛上发起关于您有兴趣参与他们提供指导的特定项目的帖子时,请随时提及项目导师。
今年在论坛上发布关于 GSoC 的帖子时,请使用 gsoc-2024
标签,以便于识别。
联系导师的提示
Swift 论坛由 Discourse 驱动,Discourse 是一个内置垃圾邮件避免机制的讨论论坛平台。如果您是首次加入论坛,您*可能*无法向导师发送私信,因为这需要最少的先前参与度,之后“发送私信”功能才会自动启用。
首先,我们建议您在专门的 GSoC 论坛类别中发起新主题或加入关于您感兴趣的项目的现有讨论。您还应该使用 gsoc-2024
标签*标记*您的主题。最好在您已经对该主题进行了一些探索之后再发起主题,并提出关于您不确定的项目部分的具体问题。例如,您可能尝试构建项目,但不确定功能将在何处实现;或者您可能不确定项目的范围。
请使用论坛标记项目导师并与之沟通,以 выяснить 项目的详细信息,这样在编写正式的提案计划并在编程之夏网站上提交时,您才能对项目有充分的理解,并能撰写一份出色、详细的提案(有关提示,请参阅下一节)。
如果您想私下联系导师,而不是发布公开论坛帖子,并且论坛还不允许您发送私信,请通过电子邮件直接联系 Konrad Malawski,地址为 ktoso AT apple.com
,并在电子邮件主题中添加 [gsoc2024]
标签,并描述您想从事的项目。我们会将您转交给合适的导师。总的来说,虽然首选在论坛上进行公开交流,因为这更接近 Swift 项目中完成工作的正常开源方式。
撰写提案
熟悉您在 GSoC 期间有兴趣从事的代码库有助于撰写一份好的提案,因为它有助于您更好地理解一切如何运作,以及您可能如何最好地处理您感兴趣的项目。您想怎么做真的取决于您和您的学习风格。您可以克隆存储库,通读源代码,并通过设置断点并单步执行不同的指令来跟踪测试用例的执行路径,阅读可用的文档,或者尝试修复代码库中的一个简单错误。后者是许多开源贡献者入门的方式,但这真的取决于您。如果您想去修复一个简单的错误,我们的存储库包含一个“good first issue”标签,该标签标记了应该易于修复且新手可以完成的问题。
在撰写提案时,《Google 编程之夏指南》包含一般性的良好建议。
潜在项目
我们目前正在论坛的专门 GSoC 区域收集项目构想。
潜在导师,请随时通过向 Swift 网站打开拉取请求,直接向此页面提出项目构想。
您可以在这里浏览往年的项目构想: 2023, 2022, 2021, 2020, 2019。
创建真实世界的 Swift 宏示例
项目规模: 90 小时
估计难度: 简单
推荐技能
- 具备 Swift 的基本能力。
- 具备 SwiftSyntax 的基本知识。
- 可选:具有文档工具的经验,尤其是 Swift 的 DocC。
描述
Swift 宏提供了一种在编译期间转换源代码的强大方法,简化了代码生成过程并最大限度地减少了重复的手动任务。swift-syntax 存储库包含多个展示 Swift 宏的示例。这些示例作为基础起点,说明了各种类型的宏。然而,它们通常呈现的场景可能与现实世界应用程序中遇到的日常用例并不直接一致。此外,这些示例在处理诊断方面存在显著差异,有些宏需要更详细的反馈机制来应对不正确的使用。这种情况突显了一个有价值的增强领域,旨在为开发人员提供更全面的指导和实际应用。
这个项目旨在通过增强当前 Swift 宏示例套件的现实世界适用性,并引入新的、精心制作的示例,来丰富 Swift 社区。它将扩展 swift-syntax 存储库中的基础工作,并使用 DocC 为其注入全面的文档和交互式教程。每个示例,无论是新的还是增强的,都将经过精心设计,以展示不同类型 Swift 宏的用法,配备实用的诊断、单元测试和详细的文档。该计划还将包括为一些最受欢迎和最有影响力的宏创建 DocC 教程,为 Swift 社区提供宝贵的教育资源。我们的目标是阐明 Swift 宏的多样化功能,突出它们的强大功能和灵活性,同时分享诊断、错误处理和测试的最佳实践。通过在现有示例的基础上构建并引入新的见解和技术,该项目有望提升 Swift 宏的集体知识和实用性,从而在生态系统中促进创新和卓越。
预期成果/益处/交付成果
- 一套全面的真实世界 Swift 宏示例,展示不同类型宏的实际应用。
- 每个示例的详细文档,包括使用宏的理由、它们解决的问题以及实现指南,重点是诊断和错误处理。
- 一系列高质量的 DocC 教程,涵盖流行且有用的宏的创建和应用,提供互动和引人入胜的学习体验。
潜在导师
swift-syntax 的词法作用域
项目规模: 175 小时
难度: 中级
推荐技能
- 具备 Swift 的基本能力,愿意阅读 C++ 以获取灵感
- 对解析器和编译器感兴趣
描述
Swift 源代码被组织成一组作用域,每个作用域都可以引入可以在该作用域以及嵌套在其中的其他作用域中找到的名称。例如,在这样的函数中
func f(a: Int, b: Int?) -> Int {
if let b = b {
return a + b
}
return a
}
函数的最外层花括号有一个作用域,其中参数 a
和 b
是可见的。在该作用域内的 if let
又引入了另一个作用域,它引入了一个新的名称 b
(与参数 b
不同),该名称仅在该 if let
中可见。编译器和类似编译器的工具的许多方面都依赖于遍历作用域来查找有趣的东西——例如,确定在那里引入了哪些名称(用于名称查找,即第一个 return
语句中的 a
和 b
指的是什么?),确定 break
或 continue
跳转到哪里,抛出的错误可以在哪里捕获等等。
这个项目涉及在 swift-syntax 中实现词法作用域的概念,并提供 API 来回答诸如“return a + b
中的 b
指的是什么?”或“这个 break
跳出哪个结构?”之类的问题。这些 API 可以构成 IDE 功能(如“在作用域内编辑所有内容”)的基础,并且是替换 Swift 编译器中作用域的 C++ 实现的重要一步。
预期成果/益处/交付成果
为 swift-syntax 包引入一个新的库,其中包含用于为给定语法节点实现名称和作用域查找的 API,并为 Swift 中所有有趣的角落案例(例如,guard let
、隐式名称(如 self
)、catch 代码块中的 error
、setter 中的 newValue
)进行大量测试。从那里开始,可能性是无限的:有许多基于作用域的查询可以构建 API,或者您可以开始在这些 API 之上构建像 SourceKit-LSP 中的 IDE 支持之类的东西。
潜在导师
使用 swift-syntax 实现关键字代码补全
项目规模: 175 小时
估计难度: 中级
推荐技能
- 具备 Swift 的能力
- 具备 C++ 知识是有利的,但不是必需的
描述
swift-syntax 树具有关于 Swift 语法的结构信息。例如,它知道所有不同的声明节点以及它们以哪些关键字开头。这应该允许我们通过确定光标在语法树中的位置,并通过迭代语法树的结构来找出该位置可能的关键字,从而执行关键字(例如 struct
)和标点符号(例如 ->
)的代码补全。例如,当在顶层调用代码补全时,代码补全应确定顶层允许声明,迭代所有声明节点并收集它们开头的关键字。
棘手的部分是 SwiftSyntax 树是对 Swift 语言的过度近似。例如,诸如 get { 42 }
之类的访问器被建模为声明,但仅在访问器块内有效。我们应该需要执行一些过滤,并防止在顶层建议 get
。
swiftlang/swift-syntax#1014 是一个草稿拉取请求,它实现了可能关键字的集合,但没有执行任何过滤。该项目的目标是确定需要添加的上下文过滤器,以获得良好的结果,且几乎没有或没有无效的建议。此外,它应该将新的关键字补全实现与 sourcekitd 连接,以便将这些结果提供给 Xcode、SourceKit-LSP。
基于 swift-syntax 的关键字补全的优势在于,其结果由语法树生成,因此保证是完整的。它消除了手动维护关键字补全列表的需要,并提供了以前缺失的补全,例如函数声明中参数之后的 ->
。
预期成果/益处/交付成果
在 SwiftSyntax 树中的某个位置提供所有有效的关键字或标点符号补全,且无效补全的比例非常低。
潜在导师
在 Visual Studio Code 中展开 Swift 宏
项目规模: 175 小时
估计难度: 中级
推荐技能
- 具备 Swift 的能力
- 具备 TypeScript 和 JavaScript 的能力
- 编写 Visual Studio Code 扩展的经验是有利的,但不是必需的
描述
Swift 宏允许在编译时生成源代码。虽然这提供了简洁的代码并避免了常见范式的重复,但如果不知道宏会展开成什么,理解源代码可能会变得更加困难。
使用 Swift 扩展的 Visual Studio Code 目前显示宏生成的代码的能力有限,它通过调用代码操作来将宏替换为当前源文件内生成的代码。
该项目的目标是实现一个代码操作,以显示宏生成的代码,而无需修改当前源文件。这包括在 sourcekit-lsp 中实现一个请求,以计算宏展开的内容,并在 Visual Studio Swift 扩展中提供支持以显示该内容。关于设计可能是什么样子的初步讨论可以在 此线程中找到。
作为一个延伸目标,Visual Studio Code 还应提供语义功能,例如在宏展开内部跳转到定义,并允许展开嵌套宏。
预期成果/益处/交付成果
一个端到端的实现,允许在 Visual Studio Code 中显示宏的内容。
潜在导师
为 AsyncHTTPClient 引入 Swift 分布式追踪支持
项目规模: 90 小时
难度: 中级
推荐技能
- 掌握 Swift 和 Swift 并发的基础知识
- 掌握 HTTP 概念的基础知识
描述
在之前的 Summer of Code 版本中,启动了 swift-distributed-tracing 库。此后该库的开发一直在继续,现在我们希望在一些核心服务器库中包含对追踪的支持。
Swift 服务器应用程序推荐使用的 HTTP 客户端是 async-http-client,而这个项目旨在在该项目中引入对分布式追踪的一流支持。需要完成的工作将类似于在 swift-grpc 中完成的工作。
分布式追踪允许关联分布式系统中跨节点进行的追踪的“span”(开始时间、结束时间和附加信息)。在 HTTP 中,这意味着将额外的追踪标头附加到传出的 HTTP 请求。
最终结果是,以下代码应将追踪信息发送到配置的后端
import AsyncHTTPClient
import Tracing
let httpClient = HTTPClient(eventLoopGroupProvider: .singleton)
try await tracer.withSpan("Prepare dinner") { span in
let carrotsRequest = HTTPClientRequest(url: "https://example.com/shop/vegetable/carrot?count=2")
let carrots = try await httpClient.execute(request, timeout: .seconds(30))
let meatRequest = HTTPClientRequest(url: "https://example.com/shop/meat?count=1")
let meat = try await httpClient.execute(request, timeout: .seconds(30))
print("Dinner ready: \(makeDinner(carrots, meat))")
}
上述代码应记录 3 个 span
- 整体的 “准备晚餐” span
- 一个客户端 span,用于胡萝卜 HTTP 请求的持续时间
- 一个客户端 span,用于肉类 HTTP 请求的持续时间
您可以在这些库的文档中阅读更多关于追踪的信息:swift-distributed-tracing, swift-otel。
预期成果/益处/交付成果
- 在 AsyncHTTPClient 中引入对分布式追踪的内置支持
- 应该可以引导一个追踪后端,并让 HTTP 客户端选取追踪标头并在发出的任何请求中传播它们。
- 此外,应该准备一个小型的 “演示” docker 示例,以便开发人员可以快速试用该功能。
潜在导师
使用宏重新实现属性包装器
项目规模:350 小时
估计难度: 中级
推荐技能
- 掌握 Swift 和 C++
描述
属性包装器特性目前纯粹在编译器内部实现,但随着 Swift 宏 和 init 访问器 的添加,现在可以从编译器中删除所有 ad-hoc 代码,并使用现有特性实现属性包装器。
这项工作将删除编译器中大量特定于属性包装器的代码 - 解析、语义分析、SIL 生成等,这将通过促进代码重用、清理代码库并可能修复实现中的 corner case 带来巨大的好处。宏和 init 访问器在当前状态下可能不足以覆盖所有属性包装器的使用场景,因此该项目很可能还需要改进和扩展上述特性。
预期成果/益处/交付成果
该项目的成果是从编译器中完全删除所有特定于属性包装器的代码。这在多个方面使 Swift 项目受益 - 稳定性、可测试性和代码健康。
潜在导师
etcd 客户端
项目规模: 175 小时
估计难度: 中级
推荐技能
- 掌握 Swift 和 Swift 并发的基础知识
- 掌握 gRPC 的基础知识
- 可选:使用 etcd 的经验
描述
etcd
是一个强一致性的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的领导者选举,并且可以容忍机器故障,即使在领导者节点中也是如此。此外,etcd
是一个 CNCF 毕业项目,为 Kubernetes 提供支持,Kubernetes 将所有集群信息存储在 etcd
中。
Swift 是一种非常适合实现复杂分布式系统的编程语言,拥有 etcd
客户端使此类系统能够可靠地存储其数据。最新版本的 etcd
公开了一个 gRPC API,客户端可以使用该 API 与 etcd
服务器通信以更新和查询存储的数据。
预期成果/益处/交付成果
- 创建一个全新的
swift-etcd-client
包 - 使用 etcd gRPC API 连接 etcd 服务器并进行通信
- 实现以下
etcd
API - 所有公开的 API 都应该感觉像 Swift 原生的,并使用并发概念,例如
AsyncSequence
潜在导师
为 AWS Lambda 的 Swift 运行时添加一个 deploy
SwiftPM 插件和一个基于 Swift 的 DSL deploy SwiftPM plugin and a Swift-based DSL to the Swift runtime for AWS Lambda section 的永久链接" href="#add-a-deploy-swiftpm-plugin-and-a-swift-based-dsl-to-the-swift-runtime-for-aws-lambda">
项目规模: 90 小时
估计难度: 中级
推荐技能
- 具备 Swift 的能力
描述
AWS SAM 模板提供了一种简写语法,针对为无服务器应用程序定义基础设施即代码 (IaC) 进行了优化。
我 开始探索在 Swift 中使用 DSL 表示 SAM 模板的可能性。当前代码有三个组件
- 一组数据结构,用于表示 YAML SAM 模板
- 一个 DSL 定义(使用
@resultBuilder
构建),用于使用 Swift 编程语言表达 SAM 模板 - 一个 SwiftPM 插件,允许生成 SAM 模板并将其部署到云端。
现有代码存在一个重大挑战:为了对开发人员有用,数据结构集和 DSL 必须与 SAM 模板定义对齐。
该项目旨在通过编写代码生成器来简化与不断发展的 SAM 模板定义的对齐。代码生成器将使用 SAM 模板定义 并生成一组 API 稳定的 Swift 数据结构。作为第二步,手动设计和编码的 DSL 将使用这些数据结构从 DSL 生成 YAML SAM 模板。
预期成果/益处/交付成果
-
一个 Swift 数据结构生成器。这段新的、尚未创建的代码将读取和解析 JSON SAM 模板定义,并生成一组 API 稳定的 Swift
Codable
数据结构,以生成有效的 SAM YAML 模板。生成的代码必须类似于 这些现有的数据结构(这些是手动创建的) -
一个手动设计和编码的基于 Swift 的 DSL,以对开发人员友好的方式公开 SAM 模板定义(它可以/应该基于 此现有代码)
-
这两个组件必须可以从 现有的 SwiftPM 插件 中调用
潜在导师
使用 WebAssembly 构建 Swift 宏
项目规模:350 小时
难度: 中级
推荐技能
- 掌握 Swift, C++ 的基础知识
- 对编译器和 WebAssembly 感兴趣
描述
Swift 宏 构建为主机程序,这些程序利用 swift-syntax 包来处理 Swift 语法并生成新语法。这种方法的一个缺点是,每个宏的构建过程可能需要大量时间,并且预构建宏二进制文件很复杂,因为二进制文件需要为多个主机平台(例如,Linux、Windows 和 macOS)和架构(例如,x86 和 ARM)构建。此外,宏被积极地沙盒化,以防止宏中的错误影响 Swift 编译器本身。
WebAssembly 提供了一个可移植的编译目标,可以在任何平台和架构上执行。SwiftWasm 可以将 Swift 编译为 WebAssembly,而 WasmKit 提供了一个可以执行 WebAssembly 程序的运行时。WebAssembly 可以提供一种将 Swift 宏构建为二进制文件的方法,这些二进制文件可以分发并在任何地方运行,从而无需持续重建它们。该项目涉及使 swift-syntax 和在其之上实现的宏构建为 WebAssembly,教会 Swift 编译器与这些宏实现通信,以及扩展 Swift Package Manager 以支持使用 WebAssembly 构建和使用宏。
预期成果/益处/交付成果
该项目的理想结果是 Swift 宏能够选择使用 WebAssembly 构建,并让 Swift Package Manager 在没有用户进一步干预的情况下这样做。
潜在导师
项目主题提案模板
项目名称
项目规模:90 小时 / 175 小时 / 350 小时
预计难度:简单 / 中等 / 困难
推荐技能
- 例如:掌握 Swift 和/或 C++
- ... 知识
- 可选,... 方面的经验
描述
项目的简要描述,其目标以及与 Swift 项目相关的领域。
预期成果/益处/交付成果
预期成果的描述,例如正在实现的某些特定功能、性能改进或正在编写的指南。这将是 Summer of Code 任务通过和项目最终提交的基础。
潜在导师
- 您的姓名(以及 GitHub 链接或其他联系方式)
- 可选:额外的导师