正如标题所示,是否有任何C/C++字节码编译器/解释器?我正在用一种解释语言编写应用程序,这种语言依赖于某些完全可交叉编译的库(在编译某个平台时没有特殊的标志来指示代码更改),但是用C和C++编写.不是在每个平台上运送n-platform-specific-libs,而是运送一组由一个平台特定的解释器解释的libs会很不错.
可能和/或可用?
EDIT1:有问题的解释语言是Python,虽然我也可以使用Ruby.
我可以反编译和编辑类文件的最有效方法是什么?我真的只想编辑文件中的一行代码,但JBE(java ByteCode Editor)不允许我更改浮点常量.
反编译该类并重新编译将无法正常工作,因为我已经尝试过这种方法,我会遇到很多依赖项错误,并且会出现名称错误.我怎样才能有效地解决这个问题?
谢谢
我在罐子里有一个类的方法,我想用自己的身体交换它.在这种情况下,我只想让方法将"GOT IT"打印到控制台并返回true;
我正在使用系统加载器来加载jar的类.我使用反射使系统类加载器能够通过字节码加载类.这部分似乎工作正常.
我按照这里找到的方法替换示例:asm.ow2.org/current/asm-transformations.pdf.
我的代码如下:
public class Main
{
public static void main(String[] args)
{
URL[] url = new URL[1];
try
{
url[0] = new URL("file:////C://Users//emist//workspace//tmloader//bin//runtime//tmgames.jar");
verifyValidPath(url[0]);
}
catch (Exception ex)
{
System.out.println("URL error");
}
Loader l = new Loader();
l.loadobjection(url);
}
public static void verifyValidPath(URL url) throws FileNotFoundException
{
File filePath = new File(url.getFile());
if (!filePath.exists())
{
throw new FileNotFoundException(filePath.getPath());
}
}
}
class Loader
{
private static final Class[] parameters = new Class[] {URL.class};
public static void addURL(URL …Run Code Online (Sandbox Code Playgroud) 鉴于CODE参考,是否有可能:
通常我们通过指定源代码在perl中创建子例程,然后解析源代码并将其转换为解析树.
我想编写一个perl函数,它可以通过指定其解析树来创建子例程,并且该解析树可以从某个其他子例程的另一个解析树派生.
可能?
我最近一直在使用Java库'ASM',它用于在运行时修改字节码,以防人们不知道,而且我无法在ASM 4上找到一个教程.除了官方手册之外ASM 4,它引用了甚至不存在的ASM类.
我想知道是否有人知道该库的任何教程,其中包括基本到中间事物,例如将一些代码插入到方法中.
我已经阅读了关于将Scala代码转换为Java代码的问题的答案.它说:
我不认为将scala转换回标准java是可能的,因为Scala做了一些相当低级别的字节码操作.我90%肯定他们做了一些不能完全转换回普通Java代码的东西.
那么Scala语句或代码可以产生无法转换为java的字节码?
PS我通常同意这个答案,但想要一个具体的例子用于学习目的.
我正在尝试自学python字节码是如何工作的,所以我可以通过操作函数的代码来做一些事情(只是为了好玩,而不是用于实际用途)所以我从一些简单的例子开始,例如:
def f(x):
return x + 3/x
Run Code Online (Sandbox Code Playgroud)
字节码是*:
(124, 0, 0, 100, 1, 0, 124, 0, 0, 20, 23, 83)
Run Code Online (Sandbox Code Playgroud)
因此,它是有道理的,我认为124是LOAD_FAST字节码,并且正在加载的对象的名称是f.__code__.co_varnames[0]这里0后是多少124.并100表示LOAD_CONST加载f.__code__.co_consts[1]在那里1是在数字后100.但是有一堆辅助零,比如第二个,第三个和第五个零,似乎没有任何意义,至少对我而言.他们表示什么?
文本字节码:
>>> dis.dis(f)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (3)
6 LOAD_FAST 0 (x)
9 BINARY_DIVIDE
10 BINARY_ADD
11 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
*注意:在Python 3中(字节码可能与上面不同),可以通过以下方式找到字节码:
>>> list(f.__code__.co_code)
[124, 0, 100, 1, 124, 0, 27, 0, 23, 0, 83, 0]
Run Code Online (Sandbox Code Playgroud) 我想在运行时为使用Byte Buddy的抽象类创建一个实现,我面临的问题java.lang.AbstractMethodError是,从创建的实例调用方法时会抛出a.我有一个abstract像这样的现有类(我实际上无法修改,实际上包含更多逻辑):
public abstract class Algorithm {
abstract int execute();
}
Run Code Online (Sandbox Code Playgroud)
使用以下最小样本,我希望我的Algorithm实例返回一个常量值:
Class<?> type = new ByteBuddy()
.subclass(Algorithm.class)
.method(ElementMatchers.named("execute"))
.intercept(FixedValue.value(42))
.make()
.load(classLoader, ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
Algorithm instance = (Algorithm) type.newInstance();
System.out.println(myInstance.execute());
Run Code Online (Sandbox Code Playgroud)
然而,这会导致以下异常:
Exception in thread "main" java.lang.AbstractMethodError: package.Algorithm.execute()I
Run Code Online (Sandbox Code Playgroud)
(当我实验性地Algorithm改为a时interface,一切正常,但这并不能解决我的具体问题).
因为Scala还生成字节码并由JVM执行.我想知道JVM如何区分Scala字节码和Java字节码.有人可以解释一下吗?
Scalac Myprogram.scala
java Myprogram
Run Code Online (Sandbox Code Playgroud)
所以这句话完全没问题?
当天早些时候,我正在大量尝试使用docstrings和dis模块,并且遇到了一些我似乎找不到答案的东西.
首先,我创建一个test.py包含以下内容的文件:
def foo():
pass
Run Code Online (Sandbox Code Playgroud)
就是这样,没有别的.
然后我打开一个解释器来观察程序的字节码.你可以这样得到它:
code = compile(open('test.py').read(), '', 'exec')
Run Code Online (Sandbox Code Playgroud)
第一个参数是字符串形式的代码,第二个参数用于调试目的(将其留空即可),而第三个参数是模式.我都试过single和exec.结果是一样的.
在此之后,您可以使用反编译字节码dis.
>>> import dis
>>> dis.dis(code)
Run Code Online (Sandbox Code Playgroud)
字节码输出是这样的:
1 0 LOAD_CONST 0 (<code object foo at 0x10a25e8b0, file "", line 1>)
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (foo)
9 LOAD_CONST 1 (None)
12 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
合理的,对于这样一个简单的脚本.它也是有道理的.
然后我尝试通过命令行编译它,如下所示:
$ python -m py_compile test.py
Run Code Online (Sandbox Code Playgroud)
这导致生成字节码并将其放置在test.pyc文件中.内容可以再次拆卸:
>>> import dis
>>> dis.dis(open('test.pyc').read())
Run Code Online (Sandbox Code Playgroud)
这是输出:
>> 0 ROT_THREE
1 <243> 2573
>> 4 …Run Code Online (Sandbox Code Playgroud) bytecode ×10
java ×6
class ×2
python ×2
scala ×2
byte-buddy ×1
c ×1
c++ ×1
classloader ×1
disassembly ×1
editor ×1
interface ×1
interpreter ×1
jvm ×1
perl ×1
pyc ×1