我刚下载了一个应用程序,我想知道他们用什么编程语言编写它。
如果是Java,那么JVM进程会在后台运行吗?
我做了:
% sudo ps -A | grep -i java
没有结果。
我记得在Linux上有一个工具可以在编译的源代码中搜索字符串,但我不记得这个名字了,你知道这样的事吗?
有关我如何找到编程语言的任何建议吗?
答案 0 :(得分:4)
编译是将程序从一种语言翻译成另一种语言的过程。使用计算机语言,就像翻译自然语言一样,通常无法分辨哪些语言是从翻译的,你只能知道它被翻译成哪种语言到。
例如,在您的问题中保留您的示例,如果将Java程序编译为ECMAScript然后运行,则不会运行java
进程。所有你能说的程序都是当前用ECMAScript编写的,但是你无法分辨它之前写的是什么。同样,如果您将Java程序编译为本机机器代码,您将无法告诉它以前是Java程序,您只能告诉它它是本机可执行文件。如果您将Java编译为CIL字节码,那么您可以告诉它的是它是一个CLI程序,但不是以前的程序。
另一方面,如果您将Ruby编译为JVM字节码然后运行它,将成为java
进程运行。但不在任何方面都意味着原始程序是用Java编写的。它只表示运行程序是在JVM字节代码中“写入”的。但是,该程序可能是用任何语言编写的,其中存在编译器,可以通过编码方式编译为JVM。或者,它可能是用JVM字节代码本身编写的,尽管这种可能性很小。存在许多编译为JVM字节代码的编译器语言:Scala,Groovy,Clojure,Fantom,Kotlin,Ceylon,Ruby,Python,ECMAScript,C,PHP,Scheme,CommonLisp,x86本机机器代码,Frege,Ioke, Seph,...我相信在JVM上实现了超过500种语言。
现在,这不是完全为真:有时,根据所使用的确切编译器,编译器将在编译代码中留下某些可检测的残留迹线或模式,使您至少可以猜测源语言。例如,主线Scala-to-JVM编译器将在编译的ScalaSig
文件中留下.class
属性,该文件包含无法在有限的JVM类型系统中清晰表示的签名和类型信息。许多X-to-ECMAScript编译器实际上会在编译输出的顶部放置一个注释,其中包含原始源文件的名称以及编译器的名称和版本。等等。具体地说,需要保持关于原始程序的一定量的运行时信息的语言,例如,对于动态类型,动态调度,动态反射,动态优化等,将比能够擦除几乎所有类型和名称的语言更容易识别。
但这不是你可以依赖的东西。
我记得在Linux上有一个工具可以在编译的源代码中搜索字符串,但我不记得这个名字了,你知道这样的事吗?
它简称为strings
,并预装在大多数类Unix操作系统上,包括OSX。