JVM上有几种语言/运行时:例如JRuby,Groovy,Jython,Clojure,Rhino,Scala等等......
(或者我的假设是错误的,并且一些提到的语言不会生成字节码?)
java compiler-construction jvm programming-languages bytecode
它们有多完整?
有什么基准吗?
他们中的任何一个曾经很受欢迎吗?
PS 是否有其他非垃圾收集语言具有和/或拥有字节码编译器(例如 pascal)?
我有一个简单的类用于说明目的:
public class Test {
public int test1() {
int result = 100;
result = 200;
return result;
}
public int test2() {
return 200;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器生成的字节码(检查者javap -c Test.class)如下:
public int test1();
Code:
0: bipush 100
2: istore_1
3: sipush 200
6: istore_1
7: iload_1
8: ireturn
public int test2();
Code:
0: sipush 200
3: ireturn
Run Code Online (Sandbox Code Playgroud)
为什么编译器没有将test1方法优化为为该方法生成的相同字节码test2?我希望它至少可以避免result变量的冗余初始化,因为很容易得出结论100根本没有使用该值.
我用Eclipse编译器和javac.
javacversion 1.8.0_72:,与Java一起作为JDK的一部分安装:
Java(TM) SE Runtime Environment (build …Run Code Online (Sandbox Code Playgroud) 我需要创建一个 java 代理,当启用它时,它将获取 jar 文件的路径作为参数,然后如果它们的名称匹配,它将替换 jar 文件中的任何加载类。
例如,我们有一个名为 com.something.ClassTest 的类的应用程序。现在,如果提到的 jar(不在类路径中)有一个与 com.something.ClassTest 同名的类,我想用 jar 中的那个来替换它。
我有这个类转换器,但不确定这是否正确。我收到消息 Class not found 的 IOException。
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if(classNames.contains(className.replace("/", "."))) {
System.out.format("\n==> Found %s \n", className);
try {
Class c = urlClassLoader.loadClass(className.replace("/", "."));
InputStream is = urlClassLoader.getResourceAsStream(className.replace("/", "."));
System.out.println("Loaded class " + c);
ClassReader reader = new ClassReader(is);
ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
byte[] content = writer.toByteArray();
System.out.println("Redifned …Run Code Online (Sandbox Code Playgroud) Is it possible to generate gremlin script from the bytecode?
I am working on a POC in which I need to query graph Azure CosmosDB database via Gremlin API.
Currently, Azure CosmosDB does not support bytecode. Azure development team has started working on this but no release timeline has been published so far.
I would like to prepare working code which would require minimum refactoring in future when bytecode support will be generally available.
Based on the Apache TinkerPop docs …
python bytecode gremlin azure-cosmosdb-gremlinapi gremlinpython
这个字节码来自exec marshal.loads('<BYTECODE>'),我想将它转换成具有清晰源代码的常规 python 脚本。我无法粘贴所有字节码,因为它重约 4MB,因此我将链接附加到GitHub(在 Pastebin 上文件太大)。
我尝试使用此代码来反转此字节码:
import sys
from sys import stdout
import uncompyle6
from uncompyle6.main import *
import marshal
x = marshal.loads('BYTECODE')
uncompyle6.main.uncompyle(2.7, x, sys.stdout)
Run Code Online (Sandbox Code Playgroud)
但它只适用于较小的文件,例如:
c\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00@\x00\x00\x00sa\x00\x00\x00d\x00\x00d\x01\x00l\x00\x00Z\x00\x00d\x00\x00d\x02\x00l\x01\x00m\x02\x00Z\x02\x00\x01d\x00\x00d\x03\x00l\x03\x00m\x04\x00Z\x04\x00\x01d\x04\x00\x84\x00\x00Z\x05\x00d\x05\x00\x84\x00\x00Z\x06\x00d\x06\x00\x84\x00\x00Z\x07\x00e\x08\x00d\x07\x00k\x02\x00r]\x00e\x05\x00\x83\x00\x00\x01n\x00\x00d\x01\x00S(\x08\x00\x00\x00i\xff\xff\xff\xffN(\x01\x00\x00\x00t\x04\x00\x00\x00exit(\x01\x00\x00\x00t\x06\x00\x00\x00sha512c\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\t\x00\x00\x00d\x01\x00GHd\x00\x00S(\x02\x00\x00\x00Ns\x0c\x00\x00\x00import me :D(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\n\x00\x00\x00bughela.pyt\x04\x00\x00\x00main\x05\x00\x00\x00s\x02\x00\x00\x00\x00\x01c\x01\x00\x00\x00\x07\x00\x00\x00\x03\x00\x00\x00C\x00\x00\x00s\xb5\x00\x00\x00|\x00\x00d\x01\x00 d\x02\x00k\x03\x00r\x1a\x00t\x00\x00\x83\x00\x00\x01n\x00\x00|\x00\x00d\x01\x00\x1f}\x00\x00t\x01\x00j\x02\x00t\x01\x00j\x01\x00\x83\x00\x00\x83\x01\x00}\x01\x00t\x01\x00j\x03\x00d\x03\x00t\x01\x00j\x02\x00\x83\x00\x00\x83\x02\x00}\x02\x00t\x04\x00|\x02\x00\x83\x01\x00j\x05\x00\x83\x00\x00}\x03\x00|\x01\x00j\x06\x00d\x04\x00\x16d\x05\x00\x17}\x04\x00|\x04\x00|\x01\x00j\x07\x00d\x06\x00\x16d\x07\x00\x17\x14}\x05\x00|\x03\x00|\x04\x00|\x05\x00!}\x06\x00|\x06\x00|\x00\x00k\x03\x00r\xac\x00t\x00\x00\x83\x00\x00\x01n\x00\x00d\x08\x00GHd\x00\x00S(\t\x00\x00\x00Ni+\x00\x00\x00s+\x00\x00\x00http://wargame.kr:8080/pyc_decompile/?flag=s\x0c\x00\x00\x00%m/%d/HJEJSHi\x03\x00\x00\x00i\x01\x00\x00\x00i\x1e\x00\x00\x00i\n\x00\x00\x00s\x07\x00\x00\x00GOOD!!!(\x08\x00\x00\x00t\x03\x00\x00\x00diet\x04\x00\x00\x00timet\t\x00\x00\x00localtimet\x08\x00\x00\x00strftimeR\x01\x00\x00\x00t\t\x00\x00\x00hexdigestt\x07\x00\x00\x00tm_hourt\x06\x00\x00\x00tm_min(\x07\x00\x00\x00t\x04\x00\x00\x00flagt\x03\x00\x00\x00nowt\x04\x00\x00\x00seedt\x02\x00\x00\x00hst\x05\x00\x00\x00startt\x03\x00\x00\x00endt\x02\x00\x00\x00ok(\x00\x00\x00\x00(\x00\x00\x00\x00s\n\x00\x00\x00bughela.pyt\x0c\x00\x00\x00GIVE_ME_FLAG\x08\x00\x00\x00s\x18\x00\x00\x00\x00\x01\x10\x00\n\x01\n\x01\x15\x01\x18\x01\x12\x01\x11\x01\x15\x01\r\x01\x0c\x00\n\x01c\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\x10\x00\x00\x00d\x01\x00GHt\x00\x00\x83\x00\x00\x01d\x00\x00S(\x02\x00\x00\x00Ns\x07\x00\x00\x00NOPE...(\x01\x00\x00\x00R\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\n\x00\x00\x00bughela.pyR\x03\x00\x00\x00\x14\x00\x00\x00s\x04\x00\x00\x00\x00\x01\x05\x01t\x08\x00\x00\x00__main__(\t\x00\x00\x00R\x04\x00\x00\x00t\x03\x00\x00\x00sysR\x00\x00\x00\x00t\x07\x00\x00\x00hashlibR\x01\x00\x00\x00R\x02\x00\x00\x00R\x11\x00\x00\x00R\x03\x00\x00\x00t\x08\x00\x00\x00__name__(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\n\x00\x00\x00bughela.pyt\x08\x00\x00\x00<module>\x01\x00\x00\x00s\x0e\x00\x00\x00\x0c\x01\x10\x01\x10\x02\t\x03\t\x0c\t\x04\x0c\x01
Run Code Online (Sandbox Code Playgroud)
c\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00@\x00\x00\x00s\xfb\x02\x00\x00d\x00\x00d\x01\x00l\x00\x00Z\x00\x00d\x00\x00d\x01\x00l\x01\x00Z\x01\x00d\x00\x00d\x01\x00l\x02\x00Z\x02\x00d\x00\x00d\x01\x00l\x03\x00Z\x03\x00d\x02\x00Z\x04\x00d\x03\x00Z\x05\x00d\x04\x00Z\x06\x00d\x05\x00Z\x07\x00d\x06\x00Z\x08\x00d\x07\x00\x84\x00\x00Z\t\x00y2\x00e\t\x00\x83\x00\x00\x01e\x06\x00d\x08\x00\x17GHe\n\x00d\t\x00\x83\x01\x00Z\x0b\x00e\x0b\x00j\x0c\x00d\n\x00d\x0b\x00\x83\x02\x00Z\r\x00Wn\x0e\x01\x04e\x0e\x00k\n\x00r\xc7\x00\x01\x01\x01e\x05\x00d\x0c\x00\x17e\x07\x00\x17d\r\x00\x17e\x05\x00\x17d\x0e\x00\x17e\x07\x00\x17d\x0f\x00\x17GHe\x01\x00j\x0f\x00\x83\x00\x00\x01n\xd3\x00\x04e\x10\x00k\n\x00r0\x01\x01\x01\x01e\x05\x00d\x0c\x00\x17e\x07\x00\x17d\r\x00\x17e\x05\x00\x17d\x0e\x00\x17e\x07\x00\x17d\x10\x00\x17GHe\x05\x00d\x0c\x00\x17e\x07\x00\x17d\r\x00\x17e\x05\x00\x17d\x0e\x00\x17e\x07\x00\x17d\x11\x00\x17GHe\x03\x00j\x11\x00d\x12\x00\x83\x01\x00\x01e\x01\x00j\x0f\x00\x83\x00\x00\x01nj\x00\x04e\x12\x00k\n\x00r\x99\x01\x01\x01\x01e\x05\x00d\x0c\x00\x17e\x07\x00\x17d\r\x00\x17e\x05\x00\x17d\x0e\x00\x17e\x07\x00\x17d\x13\x00\x17GHe\x05\x00d\x0c\x00\x17e\x07\x00\x17d\r\x00\x17e\x05\x00\x17d\x0e\x00\x17e\x07\x00\x17d\x11\x00\x17GHe\x03\x00j\x11\x00d\x12\x00\x83\x01\x00\x01e\x01\x00j\x0f\x00\x83\x00\x00\x01n\x01\x00Xy\x19\x00e\x13\x00e\x0b\x00d\x14\x00\x83\x02\x00j\x14\x00\x83\x00\x00Z\x15\x00WnC\x00\x04e\x16\x00k\n\x00r\xf8\x01\x01\x01\x01e\t\x00\x83\x00\x00\x01e\x05\x00d\x0c\x00\x17e\x07\x00\x17d\r\x00\x17e\x05\x00\x17d\x0e\x00\x17e\x07\x00\x17d\x15\x00\x17GHe\x01\x00j\x0f\x00\x83\x00\x00\x01n\x01\x00Xy%\x00e\x17\x00e\x15\x00d\x16\x00d\x17\x00\x83\x03\x00Z\x18\x00e\x00\x00j\x19\x00e\x18\x00\x83\x01\x00Z\x1a\x00WnC\x00\x04e\x1b\x00k\n\x00rc\x02\x01\x01\x01e\t\x00\x83\x00\x00\x01e\x05\x00d\x0c\x00\x17e\x07\x00\x17d\r\x00\x17e\x05\x00\x17d\x0e\x00\x17e\x07\x00\x17d\x18\x00\x17GHe\x01\x00j\x0f\x00\x83\x00\x00\x01n\x01\x00Xe\x13\x00e\r\x00d\x19\x00\x17d\x1a\x00\x83\x02\x00Z\x1c\x00e\x1c\x00j\x1d\x00d\x1b\x00\x83\x01\x00\x01e\x1c\x00j\x1d\x00d\x1c\x00\x83\x01\x00\x01e\x1c\x00j\x1d\x00d\x1d\x00\x83\x01\x00\x01e\x1c\x00j\x1d\x00d\x1e\x00e\x1e\x00e\x1a\x00\x83\x01\x00\x17d\x1f\x00\x17\x83\x01\x00\x01e\x1c\x00j\x1f\x00\x83\x00\x00\x01e\t\x00\x83\x00\x00\x01e\x04\x00d\x0c\x00\x17e\x07\x00\x17d \x00\x17e\x04\x00\x17d\x0e\x00\x17e\x06\x00\x17d!\x00\x17e\x07\x00\x17e\r\x00\x17d"\x00\x17GHd\x01\x00S(#\x00\x00\x00i\xff\xff\xff\xffNs\x05\x00\x00\x00\x1b[34ms\x05\x00\x00\x00\x1b[31ms\x05\x00\x00\x00\x1b[32ms\x04\x00\x00\x00\x1b[0ms\x07\x00\x00\x00\x1b[33;5mc\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00C\x00\x00\x00s\xfb\x00\x00\x00t\x00\x00j\x01\x00d\x01\x00\x83\x01\x00\x01t\x02\x00d\x02\x00\x17GHt\x03\x00d\x03\x00\x17GHt\x02\x00d\x02\x00\x17GHt\x04\x00d\x04\x00\x17d\x05\x00d\x06\x00\x14\x17d\x07\x00\x17GHt\x04\x00d\x08\x00\x17t\x05\x00\x17d\t\x00\x17t\x03\x00\x17d\n\x00\x17t\x04\x00\x17d\x0b\x00\x17GHt\x04\x00d\x08\x00\x17t\x05\x00\x17d\x0c\x00\x17t\x03\x00\x17d\r\x00\x17t\x04\x00\x17d\x0e\x00\x17GHt\x04\x00d\x08\x00\x17t\x05\x00\x17d\x0f\x00\x17t\x03\x00\x17d\x10\x00\x17t\x04\x00\x17d\x08\x00\x17GHt\x04\x00d\x08\x00\x17t\x05\x00\x17d\x11\x00\x17t\x03\x00\x17d\x12\x00\x17t\x04\x00\x17d\x13\x00\x17GHt\x04\x00d\x08\x00\x17t\x05\x00\x17d\x14\x00\x17t\x03\x00\x17d\x15\x00\x17t\x04\x00\x17d\x16\x00\x17GHt\x04\x00d\x04\x00\x17d\x05\x00d\x06\x00\x14\x17d\x17\x00\x17GHd\x00\x00S(\x18\x00\x00\x00Nt\x05\x00\x00\x00clears$\x00\x00\x00 +-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+s$\x00\x00\x00 |C|o|m|p|i|l|e| |M|a|r|s|h|a|l|s\x02\x00\x00\x000{i\'\x00\x00\x00t\x01\x00\x00\x00=s\x02\x00\x00\x00}0t\x01\x00\x00\x00|s\x0b\x00\x00\x00 Coded by: t\n\x00\x00\x00xNot_Founds\x15\x00\x00\x00 |s\x0b\x00\x00\x00 Contact : s\x10\x00\x00\x00+62823-8637-2115s\x0f\x00\x00\x00 |s\x0b\x00\x00\x00 Email : s\x1e\x00\x00\x00febryafriansyah@programmer.nets\x0b\x00\x00\x00 Website : s\x1a\x00\x00\x00http://hatakecnk.noads.bizs\x05\x00\x00\x00 |s\x0b\x00\x00\x00 Github : s\x1c\x00\x00\x00https://github.com/hatakecnks\x03\x00\x00\x00 |s\x03\x00\x00\x00}0\n(\x06\x00\x00\x00t\x02\x00\x00\x00ost\x06\x00\x00\x00systemt\x01\x00\x00\x00Rt\x01\x00\x00\x00Wt\x01\x00\x00\x00Yt\x01\x00\x00\x00B(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<debby>t\x06\x00\x00\x00banner\t\x00\x00\x00s\x16\x00\x00\x00\x00\x01\r\x01\t\x01\t\x01\t\x01\x15\x01!\x01!\x01!\x01!\x01!\x01s\x11\x00\x00\x00Ex :/sdcard/ex.pys*\x00\x00\x00\x1b[0m[\x1b[31mInput Your File Path\x1b[0m]> \x1b[36ms\x03\x00\x00\x00.pyt\x00\x00\x00\x00t\x01\x00\x00\x00[t\x01\x00\x00\x00!s\x02\x00\x00\x00] s\x12\x00\x00\x00there is an error\ns\x0f\x00\x00\x00ctrl+c detecteds\x0f\x00\x00\x00trying to exit\ni\x03\x00\x00\x00s\x0f\x00\x00\x00ctrl+d detectedt\x01\x00\x00\x00rs\x0f\x00\x00\x00file not exist\ns\x07\x00\x00\x00<debby>t\x04\x00\x00\x00execs\x16\x00\x00\x00file already …Run Code Online (Sandbox Code Playgroud) 给定两个函数,foo()and foo(),第一个是标准的,第二个是可暂停的
fun foo(x: Int): Int {
return 2*x
}
suspend fun foo(x: Int): Int {
return 4*x
}
Run Code Online (Sandbox Code Playgroud)
以下代码无法编译,因为具有相同签名的两个函数存在冲突。
冲突重载:public fun foo(x: Int): Int 在文件 t.kt 中定义,public suspend fun foo(x: Int): Int 在文件 t.kt 中定义
如果我对挂起函数的理解是正确的,那么:
Continuation参数被添加到挂起函数中,状态机使用它来停止和启动挂起代码Any(因此Object对于 java)这两个副作用理论上应该足以改变第二个foo()函数签名,因此以不同于第一个的方式看待挂起标记的函数。
起初,我认为函数签名检查可以在实际将代码编译成字节码之前进行。然而,将两个呈现的函数变成实际的字节码实际上会导致 2 个具有 2 个不同签名的方法。
@Metadata(
mv = {1, 1, 16},
bv = {1, 0, 3},
k = 2,
d1 …Run Code Online (Sandbox Code Playgroud) 我只想用公共或受保护的字段、构造函数和方法为 java 类生成字节码。
我正在尝试使用以下代码,但我不知道这是正确的方法吗?
客户端代码:
String sourceFileName = file.getName();
ClassReader reader = new ClassReader(file.getContents());
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
JavaStubClassAdapter adapter = new JavaStubClassAdapter(writer, sourceFileName);
reader.accept(adapter, 0);
byte[] content = writer.toByteArray();
// we can use content to print in .class file
Run Code Online (Sandbox Code Playgroud)
适配器代码:
private class JavaStubClassAdapter extends ClassVisitor {
private final String sourceFileName;
/**
* @param writer
* @param sourceFileName
*/
public JavaStubClassAdapter(ClassWriter writer, String sourceFileName) {
super(Opcodes.ASM7, writer);
this.sourceFileName = sourceFileName;
}
@Override
public void visitSource(String source, String debug) …Run Code Online (Sandbox Code Playgroud) 此图显示了当我们从模块类型列表创建新模块时的弹出对话框。在这里我选择了 Android 库。 此图显示了当我们从模块类型列表创建新模块时的弹出对话框。
上下文:我一直在对使用invokedynamic和手动生成字节码之间的差异进行基准测试(这是在决定面向 JVM 的编译器是应该发出更冗长的“传统”字节码还是只是invokedynamic使用巧妙的引导方法调用)的上下文中。在这样做时,将字节码映射到MethodHandles至少同样快的组合器是非常简单的,除了tableswitch.
问题:是否有模仿tableswitch使用的技巧MethodHandle?我试着用一个跳转表来模仿它:使用一个常量MethodHandle[],用 索引到它arrayElementGetter,然后用 调用找到的句柄MethodHandles.invoker。然而,当我通过 JMH 运行它时,它最终比原始字节码慢了大约 50%。
下面是生成方法句柄的代码:
private static MethodHandle makeProductElement(Class<?> receiverClass, List<MethodHandle> getters) {
MethodHandle[] boxedGetters = getters
.stream()
.map(getter -> getter.asType(getter.type().changeReturnType(java.lang.Object.class)))
.toArray(MethodHandle[]::new);
MethodHandle getGetter = MethodHandles // (I)H
.arrayElementGetter(MethodHandle[].class)
.bindTo(boxedGetters);
MethodHandle invokeGetter = MethodHandles.permuteArguments( // (RH)O
MethodHandles.invoker(MethodType.methodType(java.lang.Object.class, receiverClass)),
MethodType.methodType(java.lang.Object.class, receiverClass, MethodHandle.class),
1,
0
);
return MethodHandles.filterArguments(invokeGetter, 1, getGetter);
}
Run Code Online (Sandbox Code Playgroud)
这是初始字节码(我试图用一个invokedynamic调用替换它)
public java.lang.Object productElement(int); …Run Code Online (Sandbox Code Playgroud)