Advertise with Googlier.com Max's Zone https://blog.maxxsoft.net/ zh-CN 一个微不足道的幻想者的 Blog = = Wed, 02 Apr 2025 22:27:00 +0800 Wed, 02 Apr 2025 22:27:00 +0800 终于,我得到了人生中第一份版税收入 https://blog.maxxsoft.net/index.php/archives/163/ https://blog.maxxsoft.net/index.php/archives/163/ Wed, 02 Apr 2025 22:27:00 +0800 MaxXing 半个多月前,网易云音乐的工作人员和我取得了联系。对方相中了《100%矛盾集合体》这首歌,想购买它的独家授权。

听到这个消息,我激动不已。

今天,预付的版税到账了。不以音乐为生的我,终于也能凭借音乐,被大众和资本认可,赚到自己的一笔收入。

回顾自己人生的前 26 年,很庆幸,无论喜与悲,我总有音乐相伴。

[...]

]]>
12 https://blog.maxxsoft.net/index.php/archives/163/#comments https://blog.maxxsoft.net/index.php/feed/archives/163/
JVM 里的逻辑漏洞,居然让你的哈希表慢了 20%! https://blog.maxxsoft.net/index.php/archives/162/ https://blog.maxxsoft.net/index.php/archives/162/ Wed, 02 Apr 2025 17:48:00 +0800 MaxXing 首先来看一段 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% 还多!

[...]

]]>
4 https://blog.maxxsoft.net/index.php/archives/162/#comments https://blog.maxxsoft.net/index.php/feed/archives/162/
JVM/编译器/CPU,究竟谁是卧底?一个曾经困扰我一个月的 bug https://blog.maxxsoft.net/index.php/archives/152/ https://blog.maxxsoft.net/index.php/archives/152/ Wed, 05 Jun 2024 13:07:00 +0800 MaxXing 假设你是一个 Java 程序员,但你早已厌倦了什么 Java 8 什么 CMS GC 什么 SSM。某天你心血来潮,在自己的小破开发机里装了最新版的 JDK,用上了潮到没边的 Shenandoah GC,抄起键盘起手就是 hello world 一把梭,结果发现你写的程序居然跑不了——甚至还把 Java 搞崩溃了,现场只剩下 log、coredump 和一地鸡毛。

你会怀疑是不是自己太长时间没接触 Java 新特性,居然写不出一个能跑的程序……

还是说,你会觉得是 Java 本身,甚至是编译 JVM 的那个编译器、OS、CPU 里出现了更离谱的 bug 呢?

[...]

]]>
4 https://blog.maxxsoft.net/index.php/archives/152/#comments https://blog.maxxsoft.net/index.php/feed/archives/152/
写一个倒着跑的 x86-64 程序 https://blog.maxxsoft.net/index.php/archives/146/ https://blog.maxxsoft.net/index.php/archives/146/ Sun, 27 Nov 2022 20:09:00 +0800 MaxXing 什么是“倒着跑”的程序?

正常的程序都是正着跑的:CPU 里有一个程序计数器(PC),用来记录当前正在执行的指令的地址。执行完 PC 处的指令后,CPU 会接着执行 PC+1 处的指令。

而倒着跑的程序指的是:执行完 PC 处的指令后,程序回过头去执行 PC-1 处的指令。如果你反汇编这个程序,你会看到程序中机器指令的序列也是完全倒过来的,比如程序看起来会先调用函数,后传参。

等等,这样的程序是真实存在的吗?

是的,而且我真的写了一个这样的 x86-64 程序,还把它出成了一道 CTF 逆向题!

[...]

]]>
6 https://blog.maxxsoft.net/index.php/archives/146/#comments https://blog.maxxsoft.net/index.php/feed/archives/146/
【教程】从零开始,写个编译器! https://blog.maxxsoft.net/index.php/archives/145/ https://blog.maxxsoft.net/index.php/archives/145/ Wed, 23 Feb 2022 10:57:00 +0800 MaxXing 是的,这又是一个教你写个编译器的教程。

你可能已经见过无数个教你写编译器的教程了,但它们也许或多或少存在各种问题,导致你看了它们之后,依然觉得无从下手:

  • 教程并非面向“零编译器基础”的人群,理解起来比较费劲。
  • 只教了怎么做一个编译器,但没教为什么这么做,读完之后还是觉得一头雾水。
  • 开始编码之前,需要复杂的环境配置,开局劝退。
  • 上来先做和“编译一个程序”这件事八竿子打不着的东西,跟着教程学一个月才能看到自己的编译器编出一个能跑的程序,反馈周期过长。
  • 最终写出来的只是个解释器,或者不能编译到真实的 ISA(例如输出了某种字节码),或者高度依赖其他框架(例如 LLVM),让人体会不到那种“我真的写出个编译器”的成就感,以及“所有事情都由自己实现”的酣畅感。
  • 实现的编译器只能编译一些过于简单的程序,比如排序算法等等,看起来非常无聊。谁会没事干排序玩啊?
  • 教程及其配套资源非中文,或需要付费,且不开源。

