我正在尝试了解这些语言在幕后是如何工作的。不幸的是,我只读过非常肤浅的东西。 我会总结我已经知道的,如果你能指正我,我会很高兴,最重要的是,帮助我提高我的一点半知识。
C++:
C++ 编译器预处理所有源文件。这意味着,它实际上将字符串插入到宏最初所在的位置。之后,它为每个包含机器独立字节码的源文件创建一个 .obj 文件。 然后,链接器将库中的所有外部 .obj 文件与自定义的 .obj 文件链接在一起,并将其编译为 .exe。
Java:
Java 代码被编译成独立于机器的“字节码”,它位于 .class 文件中,而后者又可以位于 .JAR 文件中,后者在 JRE 上运行。虚拟机只是在做垃圾清理。 Java 代码像 C# 一样即时编译,但具有 SUN 开发的热点优化。
C#:
几乎与 Java 相同? C# 源代码被编译成 CIL(通用中间语言)代码,它仍然是人类可读的。此代码将由 CLR Just-in-Time 运行。这种编译会在方法首次调用时将其转换为机器特定代码。
我实际上对几乎所有语言都感兴趣...但是 Java 和 C# 几乎相同,我一直想知道它们之间的区别。而 C++ 可以说是“经典”。两者的父亲都没有任何虚拟机。感谢您的帮助!
编辑:我知道这是一个广泛的主题,但我真的找不到任何扎实的知识。如果您有解释此类事情的链接或书籍,我很乐意去上类。我试图阅读 java 虚拟机的 SUN 规范/白皮书,但现在对我来说这有点太深了。
最佳答案
非托管 C++ 的编译与托管 C++、C# 和 Java 的编译非常不同。
非托管 C++(“传统”C++)直接编译成机器代码。程序员调用针对特定平台(处理器和操作系统)的编译器,编译器输出仅在该平台上运行的可执行文件。可执行文件包含特定处理器理解的机器代码。执行时,处理器会直接按原样执行编译后的代码(模虚拟内存地址转换yadda yadda)。
托管代码被编译成中间代码(C# 等 .NET 语言中的 CIL,Java 中的 Java 字节码)。编译器输出包含此中间语言代码的可执行文件。此时,它仍然是平台无关的。执行时,所谓的即时编译器 将启动,在执行之前将中间代码转换为机器代码。然后处理器将执行由 JIT 编译器生成的机器代码。大多数时候,该机器代码保存在内存中并在程序结束时被丢弃(因此下次必须再次运行 JITting),但是存在永久执行 JITting 的工具。
这样做的好处当然是独立于平台的可执行文件可以在任何平台上运行,但缺点是您需要该平台的执行环境(包括 JIT 编译器)。
关于c# - 编译 c++/c#/java 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3663754/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/