为什么要讲大程序的构成与扩展?主要是实践的需要。因为但凡是有一定用处的软件,在工程实践中,大多都非一个模块所支撑。有几个到几十个动态库、静态库,都是很正常的,也是在所难免的。关于静态库与动态库的编译和连接,以及它们的优劣,在前面介绍了很多,这里就不再重复。库的方式,不单单在节省系统存储和内存上有很大优势,而且,在模块化协助方面,也是有很多用处的。比如,将一些功能相对独立的模块,编译为动态库,然后配合头文件,既可以提供给企业内部,作为隔离;也可以提供给外部,进行集成。这样可以避免核心代码外泄,便于商业应用。而且,无论是在内部还是外部,模块的替换、更新,都会方便很多。如果涉及到升级,也不用整体升,只需要替换相关的动态库就可以了,不仅可以减少升级包的大小,也能够简化升级流程,较少对用户的干扰,提升用户体验。

如上图所示,一个软件,我们可以认为是由很多部分拼接而成,每个部分都承担了一定的功能。可执行文件本身作为对外交流的入口和接口,承担了总控制器的角色。而构成程序的各个库,则是一个个独立的功能模块。除了程序自身独用的库,在现代系统环境下,每个程序还会用到操作系统或者语言本身的库,比如加载库的库,C或者C++标准库等。这就是上图中最底层的依赖库部分。

除了库的概念,我们常听到或者遇到的,就是插件的概念。相对于动态库,插件是一种更加延后的扩展技术。只要约定好同主程序的接口,那么同样的功能,就可以由不同的人,开发不同的插件来完成。插件技术,也广泛存在于软件工程实践中。

关于插件本身的实现方式,可以是动态库,也可以是一个新的可执行程序,还可以是脚本等等。

插件是一种遵循统一的预定义接口规范编写出来的程序。应用程序运行时,通过接口规范对插件进行调用,以扩展应用程序功能。插件是提供运行时扩展的很好的技术,当然也有其优缺点:优点自然是扩展个性化的功能,或者可以通过第三方来做很多功能;缺点是复杂,还有安全性、稳定性,这是自然而然引入的。插件典型技术代表有com技术,activx等。浏览器是我们最常接触的、频繁使用插件的软件之一。

下面对插件常采用的具体技术展示讨论。

1 动态库方式。

采用动态库方式,模块跟主程序运行在一个进程空间中。动态库的使用,本质上是借用操作系统提供的机制。这种模式,有两种使用方式,一种是链接时告诉操作系统,我要用到某个动态库,这样编译时会将依赖库信息带到可执行文件中。可执行文件加载时,操作系统检测到需要依赖的动态库,然后到系统环境指定的目录下,找到相关动态库,加载到内存中,供程序使用。如果依赖的动态库已经加载到内存中了,那么,就共享代码空间,从而节省了内存使用。这其实就是虚拟内存提供的支撑。另外一种方式,是在运行中,通过相关接口,主动加载指定目录下的动态库,并提取其中的接口。这种方式灵活性相对更大一些,但是使用相对麻烦一点,属于动态库的延后加载。当然,这种延后加载,比较适合做插件功能。

2 可执行文件方式。

这种方式,模块跟主程序运行在不同的进程空间中,二者通过进程间通信来交互。如何理解这种方式呢?举个通俗的例子。首先,主程序通过特定规则查找或者通过交互接口加载
(运行)可执行文件插件。可执行文件运行后,根据约定规则,采用进程间通信方式,将自己的特性注册到主程序中。主程序接收到信息模板后,将其通过特定接口暴露给用户。这样,用户就可以看到主程序多了一部分功能。当然,插件也可以主动注册到主程序中。

3 脚本方式。

脚本方式其实可以理解为是规则方式。这种规则,主要由主程序的开发者来定义。当然,也可以使用一些通用的规则。怎么理解这种方式呢?可以这样想,我们认为主程序不仅是一个执行自身逻辑的程序,还附带有一个解释器。这个解释器可以专门用来解释规则,执行规则。就相当于程序中存在一个小机器。更通俗的讲,就是一个小虚拟机。这样一来,我们就可以将规则确定的脚本理解为小程序。二者配合,就可以很灵活的实现插件功能。

当然,这些不是实现插件的所有方式。只要满足系统的运行要求,可以有各种各样的扩展程序功能的方式。所以,就看你的想象力了。就像俄罗斯套娃,每一个都是自我完整存在的世界。你也可以在一个程序世界中创造另一个程序世界,从而扩展创世者。

参考:前面所说的程序虚拟内存,可参考下图(第七章已说明):

程序的扩展不能无序进行,就像操作系统对应用程序的要求,当我们的程序变成一个具有平台意味的程序后,同样对其扩展有一定的要求,这就导致架构的需求。架构或平台的这种要求,目标是统一而不失单调性,既有规则,又有自由。下面我们就来看看架构。