研究生期间,我一直在担任本科编译原理课程的助教。为了让本科生更好地理解编译器工作的原理,在参考多个其他教程之后,我设计了一套全新的,教你从零开始写个编译器的教程:

[...]

]]>
6 https://blog.maxxsoft.net/index.php/archives/145/#comments https://blog.maxxsoft.net/index.php/feed/archives/145/
公布自己的 PGP 公钥以便验证我的身份 https://blog.maxxsoft.net/index.php/archives/144/ https://blog.maxxsoft.net/index.php/archives/144/ Fri, 21 Jan 2022 10:12:00 +0800 MaxXing 如题, 这在某些场合是比较有用的. 我会在必要的情况下, 发布签名后的信息, 以便自证身份.

同时, 我的 PGP 公钥在我的 GitHub 主页也可获取到, 我会确保这两处的公钥是完全一致的. 如你发现这两处的信息不一致, 说明这两个公钥均已失效, 请勿使用其中的任何一个验证 MaxXing 的身份.

[...]

]]>
0 https://blog.maxxsoft.net/index.php/archives/144/#comments https://blog.maxxsoft.net/index.php/feed/archives/144/
SSA 形式的设计取舍: Phi 函数的新形式? https://blog.maxxsoft.net/index.php/archives/143/ https://blog.maxxsoft.net/index.php/archives/143/ Mon, 20 Dec 2021 14:50:01 +0800 MaxXing SSA, 静态单赋值形式, 是 “单赋值” 的, 所有的量都只会被赋值一次.

在控制流汇聚的时候, 我们可能需要在汇点后的控制流中取得汇点前的多个控制流中更新过后的数据. 此时, 由于其单赋值的特性, 我们没办法简单地表示, 我们拿到的具体是哪一个数据.

为了解决这个问题, Phi 函数应运而生.

[...]

]]>
4 https://blog.maxxsoft.net/index.php/archives/143/#comments https://blog.maxxsoft.net/index.php/feed/archives/143/
关于虚拟歌姬音源的购买证明 https://blog.maxxsoft.net/index.php/archives/141/ https://blog.maxxsoft.net/index.php/archives/141/ Tue, 13 Jul 2021 14:05:35 +0800 MaxXing 众所周知,我比较喜欢写歌但不擅长唱歌,所以通常会用 Vocaloid 实现歌曲的人声部分。以后可能还会考虑 Synthesizer V 的音源,当然这是后话了。

之前会将歌曲上传到网易云音乐,因为在 2014-2017 年期间,网易云音乐一直是一个还不错的音乐平台。

然而现在,网易云的审核真的是越来越 nt 了。如果你希望在你上传的歌曲里添加虚拟歌姬作为歌手,你必须:

[...]

]]>
0 https://blog.maxxsoft.net/index.php/archives/141/#comments https://blog.maxxsoft.net/index.php/feed/archives/141/
要毕业了,写首歌吧 https://blog.maxxsoft.net/index.php/archives/137/ https://blog.maxxsoft.net/index.php/archives/137/ Fri, 09 Jul 2021 14:23:00 +0800 MaxXing 之前一直在豆瓣音乐人小站上传 demo,然而豆瓣似乎已经抛弃“小站”这个产品许久

——小站需要借助 Flash Player 才能在浏览器端上传音乐,然而 Adobe Flash Player 已于去年十二月寿终正寝。

于是给 Typecho 装了一个 APlayer 插件,以后有什么 demo 的话直接上传到 blog 就完事了。希望有关部门不要找我麻烦,让我提供什么视听许可证之类的…… = =


明天就要返校参加毕业典礼了。2016 年上大学,但 2021 年才参加毕业典礼。疫情搅乱了太多的事情。

打算在毕业的时候整个活,于是很早就开始着手写了一首新歌,希望能在明天大家合影留念的时候,挑个人多的地方搞一波快闪。毕竟之前完全没这么玩过。

[...]

]]>
3 https://blog.maxxsoft.net/index.php/archives/137/#comments https://blog.maxxsoft.net/index.php/feed/archives/137/
【读书报告】VLIW技术论:打碎软硬件的边界 https://blog.maxxsoft.net/index.php/archives/134/ https://blog.maxxsoft.net/index.php/archives/134/ Fri, 28 May 2021 10:14:00 +0800 MaxXing 注:本文是高等计算机体系结构课程的作业,因为觉得作业不能白写,而且读书报告似乎被我写成了科普向的文章,所以打算把这些作业发在 blog 上 \_(:з」∠)_

微处理器的结构曾经有过几次重大的革新:流水线和 RISC 概念的诞生,使得处理器的性能和指令吞吐量大幅度提升;多发射、超标量技术的诞生,使得指令级并行性得到了进一步的开发;乱序执行技术的推出,使得处理器的动态调度能力达到了新的顶峰。而在微结构发展的历史中,曾出现过很多让人耳目一新的设计:前有 Cray 设计的向量处理机,后有本文提出的超长指令字架构。

[...]

]]>
0 https://blog.maxxsoft.net/index.php/archives/134/#comments https://blog.maxxsoft.net/index.php/feed/archives/134/