简介
大家好。希望你一切都好。九月我们过得挺忙。我们在网站上发布了一大批新的改进和功能,主要围绕改进导师指导以及相关流程。结果就是,我们收到的导师指导请求数量是 4 周前的两倍,这很棒。如果你还没试过让导师审查你的代码,一定要试试,这是非常棒的学习方式。如果你想帮助别人,队列里有很多请求等着你。你可以在 Contribute 菜单的 Mentoring 链接下注册成为导师!我们还做了一次大型数据库更新,从 MySQL 5.6 升级到 MySQL 8,我录了视频,放在 Insiders 板块里。所以如果你是 Insider,还没看过那段视频,一定要去看看!
好,接下来聊聊 #12in23。九月是个有趣的月份,我们探索了简洁凝练的语言。这个月我们换个方向,来看看几头块头大得多的“巨兽”。我们聚焦面向对象语言,具体来说是 C#、Crystal、Java、Pharo、Ruby 和 PowerShell。我们已经在五月和八月分别讨论过 Pharo 和 Java,所以这个视频里不再重复。但如果你对这两种语言的介绍感兴趣,可以看看前几个月的视频。不过在这个视频里,我们要探索 C#、Crystal、Ruby 和 PowerShell。和往常一样,Erik 会带我们了解这些语言有趣和独特的地方。
徽章
和往常一样,完成这些语言中任意 5 道练习即可获得面向对象十月徽章。我们还有全年徽章,我知道很多人都在为它努力。为此我们准备了 5 道精选练习供你完成,它们都很适合用面向对象的方式解决。它们是:
- 二叉搜索树:在二叉树中插入和查找数字
- 环形缓冲区:实现一个首尾相连的数据结构
- 时钟:实现一个只处理时间、不涉及日期的时钟
- 矩阵:返回以字符串表示的矩阵的行和列
- 简单密码:实现一个替换密码
概览
C#
- 由 Anders Hejlsberg 于 2000 年在微软开发
- 这门语言和虚拟机都有官方规范。2002 年成为 ECMA 官方标准,2003 年成为 ISO 标准
- 编译器、.NET Framework(标准库)和 Visual Studio(编辑器)最初都是闭源的,但编译器和 .NET Framework 在 2014 年开源
- 虽然与 Java(早几年发布)共享大量语法,但 C# 并不是 Java 的一对一复制(例如支持属性、值类型,以及没有受检异常)
- 编译为字节码,自 .NET 7 起支持编译为机器码(仍在改进中)
- 被大量软件使用,从网站到嵌入式系统,从应用(Xamarin)到游戏(Unity)
Crystal
- Crystal 由 Ary Borenszweig(他在 Exercism 上有账号)、Juan Wajnerman 和 Brian Cardiff 开发(最初叫 Joy,但 3 天后改名为 Crystal :))
- 旨在兼具 Ruby 的优雅和生产力,以及现代编译型语言的速度、效率和类型安全
- 由 Manas 组织开发的开源语言
- 1.0 版本于 2021 年发布
- 使用 LLVM 编译为机器码(和 Rust 一样)
- 编译器最初用 Ruby 编写,后来转变为自举版本
- 被卡车公司 Nikola、Manas 等使用,主要用于网站,也用于云服务、命令行应用和脚本
PowerShell
- 由 Jeffrey Snover 领导的微软团队打造,最初于 2006 年发布
- 开发源于 Intel,他们想把 KornShell 脚本从 Sun RISC 迁移到另一个平台,以协助自家 CPU 的开发。最终 Intel 选择了别的平台,但微软继续开发他们的新 shell:PowerShell,因为它能改进 Windows 系统管理(当时的管理并不太好,经常需要图形界面)
- 语法受到 KornShell 影响,也受 PHP、Perl 等影响
- 第一个版本只能运行在 .NET Framework 上,也就是说只能在 Windows 上运行。但 PowerShell 6.0(2018 年发布)运行在 .NET Core 上,后者跨平台且开源
- 主要用于系统管理,也用于提供 CLI 工具或对其他工具的封装。我们在批量处理 Exercism 代码仓库时大量使用它
Ruby
- 由松本行弘(Matz)开发,1995 年首次发布
- Matz 想用一门真正面向对象的脚本语言,但不喜欢现有的选择(比如 Perl 和 Python),于是打造了一门新语言:Ruby
- Matz 这样描述 Ruby:核心是一门简单的 Lisp 语言,有着类似 Smalltalk 的对象系统、受高阶函数启发的块,以及类似 Perl 的实用工具性
- 通常是解释执行,但也可以即时编译为机器码
- 除了官方翻译,还有别的实现,比如 JRuby(运行在 JVM 上)、Rubinius(使用 LLVM)和 YJIT,一个随官方安装包一起发布的即时编译器
- 大多用于网站(借助 Ruby on Rails),例如 GitHub、Stripe、Shopify 等(包括 Exercism 和 Exercism 论坛!)。Ruby 也用于自动化
从编程角度看,它们有什么不同?
它们都是面向对象语言,虽然实现方式不尽相同(例如 Crystal 和 Ruby 用 Smalltalk 的消息发送模型来调用方法)。
C#
- 强类型、静态类型
- 也支持命令式和声明式范式,并且越来越函数式
Crystal
- 强类型、静态类型(与 Ruby 不同)
- 也支持函数式和命令式编程
PowerShell
- 强类型
- 也支持命令式、函数式编程和基于管道的编程
Ruby
- 动态类型
- 也支持函数式和命令式编程
话虽如此,这些语言首先都是面向对象语言。
这些语言有什么过人之处?
C#
- (几乎)到处都能运行,包括通过 Xamarin 运行应用。最初只能在 Windows 上运行,这催生了 Mono,一个免费开源、跨平台的 C# 编译器和运行时实现。2015 年推出了 .NET Core,它完全跨平台且开源
- 通用:几乎可用于任何工作负载,包括应用、网站和游戏
- 表达力强:用相对较少的 C# 代码就能做很多事。LINQ 尤其能大幅提升效率,用起来也很有趣
- 出色的工具链,既包括 IDE 也包括构建系统等其他工具。Visual Studio 仅限 Windows,而 JetBrains Rider 和 VS Code 跨平台
- .NET 编译器平台(通常称为 Roslyn)是解析、转换、生成 C# 代码的绝佳方式(我们在 C# 的 test runner、analyzer 和 representer 中大量使用它)
- 文档详尽、细致、写得好
- 社区庞大:有大量资源可用,包括博客、论坛等
Crystal
- 语法优雅易读,让 Crystal 代码易于读写
- 表达力强。和 Ruby 一样,Crystal 非常有表现力,用很少的代码就能做很多事。这在一定程度上归功于出色而丰富的标准库
- 快。静态类型使得可以用 LLVM 编译出高效的机器码,并通过垃圾回收器实现简单的内存管理
- 出色的面向对象实现。一切都是对象,包括类和数字、布尔值这样的原始类型
- 开箱即用:庞大的标准库、内置格式化器、模板引擎、测试框架等
- 互操作。与 C 库互操作很简单
- 跨平台:可运行在 Linux、macOS 和 Windows 上,不过 Windows 还不是一等公民
PowerShell
- 强大:PowerShell 是管理员的强大工具。它能与许多其他系统很好地集成,比如 Windows 操作系统(组件、服务和设置)、Exchange、SharePoint、Azure 等其他微软产品。它还能与许多其他技术交互,比如 REST API、数据库、Web 服务等
- 可用性:PowerShell 在每一个现代 Windows 系统上都预装,也能安装在任何运行 .NET 的系统上(包括 macOS、Linux 和许多 Unix 系统)
- 安全性:PowerShell 内置了保护脚本安全、并基于签名脚本和执行策略限制其执行的功能。这对确保自动化流程的安全至关重要
- 图形界面:你可以把它和 Windows Forms 或 Windows Presentation Foundation 等框架结合,为 PowerShell 脚本设计和构建图形界面,让它更友好易用
- 管道:与 Unix 系统上的 Bash 类似,PowerShell 允许把 cmdlet 串联起来,通过把一个 cmdlet 的输出作为另一个的输入,来完成复杂的操作和任务
Ruby
- 语法优雅易读,让 Ruby 代码易于读写
- 表达力强。Ruby 是一门非常有表现力的语言,用很少的代码就能做很多事。这在一定程度上归功于出色而丰富的标准库
- 庞大的生态系统,有海量可用库(gem)
- 出色的面向对象实现。一切都是对象,包括类和数字、布尔值这样的原始类型
- 务实。Ruby 及其大多数库都非常务实,专注于解决现实世界的问题
- 互操作。与 C 库互操作很简单,这在性能特别重要时经常使用。例如,Nokogiri 这个 gem 通过封装 C 库来完成繁重的工作,从而以高性能的方式处理 XML
- 有大量创新正在发生。例如,Stripe 构建了 Sorbet,一个 Ruby 的类型检查器;Shopify 开发了 YJIT,一个 Ruby 的即时编译器(包含在 Ruby 3.1+ 中);WASM 支持也在开发中
突出特性
C#
- 性能出色,尤其是对托管语言而言。语言和运行时都有大量提升性能的特性,例如 Span<t> 类型和对 CPU 内建指令的访问(如 AVX 指令)。CLR 是一个成熟、稳定、高性能的虚拟机,还在不断改进</t>
- 庞大的生态系统,有海量可用库。这些库和 C# 一样,成熟、稳定、功能齐全
- 现代且不断演进:语言和运行时仍在演进,语言更新非常频繁,让它更现代化。例如:
- async/await 让并发更简单
- span<t> 实现高效的内存使用</t>
- 可空引用类型(修复了“十亿美元的错误”)
- 运行时也在定期更新,例如 .NET AOT 可直接编译为机器码
- 相比其他许多语言/生态系统,替代方案更少。大多数情况下,用微软提供的默认方案就足够了,通常也包括 IDE。你也可以说这是一个缺点,但它也可能很棒,尤其是在刚开始学一门语言时
Crystal
- 两全其美。全局类型推断和联合类型的结合,让 Crystal 感觉像一门动态类型语言,通常不需要写太多类型标注,同时又拥有静态类型语言的性能和额外的安全保障(包括编译时的 nil 检查)
- 元编程。与 Ruby 的动态、运行时元编程不同,Crystal 有宏,在编译时运行。宏作用于 AST 节点并生成代码。它们定义和使用都相当容易。Embedded Crystal(ECR)是一个内置模板引擎,用宏把 Crystal 代码嵌入其他文本
- 出色的并发。并发易于使用,采用类似 Go 的并发模型,使用 fiber(轻量执行单元)并通过 channel 通信
- 高效又有趣。Ruby 以面向生产力和开发者幸福感的设计著称,语法优雅易读,人体工学出色。由于 Crystal 的语法和设计非常接近 Ruby,这一点同样适用于 Crystal(有趣的事实:相当多的 Ruby 代码是合法的 Crystal 代码)
PowerShell
- Cmdlet:PowerShell 用 cmdlet(读作 "command-lets")作为其构建块。它们是小巧的、面向任务的命令,封装了现有功能,为系统管理员提供一致的(例如用 Get-Help 显示任何 cmdlet 的帮助)、对管理员友好的界面。有面向各种各样“后端”的 cmdlet,比如所有 .NET 类、Windows Management Instrumentation、Azure 等等。cmdlet 可以用任何 .NET 语言定义,且定义方式非常声明式,参数、其验证、要求(required 为 true/false)、替代(switch)名称等都能轻松定义。
- 面向对象:PowerShell 中几乎所有东西都是带有许多不同属性的对象。文件、进程、注册表项,甚至字符串和数字这样的简单数据类型,都被当作对象处理,这种方式简化了你处理不同数据类型和服务的方式。任何用过 .NET 的人都会感到非常熟悉
- 远程管理:它支持对 Windows 服务器和系统的远程管理,甚至能管理 Azure、AWS 和 GCP 上的云资源,这对管理大规模自动化和部署至关重要。
- 可扩展:它有出色的内置模块系统,允许你创建自定义 cmdlet、函数和模块,并与其他编程语言和库协作,按需进一步扩展其能力。
Ruby
- 高效又有趣。Ruby 以面向生产力和开发者幸福感的设计著称。虽然难以量化,但用过 Ruby 的人的热情就说明了一切
- 元编程。Ruby 高度动态,支持运行时元编程。无论是给现有类打补丁(monkey-patching)、动态添加或调用方法,Ruby 都能满足你
- Ruby on Rails 是一个出色、功能齐全的网站构建框架。开箱即用,它包含模板、缓存、ActiveRecord(通过对象与数据库交互的方式)、迁移、脚手架、WebSocket 等。
如何选择
- 如果你熟悉面向对象编程,但想看看不同的做法,试试 Pharo
- 如果你懂 Java 或 C#,但有一阵子没碰了,不妨再试一次。这两门语言都进化了很多,去看看那些闪亮的新特性吧!
- 如果你在找工作,C# 和 Java(以及程度稍轻的 Ruby)也是很好的选择,因为它们是雇主最需要的语言之一
- 如果你懂 Ruby,试试 Crystal,看看一门静态类型的 Ruby 会是什么样子、什么感觉
- 如果你喜欢动态语言,但也想要出色的性能,去看看 Crystal
- 如果你懂 Bash 或 Windows 批处理文件,试试 PowerShell,看看 shell 脚本的另一种面向对象做法
- 如果你总体上喜欢脚本语言,Ruby、Crystal 和 PowerShell 都是不错的选择
- 如果你想做一些元编程,Pharo、Crystal 和 Ruby 都很棒(C# 也在获得一些元编程特性)
- 如果你想体验用一门不依赖文本文件的语言编程是什么感觉,试试 Pharo 及其独特而强大的 IDE
- 如果你喜欢构建网站,带 Ruby on Rails 框架的 Ruby 值得一试
Translation missing: zh-CN.number.nth.ordinalized Oct 2023
·
觉得有用吗?
作者:
Jeremy Walker