我想要一个简单明了的JVM汇编程序.它应该采用以Java虚拟机规范中描述的助记符语言编写的文本文件,并生成类文件,即字节码.
要明确:我不想要一个可以从API调用生成类文件的库.
JVM汇编程序的当前状态是什么?它们是否支持invokedynamic(对我来说不是强制性的,但是有优势)?我可以使用哪些操作系统?他们各自的利弊是什么?
我注意到Ruby/Oniguruma的副作用只出现在4个看似相同的陈述中的1个中.为什么变量day定义在009,但不在003,005或007?
irb(main):001:0> r = /(?<day>\d\d):(?<mon>\d\d)/
=> /(?<day>\d\d):(?<mon>\d\d)/
irb(main):002:0> r =~ "24:12"
=> 0
irb(main):003:0> day
NameError: undefined local variable or method `day'
irb(main):004:0> "24:12" =~ r
=> 0
irb(main):005:0> day
NameError: undefined local variable or method `day'
irb(main):006:0> "24:12" =~ /(?<day>\d\d):(?<mon>\d\d)/
=> 0
irb(main):007:0> day
NameError: undefined local variable or method `day'
irb(main):008:0> /(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12"
=> 0
irb(main):009:0> day
=> "24"
Run Code Online (Sandbox Code Playgroud)
nb#1:在所有四种情况下,它都是相同的正则表达式和相同的字符串.
nb#2:我已经验证了MS Windows和Ubuntu Linux中的行为.
占有量词是贪婪的,拒绝回溯.正则表达式/.{1,3}+b/应该是:匹配除换行符之外的任何字符,尽可能多地匹配1到3次,并且不要回溯.然后匹配角色b.
在这个例子中:
'ab'.sub /.{1,3}+b/, 'c' #=> "c"
Run Code Online (Sandbox Code Playgroud)
与事实相反,不应该进行替换.
这两个例子的结果有所不同:
'aab'.sub /.{0,1}+b/, 'c' #=> "c"
'aab'.sub /.?+b/, 'c' #=> "ac"
Run Code Online (Sandbox Code Playgroud)
与Scala相比,他们给出了相同的答案:
scala> ".{0,1}+b".r.replaceAllIn("aab", "c")
res1: String = ac
scala> ".?+b".r.replaceAllIn("aab", "c")
res2: String = ac
Run Code Online (Sandbox Code Playgroud)
这是一个Ruby错误,还是可以激发这种行为?也许,Oniguruma出于某种原因实现占有与所有量词?,*,+除了一般的量词{m,n}?如果是这样的话,为什么?