为什么Sun不做一个C#到Java的字节码编译器?
我们想在JVM 上运行C#代码 我的公司有一个大的C#代码基础.超过一半的代码是我们用于创建,阅读,修改,计算和编写Excel工作簿的核心引擎.我们经常收到客户和潜在客户的问题,询问我们是否要构建引擎的Java版本 - 其中许多对UI根本不感兴趣.我们甚至有一些客户从Java应用程序中使用.NET库的麻烦. 因此,我们想构建核心引擎的Java版本,理想情况下,不维护单独的Java源代码库. eric sink 很好地描述了这个问题很好.我处于类似的位置,除了我们的软件许可包括免版税部署,这使埃里克(Eric)对Mainsoft的选择对我们而言是无关紧要的. 我一直在谷歌搜索" C#到JVM" 几年来每隔几个月就没有欢乐.花了约7年的时间为Java开发了类似的软件,我相信我们在核心引擎中使用的.NET API很容易被封装,并且我们可以使用Java库来完成所需的一切.因此,如果我们只有一个C# - > JVM编译器,我们可以为Java构建核心引擎,而我们将不再需要拒绝想
10 2024-04-17
编程技术问答社区
Java与.NET的性能对比
我写了这个小型代码以比较.NET 4.5和Java 8的性能后,我感到非常惊讶: class ArrayTest { public int[][] jagged; public ArrayTest(int width, int height) { Height = height; Width = width; Random rng = new Random(); jagged = new int[width][]; for (int i = 0; i
16 2024-04-15
编程技术问答社区
为JVM实现C#
有人试图为JVM实施C#吗?作为Java开发人员,我一直在嫉妒地关注C#,但是我不愿意放弃JVM的可移植性和成熟度,更不用说为此的各种工具范围. 我知道JVM和CLR之间存在一些重要的区别,但是有什么样的震撼者吗? 解决方案 CLR和JVM之间存在非常显着的差异. 一些示例: Java没有用户定义的值类型 java generics 完全与.net generics 完全不同 C#的许多方面取决于框架的要素 - 委托等.您也需要移植库,即使是 Language 方面. Java不支持JVM级别的属性和事件.您可以伪造其中的一些,但不会相同. 我不认为Java甚至在JVM级别 与不同的内存模型有关的微妙之处很可能会咬人,尽管我不确定C#规格中有多少. 通常在Java中可能无法使用不安全的代码 与本机代码的互操作性在JNI和P/Invoke之间非常不同.这可能不是您的问题. 您必须伪造操作员超载和用户定义的转换 您可能可以将c#的 lot 移植
10 2024-04-14
编程技术问答社区
内存中的方法表示是什么?
在考虑Java/c#中的编程时,我想知道如何属于对象在内存中表示的方法以及该事实如何涉及多线程. 是单独内存中每个对象实例化或执行的方法 同一类型的所有对象共享该方法的一个实例? 如果后者,执行线程如何知道哪个对象 要使用的属性? 是否可以修改方法的代码 C#具有一个反射,只有一个对象的一个​​对象 相同类型? 是不使用类属性始终安全的静态方法吗? 我试图决定这些问题,但我对他们的答案非常不确定. 解决方案 您的源代码中的每种方法(在Java,C#,C ++,Pascal中,我认为每种OO和过程语言...)在二进制文件中和内存中只有一个一个复制. 一个对象的多个实例具有单独的字段,但都共享相同的方法代码.从技术上讲,有一个过程采用隐藏的this参数,以提供对对象上执行方法的幻想.实际上,您正在调用一个过程和传递结构(一袋字段)以及其他参数.这是一个简单的Java对象,或者或更无效的伪C代码: class Foo { private int x;
10 2024-04-11
编程技术问答社区
Pragma Pack使用C库导致jvm崩溃
我使用JNA在我的Java代码中使用了C库.我有这些C结构的成员需要在Java上打印.由于内存的对齐和填充,大小与我实际期望的不同.因此,我使用了Pragma Pack,这就是结构现在的样子. #define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) ) PACK( typedef struct { size_t size; uint8_t bytes[48]; } ipj_tid_t); PACK( typedef struct { bool has_epc; //1 ipj_epc_t epc; //64+8 bool has_tid; //1 ipj_tid_t tid; //48+8 bool has_pc; //1 uint32_t pc; //4 bool ha
12 2024-04-09
编程技术问答社区
如何对Native JNI库进行剖析
如何介绍用C? 编写的Java本机界面库 我知道通常的C剖面师,但是我的问题是如何介绍 thotle 设置,包括对JVM方法的调用,这可能正在减慢程序的速度. 解决方案 在进行了一些研究和测试之后,此处提出的一些方法最终使用sprof . 基本上,我遵循可用的说明在此答案中.一些评论: 我必须离开LD_PROFILE_OUTPUT为了使结果/var/tmp/>,否则未生成输出文件. 我分配了LD_PROFILE=libXXXX.so 要获取配置文件,我运行了加载和使用本机JNI库的Java代码,我得到了一个带有分析的文件,结果为: /var/tmp/libXXXX.so.profile 拥有文件后,您可以使用命令阅读它: sprof /path/to/libXXXX.so /var/tmp/libXXXX.so.profile 分析的结果遵循与gprof相同的模板.
16 2024-04-09
编程技术问答社区
使用jni从c中调用java函数
我正在编写一个简单的程序来调用我的C程序中的Java功能. 以下是我的代码: #include #include #include #include #include #include #include #include #include #include #include #include JNIEnv* create_vm() { JavaVM* jvm; JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption options[1]; options[0].optionString - "-Djava.class.pa
20 2024-04-08
编程技术问答社区
不同语言的数组-存储引用,还是原始对象?
我试图将使用数组时的原始内存外观缠绕在原始内存中. 考虑以下Java代码: String a = "hi"; String b = "there"; String c = "everyone"; String[] array = {a, b, c}; 显然,数组持有参考,而不是对象;也就是说,在内存三个引用中有一个连续的数组,每个引用都指向对象所在的内存中的其他位置.因此,物体本身不一定坐在三个连续的水桶中.而是参考是. 现在考虑以下内容: String[] array = {"hi", "there", "everyone"} 我想在这种情况下,字符串存在于内存中的所有其他常数,然后数组对记忆中的这些常数进行引用?因此,同样,在原始内存中,数组看起来不像['h', 'i', '\0', 't', 'h', 'e', 'r', 'e'... (etc)]. (为方便起见,使用C风格终止).相反,更像['a83a3edf' ,'a38decd' ... (e
8 2024-04-08
编程技术问答社区
JVM跳转指令的偏移量怎么会是32768?
写回答有关JVM字节代码偏移问题的回答,我注意到Javac和Javac和The的行为我无法解释的结果类文件: 编译这样的课时 class FarJump { public static void main(String args[]) { call(0, 1); } public static void call(int x, int y) { if (x
16 2024-04-08
编程技术问答社区
main函数没有返回任何东西。为什么?
关于C/C ++ Main()必须始终返回整数(零以表示成功,而非零以表示故障).我可以理解这一点,因为程序运行将成为一个过程,并且每个过程都应该具有退出状态,而我们通过进行Echo $来获得?该过程结束后的外壳. 现在我不明白为什么主要方法不返回Java中的任何内容?它与该程序在JVM上运行,JVM流程可重新归还出口状态是否有任何关系? ? 请澄清. 谢谢, 罗杰 解决方案 如果单个螺纹Java应用程序的主要方法终止,则该应用程序将用退出代码0终止.如果您需要其他退出代码,也许要指示错误,则可以放置 System.exit(yourNumberHere); 代码中的任何地方(尤其是在主要方法之外). 这对于多线程应用程序有所不同,其中您必须从kill -9内部从外部使用System.exit以停止JVM. 这是一个快速示例,其中终止Main不会停止应用程序(典型服务或守护程序行为): public static void mai
10 2024-04-08
编程技术问答社区
Java中的字符大小与C语言相比
为什么Java中的一个角色占用了C? 中的角色的两倍以存储空间 解决方案 在Java字符中是16位,C是8位. 一个更一般的问题是为什么这样? 找出为什么需要查看历史并得出结论/意见 . 在美国开发C时,ASCII在那里是非常标准的,您确实需要7位,但是有8位也可以处理一些非ASCII字符.这似乎足够了.许多基于文本的协议(例如SMTP(电子邮件),XML和FIX)仍然仅使用ASCII字符.电子邮件和XML编码非ASCII字符.二进制文件,插座和流仍然只有8位字节本机. btw:c可以支持更广泛的字符,但这不是普通的char 开发Java时,16位似乎足以支持大多数语言.从那时起,Unicode已扩展到65535以上的字符,Java不得不添加对utf-16字符的CodePoint的支持,并且可以是一个或两个16位字符. 因此,使一个字节和char当时有意义的16位值是有意义的. btw:如果您的JVM支持-XX:+UseCompressed
6 2024-04-07
编程技术问答社区
了解JNI参数的安全访问
我正在进行一些有关热点在JNI代码运行时如何执行垃圾收集和/或堆积的研究. 似乎很常见,可以随时在Java中移动对象.我试图理解JNI是否受到影响垃圾收集的影响.存在许多JNI功能,以明确防止垃圾收集.例如GetPrimitiveArrayCritical.如果参考确实确实是挥发性的,则存在这样的功能是有道理的.但是,如果不是. 是没有道理的. 似乎在此主题上有大量相互矛盾的信息,我正在尝试解决. JNI代码在SafePoint中运行并可以继续运行,除非它调用 返回Java或调用一些特定的JVM方法,此时 可能会停止以防止离开SafePoint(感谢Nitsan 评论). JVM使用什么机制停止世界暂停期间的块线 以上使我认为垃圾收集将与JNI代码同时运行.那是不安全的,对吗? 要实现本地参考,Java VM为每个引用创建一个注册表 控制从Java过渡到本机方法.注册表地图 对Java对象的不可移动的本地引用,并保留对象 从垃圾收集.所有的Java对
12 2024-04-06
编程技术问答社区
在JVM之上运行/解释C语言?
有没有办法在JVM顶部运行普通C代码? 不通过JNI连接,就像您可以通过Jruby运行Ruby Code,或通过Rhino运行Ruby Code. 如果没有当前的解决方案,您建议我该怎么办? 显然,我想尽可能多地使用其他局部解决方案来实现它. antlr似乎是一个很好的起点,拥有完整的" ANSI C"语法实现... 我应该使用ANTLR生成的代码在JVM上构建"玩具" VM? 解决方案 更新了2012-01-26:根据公司网站上的此页面该产品已被收购,不再可用. 是. 这是一种商业c编译器,生产JVM ByteCode . 其他解决方案 还有另外两种开源可能性: jpc 在JVM中模拟整个X86 PC,并且能够同时运行DOS和Linux . 其他解决方案 似乎 lljvm 也可以满足您的要求. lljvm:源代码首先由LLVM-GCC或Clang等前端汇编为LLVM中间表示(IR).然后将LLVM IR转换为Jasmin
10 2024-04-06
编程技术问答社区
Java运行时性能与本地C/C++代码的对比?
与C ++或C一起,我在Java中变得越来越舒适.我希望能够了解使用JVM解释器产生的性能命中,而不是本地执行相同的"项目".我意识到这里有一定程度的主观性.该计划的质量将在很大程度上取决于良好的实施.我对以下方面的一般意义感兴趣: 使用解释器时,必须有一些基线.是否有一些一般的经验法则要记住? 10%15%? (我从稀薄的空气中拉出了这些数字)我已经阅读了偶尔的博客,指出Java代码几乎与本机代码一样快,但我认为这可能是有偏见的. JVM垃圾收集器是否为运行时性能增加了大量的开销?我知道可可应用程序已经开始使用垃圾收集模型,我同意它使编程变得更加简单,但是以什么成本? 从Java进行系统调用的开销是什么?例如,与C套接字API相反,创建套接字对象. 最后,我记得在某处阅读JVM实现是单线线程.如果这是真的(我对此表示怀疑),这是否意味着Java线程真的不是真实的线程?通常,Java线程是否对应于基础内核提供的线程? Java应用程序是否以本机应用程序从多个内核/
12 2024-04-06
编程技术问答社区
是否可以用sun.misc.Unsafe来调用C函数而不用JNI?
C/C ++代码可以提供带有一系列功能指针的JNI方法.但是,是否有一种方法可以直接从Java代码内部(不使用JNI或类似)来堆叠数组指针指向的功能? JNI以某种方式做类似的事情,因此必须有一种方法. JNI如何做到?是通过sun.misc.unsafe吗?即使不是这样,我们也可以使用一些不安全的解决方法来获取执行此操作的JVM代码吗? 当然,我不打算在商业上使用它.我什至不是专业人士,我真的很喜欢编码,而且我最近一直在研究CUDA,所以我认为也许我可以尝试将所有内容混合在一起,但是JNI呼叫的开销将失去GPU加速代码的目的./p> 解决方案 JNI慢吗? jni已经经过了很多优化,您应该先尝试一下.但这确实具有一定的开销,请参阅详细信息. 如果本机功能简单并且经常称呼,则此开销可能很重要. JDK具有称为关键本地的私人API,以减少不需要JNI功能的呼叫功能的开销. 关键本地人 一种本地方法必须满足以下条件,以成为关键本地人: 必须是静态和不同
12 2024-04-06
编程技术问答社区
Java中的自定义类加载器
可以在Java中制作我自己的自定义类加载程序.如果是,请引导我. 我想在类文件中更改类,而不是类混淆,以便任何工具都无法反转 解决方案 您可以使用一些混淆工具,例如Proguard. 必须将一个自写的classloader放在标准.class文件中,JVM可以加载它.然后,您可以固定加载程序进行逆向工程. 不要自己做.编写"安全"代码而不知道加密算法将导致容易出错的不安全代码 其他解决方案 import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; /**
32 2024-04-05
编程技术问答社区
有什么理由不把 invokevirtual 和 invokeinteface 的字节码指令合二为一呢?
是否有任何理由使指令将非静态非构造方法调用到两个不同的指令中,而不是一个统一的指令,例如invokeinstance?它与一些随机的内部JVM机制有任何关系,还是另一个恐怖的遗产问题? 我知道我们有invokespecial,因为调用构造函数需要名称ckecking,已执行了另一个构造函数,等等,以及invokestatic,因为我们不需要objectref 倒入新的堆栈框架.但是,它没有易于找到的理由,太阳选择将可能的通用指令助长到invokevirtual和invokeinterface中.不透传它,ASM代码可能会更简单得多,因为我们不必浏览所有超级界面即可查看这是否是接口方法,而是构建代码conplexity. 解决方案 InvokeInterface是不同的,因为接口仅在运行时进行类型检查.使用虚拟方法,您可以静态地确定类型是定义方法的类的子类型.对于接口,无法确定该值是否具有在不知道值的运行时类型的情况下实现该接口的类型. 考虑以下伪代码(请注意,在Jav
10 2024-04-05
编程技术问答社区
JVM、常量池、堆和地址。
如果我在茉莉花汇编中创建一个新项目,然后将其存储,我会使用Aload的指令进行操作,因为它是一个地址: new Object dup invokespecial..... astore_3 ; load the object reference into local variable 3 现在,如果我想从常量池中保存一个字符串...我将使用LDC创建它,然后也将其保存使用: : ldc "Great string" astore_3 ; save the reference to the actual string in the constant pool 现在...这些地址是否在相同的形式和相同数量的字节上?由于我使用相同的指令加载并存储这些项目,因此JVM必须能够区分属于恒定池中的地址和堆中的地址? 检查字节码后,似乎在我的情况下,在常数池中的实际地址只是一个字节索引(我想对常量池的主要引用也保留在某个地方)
12 2024-04-05
编程技术问答社区
JVM中的指令数
我今天在考试中被问到以下问题.我仍然不知道答案. Java在JVM中使用堆栈进行字节代码.每个指令都是一个字节,因此在操作系统中可以使用多少个这样的说明(每个字节代码). 我所知道的是,堆栈宽32位.有人可以帮助我(我是JVM的初学者)? 解决方案 预期的答案几乎可以肯定是256,因为一个字节可能有256个可能的值. 这当然与实际的JVM指令集无关.可能的说明数量可能从几十个到指数的数量不等,具体取决于您的计数. 实际的JVM指令集具有许多未使用的OPCODES,一个在概念上代表多个指令的OPCODE,并且可以用多种不同的Opcodes以多种不同方式编码的许多指令.许多说明是一个以上的字节,一对夫妇最多可以长64kb.而且,这甚至还没有涉及您如何计算宽前缀的方式.
14 2024-04-05
编程技术问答社区