从俄罗斯套娃看程序的扩展相关推荐

  1. python程序文件扩展名有_python程序文件的扩展名称是什么

    python程序文件的扩展名称是什么 python程序的扩展名有.py..pyc..pyo和.pyd..py是源文件,.pyc是源文件编译后的文件,.pyo是源文件优化编译后的文件,.pyd是其他语言 ...

  2. java ee的小程序_扩展Java EE应用程序的基础

    java ee的小程序 老实说,"可扩展性"是一个详尽的主题,并且通常没有被很好地理解. 通常,它被认为与高可用性相同. 我已经看到新手程序员和"经验丰富"的建 ...

  3. python源程序文件的扩展名_python程序文件扩展名知识点详解

    python程序文件的扩展名称是什么 python程序的扩展名有.py..pyc..pyo和.pyd..py是源文件,.pyc是源文件编译后的文件,.pyo是源文件优化编译后的文件,.pyd是其他语言 ...

  4. 【收藏】C#面试题整理笔试篇(最全1000+道带答案)300道填空 + 300道选择 + 300道判断 + 70道读程序写结果和看程序填空 + 100道简答题

    <程序员>曾陪伴了无数开发者成长.<新程序员>全新归来,推荐给大家! <新程序员> 一.填空: 1.操作符( && )被用来说明两个条件同为真的情况 ...

  5. Python看程序执行时间(time模块)

    Python看程序执行时间需要用到time模块,该模块提供了各种时间相关的函数.相关功能还可以参阅 datetime 和 calendar 模块. time模块的官方文档https://docs.py ...

  6. noip2014到2017初赛普及组看程序写结果、完善程序

    一晃又是noip2018了 今天先进行普及组初赛摸底 计划做两套题(noip2016.noip2014,这两套题比较中规中矩),分析一下大家的知识点缺陷,然后每个人再进行有针对性的学习. 重点是 看程 ...

  7. 可运行的C语言程序的拓展名,可运行的c语言程序的扩展名为什么?

    可运行的c语言程序的扩展名为".exe".c语言程序经过"编译程序"编译之后,生成一个后缀为".obj"的二进制文件:然后由"连接 ...

  8. OSChina 程序员节乱弹 ——看程序员如何优雅地生活

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @莱布妮子 :分享Eminem/Rihanna的单曲<Love t ...

  9. python程序的文件拓展名主要是_Python程序文件扩展名主要有________和________两种,其中后者常用于GUI程序...

    Python程序文件扩展名主要有________和________两种,其中后者常用于GUI程序 答:py:pyw: 中国大学MOOC: 下列关于我国增值税税率的表述中,不正确的是( ). 答:煤炭适 ...

最新文章

  1. typora新增主题,typora将主题导入本地
  2. [AVR]使用AVR单片机驱动舵机
  3. nvm npm不是内部命令_npm作弊表-最常见的命令和nvm
  4. Symantec Backup Exec System Recovery还原向导
  5. 权限提升 T1548.002 绕过UAC
  6. python爬虫不错的文章
  7. 解析 | K8S之网络插件exec
  8. ***Xcode Interface Builder或Storyboard中可建立那两种连接?
  9. JUC多线程:JMM内存模型与volatile内存语义
  10. 关于laravel框架中and 和orWhere 的多条件嵌套
  11. MIPS 汇编指令学习
  12. 网络知识:WiFi越用越慢,到底是什么原因?
  13. linux中第一个进程的形成,Linux进程管理
  14. 《Unix网络编程卷1:套接字联网API》读书笔记
  15. 管理学基础 形成性考核一
  16. pcie协议_如何通过PCIE协议实现FPGA 配置?详情请戳这里!
  17. c 和易语言如何传字节集,易语言字节集参数传递详解
  18. MAC抓包工具charles(青花瓷)
  19. Windows文件传输小工具,网络传输文件,内网传输
  20. Involution: Inverting the Inherence of Convolution for Visual Recognition(CVPR2021)

热门文章

  1. 微信3.1.0.58逆向-微信3.1.0.58HOOK接口(WeChatHelper3.1.0.58.dll)使用说明-发布群公告(相当于@所有人)
  2. re:Invent现场直击:无处不在的云计算
  3. java反射类型转换_java反射(转)
  4. VS2019 OPENCV C++ 人脸和眼睛识别 01
  5. Android 9.0横屏旋转开机动画显示不全的解决方案
  6. 面试过程中常遇到的Mysql优化方面的面试题
  7. 基于matlab的鼠标的点击小工具
  8. canal+zookeeper+mysql高可用配置
  9. The plugin `fluttertoast` uses a deprecated version of the Android embedding.
  10. 关于Tcpdump抓包总结