管理计算机上的软件

273 阅读6分钟

本文已参与「博主入驻有礼」活动, 一起开启掘金创作之路。

前置知识

虽然在“软件工程”这门学科中将软件描述为代码+文档,

装在计算机上的软件,在硬盘上是静态的一系列代码、文件的集合,运行时成为动态的进程,会调用操作系统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字符集,因此在中文路径下可能发生读取错误。