什么是程序?
程序 = 算法 + 数据结构。这不是给普通人认识的。
程序是有过程有次序的命令操作的文件整合,可以被系统执行。
比如我执行一个大象放冰箱的程序,其执行过程简单就分为三步:
- 开冰箱门
- 大象赛到冰箱
- 关冰箱门
程序具有确定性。今天你能打开微信,明天微信打不开,宏观看这不确定(其实不确定的是腾子的服务器状况),实际上确定的是为什么打不开,是有原因的。
然而查找程序运行不正常的原因并非是一件容易的事情,谨记。
程序的分类
-
图形化应用
GUI App
,软件具有图形界面窗口,通过鼠标进行控制界面,简化软件的使用。因为常在在系统桌面环境打开软件,又称桌面应用程序, -
命令行应用
CLI App
,只在程序的命令行交互环境下通过命令文本执行。这类程序有些是作为长期运行的后台服务,其可称为服务端程序。命令行应用一般支持命令参数解析,参数即传递给命令行程序的启动选项。
Note
所有的图形化应用都可以在命令行交互环境执行。有鼠标点击,谁还用命令啊。
安装程序与卸载
系统没有的程序,我们要先安装在本地环境才可以使用。通过网络下载应用安装包,然后双击即进入安装环节。Windows程序安装一般可以设置应用安装位置,即程序主体文件存储位置。在Mac和Linux上的程序安装位置多固定不可修改。
软件通过安装器安装可以方便软件更新与管理,故软件安装后不可直接移动程序本体文件夹,避免软件自我管理出错。另外安装器本质也是文件解压的过程。
卸载程序,往往包含清除软件程序本体和软件数据缓存配置两个方面。卸载程序需要注意的是,也不可直接删除程序本体文件夹,程序有可能会在系统内注册特定文件打开,会有影响系统的软件残留。
应在遵循程序的卸载方式进行过程化卸载。
有些程序是未经安装过程(免安装),直接双击就可以运行的程序本体,这类程序提供多以压缩包形式,解压到一个文件夹下即是安装过程,删除文件夹即是卸载。
Tip
有Windows软件安装的推荐建议,这部分将在Windows章节中细说。
程序的运行
图形化应用,鼠标双击运行。
命令行应用,通过执行命令启动程序。
在命令交互环境下,输入命令文本,然后回车即可。
> python -m pip install --update pip
这个就是一个执行python的包管理pip自我更新的命令。由多个文本字符组构成,并以空格区分参数(不计空格数),第一个python
为可执行程序名,这在系统里一定找的到的可执行文件,剩下的就是传递给python的参数(提供给程序/脚本/函数的选项值)。
简单解释一下各个参数:
# --参数名 参数值的组合
-m 启动的python模块
pip 提供给-m的值
# 执行参数 执行可选项 执行目标的组合
install 提供模块pip的参数,意在执行pip安装操作
--update 提供给pip install的选项,为更新安装
pip 这里的pip为install的目标,安装的目标模块为pip
值得注意的是,命令行执行程序并非是安装过的程序,通过给出程序的路径位置信息一样可以执行程序。如 > C:\Windows\explorer.exe D:\Work\records.txt
就是指定用文件资源管理器打开一个records.txt文件。
Help参数
一些命令行是提供help信息的,即附加 --help
或help
如果对于help打印的信息不能清晰认知,可以发给AI问答工具分析分析。
查找命令程序
当我们执行命令的时候,终端给出找不到命令的输出,这代表命令是无效的,要检查对应的程序是否安装,如果确定已装并且不使用相对路径执行程序,那么就要检查环境变量PATH
中是否存在程序的所在路径。
环境变量是一个重要的程序运行概念,将在操作系统章节细讲。
定位程序
如何确定执行的命令程序所安装的位置,在Widnows中可使用 where.exe
程序确定,Linux和mac使用which
即可。
# Windows中
> where.exe python
# Linux 中
> which cd
程序的状态
- 正在运行,程序正在执行访问系统资源,用户体感良好。
- 异常运行,程序看似一直运行,但操作某一步阶段相对之前时间过长、未预期结果。
- 无响应,程序已经被卡住(阻塞),可能因为网络或者本地内存资源紧张导致。等待一段时间若仍未恢复只可终止程序了。
- 闪退,启动完就退出,通常系统环境异常导致满足不了软件运行的条件。
- 崩溃,运行过程中,直接停止运行,并可能连带着影响到其他程序也终止。
- 后台保留,程序关闭运行窗口。但程序的服务程序部分保留运行,通常会带有桌面环境的托盘图标供用户快速打开。前台程序转后台服务。
- 过度占用,程序大量消耗CPU或内存资源,还会影响其他的软件运行。一般软件存在问题
bug
会导致,特别的系统环境也会有这种情况。 - 程序退出后不能重启,
- 一种情况为程序的残留后台还在内存中驻留并未完全退出,需在任务管理器/进程监测器中找到对应的残留进程杀死(电脑重启也行)。
- 另外即缺失程序运行的基本条件,导致程序不能响应。
程序的终止操作
程序点击关闭窗口后,一般的程序即退出,也有一些以后台驻留的形势继续运行,往往在系统的托盘图标区提供最小化的功能图标。
右键托盘图标一般提供退出操作。
当程序不能正常退出时,我们可通过任务管理器/进程管理工具进行手动杀死软件进程(运行中的程序组成)。
命令行程序中,终止程序运行的快捷键操作Ctrl C
这个必须会。
脚本执行
脚本script
,一种特殊的文本文件,包含着要连续执行的命令操作,可以理解为一种可编辑查看执行内容的程序。
脚本通常对应着自动化
的概念,其本质就是帮助人执行固定的操作流。
在Windows上系统支持的脚本有以下几种,
-
.bat .cmd
,传统的Windows脚本,可以双击运行,也可在命令行中调用。 -
.ps1
,powershell的执行脚本,右键可在powershell中运行,也仅可在powershell中执行。
而对于Unix类系统(Linux,MacOS,BSD们)
.sh
,shell脚本,运维工程师眼中的耶路撒冷,Linux的官方认证,此类型在Mac中亦有记载。
像执行程序那样执行脚本就行,一样可以加参数解析,必要可修改脚本本身的一些内容以方便执行。
服务进程&守护进程。
有些程序,是没有前台的,纯后台进程。这类往往承担核心和必要的基础功能,所以基本开机自启,甚至不可终止,Windows中可通过服务
查看,在任务管理器中也能看到运行中的服务进程。Linux中通过systemd
管理服务。Mac中通过launchctl
命令管理。
程序的运行库
如果将所有的程序执行块都封装到一个可执行程序中,这个程序就比较臃肿了,把程序通用的共用的部分抽离出来,封装成一个文件,然后启动程序后,需要这部分的内容时,再加载这个共享程序块文件。既降低了存储占用,也方便了程序打包,甚至可以优化内存占用。这种方式即共享库 / 动态库 链接,共享库就是不包含代码启动执行的程序零件。
一些软件运行失败,有可能原因是动态运行库的缺失。不同的系统,软件程序对依赖的动态库的查找方式不一样。
在Windows上,这类文件为.dll
,系统先从同级文件夹找dll,找不到会从Path
环境变量的路径中逐个查找dll文件。
在Linux和Mac上,这类文件为.so
,Unix也会从特定的lib
目录查找,临时指定手动索引的动态库通过环境变量 LD_LIBRARY_PATH
。