限制正则表达式执行时间

正则表达式是一种非常方便的工具,为了支持更强大的搜索功能,大部分正则表达式引擎在某些场景会进行回溯(backtracking)。

JDK 8

例如正则表达式 (a+)*b ,在 OpenJDK 8 上测试。

1
2
3
Pattern compile = Pattern.compile("(a+)*b");
String string = "aaaaaaaaaaaaaaaaaaaaaaaab";
System.out.println(compile.matcher(string).matches());

执行速度非常快,似乎也没什么问题。但如果把最后一个 b 修改成 c,执行时间就需要超过 1 秒了。


Valhalla (1): 背景 How We Got the Generics We Have

翻译 https://openjdk.java.net/projects/valhalla/design-notes/in-defense-of-erasure

在我们讨论泛型该如何发展时,我们首先要看看当前泛型是什么样的。这篇文章主要聚焦在泛型是如何发展到现在的,以及为什么会是这个样子,了解这些可以帮助我们基于现有的泛型尝试构建出“更好”的泛型。

特别是,我们强调擦除实际上是 2004 年将泛型添加到 Java 时明智且务实的选择,而且很多导致我们选择擦除的因素至今仍在运作。


Valhalla (0): 序言

在 JDK 1.8 中,增加了 java.util.Optionaljava.time.LocalDateTime 等类,在这些类的注释中有这么一行:

This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.

引入了一个新的概念,基于值(value-based)的类。

JDK 16 的新特性中,还有一个不太起眼的 JEP 390: Warnings for Value-Based Classes。只是对基于值的类增加了一些警告信息,对功能没有任何影响。

可就在这个不起眼的概念背后,却跟一个足以颠覆 Java 的项目有关,这个项目就是 Valhalla

系列文章(未完待续)


Quine 自产生程序 — Java

Quine 以哲学家奎恩(Willard Van Orman Quine)命名,指的是输出结果为程序自身源码的程序,也称为 自产生程序。有点类似于代码中的不动点,举一个例子

quine.py
1
exec(s:='print("exec(s:=%r)"%s)')

那么以下命令全部输出 exec(s:='print("exec(s:=%r)"%s)')

1
2
3
python quine.py
python -c $(python quine.py)
python -c $(python -c $(python quine.py))

理论上图灵完备的语言都可以构造出 Quine,那么如何在 Java 中构造呢?


Java 进阶 — 类加载机制

类加载机制是 Java 技术体系中非常核心的部分,负责把 class 文件加载到 JVM。

类加载器可以说是 Java 语言的一项创新,它是早期 Java 语言能够快速流行的重要原因之一。类加载器最初是为了满足 Java Applet 的需求而设计出来的,在今天用在浏览器上的 Java Applet 技术基本上已经被淘汰,但类加载器却在类层次划分、OSGi、程序热部署、代码加密等领域大放异彩,成为 Java 技术体系中一块重要的基石,可谓是失之桑榆,收之东隅。

——《深入理解 Java 虚拟机》


Icarus 主题自定义

本文是基于icarus 5.x的版本(4.x的版本差别不大),icarus在2.0使用的是ejs,如果需要请查看旧版本

本博客所选取的主题是 Icarus ,并做了一些个性化的修改,很多修改都可以直观的看到。详细的差异可以查看 diff,这里记录一些主要的改动。