限制正则表达式执行时间
正则表达式是一种非常方便的工具,为了支持更强大的搜索功能,大部分正则表达式引擎在某些场景会进行回溯(backtracking)。
JDK 8
例如正则表达式 (a+)*b
,在 OpenJDK 8
上测试。
1 | Pattern compile = Pattern.compile("(a+)*b"); |
执行速度非常快,似乎也没什么问题。但如果把最后一个 b
修改成 c
,执行时间就需要超过 1 秒了。
正则表达式是一种非常方便的工具,为了支持更强大的搜索功能,大部分正则表达式引擎在某些场景会进行回溯(backtracking)。
例如正则表达式 (a+)*b
,在 OpenJDK 8
上测试。
1 | Pattern compile = Pattern.compile("(a+)*b"); |
执行速度非常快,似乎也没什么问题。但如果把最后一个 b
修改成 c
,执行时间就需要超过 1 秒了。
翻译 https://openjdk.java.net/projects/valhalla/design-notes/state-of-valhalla/01-background。
这是描述 Valhalla 现状(2021.12)的三篇文章中的第一篇,第二篇是语言模型,第三篇是 JVM 模型。
Valhalla 的口号是:像 class
一样编写,像 int
一样运行。
解读 JEP 390 Warnings for Value-Based Classes,基于值的类(value-based)的相关警告。
翻译 https://openjdk.java.net/projects/valhalla/design-notes/in-defense-of-erasure。
在我们讨论泛型该如何发展时,我们首先要看看当前泛型是什么样的。这篇文章主要聚焦在泛型是如何发展到现在的,以及为什么会是这个样子,了解这些可以帮助我们基于现有的泛型尝试构建出“更好”的泛型。
特别是,我们强调擦除实际上是 2004 年将泛型添加到 Java 时明智且务实的选择,而且很多导致我们选择擦除的因素至今仍在运作。
在 JDK 1.8 中,增加了 java.util.Optional
、java.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
以哲学家奎恩(Willard Van Orman Quine)命名,指的是输出结果为程序自身源码的程序,也称为 自产生程序
。有点类似于代码中的不动点,举一个例子
1 | exec(s:='print("exec(s:=%r)"%s)') |
那么以下命令全部输出 exec(s:='print("exec(s:=%r)"%s)')
1 | python quine.py |
理论上图灵完备的语言都可以构造出 Quine
,那么如何在 Java 中构造呢?
类加载机制是 Java 技术体系中非常核心的部分,负责把 class
文件加载到 JVM。
类加载器可以说是 Java 语言的一项创新,它是早期 Java 语言能够快速流行的重要原因之一。类加载器最初是为了满足 Java Applet 的需求而设计出来的,在今天用在浏览器上的 Java Applet 技术基本上已经被淘汰,但类加载器却在类层次划分、OSGi、程序热部署、代码加密等领域大放异彩,成为 Java 技术体系中一块重要的基石,可谓是失之桑榆,收之东隅。
——《深入理解 Java 虚拟机》