Clojure(Script) 的编程乐趣
Clojure 绝对不是“另一门”编程语言,它足够的老,可以追溯到 1972 年,又足够的现代,不论是前端的消息总线还是后端的不可变数据库。它不依赖重型的框架,提倡简单就好的理念,面向不可变的数据开发。它足够的优雅和有趣,以至于 Uncle Bob 选择 Clojure 作为他二三十年职业生涯最推崇的选择。
我的博客覆盖了前端、后端、客户端以及系统编程等领域,以构建高效、弹性、可维护的应用程序为目标。这里记录了我对一些新技术、新工具以及在项目中的开发实践,往前翻翻还有很多不着调的诗歌。
Clojure 绝对不是“另一门”编程语言,它足够的老,可以追溯到 1972 年,又足够的现代,不论是前端的消息总线还是后端的不可变数据库。它不依赖重型的框架,提倡简单就好的理念,面向不可变的数据开发。它足够的优雅和有趣,以至于 Uncle Bob 选择 Clojure 作为他二三十年职业生涯最推崇的选择。
本章是 SICP 的最后一章,包含了必要的习题解答。首先使用 Scheme 实现了一个寄存器模拟器,然后手动把一些 Scheme 代码翻译成了汇编代码执行,之后用汇编代码写了一个直接控制的解释器,探讨了这个寄存器机器存储分配的方法并使用汇编代码实现了 LISP 经典的分半垃圾回收机制,最后我们使用 Scheme 代码写了一个编译器,使其可以自动将 Scheme 代码翻译为汇编代码。作为最终的结果,Scheme 代码可以编译执行(比如过程定义),也可以在解释器中解释执行(比如过程调用),这种方式充分利用了编译的性能和解释的开发调试灵活性。
本文是对 Structure and Interpretation of Program - SICP 一书第四章“元数据抽象”的总结,包含了(几乎)所有习题的答案。元数据抽象提供给开发者看待和解决问题的新视角,在领域相关问题上可提供相比较通用程序设计语言更加简洁且具有表现力的解决方案。本文将介绍如何实现一个(不包含错误处理的基于 Scheme 基本过程和控制能力)的基本 Lisp 解释器,并且基于这种解释器的变形实现惰性求值、非确定性问题解决,并且在最后介绍了如何从头实现一门具有基本结构、组合能力和抽象能力的逻辑语言(数据查询语言)。
这是 SICP 第三章的内容总结,包含了全部习题的答案。本文阐述了使用赋值和局部状态实现更好的模块化,探讨了这种模型在模拟真实物体上的优势,以及这种为代码引入“时间维度”带来的后果:对于同一和变化、引用透明性和把握代码的时序性导致的心智负担等问题,尤其在并发模型下的严重水土不服。作为替代,我们引入了同样可以表示状态的流模型,通过对流模型的概念和应用的审视来探索其适用范围,并最终得出结论:当非共享状态大于共享时,对象可更好的实现模块化,反之基于函数式(非赋值)和流模型则更方便。
这是 SICP 第二章的内容总结,包含了大部分习题的答案。数据抽象是软件工程的基石之一,本文阐述了数据抽象的方法,如何对层次性数据进行抽象,如何对数据抽象的不同表现形式进行处理(基于标签、数据导向风格和消息传递风格),如何打造数据抽象层次这几个问题。
这是 SICP 第一章的内容总结,包含了所有习题的答案。过程抽象是编程最重要的特性之一,本文阐释了为什么要进行过程抽象,如何进行好过程抽象,过程抽象的主要实践,对不同过程抽象的时间和空间认识,如何进行抽象的抽象,如何基于抽象的抽象进行工作,以及在什么时候需要什么层次的抽象这几个问题。
本文是对 Structure and Interpretation of Program - SICP 一书导论部分的总结,作者提出程序员往往和三个对象相关:人的大脑、程序集合、计算机本身。SICP 使用 Scheme 语言来教授编程,Scheme 的英文含义正是“做计划”,编程的核心在于对现实世界的不断抽象,如果说艺术解释了我们的梦想,计算机则以程序之名在执行它们。
本文介绍了 OpenStack Horizon 界面操作网络相关功能以及操作分别基于 LinuxBridge 和 OVS 的底层实现原理,基于 OpenStack Rocky 和 CentOS 7。
本文介绍了 Neutron Agent(包括 OpenVSwitch Agent 和 L3 Agent) 的启动过程和作用原理,基于 OpenStack Rocky 版本。