高级语言小记

最近学习回顾了几门高级语言和周边工具。这里做个小总结,学习暂时告一段落,以后会在需要的时候再捡起来。

Swift:

Swift 这门语言,真的是大杂烩。集合了不知道多少语言的混杂体。
Swift 语法都觉得似成相识,比如 范型、异步、多线程、函数编程、闭包、下标、嵌套、元组、虚函数。不过这些能力都是一门高级语言本该支持的,也无可厚非。
后起的语言,的确是有后天优势的。很多语言都有历史遗留问题,比如 python 为了解决作用域问题,弄出来 global、local、nolocal 这样反人类的设计。

值类型和引用类型 (struct /class) 借鉴的 C++,详见之前的文章:Swift struct (值类型) 与 class (引用类型) 区别及三种传参机制深刻关系和使用

元组,借鉴的 C++ 的 tuple。这是真好用,尤其在写算法的时候,可以省去不少逻辑复杂度。

属性包装器 propertyWrapper 借鉴 Java 的注解。

函数调用中的虚函数,借鉴 C++ 的虚函数设计。不过在函数调用这个问题上,也没有那么多选择,要么静态编译直接派发,要么虚函数存储方法列表派发,要么像 OC 一样动态派发,要么就得和 Java 这类一样靠虚拟机动态解析 (JIT 是直接派发)。本质就是找函数指针的过程。

范型,谈不上借鉴,各个语言都有实现。不过最古老的,应该还是 C++。

闭包,没有什么特别的。也是在吃 OC 的老本,没有什么创新。但是对于函数是第一公民这一点上,闭包将 Swift 带进了函数式编程的大家庭。

subString 共用内存,借鉴的 Go。

空合运算符??是从 TS 弄过来的,就是一个语法糖,但很好用。

enum,不可否认,算是一个伟大的创新,使用起来很方便。不过将枚举提升到了 struct 和 class 的程度,感觉是过度了。现在的设计,完全可以将 enum 的设计潜入到 struct 里面,这会少一个复杂知识的认知。

区间运算符,也是一个创新。不过我认为还是借鉴了 Go 的切片设计。

Swift 目前还是极度不适合服务端开发(2023)。简单项目也不建议尝试,因为意义真的不大。如果项目真的简单,希望快速开发,其实更愿意推荐 Python。
Swift 的服务端周边生态太差了,社区也匮乏,Vapor 这样的 web 框架真的是简陋。

很多人还推荐使用 Swift 来写脚本或者可执行命令,简直就是脱裤子放屁。十分不推荐。时间很宝贵,要善待。
这类脚本开发,能有 python 写的爽?退一步说,即使非 PC 场景命令,是 app 执行中的脚步,那 python 也可以做一个阉割版的解释器放在 app 中,在 Mac 和 iPhone 都能跑。

但是在 苹果 生态里面,only swift,也不用在留念 Objective-C 了。
随着很多 api 只开放 swift 接口,OC 的影子会逐渐退去。
SwiftUI 也是大势所趋,结合 Combine 还是很方便的做 MVVM 架构开发的。
很想试试 Swift 做 Vision Pro 的开发。

Swift 用起来还是挺爽的,3 年前用 swift 做过一段时间的开发,这次使用下来,发现新增了 async/await 协程,而且非常好用。
这里特别说明一下通过 协程 整合了 异步 & 并发 两大能力的 async/await,寥寥几行代码实现了这么多功能,简直相当惊艳。
很少有语言会把协程能力和 多线程 做耦合,一般都是需要开发同学自己加多线程逻辑的。

整体感触:
Swift 使用起来还是很爽的。尤其很好的支持了函数式编程。整体比 OC 爽的不止一点点。
但 Swift 目前还是得围绕苹果生态使用,想破圈,还是很难。 之前 tensorflow 增加对 Swift 的支持,后来也放弃了。IBM 也推出并停止了 Swift 服务端的建设道路。
之前还对 Swift 成为全能型开发语言有一些期待的,目前来看,难了,基本不可能了。
这里大胆做个预期:截止当前 2023 年,Swift 已经没有破圈的可能了。以后如果没有惊艳的 case,机会也不会有了。

SwiftUI

如果没有经历过动态化开发,很多人会不理解为什么复杂的应用界面可以通过 SwiftUI 这样的层级形式给描绘出来。
我之前和同事聊过,GUI 开发,最主要的是数据的稳定,UI 一定是跟着数据转的。只要数据稳定,就不会有大的问题。

界面 (UI),是一层皮肤,SwiftUI 和 Flutter 的 dart,都是用来描述这层皮肤的样式的。当然可以拎出来单独设计。
大厂也都会自建 DSL 的 UI 描述方式和专用 IDE,一般是通过 JSON/TS & VSCode 来做。
编码上没有太多差异,更多的是功能 api 上的联动性。SwiftUI 官方出品,直接在写 UI 的时候就能联动系统 API,使用起来也是最爽的。

