本文已参与「博主入驻有礼」活动, 一起开启掘金创作之路。
前置知识
虽然在“软件工程”这门学科中将软件描述为代码+文档,
装在计算机上的软件,在硬盘上是静态的一系列代码、文件的集合,运行时成为动态的进程,会调用操作系统api;
但想要保证软件正常运行,需要环境+软件+库/依赖相匹配才行
- 环境:
- 操作系统:基本环境,也是可执行文件的直接运行环境;
- 运行环境:如java字节码文件需要运行在jvm里,解释型语言要运行在有解释器的操作系统上,js要在浏览器or Node.js运行;脚本语言/解释型语言在自己的环境中运行,就不需要转换成操作系统的可执行文件;
- java、python等环境安装后,需要将环境的位置添加到操作系统的PATH环境变量中,操作系统和一些依赖该环境的软件会从PATH环境变量下寻找自己的环境
- 软件
- 比程序要大一点的概念,除了一系列指令外,通常包括配置文件、自带的依赖(如安装MC游戏时会自己安装java)
- 因此软件最终都会成为机器能看懂的语言,在硬盘上不论是被编译成的可执行文件,还是脚本语言文件,还是配置文件中的内容,在cpu接触前,都会成为机器语言;
- 库
- 自己的库,如C语言#include的库;Java中的jre就是jvm+基础类库
- 系统提供的动态链接库,如win下的dll、linux的lib文件夹内容;
软件安装方式
源码编译
下载源代码(如redis使用C语言开发、nginx基于c++开发),然后使用对应版本的编译器、项目构建工具等在源码文件夹下编译,最终形成可执行文件。
./configure
make && make install
在不同cpu架构下源码包和编译器会有区别,因为底层的指令集不同;
曾经都是在要运行程序的系统上编译,后来大家都用通用操作系统,所以可以提前编译好直接下载运行
在当前计算机编译另一架构下运行的软件,就是交叉编译,如在linux下将C文件编译成windows用的exe
java代码编译后运行在虚拟机上,但如今云原生在启动速度上占据,spring native和新版jdk也对原生提供支持
go天生支持交叉编译
安装流程和C语言源文件运行流程类似
安装包
msi\exe\rpm\ipk\apk\aab;
安装包也是由源码编译而成的二进制文件;但已经过官方封装,对应某一操作系统,开箱即用。
单独安装安装包可能会遇到安装包之间的依赖问题。
包管理器(依赖管理)
应用商店等也是类似的角色,在官方的服务器上统一管理安装包;有些完整的软件可以直接通过包管理器下载
apt、yum、rpm、pip、winget等,从源(保管安装包的服务器)上下载安装软件或安装包;可以通过写配置文件等操作来指定多个源;
一些包管理器可以帮助解决依赖等问题。
除了软件下载外,这类工具的本职工作是对库、包、容器等进行管理(包括下载),如maven、npm、docker等,有些同时具有项目管理功能
npm
npm 是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。
npm 由三个独立的部分组成:
- 网站
- 注册表(registry)
- 命令行工具 (CLI)
yarn
Yarn 是一个软件包管理器,还可以作为项目管理工具。
代码通过 软件包(package) 的方式被共享。一个软件包里包含了所有需要共享的代码,以及一个描述软件包信息的文件 package.json (叫做 清单)。
用lockfile隔离单个项目的依赖环境;
先全局安装yarn的 二进制文件
安装脚本
如docker,网上有提供脚本直接安装;
可执行文件/脚本文件
可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。
有时被称为“绿色免安装”版,“安装包”其实就是全部程序压缩一下;这种软件安装时不去注册表注册。
如windows下的exe;
任何文件都是有数字(编码)组成的,即使是文本在物理上也是以二进制存储的;在一些编辑器下,exe也可以直接被文本编辑器以字符的形式查看。图片、视频也是二进制文件,但不是可执行文件。
大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
可执行文件就是操作系统可以执行的、不需要指定其他软件来执行的文件。一个文件是不是可执行文件要看操作系统的定义。
pyInstaller可以把py程序打包成exe程序,然后在没有安装python环境的电脑上能运行啦!
But why MC还需要装java,而不是打包成exe?java应该可以打包吧
软件卸载
管理器/控制面板
- 使用包管理器的命令卸载
- windows的控制面板:操作系统找到对应的卸载程序并运行;
- 这样似乎对exe直接运行的软件不行;是因为他们没去注册表报道吗?
软件官方提供卸载程序
windows下比较常见,linux下通常是卸载脚本的形式。
可执行文件
直接删除即可;注意不要只删除了快捷方式。可以对快捷方式右键->打开文件位置找到真正的文件所在处。
软件运行
有些会在内存被更改
守护进程:占端口号,后台运行
阻塞进程:会一直占用当前进程/线程
附录
附录1:注册表
附录2:安装包选择
x86:适用于字长为32位的计算机;因为在386年代所以叫x86;
x86_64、arm64:都适用于64位的计算机;只是叫法不同(intel和amd的不同叫法);
el7:centos7
附录3:为什么不要安装在中文路径下?
安装目录最好不要有中文或空格。同一个中文字符在不同字符集下为不同的数值,(如同一个汉字字符背后在GBK字符集或UTF字符集下的编号不同)但大多字符集的前128个字符通常和ASCII字符集保持一致,为了统一且省事,很多软件读取路径时都只认得ASCII字符集,因此在中文路径下可能发生读取错误。