diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index c9ff722..28a9f55 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -12,6 +12,7 @@ config: - ElectiveCourseTable - HomePage - MaterialResourceList + - ProgrammingLanguageNav - XingshuCampusMap - a - div diff --git a/docs/.vitepress/theme/components/ProgrammingLanguageNav.vue b/docs/.vitepress/theme/components/ProgrammingLanguageNav.vue new file mode 100644 index 0000000..b902c4d --- /dev/null +++ b/docs/.vitepress/theme/components/ProgrammingLanguageNav.vue @@ -0,0 +1,219 @@ + + + diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 606fa1e..0119777 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -994,15 +994,6 @@ width: 100%; } -@media (max-width: 768px) { - .vp-doc._start_programming-languages table { - display: block; - max-width: 100%; - overflow-x: auto; - white-space: nowrap; - } -} - .vp-doc code { border-radius: 3px; } @@ -2364,3 +2355,538 @@ grid-template-columns: 1fr; } } + +/* Programming languages guide */ + +html.has-programming-language-guide { + scroll-padding-top: calc(var(--vp-nav-height) + 22px); +} + +.programming-language-nav { + background: color-mix(in srgb, var(--vp-c-bg) 96%, transparent); + border-right: 1px solid var(--vp-c-divider); + box-sizing: border-box; + bottom: 0; + left: 0; + overflow-x: hidden; + overflow-y: auto; + padding: 26px 22px 48px 28px; + position: fixed; + top: var(--vp-nav-height); + width: 244px; + z-index: 20; +} + +.programming-language-nav__title { + color: var(--vp-c-text-1); + font-size: 14px; + font-weight: 700; + margin: 4px 0 12px; +} + +.programming-language-nav__link { + align-items: center; + border-radius: 8px; + color: var(--vp-c-text-2); + display: flex; + font-size: 14px; + gap: 10px; + margin: 2px 0; + min-height: 38px; + padding: 5px 10px; + transition: + color 160ms ease, + background-color 160ms ease; +} + +.programming-language-nav__link:hover { + background: var(--vp-c-default-soft); + color: var(--vp-c-text-1); +} + +.programming-language-nav__link.is-active { + background: var(--vp-c-brand-soft); + color: var(--vp-c-brand-1); + font-weight: 650; +} + +.programming-language-nav__icon { + align-items: center; + background: var(--vp-c-bg-soft); + border: 1px solid var(--vp-c-divider); + border-radius: 7px; + display: inline-flex; + flex: 0 0 auto; + height: 26px; + justify-content: center; + overflow: hidden; + position: relative; + width: 26px; +} + +.programming-language-nav__fallback { + align-items: center; + background: var(--language-color); + color: #fff; + display: flex; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 9px; + font-weight: 800; + inset: 0; + justify-content: center; + letter-spacing: -0.06em; + position: absolute; +} + +.programming-language-nav__icon img { + height: 78%; + object-fit: contain; + position: relative; + width: 78%; + z-index: 1; +} + +.programming-language-nav-toggle, +.programming-language-nav-backdrop { + display: none; +} + +@media (min-width: 960px) { + html.has-programming-language-guide .VPDoc { + padding-left: 244px; + } + + html.has-programming-language-guide .VPDoc .container { + max-width: 1180px; + } +} + +.vp-doc._start_programming-languages { + color: var(--vp-c-text-1); + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + 'PingFang SC', + 'Microsoft YaHei', + Arial, + sans-serif; + font-size: 16px; + line-height: 1.8; +} + +.vp-doc._start_programming-languages h1 { + color: var(--vp-c-text-1); + font-size: 36px; + letter-spacing: -0.025em; + line-height: 1.25; + margin-bottom: 18px; +} + +.vp-doc._start_programming-languages h1 + p { + color: var(--vp-c-text-2); + font-size: 17px; + line-height: 1.8; + margin: 0 0 24px; +} + +.vp-doc._start_programming-languages .custom-block.tip { + background: var(--vp-c-brand-soft); + border: 0; + border-left: 4px solid var(--vp-c-brand-1); + border-radius: 8px; + color: var(--vp-c-text-2); + padding: 14px 16px; +} + +.vp-doc._start_programming-languages .custom-block.tip .custom-block-title { + color: var(--vp-c-text-1); +} + +.vp-doc._start_programming-languages .content-meta { + margin-bottom: 52px; + margin-top: 26px; +} + +.vp-doc._start_programming-languages + h2:is( + #typescript, + #python, + #javascript, + #java, + #csharp, + #php, + #bash, + #cpp, + #go, + #c, + #rust, + #kotlin, + #ruby, + #swift, + #dart + ) { + align-items: center; + border-top: 1px solid var(--vp-c-divider); + color: var(--vp-c-text-1); + display: flex; + font-size: 29px; + gap: 13px; + letter-spacing: -0.018em; + line-height: 1.35; + margin: 12px 0 4px; + padding-top: 54px; +} + +.vp-doc._start_programming-languages h2#typescript { + border-top: 0; + padding-top: 6px; +} + +.vp-doc._start_programming-languages + h2:is( + #typescript, + #python, + #javascript, + #java, + #csharp, + #php, + #bash, + #cpp, + #go, + #c, + #rust, + #kotlin, + #ruby, + #swift, + #dart + )::before { + background-color: var(--vp-c-bg-soft); + background-position: center; + background-repeat: no-repeat; + background-size: 78%; + border: 1px solid var(--vp-c-divider); + border-radius: 10px; + content: ''; + flex: 0 0 auto; + height: 42px; + width: 42px; +} + +.vp-doc._start_programming-languages h2#typescript::before { + background-image: url('/images/programming-languages/typescript.svg'); +} + +.vp-doc._start_programming-languages h2#python::before { + background-image: url('/images/programming-languages/python.svg'); +} + +.vp-doc._start_programming-languages h2#javascript::before { + background-image: url('/images/programming-languages/javascript.svg'); +} + +.vp-doc._start_programming-languages h2#java::before { + background-image: url('/images/programming-languages/java.svg'); +} + +.vp-doc._start_programming-languages h2#csharp::before { + background-image: url('/images/programming-languages/csharp.svg'); +} + +.vp-doc._start_programming-languages h2#php::before { + background-image: url('/images/programming-languages/php.svg'); +} + +.vp-doc._start_programming-languages h2#bash::before { + background-image: url('/images/programming-languages/bash.svg'); +} + +.vp-doc._start_programming-languages h2#cpp::before { + background-image: url('/images/programming-languages/cpp.svg'); +} + +.vp-doc._start_programming-languages h2#go::before { + background-image: url('/images/programming-languages/go.svg'); +} + +.vp-doc._start_programming-languages h2#c::before { + background-image: url('/images/programming-languages/c.svg'); +} + +.vp-doc._start_programming-languages h2#rust::before { + background-image: url('/images/programming-languages/rust.svg'); +} + +.vp-doc._start_programming-languages h2#kotlin::before { + background-image: url('/images/programming-languages/kotlin.svg'); +} + +.vp-doc._start_programming-languages h2#ruby::before { + background-image: url('/images/programming-languages/ruby.svg'); +} + +.vp-doc._start_programming-languages h2#swift::before { + background-image: url('/images/programming-languages/swift.svg'); +} + +.vp-doc._start_programming-languages h2#dart::before { + background-image: url('/images/programming-languages/dart.svg'); +} + +.vp-doc._start_programming-languages + h2:is( + #typescript, + #python, + #javascript, + #java, + #csharp, + #php, + #bash, + #cpp, + #go, + #c, + #rust, + #kotlin, + #ruby, + #swift, + #dart + ) + + blockquote { + border-left: 0; + color: color-mix(in srgb, var(--vp-c-text-2) 86%, var(--vp-c-brand-1) 14%); + font-family: 'STKaiti', 'KaiTi', '楷体', 'FZKai-Z03', cursive; + font-size: 18px; + font-style: italic; + letter-spacing: 0.025em; + line-height: 1.75; + margin: 3px 0 22px 55px; + padding: 0; + transform: rotate(-0.18deg); +} + +.vp-doc._start_programming-languages h2 + blockquote > p { + color: inherit; + margin: 0; +} + +.vp-doc._start_programming-languages p { + line-height: 1.9; + margin: 15px 0; +} + +.vp-doc._start_programming-languages p code { + background: var(--vp-c-bg-soft); + border-radius: 4px; + color: var(--vp-c-brand-1); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 0.9em; + padding: 2px 5px; +} + +.vp-doc._start_programming-languages .custom-block.info { + background: var(--vp-c-bg-alt); + border: 0; + border-left: 3px solid var(--vp-c-brand-1); + border-radius: 0 9px 9px 0; + margin: 21px 0 23px; + padding: 15px 18px; +} + +.vp-doc._start_programming-languages .custom-block.info .custom-block-title { + color: var(--vp-c-text-1); + font-size: 15px; + line-height: 1.45; + margin: 0 0 7px; +} + +.vp-doc._start_programming-languages .custom-block.info p { + color: var(--vp-c-text-2); + font-size: 14px; + line-height: 1.85; + margin: 0; +} + +.vp-doc._start_programming-languages .custom-block.info + p { + align-items: baseline; + color: var(--vp-c-text-2); + display: flex; + font-size: 14px; + font-weight: 600; + gap: 9px; + margin: 21px 0 11px; +} + +.vp-doc._start_programming-languages .custom-block.info + p strong { + color: var(--vp-c-text-3); + font-size: 12px; + font-weight: 700; + letter-spacing: 0.08em; +} + +.vp-doc._start_programming-languages div[class^='language-'] { + --shiki-light-bg: #1e1e20; + --shiki-dark-bg: #0e0e10; + border: 1px solid color-mix(in srgb, var(--vp-c-divider) 55%, transparent); + border-radius: 10px; + background: var(--shiki-light-bg); + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08); + margin: 22px 0 38px; + overflow: hidden; +} + +.dark .vp-doc._start_programming-languages div[class^='language-'] { + background: var(--shiki-dark-bg); +} + +.vp-doc._start_programming-languages div[class^='language-'] pre { + background: inherit !important; +} + +.vp-doc._start_programming-languages div[class^='language-'] .vp-code span { + color: var(--shiki-dark) !important; +} + +.vp-doc._start_programming-languages div[class^='language-'] .lang { + color: #9d9da6; +} + +.vp-doc._start_programming-languages div[class^='language-'] + p { + color: var(--vp-c-text-2); + font-size: 14px; + line-height: 1.8; + margin: -20px 0 10px; +} + +.vp-doc._start_programming-languages div[class^='language-'] + p + p { + color: var(--vp-c-text-2); + font-size: 14px; + margin: 10px 0 34px; +} + +.vp-doc._start_programming-languages div[class^='language-'] + p + p strong { + color: var(--vp-c-text-1); +} + +@media (max-width: 959px) { + .programming-language-nav-toggle { + align-items: center; + background: var(--vp-c-bg-soft); + border: 1px solid var(--vp-c-divider); + border-radius: 9px; + color: var(--vp-c-text-1); + display: inline-flex; + font-size: 14px; + font-weight: 600; + gap: 8px; + margin: 0 0 24px; + padding: 8px 12px; + position: sticky; + top: calc(var(--vp-nav-height) + 10px); + z-index: 22; + } + + .programming-language-nav { + box-shadow: 14px 0 36px rgba(0, 0, 0, 0.16); + transform: translateX(-105%); + transition: transform 220ms ease; + width: min(82vw, 300px); + z-index: 42; + } + + .programming-language-nav.is-open { + transform: translateX(0); + } + + .programming-language-nav-backdrop { + background: rgba(0, 0, 0, 0.36); + border: 0; + bottom: 0; + display: block; + left: 0; + position: fixed; + right: 0; + top: var(--vp-nav-height); + z-index: 41; + } + + .vp-doc._start_programming-languages h1 { + font-size: 30px; + } + + .vp-doc._start_programming-languages + h2:is( + #typescript, + #python, + #javascript, + #java, + #csharp, + #php, + #bash, + #cpp, + #go, + #c, + #rust, + #kotlin, + #ruby, + #swift, + #dart + ) { + font-size: 25px; + scroll-margin-top: calc(var(--vp-nav-height) + 70px); + } +} + +@media (max-width: 520px) { + .vp-doc._start_programming-languages + h2:is( + #typescript, + #python, + #javascript, + #java, + #csharp, + #php, + #bash, + #cpp, + #go, + #c, + #rust, + #kotlin, + #ruby, + #swift, + #dart + )::before { + border-radius: 8px; + height: 36px; + width: 36px; + } + + .vp-doc._start_programming-languages + h2:is( + #typescript, + #python, + #javascript, + #java, + #csharp, + #php, + #bash, + #cpp, + #go, + #c, + #rust, + #kotlin, + #ruby, + #swift, + #dart + ) + + blockquote { + font-size: 16px; + margin-left: 0; + } +} + +@media (prefers-reduced-motion: reduce) { + .programming-language-nav { + transition: none; + } +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index e81016f..aff660a 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -6,6 +6,7 @@ import ContentMeta from './components/ContentMeta.vue'; import ElectiveCourseTable from './components/ElectiveCourseTable.vue'; import HomePage from './components/HomePage.vue'; import MaterialResourceList from './components/MaterialResourceList.vue'; +import ProgrammingLanguageNav from './components/ProgrammingLanguageNav.vue'; import ScsLayout from './components/ScsLayout.vue'; import 'katex/dist/katex.min.css'; import './custom.css'; @@ -19,6 +20,7 @@ export default { app.component('ElectiveCourseTable', ElectiveCourseTable); app.component('HomePage', HomePage); app.component('MaterialResourceList', MaterialResourceList); + app.component('ProgrammingLanguageNav', ProgrammingLanguageNav); app.component( 'XingshuCampusMap', defineAsyncComponent(() => import('./components/XingshuCampusMap.vue')), diff --git a/docs/public/images/programming-languages/bash.svg b/docs/public/images/programming-languages/bash.svg new file mode 100644 index 0000000..8aade9d --- /dev/null +++ b/docs/public/images/programming-languages/bash.svg @@ -0,0 +1 @@ + diff --git a/docs/public/images/programming-languages/c.svg b/docs/public/images/programming-languages/c.svg new file mode 100644 index 0000000..5197f2a --- /dev/null +++ b/docs/public/images/programming-languages/c.svg @@ -0,0 +1 @@ + diff --git a/docs/public/images/programming-languages/cpp.svg b/docs/public/images/programming-languages/cpp.svg new file mode 100644 index 0000000..6cae222 --- /dev/null +++ b/docs/public/images/programming-languages/cpp.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/public/images/programming-languages/csharp.svg b/docs/public/images/programming-languages/csharp.svg new file mode 100644 index 0000000..acc487e --- /dev/null +++ b/docs/public/images/programming-languages/csharp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/images/programming-languages/dart.svg b/docs/public/images/programming-languages/dart.svg new file mode 100644 index 0000000..8c78fdb --- /dev/null +++ b/docs/public/images/programming-languages/dart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/images/programming-languages/go.svg b/docs/public/images/programming-languages/go.svg new file mode 100644 index 0000000..0fbf6fd --- /dev/null +++ b/docs/public/images/programming-languages/go.svg @@ -0,0 +1 @@ + diff --git a/docs/public/images/programming-languages/java.svg b/docs/public/images/programming-languages/java.svg new file mode 100644 index 0000000..051bf25 --- /dev/null +++ b/docs/public/images/programming-languages/java.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/images/programming-languages/javascript.svg b/docs/public/images/programming-languages/javascript.svg new file mode 100644 index 0000000..7975261 --- /dev/null +++ b/docs/public/images/programming-languages/javascript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/images/programming-languages/kotlin.svg b/docs/public/images/programming-languages/kotlin.svg new file mode 100644 index 0000000..1b8d8f4 --- /dev/null +++ b/docs/public/images/programming-languages/kotlin.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/public/images/programming-languages/php.svg b/docs/public/images/programming-languages/php.svg new file mode 100644 index 0000000..32b7a5b --- /dev/null +++ b/docs/public/images/programming-languages/php.svg @@ -0,0 +1,2 @@ + + diff --git a/docs/public/images/programming-languages/python.svg b/docs/public/images/programming-languages/python.svg new file mode 100644 index 0000000..e0e096a --- /dev/null +++ b/docs/public/images/programming-languages/python.svg @@ -0,0 +1 @@ + diff --git a/docs/public/images/programming-languages/ruby.svg b/docs/public/images/programming-languages/ruby.svg new file mode 100644 index 0000000..9c65110 --- /dev/null +++ b/docs/public/images/programming-languages/ruby.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/images/programming-languages/rust.svg b/docs/public/images/programming-languages/rust.svg new file mode 100644 index 0000000..3f2c9b0 --- /dev/null +++ b/docs/public/images/programming-languages/rust.svg @@ -0,0 +1 @@ + diff --git a/docs/public/images/programming-languages/swift.svg b/docs/public/images/programming-languages/swift.svg new file mode 100644 index 0000000..68630ab --- /dev/null +++ b/docs/public/images/programming-languages/swift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/images/programming-languages/typescript.svg b/docs/public/images/programming-languages/typescript.svg new file mode 100644 index 0000000..e1db5f1 --- /dev/null +++ b/docs/public/images/programming-languages/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/start/programming-languages.md b/docs/start/programming-languages.md index 9ec6153..7eab7e1 100644 --- a/docs/start/programming-languages.md +++ b/docs/start/programming-languages.md @@ -1,6 +1,6 @@ --- title: 程序设计语言导览 -description: 面向新生的 15 种常见程序设计语言对比、特色代码与方向选择建议 +description: 通过图标、设计印象、发展史和特色代码认识 15 种常见程序设计语言 category: start audience: - 本科新生 @@ -13,125 +13,63 @@ sources: url: https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/ - name: Dennis Ritchie《The Development of the C Language》 url: https://www.nokia.com/bell-labs/about/dennis-m-ritchie/chist.html + - name: Devicon 开源语言图标 + url: https://github.com/devicons/devicon +sidebar: false +aside: true +outline: [2, 2] --- - + + +# 15 种主流程序设计语言 {#overview} -# 程序设计语言导览 +15 门常见程序设计语言,从语法风格、设计取向到典型代码,放在同一页里对照着看。 -本页选取 15 种在课程学习、Web、后端、系统软件和移动端中常见的程序设计语言,帮助新生认识不同语言的设计取向和典型用途。它不是严格的热度排行榜,也不表示每种语言都需要学习。 +::: tip 阅读方式 +标题下方的斜体小字概括这门语言最鲜明的印象,正文再展开它的使用方式和设计特点,最后用一段代码把语言本身的味道写出来。 +::: ::: tip 新生先看 先跟随课程学好 C 语言和程序设计基础,再根据目标选择一门实践语言即可。想做 Web 可以继续了解 JavaScript 和 TypeScript;偏数据、自动化或人工智能可以学习 Python;对系统、性能或基础设施感兴趣,可以在有基础后接触 C++、Go 或 Rust。 ::: -## 一页比较 - -| 语言 | 类型与运行方式 | 代表方向 | 新生建议 | -| ------------ | ------------------------------- | ------------------------------- | ---------------------------- | -| C | 静态类型、原生编译 | 程序设计基础、嵌入式、底层软件 | 优先跟随课程掌握 | -| C++ | 静态类型、原生编译 | 算法、游戏引擎、高性能软件 | 掌握 C 基础后学习 | -| Python | 动态类型、解释执行 | AI、数据分析、自动化、Web 后端 | 适合快速完成实践项目 | -| Java | 静态类型、JVM | 企业后端、Android 基础生态 | 适合学习面向对象与大型工程 | -| JavaScript | 动态类型、浏览器或 Node.js | Web 前端、全栈与开发工具 | Web 方向的基础语言 | -| TypeScript | 静态类型增强、编译为 JavaScript | 大型前端、全栈、SDK | 建议在 JavaScript 之后学习 | -| PHP | 动态类型、解释执行 | Web 后端、CMS、电商 | 适合维护和开发传统 Web 项目 | -| Ruby | 动态类型、解释执行 | Rails、脚本、快速原型 | 适合观察高表达力语言设计 | -| C# | 静态类型、.NET | 企业应用、云服务、Unity | 适合 .NET 与游戏开发方向 | -| Shell / Bash | 动态脚本、命令解释 | Linux、CI/CD、运维自动化 | 所有开发方向都值得掌握基础 | -| Go | 静态类型、原生编译 | 云原生、网络服务、CLI | 适合后端和基础设施方向 | -| Rust | 静态类型、原生编译 | 系统软件、WebAssembly、基础设施 | 建议具备内存与系统基础后学习 | -| Kotlin | 静态类型、JVM 或多平台 | Android、JVM 后端、多平台 | 移动端和 JVM 方向可选 | -| Swift | 静态类型、原生编译 | Apple 平台应用 | iOS、macOS 方向可选 | -| Dart | 静态类型、JIT/AOT | Flutter 多端应用 | Flutter 方向可选 | - -## 新生怎么选 - -- 课程学习:先看 [C 语言程序设计](/study/c) 和 [C/C++ 入门](/study/cpp-basics),重点理解变量、控制流程、函数、数组、指针和编译过程。 -- Web 开发:从 [Web 前端设计](/study/web-frontend) 进入 HTML、CSS 和 JavaScript,再学习 TypeScript。 -- 数据与人工智能:用 Python 完成数据处理、自动化脚本和简单模型调用,不必一开始追求复杂框架。 -- 后端与工程:Java、C#、Go 都适合构建服务端项目,选择一门深入比同时浅尝多门更有效。 -- 系统与性能:先理解 C/C++ 的内存与编译模型,再接触 Rust 等强调安全和性能的语言。 -- 移动端:Android 可关注 Kotlin,Apple 平台使用 Swift,Flutter 多端开发使用 Dart。 - -GitHub 的语言活跃度会随统计口径和时间变化。根据 GitHub Octoverse 2025,TypeScript 在 2025 年 8 月首次成为 GitHub 月度贡献者数量最多的语言;本页只把该报告作为观察生态趋势的参考,不据此给出“最好语言”排名。 - -## 课程与通用基础 - -### C + -> 几十年之后,底层软件依然绕不开它。 +## TypeScript {#typescript} -C 提供指针、结构体、直接内存访问以及非常轻量的运行模型。它缺少许多现代语言的自动安全保护,却因此给程序员极高的硬件和内存控制能力。 +> 给 JavaScript 加上编译期类型系统。 -操作系统内核、嵌入式、驱动、运行时和大量基础库至今仍大量使用 C。理解它往往也意味着要真正理解地址、内存布局和数据在机器中的表示方式。 +TypeScript 是建立在 JavaScript 之上的强类型语言,JavaScript 本身仍然是有效的 TypeScript,而 TypeScript 可以通过静态类型、类型推断、泛型、联合类型等机制,在代码真正运行之前发现大量错误。它尤其适合 `React`、`Next.js`、`Vue`、`Node.js`、`NestJS` 等现代前后端工程。 -**语言特色:** 指针直接操作数据 +现代大型 Web 项目、`npm` 生态以及 AI 辅助编程都越来越需要明确的类型边界。清晰的类型信息不仅方便多人协作和重构,也能让工具更准确地理解代码。 -::: details 发展史 -C 由 Dennis Ritchie 在贝尔实验室于 **1969—1973 年**间逐步设计,它从 BCPL 和 B 语言演化而来,并很快被用于重写 Unix 的大部分代码。这让操作系统第一次能够在保留底层效率的同时获得较好的可移植性。1978 年出版的《The C Programming Language》使 C 广泛传播;**ANSI C(C89)** 和 ISO C90 完成标准化,此后又出现 C99、C11、C17 和 C23 等版本。 +::: info 发展史 +TypeScript 由微软在 **2012 年**正式发布,核心设计由 Anders Hejlsberg 主导。它最初就是为了解决大型 JavaScript 项目在类型、重构和工具支持上的困难,同时保持与 JavaScript 的兼容。**TypeScript 1.0** 于 2014 年发布,此后随着 React、Node.js 和现代前端工程体系发展,逐渐从“可选的类型增强工具”变成大型 Web 项目的常见基础设施。进入 4.x、5.x 之后,类型推断、控制流分析和类型表达能力继续增强。 ::: -```c [pointer.c] -#include +**语言特色:** 判别联合 + 类型收窄 -typedef struct { - int x; - int y; -} Point; +```typescript [result.ts] +type Result = { ok: true; value: T } | { ok: false; error: string }; -void translate(Point *p, int dx, int dy) { - p->x += dx; - p->y += dy; -} +function unwrap(result: Result): T { + if (result.ok) { + return result.value; + } -int main(void) { - Point p = {2, 3}; - translate(&p, 4, -1); - printf("(%d, %d)\n", p.x, p.y); + throw new Error(result.error); } -``` - -**代码说明:** `Point *p`、`&p` 和 `p->x` 这一类写法对应的就是 C 世界最核心的一组概念:地址、指针以及对内存中对象的直接访问。 - -**常见场景:** Linux 内核、嵌入式、驱动、MCU、数据库底层、运行时。 - -### C++ - -> 当性能、资源控制和大型工程能力必须同时存在。 - -C++ 在接近底层硬件控制的同时,提供泛型、`RAII`、`template`、`range`、智能指针等高层抽象能力。它既能维护几十年前的系统,也能采用非常现代的编程范式。 - -游戏引擎、浏览器、数据库、高性能计算、图形系统和大量底层运行时仍然离不开 C++。这类项目通常既要求性能,又不能失去大型工程需要的抽象能力。 -**语言特色:** Ranges + Lambda + 零成本抽象 - -::: details 发展史 -C++ 由 Bjarne Stroustrup 在贝尔实验室于 **1979 年**开始设计,最初名为 “C with Classes”,目标是在 C 的性能和底层控制能力上加入类与抽象机制,1983 年正式使用 C++ 这一名称。**C++98** 成为第一个 ISO 标准版本;2011 年的 C++11 是一次重要现代化,引入 auto、lambda、智能指针、移动语义和并发支持。此后的 C++14、17、20、23 持续强化泛型、编译期计算和标准库能力。 -::: - -```cpp [ranges.cpp] -#include -#include -#include - -int main() { - std::vector nums{1, 2, 3, 4, 5, 6}; - - auto result = nums - | std::views::filter([](int n) { return n % 2 == 0; }) - | std::views::transform([](int n) { return n * n; }); - - for (int n : result) - std::cout << n << ' '; -} +const result: Result = { ok: true, value: 42 }; +console.log(unwrap(result)); ``` -**代码说明:** 现代 C++ 已经可以写出接近函数式数据管道的代码,同时仍然保持原生编译和对底层资源的控制。 +**代码说明:** 这种写法很能体现 TypeScript 的核心价值:代码仍然保持 JavaScript 的写法,但编译器已经能够理解不同业务状态对应的数据结构。 -**常见场景:** Unreal Engine、数据库、浏览器、机器人、高性能计算、基础设施。 +**常见场景:** 前端、大型 Web App、全栈、Node.js API、SDK。 -### Python +## Python {#python} > 可读性极强,同时也是数据与自动化生态中的主力语言。 @@ -139,12 +77,12 @@ Python 是高级、动态类型语言,以简洁语法、高级数据结构和 在 GitHub 上,Python 长期拥有非常大的开发者规模。尤其在数据处理、科学计算和机器学习项目中,它拥有 `NumPy`、`Pandas`、`PyTorch`、`FastAPI` 等成熟生态。 -**语言特色:** 结构模式匹配 + 极简数据模型 - -::: details 发展史 +::: info 发展史 Python 由 Guido van Rossum 在荷兰 CWI 工作期间于 **1989 年末**开始设计,1991 年公开了早期版本。它继承了 ABC 语言强调可读性的思想,同时加入异常处理、模块和面向对象等能力。**Python 2.0** 于 2000 年发布,**Python 3.0** 于 2008 年对语言做了不兼容但更统一的整理;Python 2 在 2020 年结束官方支持。随后 Python 依靠科学计算、Web、自动化和机器学习生态持续扩大影响力。 ::: +**语言特色:** 结构模式匹配 + 极简数据模型 + ```python [router.py] from dataclasses import dataclass @@ -169,41 +107,7 @@ print(route(Task("train", 12))) **常见场景:** 数据分析、自动化、爬虫、FastAPI / Django 后端、科研与机器学习。 -### Java - -> 大型企业后端的长期主力。 - -Java 是静态类型 JVM 语言,以成熟的类型系统、垃圾回收、跨平台运行时、大型企业生态和长期兼容性著称。现代 Java 已经远不是过去“类特别多、代码特别长”的形象,`record`、`sealed class`、`lambda`、`pattern matching` 等能力显著提升了表达力。 - -在企业后端、金融系统和分布式服务中,Java 仍然拥有非常成熟的工具链和框架生态。很多大型系统选择它,不只是因为语言本身,还因为 JVM、监控、调优和长期维护体系都非常完善。 - -**语言特色:** sealed type + record + pattern matching - -::: details 发展史 -Java 起源于 Sun Microsystems 在 **1991 年**启动的 Green Project,James Gosling 等人为消费电子设备设计了一门名为 Oak 的语言,后来更名为 Java,并在 1995 年正式推出。它以 JVM 和“编写一次,到处运行”的跨平台理念迅速进入 Web 与企业软件领域。2004 年 Java 5 引入泛型、注解等重要特性;2010 年 Oracle 收购 Sun 后继续维护 Java 平台。近年的 Java 通过 record、sealed class、模式匹配和更快的版本迭代不断现代化。 -::: - -```java [ShapeDemo.java] -sealed interface Shape permits Circle, Rectangle {} - -record Circle(double radius) implements Shape {} -record Rectangle(double width, double height) implements Shape {} - -static double area(Shape shape) { - return switch (shape) { - case Circle c -> Math.PI * c.radius() * c.radius(); - case Rectangle r -> r.width() * r.height(); - }; -} -``` - -**代码说明:** 这段代码把封闭类型层次、不可变数据记录和模式匹配放在一起,能看出现代 Java 在保持强类型的同时已经减少了很多样板代码。 - -**常见场景:** Spring Boot、金融系统、企业后台、分布式系统、大型微服务。 - -## Web 与应用开发 - -### JavaScript +## JavaScript {#javascript} > Web 世界的原生通用语言。 @@ -211,12 +115,12 @@ JavaScript 是动态、多范式语言,拥有一等函数、闭包、原型对 即使 TypeScript 在大型工程里越来越普及,JavaScript 本身仍然拥有极其庞大的代码存量和生态;浏览器运行时、`npm` 生态和 `Node.js` 共同决定了它依然是 Web 开发最基础的一层。 -**语言特色:** Promise + async/await + 函数式组合 - -::: details 发展史 +::: info 发展史 JavaScript 由 Brendan Eich 于 **1995 年**在 Netscape 开发,早期曾使用 Mocha、LiveScript 等名称,随后改名 JavaScript。1997 年它被标准化为 **ECMAScript**。2000 年代 Ajax 推动浏览器端应用复杂度快速上升,2009 年 Node.js 又把 JavaScript 带到服务器端。**ES2015(ES6)** 引入 class、module、Promise、箭头函数等大量现代语法,之后 ECMAScript 转为持续迭代的年度标准。 ::: +**语言特色:** Promise + async/await + 函数式组合 + ```javascript [fetch.mjs] const urls = ['/api/user', '/api/messages', '/api/settings']; @@ -234,108 +138,39 @@ console.log(data); **常见场景:** 浏览器前端、Node.js、Serverless、Electron、Web 工具。 -### TypeScript - -> 给 JavaScript 加上编译期类型系统。 - -TypeScript 是建立在 JavaScript 之上的强类型语言,JavaScript 本身仍然是有效的 TypeScript,而 TypeScript 可以通过静态类型、类型推断、泛型、联合类型等机制,在代码真正运行之前发现大量错误。它尤其适合 `React`、`Next.js`、`Vue`、`Node.js`、`NestJS` 等现代前后端工程。 - -现代大型 Web 项目、`npm` 生态以及 AI 辅助编程都越来越需要明确的类型边界。清晰的类型信息不仅方便多人协作和重构,也能让工具更准确地理解代码。 - -**语言特色:** 判别联合 + 类型收窄 - -::: details 发展史 -TypeScript 由微软在 **2012 年**正式发布,核心设计由 Anders Hejlsberg 主导。它最初就是为了解决大型 JavaScript 项目在类型、重构和工具支持上的困难,同时保持与 JavaScript 的兼容。**TypeScript 1.0** 于 2014 年发布,此后随着 React、Node.js 和现代前端工程体系发展,逐渐从“可选的类型增强工具”变成大型 Web 项目的常见基础设施。进入 4.x、5.x 之后,类型推断、控制流分析和类型表达能力继续增强。 -::: - -```typescript [result.ts] -type Result = { ok: true; value: T } | { ok: false; error: string }; - -function unwrap(result: Result): T { - if (result.ok) { - return result.value; - } - - throw new Error(result.error); -} - -const result: Result = { ok: true, value: 42 }; -console.log(unwrap(result)); -``` - -**代码说明:** 这种写法很能体现 TypeScript 的核心价值:代码仍然保持 JavaScript 的写法,但编译器已经能够理解不同业务状态对应的数据结构。 - -**常见场景:** 前端、大型 Web App、全栈、Node.js API、SDK。 - -### PHP - -> 依旧无法忽视的 Web 后端语言。 +## Java {#java} -PHP 是围绕服务器端 Web 开发成长起来的动态语言,拥有非常直接的 HTTP / Web 编程模型,同时支持闭包、类型声明、类、接口、`trait` 等现代语言能力。WordPress、Laravel 等生态让它继续维持非常大的实际项目规模。 +> 大型企业后端的长期主力。 -它和 Web 的结合非常直接:处理请求参数、模板、表单、数据库和 JSON 数据都很自然。现代 PHP 的类型系统和面向对象能力也比早期版本完整得多。 +Java 是静态类型 JVM 语言,以成熟的类型系统、垃圾回收、跨平台运行时、大型企业生态和长期兼容性著称。现代 Java 已经远不是过去“类特别多、代码特别长”的形象,`record`、`sealed class`、`lambda`、`pattern matching` 等能力显著提升了表达力。 -**语言特色:** 关联数组 + Closure +在企业后端、金融系统和分布式服务中,Java 仍然拥有非常成熟的工具链和框架生态。很多大型系统选择它,不只是因为语言本身,还因为 JVM、监控、调优和长期维护体系都非常完善。 -::: details 发展史 -PHP 最早由 Rasmus Lerdorf 在 **1994 年**编写,用来维护个人主页和处理简单的 Web 请求,之后演化为 PHP/FI。1998 年 PHP 3 通过重写形成更完整的语言,Zeev Suraski 和 Andi Gutmans 随后开发 Zend Engine,成为 PHP 4 及后续版本的重要基础。PHP 5 强化了面向对象能力,**PHP 7** 在 2015 年大幅改善性能与内存效率,PHP 8 又加入 attributes、union types、JIT 等现代特性。 +::: info 发展史 +Java 起源于 Sun Microsystems 在 **1991 年**启动的 Green Project,James Gosling 等人为消费电子设备设计了一门名为 Oak 的语言,后来更名为 Java,并在 1995 年正式推出。它以 JVM 和“编写一次,到处运行”的跨平台理念迅速进入 Web 与企业软件领域。2004 年 Java 5 引入泛型、注解等重要特性;2010 年 Oracle 收购 Sun 后继续维护 Java 平台。近年的 Java 通过 record、sealed class、模式匹配和更快的版本迭代不断现代化。 ::: -```php [users.php] - "Alice", "score" => 95], - ["name" => "Bob", "score" => 72], - ["name" => "Carol", "score" => 91], -]; - -$top = array_filter( - $users, - fn($user) => $user["score"] >= 90 -); - -echo json_encode(array_values($top), JSON_PRETTY_PRINT); -``` - -**代码说明:** PHP 的数组既能当列表,也能当键值映射,再配合闭包和内置集合函数,处理典型 Web 数据时往往非常直接。 - -**常见场景:** Laravel、WordPress、CMS、电商、传统及现代 Web 后端。 - -### Ruby - -> 追求开发者表达力与开发效率的动态语言。 - -Ruby 把“对象”贯彻得非常彻底,几乎一切都可以作为对象来操作。它大量使用 block、iterator、message passing 以及灵活的元编程能力,这也是 Ruby 代码经常读起来接近自然语言的原因。 - -Ruby on Rails 又进一步把 Ruby 的“约定优于配置、快速开发”哲学带进 Web 工程。它很适合需要快速构建业务功能和持续迭代的项目。 +**语言特色:** sealed type + record + pattern matching -**语言特色:** Block + Enumerable +```java [ShapeDemo.java] +sealed interface Shape permits Circle, Rectangle {} -::: details 发展史 -Ruby 由日本程序员 Yukihiro “Matz” Matsumoto 在 **1993 年**开始设计,并于 1995 年公开发布。Matz 希望把 Perl 的实用性、Smalltalk 的纯面向对象思想以及 Lisp 等语言的表达力结合起来,让程序员写代码时更自然。2004 年 Ruby on Rails 发布后,Ruby 在 Web 创业和快速应用开发中迅速流行。后续 Ruby 2.x、3.x 持续改善性能、并发和类型描述工具,同时保持强调可读性与开发者体验的风格。 -::: +record Circle(double radius) implements Shape {} +record Rectangle(double width, double height) implements Shape {} -```ruby [scores.rb] -scores = { - "Alice" => 95, - "Bob" => 76, - "Carol" => 91 +static double area(Shape shape) { + return switch (shape) { + case Circle c -> Math.PI * c.radius() * c.radius(); + case Rectangle r -> r.width() * r.height(); + }; } - -scores - .select { |_, score| score >= 90 } - .sort_by { |_, score| -score } - .each do |name, score| - puts "#{name}: #{score} ★" - end ``` -**代码说明:** Ruby 很少强迫开发者写大量仪式性的循环和临时代码,集合的筛选、排序和遍历往往可以自然地串成一段表达式。 +**代码说明:** 这段代码把封闭类型层次、不可变数据记录和模式匹配放在一起,能看出现代 Java 在保持强类型的同时已经减少了很多样板代码。 -**常见场景:** Rails、SaaS、Web 应用、脚本、快速原型。 +**常见场景:** Spring Boot、金融系统、企业后台、分布式系统、大型微服务。 -### C# {#csharp} +## C# {#csharp} > 微软 .NET 生态的现代全能型语言。 @@ -343,12 +178,12 @@ C# 是现代、通用、面向对象的静态类型语言,同时大量吸收 除了 ASP.NET Core 企业后端,C# 在桌面开发、云服务以及 Unity 游戏开发中都有庞大代码库。它和 .NET 的结合让同一套语言能够覆盖服务器、客户端、工具和游戏等多种项目。 -**语言特色:** LINQ + record + with - -::: details 发展史 +::: info 发展史 C# 由微软在 .NET 计划中开发,Anders Hejlsberg 是主要设计者之一,语言在 **2000 年**公开,并随 **.NET Framework 1.0** 于 2002 年正式进入开发者生态。之后 C# 先后加入泛型、LINQ、lambda、async/await 等能力,逐渐从传统面向对象语言发展为多范式语言。2010 年代 Roslyn 编译器和 .NET Core 开源,随后统一为现代 .NET 平台,使 C# 从 Windows 生态进一步扩展到 Linux、云服务和跨平台开发。 ::: +**语言特色:** LINQ + record + with + ```csharp [Orders.cs] record Order(string Id, decimal Total); @@ -372,9 +207,42 @@ foreach (var order in vipOrders) **常见场景:** ASP.NET Core、Azure、企业软件、Windows、Unity 游戏。 -## 系统、后端与基础设施 +## PHP {#php} + +> 依旧无法忽视的 Web 后端语言。 + +PHP 是围绕服务器端 Web 开发成长起来的动态语言,拥有非常直接的 HTTP / Web 编程模型,同时支持闭包、类型声明、类、接口、`trait` 等现代语言能力。WordPress、Laravel 等生态让它继续维持非常大的实际项目规模。 + +它和 Web 的结合非常直接:处理请求参数、模板、表单、数据库和 JSON 数据都很自然。现代 PHP 的类型系统和面向对象能力也比早期版本完整得多。 -### Shell / Bash +::: info 发展史 +PHP 最早由 Rasmus Lerdorf 在 **1994 年**编写,用来维护个人主页和处理简单的 Web 请求,之后演化为 PHP/FI。1998 年 PHP 3 通过重写形成更完整的语言,Zeev Suraski 和 Andi Gutmans 随后开发 Zend Engine,成为 PHP 4 及后续版本的重要基础。PHP 5 强化了面向对象能力,**PHP 7** 在 2015 年大幅改善性能与内存效率,PHP 8 又加入 attributes、union types、JIT 等现代特性。 +::: + +**语言特色:** 关联数组 + Closure + +```php [users.php] + "Alice", "score" => 95], + ["name" => "Bob", "score" => 72], + ["name" => "Carol", "score" => 91], +]; + +$top = array_filter( + $users, + fn($user) => $user["score"] >= 90 +); + +echo json_encode(array_values($top), JSON_PRETTY_PRINT); +``` + +**代码说明:** PHP 的数组既能当列表,也能当键值映射,再配合闭包和内置集合函数,处理典型 Web 数据时往往非常直接。 + +**常见场景:** Laravel、WordPress、CMS、电商、传统及现代 Web 后端。 + +## Shell / Bash {#bash} > 操作系统和各种开发工具之间的“胶水”。 @@ -382,12 +250,12 @@ GitHub 榜单中的名称通常写作 Shell,并不单指 Bash;不过 Bash Shell 在 CI/CD、容器、Linux、云服务和自动化脚本中非常常见。它的优势不是重新实现所有功能,而是把系统里已有的小工具连接起来。 -**语言特色:** Unix Pipeline - -::: details 发展史 +::: info 发展史 Shell 编程可以追溯到早期 Unix,Stephen Bourne 在 1970 年代开发的 Bourne shell(sh)奠定了许多语法基础。**Bash** 由 Brian Fox 为 GNU Project 开发,并在 **1989 年**发布,名称来自 “Bourne Again SHell”。它在兼容 Bourne shell 的基础上吸收了命令历史、作业控制和交互式编辑等功能,后来成为大量 Linux 发行版的重要默认 Shell,也长期作为脚本、构建和运维自动化的基础工具。 ::: +**语言特色:** Unix Pipeline + ```bash [largest-logs.sh] #!/usr/bin/env bash set -euo pipefail @@ -402,7 +270,42 @@ find . -type f -name "*.log" -print0 | **常见场景:** Linux、服务器管理、Docker、GitHub Actions、CI/CD、DevOps。 -### Go +## C++ {#cpp} + +> 当性能、资源控制和大型工程能力必须同时存在。 + +C++ 在接近底层硬件控制的同时,提供泛型、`RAII`、`template`、`range`、智能指针等高层抽象能力。它既能维护几十年前的系统,也能采用非常现代的编程范式。 + +游戏引擎、浏览器、数据库、高性能计算、图形系统和大量底层运行时仍然离不开 C++。这类项目通常既要求性能,又不能失去大型工程需要的抽象能力。 + +::: info 发展史 +C++ 由 Bjarne Stroustrup 在贝尔实验室于 **1979 年**开始设计,最初名为 “C with Classes”,目标是在 C 的性能和底层控制能力上加入类与抽象机制,1983 年正式使用 C++ 这一名称。**C++98** 成为第一个 ISO 标准版本;2011 年的 C++11 是一次重要现代化,引入 auto、lambda、智能指针、移动语义和并发支持。此后的 C++14、17、20、23 持续强化泛型、编译期计算和标准库能力。 +::: + +**语言特色:** Ranges + Lambda + 零成本抽象 + +```cpp [ranges.cpp] +#include +#include +#include + +int main() { + std::vector nums{1, 2, 3, 4, 5, 6}; + + auto result = nums + | std::views::filter([](int n) { return n % 2 == 0; }) + | std::views::transform([](int n) { return n * n; }); + + for (int n : result) + std::cout << n << ' '; +} +``` + +**代码说明:** 现代 C++ 已经可以写出接近函数式数据管道的代码,同时仍然保持原生编译和对底层资源的控制。 + +**常见场景:** Unreal Engine、数据库、浏览器、机器人、高性能计算、基础设施。 + +## Go {#go} > 云原生时代最典型的系统 / 服务端语言之一。 @@ -410,12 +313,12 @@ Go 是强类型、编译型、带垃圾回收的通用语言,语法刻意保 Docker、Kubernetes 等云原生生态让 Go 与基础设施工程高度绑定。编译速度快、部署方便、标准库完整,也让它很适合网络服务和命令行工具。 -**语言特色:** Goroutine + Channel - -::: details 发展史 +::: info 发展史 Go 于 **2007 年**在 Google 内部开始设计,主要设计者包括 Robert Griesemer、Rob Pike 和 Ken Thompson。他们希望在大型软件工程中兼顾编译速度、简单语法、垃圾回收和并发能力。Go 在 2009 年开源,**Go 1.0** 于 2012 年发布并确立兼容性承诺。随后 Go Modules 改善依赖管理,**Go 1.18** 在 2022 年加入泛型,使语言在保持简洁的同时扩展了抽象能力。 ::: +**语言特色:** Goroutine + Channel + ```go [worker.go] package main @@ -441,7 +344,45 @@ func main() { **常见场景:** Kubernetes 生态、微服务、网络服务、CLI、云基础设施。 -### Rust +## C {#c} + +> 几十年之后,底层软件依然绕不开它。 + +C 提供指针、结构体、直接内存访问以及非常轻量的运行模型。它缺少许多现代语言的自动安全保护,却因此给程序员极高的硬件和内存控制能力。 + +操作系统内核、嵌入式、驱动、运行时和大量基础库至今仍大量使用 C。理解它往往也意味着要真正理解地址、内存布局和数据在机器中的表示方式。 + +::: info 发展史 +C 由 Dennis Ritchie 在贝尔实验室于 **1969—1973 年**间逐步设计,它从 BCPL 和 B 语言演化而来,并很快被用于重写 Unix 的大部分代码。这让操作系统第一次能够在保留底层效率的同时获得较好的可移植性。1978 年出版的《The C Programming Language》使 C 广泛传播;**ANSI C(C89)** 和 ISO C90 完成标准化,此后又出现 C99、C11、C17 和 C23 等版本。 +::: + +**语言特色:** 指针直接操作数据 + +```c [pointer.c] +#include + +typedef struct { + int x; + int y; +} Point; + +void translate(Point *p, int dx, int dy) { + p->x += dx; + p->y += dy; +} + +int main(void) { + Point p = {2, 3}; + translate(&p, 4, -1); + printf("(%d, %d)\n", p.x, p.y); +} +``` + +**代码说明:** `Point *p`、`&p` 和 `p->x` 这一类写法对应的就是 C 世界最核心的一组概念:地址、指针以及对内存中对象的直接访问。 + +**常见场景:** Linux 内核、嵌入式、驱动、MCU、数据库底层、运行时。 + +## Rust {#rust} > 在不使用传统垃圾回收器的前提下,把内存安全尽可能交给编译器保证。 @@ -449,12 +390,12 @@ Rust 主要出现在系统编程、基础设施、网络服务、嵌入式以及 Rust 最有代表性的设计是所有权和借用系统。每个值都有明确的所有者,引用需要满足借用规则,很多悬空指针、重复释放和数据竞争问题会直接在编译阶段被拦下来。 -**语言特色:** Ownership + Borrowing + Lifetime - -::: details 发展史 +::: info 发展史 Rust 最初是 Graydon Hoare 在 **2006 年**开始的个人项目,Mozilla 在 2009 年开始赞助,随后它与实验性浏览器引擎 Servo 的开发相互促进。Rust 在 2010 年公开,经过多次重大语法和所有权模型调整后,**Rust 1.0** 于 2015 年发布并建立稳定兼容承诺。2018、2021 等 Edition 继续改进语言体验;2021 年 Rust Foundation 成立,语言治理逐渐从 Mozilla 背景转向更独立的社区和基金会体系。 ::: +**语言特色:** Ownership + Borrowing + Lifetime + ```rust [borrow.rs] fn longest<'a>(a: &'a str, b: &'a str) -> &'a str { if a.len() > b.len() { a } else { b } @@ -473,9 +414,7 @@ fn main() { **常见场景:** CLI、网络服务、数据库组件、WebAssembly、系统软件、性能敏感型基础设施。 -## 移动端与多平台开发 - -### Kotlin +## Kotlin {#kotlin} > 更现代、更简洁、更安全的 JVM 语言。 @@ -483,12 +422,12 @@ Kotlin 同时拥有面向对象和函数式编程能力,并特别强调 null s 另一个标志性能力是 coroutine,可以用看似顺序执行的代码描述异步逻辑。对于已有 Java 生态的团队来说,Kotlin 通常可以逐步引入,而不需要整体推倒重来。 -**语言特色:** Null Safety - -::: details 发展史 +::: info 发展史 Kotlin 由 JetBrains 在 **2010 年**开始设计,并于 2011 年公开。它的目标是在 JVM 上提供比 Java 更简洁的语法,同时保留与现有 Java 代码和生态的高度互操作性。Kotlin 在 2012 年开源,**Kotlin 1.0** 于 2016 年发布。2017 年 Google 宣布 Android 官方支持 Kotlin,2019 年进一步将其作为 Android 开发的首选语言之一;此后 Kotlin Multiplatform 又把它扩展到 iOS、桌面和共享业务逻辑。 ::: +**语言特色:** Null Safety + ```kotlin [Greeting.kt] fun greeting(name: String?): String { return name @@ -507,7 +446,40 @@ fun main() { **常见场景:** Android、Spring / JVM 后端、Kotlin Multiplatform、客户端开发。 -### Swift +## Ruby {#ruby} + +> 追求开发者表达力与开发效率的动态语言。 + +Ruby 把“对象”贯彻得非常彻底,几乎一切都可以作为对象来操作。它大量使用 block、iterator、message passing 以及灵活的元编程能力,这也是 Ruby 代码经常读起来接近自然语言的原因。 + +Ruby on Rails 又进一步把 Ruby 的“约定优于配置、快速开发”哲学带进 Web 工程。它很适合需要快速构建业务功能和持续迭代的项目。 + +::: info 发展史 +Ruby 由日本程序员 Yukihiro “Matz” Matsumoto 在 **1993 年**开始设计,并于 1995 年公开发布。Matz 希望把 Perl 的实用性、Smalltalk 的纯面向对象思想以及 Lisp 等语言的表达力结合起来,让程序员写代码时更自然。2004 年 Ruby on Rails 发布后,Ruby 在 Web 创业和快速应用开发中迅速流行。后续 Ruby 2.x、3.x 持续改善性能、并发和类型描述工具,同时保持强调可读性与开发者体验的风格。 +::: + +**语言特色:** Block + Enumerable + +```ruby [scores.rb] +scores = { + "Alice" => 95, + "Bob" => 76, + "Carol" => 91 +} + +scores + .select { |_, score| score >= 90 } + .sort_by { |_, score| -score } + .each do |name, score| + puts "#{name}: #{score} ★" + end +``` + +**代码说明:** Ruby 很少强迫开发者写大量仪式性的循环和临时代码,集合的筛选、排序和遍历往往可以自然地串成一段表达式。 + +**常见场景:** Rails、SaaS、Web 应用、脚本、快速原型。 + +## Swift {#swift} > Apple 平台的现代、安全、高性能主力语言。 @@ -515,12 +487,12 @@ Swift 将静态类型、类型推断、`Optional`、`pattern matching` 和现代 它是 iOS、macOS 等 Apple 平台现代应用开发的核心语言,同时也可以用于服务端等场景。近年来的 `actor`、`async/await` 等能力让并发代码的边界表达得更清楚。 -**语言特色:** Actor + async/await - -::: details 发展史 +::: info 发展史 Swift 由 Apple 在 2010 年代初开始开发,Chris Lattner 是早期核心设计者之一,并在 **2014 年 WWDC** 正式发布,用来逐步替代 Objective-C 成为 Apple 平台的新一代主力语言。2015 年 Swift 开源,之后语言经历了较快演进;Swift 3 对语法和 API 风格做了大幅整理,**Swift 5** 在 2019 年实现 Apple 平台上的 ABI 稳定。Swift 5.5 又加入 async/await 和 actor,把现代并发模型纳入语言核心。 ::: +**语言特色:** Actor + async/await + ```swift [Counter.swift] actor Counter { private var value = 0 @@ -543,7 +515,7 @@ print(await counter.current()) **常见场景:** iOS、macOS、watchOS、visionOS、Apple 生态应用。 -### Dart +## Dart {#dart} > 以 Flutter 为核心场景的现代多端开发语言。 @@ -551,12 +523,12 @@ Dart 最常见的使用场景是 Flutter。开发阶段可以依靠 `JIT` 获得 Dart 的类型系统、异步语法和对象模型都比较现代。近年的 `record` 和 `pattern matching` 又让轻量数据结构与解构写法变得更自然,适合 UI 状态和业务数据的传递。 -**语言特色:** Records + Pattern Matching - -::: details 发展史 +::: info 发展史 Dart 由 Google 开发,并在 **2011 年**公开,早期目标之一是为大型 Web 应用提供比传统 JavaScript 更结构化的开发体验。**Dart 1.0** 于 2013 年发布,Dart 2 在 2018 年强化静态类型体系,同年 Flutter 1.0 发布,使 Dart 的主要舞台逐渐从“浏览器替代语言”转向跨平台客户端开发。2021 年 Dart 引入健全的空安全,**Dart 3** 又进一步加入 records、patterns 等现代语言能力。 ::: +**语言特色:** Records + Pattern Matching + ```dart [records.dart] ({String name, int score}) bestStudent( List<({String name, int score})> students,