SwiftUI 开发中,界面只是小部分,更主要的还是 Combine 和 async/await 这些 Swift 的能力,配合 MVVM 架构,来保障数据层面的互通,从而驱动 SwiftUI 的展示。
不得不承认,SwiftUI 开发体验爽爆了。
动态化方案的设计,避免不了跨平台问题 (研发效率),也就避免不了 JSON/Tree 形式的界面描述。
而 SwiftUI 这种官方出品的界面描述系统,可以和自身 Swift 能力完美融洽,这解决了很多动态化方案性能低下、跨平台 & 跨设备兼容的问题。尤其兼容性问题,对于跨平台 (Android/iOS) 的 Flutter 或者自建,最为复杂。
一个是原生编译,一个则是运行时 AST 抽象解析,这之间的鸿沟,是巨大的。

Java:

Java 这些年发展很快,大学时候使用 Java 写过简单的后台,那时候还是 SSH,即 Spring/Struct/hibernate,使用的还是外部 tomcat + JSP 的方案。
看现在的技术方案,都已经被 Spring 全家桶吃完了。基于前后端分离逐渐统一,Java 开发已经不再需要配置 JSP 这些页面模版了。
我感触比较大的是 Spring core 和 Spring 周边 对 Java 研发生态的影响是如此之大。
其中 依赖注入 和 AOP 已经通过框架层面提高了研发同学的生产力,真棒。大学写 Java 的时候,经常使用的是各种 xml 配置。现在变成了各种注解。

Java 的周边是真的多,从 数据库到微服务,鉴权、限流、消息队列、Docker、Nginx 等。这些周边依托 Spring 全家桶,简单用起来是不难,但是在并发上来后的负载均衡、熔断等机制,还是挺考验工程和技术能力的。
当然,对这些周边,停留在使用的层面是远远不够的。深入研究也需要大量的时间,这是非常耗费精力的。

Java 这门语言,的确相当强大。多年前还被人诟病依托字节码做多平台的性能较低,在 JIT 发展起来后就完全抹平了和编译语言的执行效率。
Java 还有一个优点,就是设计模式在 Java 这个体系里面能够充分的发挥作用。甚至有一种感觉:设计模式就是为 Java 而贴合设计的。

Java 的容器,和 C++ 的 STL 有的一拼,或者说相似度非常大,挺好用的。
不像 Objective-C 那个老古董,连 堆、队列、栈 都要自己实现,没见过哪个平台支持 OC 写算法。

虽然如此,但是我还是不喜欢 Java。10 年前,我实习期间因为对 Java 的抵触而换了赛道。
当时我觉得 Java 太模式化了,在 Java 的世界里面,很多都是规定好的,条条框框。如果不按照这些约束走,那么就需要重新造轮子,甚至引发不可预期的问题。而我不喜欢那种被约束的感觉。
现在回头看,Java 在 Spring 加持下,其实更加模式化了。

有一点,Java 发展这么多年,都没有出现协程的官方实现。完全基于 用户态 的协程,实现起来复杂度并不大,Java 也有不少协程相关的三方框架,但是官方迟迟没有支持。

整体感触:
不得不承认,Java 是最优秀的高级语言。再大的项目,使用 Java 可以非常协调的开发和维护。
Java 生态框架化非常深,高层业务开发上手简单且不容易出错。对于完全新手,以前需要 6 个月入门,现在 1 个月就能入门,大大的降低了学习门槛。

Docker

Docker 真是一个好工具,以至于我希望把它单独拎出来。这个被 Google 不断实践后却被 dotCloud 异地开花的产物,实打实的改变了服务部署的游戏规则。
以前,做 web 服务的时候,好多周边配置,动不动就项目跑不起来了。现在通过 Docker 脚本化部署真的太方便了。
配合 Docker Compose 和 Google 的 kubernetes,真的做到了一键部署、动态部署,真香。

Nginx

Nginx 做 静态 / 动态 代理服务器,真棒。之前用 node 写小服务,就是在 vps 上用 nginx 做的反向代理,当时也没觉得多棒,只觉得是不错的流量路由。
现在看 Java 各种微服务的代理、负载均衡、证书、跨域、限流、资源路由,没有 Nginx 真不行。

C:

C 语言,非嵌入式或者底层开发等场景基本没有用武之地。但是,C 语言是最应该深入学习的,而且是必学的
高级语言最简单的部分就是语法糖了,看半天一天的也就差不多了。但是看到一门语言的语法糖,就能猜到内部的大致实现,离不开对 C 语言的理解

C 语言这门瑞士军刀,可以真真切切的还原内存和算法,而这是所有高级语言避不开的基石,乃至于操作系统,本质也是对内存和算法的极限控制。

举例来说,struct 是 C 唯一的结构体,也是 C++/Objective-C/Swift/Go 等众多语言的基础结构,也在操作系统里面随处可见,进程、线程的数据结构都使用 struct 来描述。
通过掌握 struct 的指针,可以对数据如何在内存中流动,有清晰的认识。任何高级语言都离不开指针,即使像 Swift/Java/Python 这些语言会刻意避开指针的概念。
在编写代码的时候,能够感觉到数据在内存中是如何流动的,就会刻意的追求更高的执行效率,也会加快 bug 处理的速度。

