This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -197,7 +197,7 @@ function hide_canvas() {
<p>我们都知道 Java 是一种基于虚拟机的静态类型编译语言。那么常见的语言可以怎么分类呢?</p>
<h4>1编程语言分类</h4>
<p>首先,我们可以把形形色色的编程从底向上划分为最基本的三大类:机器语言、汇编语言、高级语言。</p>
<p><img src="assets/g6xl5.png" alt="66340662.png" /></p>
<p><img src="assets/g6xl5.png" alt="png" /></p>
<p>按《计算机编程语言的发展与应用》一文里的定义:计算机编程语言能够实现人与机器之间的交流和沟通,而计算机编程语言主要包括汇编语言、机器语言以及高级语言,具体内容如下:</p>
<ul>
<li>机器语言:这种语言主要是利用二进制编码进行指令的发送,能够被计算机快速地识别,其灵活性相对较高,且执行速度较为可观,机器语言与汇编语言之间的相似性较高,但由于具有局限性,所以在使用上存在一定的约束性。</li>
@@ -238,8 +238,8 @@ function hide_canvas() {
<p>现在我们聊聊跨平台,为什么要跨平台,因为我们希望所编写的代码和程序,在源代码级别或者编译后,可以运行在多种不同的系统平台上,而不需要为了各个平台的不同点而去实现两套代码。典型地,我们编写一个 web 程序,自然希望可以把它部署到 Windows 平台上,也可以部署到 Linux 平台上,甚至是 MacOS 系统上。</p>
<p>这就是跨平台的能力,极大地节省了开发和维护成本,赢得了商业市场上的一致好评。</p>
<p>这样来看,一般来说解释型语言都是跨平台的,同一份脚本代码,可以由不同平台上的解释器解释执行。但是对于编译型语言,存在两种级别的跨平台: 源码跨平台和二进制跨平台。</p>
<p>1、典型的源码跨平台C++ <img src="assets/2hieg.png" alt="71212109.png" /></p>
<p>2、典型的二进制跨平台Java 字节码): <img src="assets/987sb.png" alt="71237637.png" /></p>
<p>1、典型的源码跨平台C++ <img src="assets/2hieg.png" alt="png" /></p>
<p>2、典型的二进制跨平台Java 字节码): <img src="assets/987sb.png" alt="png" /></p>
<p>可以看到C++ 里我们需要把一份源码,在不同平台上分别编译,生成这个平台相关的二进制可执行文件,然后才能在相应的平台上运行。 这样就需要在各个平台都有开发工具和编译器,而且在各个平台所依赖的开发库都需要是一致或兼容的。 这一点在过去的年代里非常痛苦,被戏称为 “依赖地狱”。</p>
<p>C++ 的口号是“一次编写,到处(不同平台)编译”,但实际情况上是一编译就报错,变成了 “一次编写,到处调试,到处找依赖、改配置”。 大家可以想象,你编译一份代码,发现缺了几十个依赖,到处找还找不到,或者找到了又跟本地已有的版本不兼容,这是一件怎样令人绝望的事情。</p>
<p>而 Java 语言通过虚拟机技术率先解决了这个难题。 源码只需要编译一次,然后把编译后的 class 文件或 jar 包,部署到不同平台,就可以直接通过安装在这些系统中的 JVM 上面执行。 同时可以把依赖库jar 文件)一起复制到目标机器,慢慢地又有了可以在各个平台都直接使用的 Maven 中央库(类似于 linux 里的 yum 或 apt-get 源macos 里的 homebrew现代的各种编程语言一般都有了这种包依赖管理机制python 的 pipdotnet 的 nugetNodeJS 的 npmgolang 的 deprust 的 cargo 等等)。这样就实现了让同一个应用程序在不同的平台上直接运行的能力。</p>