我想破解Python解释器并尝试创建一个小型DSL.是否有任何模块我可以做这样的理论代码(类似于LINQ表达式树)?
expression_tree = Function(
Print(
String('Hello world!')
)
)
compile_to_bytecode(expression_tree)
Run Code Online (Sandbox Code Playgroud)
或者只是更容易生成Python源代码?使用C或SWIG或Cython可以使这更容易吗?
我在一家使用FreeRTOS为多个设备创建固件的公司工作.最近,我们对新功能的要求超过了我们的固件工程师能够完成的工作量,但我们现在也无法雇用任何新功能.即使是微小的变化也需要固件人员进入并修改非常低的水平.
我一直在为FreeRTOS寻找某种解释性语言项目,让我们在更高层次上实现新功能.理想情况下,我想最终得到的东西让设备变得更接近通用计算机,我们编写驱动程序,而不是我们自己必须实现每个功能.
有没有解释java,python或类似字节码的FreeRTOS项目?
我看过google,但由于我自己不是固件工程师,所以我不确定我是否在寻找合适的关键字.
感谢大家
很可能是一个愚蠢的问题,因为我对Java/Jython/JRuby /字节码不太了解,但..
今天我偶然发现了_why的邪恶 ......它允许你从Ruby代码输出Python字节码.基本上允许它们生成相同的字节码..
Jython输出Java字节码,就像JRuby一样.由于这些都编译为相同的字节码,这是否意味着您可以使用Ruby中的任何Python库和Python中的Ruby库?
在我的Java项目中,我想以编程方式找出使用给定API中的哪些类.有没有一个好方法呢?通过源代码解析或字节码解析可能吗?因为反射不会有任何用处,我担心.
为了简单起见:import com.mycompany.api.*;我的项目中没有任何通配符import(),没有完全限定的字段或变量定义(private com.mycompany.api.MyThingy thingy;),也没有任何Class.forName(...)构造.鉴于这些限制,我认为它可以归结为解析import语句.有没有一种首选的方法来做到这一点?
有谁知道为什么在Java 6中不推荐使用JSR/RET字节码对?
我在网上发现的唯一有意义的解释是,他们通过运行时进行代码分析更难以执行.有谁知道另一个原因?
我正在研究一种基于Scala的脚本语言(内部DSL),它允许用户在Scala脚本文件中定义多个数据转换函数.由于这些功能的应用可能需要几个小时,我想将结果缓存在数据库中.允许用户更改转换函数的定义以及添加新函数.但是,然后用户使用略微修改的脚本重新启动应用程序,我只想执行已更改或添加的那些功能.问题是如何检测这些变化?为简单起见,我们假设用户只能调整脚本文件,以便可以假定对此脚本中未定义的内容的任何引用都不会更改.
在这种情况下,检测此类用户定义函数的更改的最佳实践是什么?
到现在为止我虽然:
然而,这三种方法都存在缺陷.
有人有这些"解决方案"的经验或者可以建议我更好吗?
有没有一种简单的方法可以从带有操作码及其参数的2元组列表中创建Python字节码?
例如:
>>> bytecode_compile([
('LOAD_CONST', 2),
('STORE_FAST', 'a'),
('LOAD_FAST', 'a'),
('RETURN_VALUE',)])
'd\x01\x00}\x00\x00|\x00\x00S'
Run Code Online (Sandbox Code Playgroud) 我一直在使用Javassist在加载类时动态操作类.虽然使用Javassist向代码添加代码相对容易,但我还是找不到删除代码的方法.
这时我通过使用nop指令来替换目标操作码和任何参数来模拟代码的删除.但是,我认为这主要是一个黑客攻击:
每个操作码必须单独处理,因为参数的字节长度不同.在某些情况下,我还需要在nop和pop之间进行选择,具体取决于删除的操作码是否影响堆栈.这种操作开始变得乏味 - 并且执行它的代码变得相当复杂.所以,当然,我希望有一个现有的解决方案.
最终结果充满了nop指令.虽然JVM应该优化那些没有性能影响,但结果字节码仍然非常不优雅,并且应该比它更大.这更像是一个美学问题,但它仍然需要考虑.
不幸的是,仅仅移动字节码数组的部分来填补空白是不够的 - 任何对移动代码的引用(例如分支指令索引)也应该更新.
是否可以使用Javassist删除指令?或者,是否有一个字节码操作库,可以让我轻松地做到这一点,而不必自己解析字节码?
我最近遇到了开发一个库,该库在JVM字节码上执行了一些操作码,在这些操作码上没有文档(我已经找到),但是JVM参考实现可以识别它们.我找到了这些列表,它们是:
BREAKPOINT = 202;
LDC_QUICK = 203;
LDC_W_QUICK = 204;
LDC2_W_QUICK = 205;
GETFIELD_QUICK = 206;
PUTFIELD_QUICK = 207;
GETFIELD2_QUICK = 208;
PUTFIELD2_QUICK = 209;
GETSTATIC_QUICK = 210;
PUTSTATIC_QUICK = 211;
GETSTATIC2_QUICK = 212;
PUTSTATIC2_QUICK = 213;
INVOKEVIRTUAL_QUICK = 214;
INVOKENONVIRTUAL_QUICK = 215;
INVOKESUPER_QUICK = 216;
INVOKESTATIC_QUICK = 217;
INVOKEINTERFACE_QUICK = 218;
INVOKEVIRTUALOBJECT_QUICK = 219;
NEW_QUICK = 221;
ANEWARRAY_QUICK = 222;
MULTIANEWARRAY_QUICK = 223;
CHECKCAST_QUICK = 224;
INSTANCEOF_QUICK = 225;
INVOKEVIRTUAL_QUICK_W = 226;
GETFIELD_QUICK_W = 227;
PUTFIELD_QUICK_W = 228;
IMPDEP1 …Run Code Online (Sandbox Code Playgroud) 关于Java 8中的流,有大量关于流的信息和教程.我发现的大部分内容都很好地解释了流的各个元素如何在概念层面上工作.但是,我没有遇到过很多材料,这些材料描述了JVM实际上如何实现和执行流.
考虑比较Collection使用流和使用旧学前Java 8方式的操作.底层的Bytecodes在这两种方法之间看起来是否相同?性能是否相同?
为了使这个具体,请考虑以下示例,其中我需要找到名称中包含单词"fish"的所有鱼,然后将每个匹配鱼的第一个字母大写.(是的,我知道Hagfish实际上并不是一条鱼,但是我用完了匹配的鱼名.)
List<String> fishList = Arrays.asList("catfish", "hagfish", "salmon", "tuna", "blowfish");
// Pre Java-8 solution
List<String> hasFishList = new ArrayList<String>();
for (String fish : fishList) {
if (fish.contains("fish")) {
String fishCap = fish.substring(0, 1).toUpperCase() + fish.substring(1);
hasFishList.add(fishCap);
}
}
// Java-8 solution using streams
List<String> hasFishList = fishList.stream()
.filter(f -> f.contains("fish"))
.map(f -> f.substring(0, 1).toUpperCase() + f.substring(1))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
您可能对这两种方法在Bytecode级别下可能有何不同的见解会很有帮助.而一些实际的字节代码会更好.