对于 C 的面向过程编程,其实和面向对象编程在运行层面就没有本质的区别。
仅仅是高级语言把函数调用的方式封装到了 class 里面,展开后,还是面向过程的。这是面向对象的语言对 ITer 的欺骗。
面向对象的封装、继承,通过 C 一样可以实现。比如 封装 可以通过 struct 实现。继承可以通过组合实现。对于多态,因为使用组合实现继承,也就没有多态一说了。

我的建议是通过算法来学习 C 语言。因为对于很多人来说,C 在工作中没有直接的应用,语法的淡忘周期会非常短。
但是对于算法,C 是除了汇编之外最底层的语言描述。可以更加清晰的描绘算法、精确掌握执行过程。这是 Java/C++ 这些语言带不来的,因为相对算法的执行过程,它们都包装过度了。

应该用 C 来学习算法,写算法还是用 C++ 爽一些。不然太多的容器轮子需要开发,太累了。
C++ 的 auto 类型推断 和 tuple 元组 太好用了。STL 容器实在强大。

整体感触:
瑞士军刀,每一名 ITer 都应该必学必会。
尤其要对 指针 和 结构体 有深入的认知,这两个是对内存的直接映射,不理解它们,就无法理解内存。而内存和算法,没有语言可以避的开。

私心:本人非常喜欢 C 的面向过程的开发方式。相比面向对象,在使用 C 的时候,有一种莫名的欢喜,不管是变量的定义或是函数的调用。
这基于 C 的命令式编程范式,让操控欲得到满足,可以精细化的描述一个过程。而面向对象没有那种操控感觉,每一个实例对象都像牵线木偶一样的流水线工人。

Python:

简单写服务、脚本,千万别往 Java/C++ 上面凑。2-3 小时就能看完 Python 的语法,用 Google 搜索下诉求,就能找到开源库。
Python,当之无愧的开箱即用。
Anaconda 很好用, 通过 conda 来代替 pip 和 环境隔离非常方便。

小技巧:

学习高级语言语法的过程中,肯定是要看文档的。但文档只有介绍,有时候不能很好的提供示例。

这里有个好用的技巧,就是找一个代码量比较大的开源项目。遇到文档里面提到的关键词,就去开源项目里面搜。很快就能理解相关知识点了。
还有一个小技巧,就是 chatGPT 可以很方便的解答很多疑问,要勤于提问。

最后,还有这两个技巧的组合。就是对于一些比较难以检索的字符,如:for ... in ... 这种,可以问 gpt 要正则表达,如 for .* in .*,然后在 IDE 里面通过正则来检索。

结束语:

编程世界,主要还是在于内功的磨炼,有 计算机原理、网络、数据结构 & 算法。反而真的需要使用某一个高级语言来完成工作的时候,其实挺快的。

比如协程,当对进程、线程的数据结构有了解,理解汇编下函数调用栈的执行流程后,协程的实现其实都是千篇一律,不管是 Go、Swift、Python、TS 等。
再比如网络,当对网络底层比较熟悉,高级语言都只是在封装各自语言的 SDK 给开发者使用而已。
还有各个语言的容器实现,都摆脱不了 数据结构 & 算法 的组合。很多容器的实现,真的没有什么魔法,很简单的数据结构 & 算法的封装而已。
还有设计模式,这是通吃的,所有语言都一样,只是表现形式不同。

高级语言真的只是工具,实现目的的工具。


上学的时候,老师说美帝国主义不安好心,让人民币对美元的汇率升高了,说这会对国家造成巨大损失。
当时我就是理解不过来,1 美元可以换更多的人民币,为什么就有损失了。如果我手里有 1 美元,不是相当于更多的人民币了么,这是好事嘛。
现在我才知道,原来是站的角度不一样,我是站在自己有美元并且期望换成人民币来消费,而老师站在很高很冷的地方,我是格局没达到。
如果 1 美元可以换更多的人民币,就是人民币贬值了。反之,则是人民币升值。
人民币贬值的影响如下($1=¥10) => ($1=¥20):

  1. 国内商品出口增加:原来 ¥20 ($2) 的商品,现在只需要 $1,所以国外抢着要中国商品。
  2. 国外商品进口减少:原来 ¥10 ($1) 的商品,现在需要 ¥20,所以国内减少国外进口。

这里的进口和出口,可以理解是泛化的。比如国际旅游、海购等物品流通,都适用。
汇率造成的人民币贬值,不仅仅影响国际贸易。当进口困难,会对内部市场也造成影响。
比如一件商品因为原材料少了,价格开始变贵。以前能买得起的,现在消费不起了。
大陆从 2005 年汇率整改后,从 8.x 的利率一路降到了 6.x,一路升值。
最近一年破 7,2023.6.30 达到了 7.26。一年前还是 6.7。一年贬值 7.7%。
这也不算啥小题大做,不从汇率做贬值计算口径,大陆内部人民币每年也是 10% 的贬值速度嘛。
明明存钱等于花钱,还一直存在,真是傻逼。