终于,我得到了人生中第一份版税收入
半个多月前,网易云音乐的工作人员和我取得了联系。对方相中了《100%矛盾集合体》这首歌,想购买它的独家授权。
听到这个消息,我激动不已。
今天,预付的版税到账了。不以音乐为生的我,终于也能凭借音乐,被大众和资本认可,赚到自己的一笔收入。
回顾自己人生的前 26 年,很庆幸,无论喜与悲,我总有音乐相伴。
半个多月前,网易云音乐的工作人员和我取得了联系。对方相中了《100%矛盾集合体》这首歌,想购买它的独家授权。
听到这个消息,我激动不已。
今天,预付的版税到账了。不以音乐为生的我,终于也能凭借音乐,被大众和资本认可,赚到自己的一笔收入。
回顾自己人生的前 26 年,很庆幸,无论喜与悲,我总有音乐相伴。
首先来看一段 Java 代码:
int sumMapElements(ConcurrentHashMap<Integer, Integer> map) {
int sum = 0;
Enumeration<Integer> it = map.elements();
while (it.hasMoreElements()) {
sum += (int) it.nextElement();
}
return sum;
}
函数 sumMapElements
使用迭代器遍历了 ConcurrentHashMap
参数的所有元素,并求了它们的总和,将结果作为返回值返回。
整个代码在实现上相当直观,也没什么弯弯绕绕。我敢说,如果让你来实现一个类似的操作,你十有八九也会写出差不多的代码——或者从不知道哪搜出来的二手 CSDN 文章里偷一段。
作为一个非常基础的容器,ConcurrentHashMap
在并发场景里有着广泛的应用。成千上万日日夜夜里,这段代码的灵魂——也就是里面的那个迭代器,伴随着网卡缓冲区里的车水马龙,流淌在无数台跑着 Java 应用的服务器中。
然而,当你用 OpenJDK 23 和 24,用默认的 G1 GC,分别运行同样的代码(需要 JMH),你会发现一个令人震撼的事实:
23 居然比 24 慢了 20% 还多!
假设你是一个 Java 程序员,但你早已厌倦了什么 Java 8 什么 CMS GC 什么 SSM。某天你心血来潮,在自己的小破开发机里装了最新版的 JDK,用上了潮到没边的 Shenandoah GC,抄起键盘起手就是 hello world 一把梭,结果发现你写的程序居然跑不了——甚至还把 Java 搞崩溃了,现场只剩下 log、coredump 和一地鸡毛。
你会怀疑是不是自己太长时间没接触 Java 新特性,居然写不出一个能跑的程序……
还是说,你会觉得是 Java 本身,甚至是编译 JVM 的那个编译器、OS、CPU 里出现了更离谱的 bug 呢?
什么是“倒着跑”的程序?
正常的程序都是正着跑的:CPU 里有一个程序计数器(PC),用来记录当前正在执行的指令的地址。执行完 PC 处的指令后,CPU 会接着执行 PC+1 处的指令。
而倒着跑的程序指的是:执行完 PC 处的指令后,程序回过头去执行 PC-1 处的指令。如果你反汇编这个程序,你会看到程序中机器指令的序列也是完全倒过来的,比如程序看起来会先调用函数,后传参。
等等,这样的程序是真实存在的吗?
是的,而且我真的写了一个这样的 x86-64 程序,还把它出成了一道 CTF 逆向题!
是的,这又是一个教你写个编译器的教程。
你可能已经见过无数个教你写编译器的教程了,但它们也许或多或少存在各种问题,导致你看了它们之后,依然觉得无从下手:
研究生期间,我一直在担任本科编译原理课程的助教。为了让本科生更好地理解编译器工作的原理,在参考多个其他教程之后,我设计了一套全新的,教你从零开始写个编译器的教程: