引言
大家好,欢迎来到十二月。希望你一切顺利。
我们的十月忙得不可开交。我们刚刚对社区解答做了一次重大改进。现在我们会对它们去重,相似的解答只会显示一次;我们新增了排序选项、按代码搜索的功能;如果你去看 C#,会发现我们还加入了按不同编程概念筛选的功能。这样你就可以搜索使用位移、递归或其他任何你感兴趣的技巧的解答。我们会在社区周把这套功能推广到其他赛道。
不过现在,我们先把注意力放到 #12in23 上。十一月很有意思,我们探索了汇编语言;而这个月我们要尝试一组非常多样的语言,具体来说是ColdFusion、Groovy、Lua、VimScript、Wren。和往常一样,Erik 会带我们了解这些语言有趣而独特的地方。
徽章
和往常一样,完成这些语言中任意 5 道练习,就能获得“十二月的多样探索”徽章。我们还有一个“全年”徽章,我知道你们很多人都在为它努力。为此,我们准备了 5 道精选练习等你完成。它们是:
- All Your Base:把一个用数字序列表示的整数转换成其他进制。
- Flatten Array:把嵌套的集合展平成一个不嵌套的集合。
- Queen Attack:判断棋盘上的两个皇后能否互相攻击。
- D&D Character:随机生成《龙与地下城》角色。
- Run-Length Encoding:实现游程编码和解码。
概述
ColdFusion
- 1995 年由 Allaire 公司创建,该公司 2001 年被 Macromedia 收购,随后 Macromedia 又在 2005 年被 Adobe 收购。
- 被设计为一个快速 Web 开发平台
- 运行在 Java 虚拟机(JVM)上
- 有两套独立的语法,看起来不同,但语义完全相同:
- 较旧的、基于标签的标记语法,它扩展了 HTML 来显示动态内容。
- 较新的、类似 ECMAScript 的语法既可以用于有基于标签语法的地方,也可以用于独立的脚本文件。其目标是把业务逻辑从标记中转移到单独的脚本文件里
- CFScript 是一门运行在 JVM 上的通用语言,Exercism 就是这样使用它的。实际上,它从未真正远离自己的 Web 服务器根基。
- ColdFusion 是付费产品,但 Lucee 基金会(一个总部位于瑞士的非营利组织)仍在积极开发他们的开源 ColdFusion 服务器,Exercism 赛道用的就是它的 Lucee Server。
- 仍在积极开发中
- 主要用于企业软件;客户包括 Apple、Adobe、通用汽车等
Groovy
- 由 James Strachan 从 2003 年开始开发。项目于 2015 年被 Apache 采纳。
- 目标是在 JVM 上开发一门动态类型语言(与静态类型的 Java 形成对比),同时减少样板代码
- 虽然大多数 Java 代码同时也是合法的 Groovy 代码,但两者有很多差异(例如 Groovy 支持动态类型和高级元编程)。这门语言也深受 Python 和 Ruby 的影响。
- 用于脚本编写、构建工具(Gradle)、持续集成(Jenkins)、Web 应用(Grails)、测试(Spock)。有一款流行的 Atlassian 工具第三方插件,可以让你用 Groovy 编写脚本。
Lua
- Lua 于 1993 年由 Roberto Lerusalimschy、Luiz Henrique de Figueiredo 和 Waldemar Celes 在巴西里约热内卢天主教大学创建。
- 名字读作 LOO-ah,在葡萄牙语中意为月亮,也是对部分启发了它的 Sol 语言的呼应,Sol 在葡萄牙语中意为“太阳”
- 主要为嵌入而设计,注重速度、可移植性、可扩展性和开发时的易用性。
- 受到 Modula、CLU、C++、SNOBOL 和 AWK 的影响。就像 LISP 和 Scheme 拥有单一而通用的数据结构机制(列表)一样,Lua 用它的表做到了这一点。
- 通过字节码解释执行,通常是在运行时,但也可以提前完成。
- 主要用于脚本用途,例如 World of Warcraft、Dota 2、Crysis 这类游戏,或 Adobe Lightroom 以及一些 FreeBSD 系统软件。也常被用来增加可扩展性,例如在 Redis、Neovim 和 Nginx 中。
VimScript
- VimScript(也叫 Vim Script,中间有空格)或 VimL(Vim Language 的缩写),是 Vim 文本编辑器使用的脚本语言。
- 源自 ex,即 Vi 之前那个面向行的可视化编辑器
- 不是通用语言,而是一门专用语言,为通过插件、配置、宏和函数来扩展和定制 Vim 功能提供高效、经过优化的脚本环境。
- 虽然 Vim 主要是用 C 写的,但 Vimscript 让用户能通过一门高级脚本语言来定制和扩展 Vim。
- 用于……嗯,Vim 本身,也用于 NeoVim,Vim 的一个分支
Wren
- 由 Bob Nystrom 于 2016 年编写,他是《Crafting Interpreters》一书的作者
- 目标:小巧、简单、快速。
- 设计用于嵌入其他应用。作者觉得现有的选择(如 Lua 和 TCL)有所欠缺,想要一门简单、可嵌入的语言,让有面向对象背景的人用起来感觉自然
- 用于:
- TIC-80:一台用于制作、游玩和分享小型游戏的幻想计算机(类似 PICO8)
- DOME:一个用于制作游戏的跨平台框架。
- luxe:一个用于制作游戏的跨平台、快速开发游戏引擎。
- Wren Console:一个 Wren REPL 和 CLI,主要由 Exercism 的长期贡献者 Josh Goebel 用 Wren 本身编写,我们的 Wren 赛道用的就是它
从编程的角度看,它们有什么不同?
ColdFusion
- 动态类型
- 多范式,主要面向对象,但函数式成分越来越多。
Groovy
- 通常是动态类型,但也可以是静态类型(以及渐进类型)
- 既可以解释执行,也可以编译执行(从第 2 版起)。正因如此,它常用于编写脚本。
- 多范式:主要面向对象,同时也支持命令式、函数式和声明式
Lua
- 动态类型,通常解释执行,但可以预编译
- 多范式:过程式、面向对象(虽然方式有点不同)、函数式和数据驱动
VimScript
- 动态类型,解释执行
- 多范式:命令式、函数式,以及一种简单的面向对象编程形式
Wren
- 动态类型,但静态定义;这让编译器可以非常快。
- 主要是一门面向对象语言,同时也支持命令式,以及一点函数式编程
这些语言有哪些过人之处?
ColdFusion
- 服务器管理与应用创建之间分离得非常好。管理控制台负责配置数据库连接和服务器监控(以及其他任何事情),应用创建者只需要数据源的名称(一个带有必要方法的 CF 对象,已预先连接到数据库管理系统中相应的部分),再加上对某个目录的写入权限来存放应用文件。
- 能发挥 JVM 和 Java 生态系统的威力,包括可以导入任何 Java 库并在 CF 中使用
Groovy
- 通用:几乎可以用于任何工作负载,包括应用和网站。
- 由于运行在 JVM 上,它的所有优势都适用:成熟、性能极高的虚拟机,以及海量可用的库。与 Java 的互操作也很好
- 缓解了人们对 Java 可能有的许多不满,比如受检异常、
- null 安全、冗长,以及缺少高级元编程
- 现代语言:高级类型推断、闭包、正则表达式的内置语法、自动生成 getter 和 setter
- 出色的函数式编程支持:闭包(类似 Ruby 的代码块)、柯里化(偏应用)、惰性求值、不可变性等等
Lua
- 通用:用于嵌入式系统、原型设计、脚本编写、游戏、Web 和后端开发。
- 简单:语法相对较少,因此这门语言很容易学。只有几个原子数据类型,以及唯一一个内置的复合数据类型:表。内存采用垃圾回收
- 可移植:解释器是用 ANSI C 编写的,几乎任何平台都有对应的编译器
VimScript
- 简单:语法轻量,易学易用。
- 互操作性:可以轻松访问文件、shell 和其他程序。不用离开 Vim 就能拥有外部工具的全部能力。
- 表达力强:用很少的代码做很多事。写出紧凑而且可读性极高的脚本。
- 强大的正则引擎:Vimscript 的正则实现受到 Emacs Lisp 的启发,为文本处理提供了强大的工具。
Wren
- 小巧:虚拟机用不到 4000 行代码实现
- 堪称典范:虚拟机的实现带有用心的注释,用 C 编写,并不算难读。是学习如何构建一门语言的绝佳途径。大部分标准库都是用 Wren 实现的,所以你也能看到它是怎么实现的。
- 熟悉:语法让你能更快上手。如果你熟悉 Java 或 C++,你会感到很亲切。支持按参数个数重载方法
- 文档非常好:语言和标准库的文档易读、详尽,而且有大量示例。
- 标准库虽小,却出奇地完整。
亮点特性
ColdFusion
- 开箱即用:大量功能都是内置的:处理 PDF、ZIP、Excel、XML、JSON,创建 API,发送邮件,集成 S3,连接各种不同的数据库……都无需安装额外的包。非常有助于减少版本不兼容的问题
- 可扩展且安全,非常适合企业软件
- 编程简单直观,新手因此能很快让复杂的数据驱动网页跑起来。DreamWeaver 集成非常出色。
Groovy
- 灵活的语法:点号和括号可以省略,这让编写非常漂亮的领域特定语言成为可能
- 元编程:同时支持运行时和编译时元编程。例如,@ToString 注解会在编译时生成 ToString 的实现,而在运行时修改对象的元类则可以实现猴子补丁。
- 构建器:通过好看的代码快速处理和构建 JSON、XML、HTML。结合 Swing 进行快速 GUI 开发。
- 特征:Groovy 的特征让你能把行为和属性组合成可复用的块。类似 Ruby 的 mixin。
Lua
- 可嵌入:设计上就易于嵌入。它有一个相对简单的 C API,方便嵌入。大小不是问题:完整的参考解释器只有 247 kB!
- 可扩展:基础语言被有意保持得相对小巧,但它允许轻松地扩展这门语言。这让语言更易学、嵌入更轻量,也非常灵活
- 快:Lua 常常是最快的动态语言之一,尤其是在使用 LuaJit 解释器时
VimScript
- 可扩展性:Vimscript 让你能为编辑器增添新功能
- 可定制:按你喜欢的方式定制编辑器(Vimscript 插件本身主要就是用 Vimscript 写的)
- 事件驱动:基于某些事件或条件(比如打开文件或保存缓冲区)自动执行代码。
- 善用 Vim 的能力:内置对 Vim 功能和 API 的访问,让脚本可以操作文本、缓冲区、窗口等等。
Wren
- 快:作为动态语言,性能出色
- 可嵌入:易于嵌入其他软件。这门语言的作者以前是游戏开发者:他希望能给游戏添加脚本功能。C API 相当干净简洁。
- 并发:借助纤程实现轻松的并发和协程,纤程是非常轻量的结构(类似 goroutine 或 Erlang 进程),而且它们之间可以轻松通信
如何选择
- 如果你想构建 Web 应用,ColdFusion 和 Groovy 是不错的选择
- 如果你对可嵌入的语言感兴趣,Lua 和 Wren 是首选,不过 Groovy 也值得一看
- 如果你想编写通用脚本,同样这三门语言,Lua、Wren 和 Groovy,也很合适
- 如果你在使用 JVM,ColdFusion 和 Groovy 是自然而然的选择
- 如果你看重性能,Lua 和 Wren 可能就是你最好的选择
- 如果你的主力编辑器是 Vim 或 NeoVim,VimScript 显然是绝佳选择
- 如果你有兴趣学习或构建编译器和虚拟机,Wren 非常适合你
- 如果你有面向对象的背景,Wren 大概是最容易上手的语言
- 如果你喜欢 LISP 那种单一而通用的数据结构设计,那就去试试 Lua 吧
- 如果你想尝试事件驱动编程,去看看 VimScript
2023年12月01日
·
觉得有用吗?
作者:
Jeremy Walker