“原生”一般想说明的是程序直接编译成单独的可执行文件(机器码)在本机的操作系统层面(用的是本机线程,可以直接访问本机硬件)执行,而不是编译成字节码在虚拟机上执行(Java),或者解释型编程语言直接有虚拟机解释执行( JavaScript)。编译成原生程序有执行速度的优势(没有任何中间层解释的负担),缺点就是不能跨平台(不同的平台可以指不同的操作系统,也可以指底层硬件架构比如不同的CPU架构指令集),能在虚拟机上执行的编程语言只要在不同平台上有相同的虚拟机实现,就被声明为可以跨平台。前者比如 C/C++写的程序,在Windows下编译的exe程序你拿到Linux系统是没法执行的,另外比如你给NVIDIA显卡写的Cuda C++程序拿到装有AMD显卡的机器上也是不能执行的。后者比如Java,所谓的编写一次到处执行(只要该平台装有Java虚拟机)。你也可以看到很多在Java平台上的新兴的编程语言比如kotlin /scala / clojure,其实仅仅意味着它们可以编译成Java 虚拟机执行的字节码而已。
是否是原生执行,这里的界限其实是非常模糊的,因为即使是虚拟机执行,虚拟机底层还是有机器来承载的。你也可以开发编译器直接把Scala代码编译成原生的机器码直接执行。再比如Hotspot Java 虚拟机,可以动态检测热点代码,把这部分热点代码动态编译成机器码执行以获得更快的速度。
当你慢慢看过更多的例子,就能更深刻的理解,特别在前端领域,比如JavaScript引擎,WebAssembly等去了解一下。