用无术语的探索进行神秘化。
我们经常听到,学习甚至使用我们不完全理解的术语或短语。 我发现这在软件开发社区中非常普遍,无论是RESTful Web API,敏捷方法,机器学习还是其他术语。 这不一定是一件坏事,但重要的是要了解何时真正知道某事以及何时仅知道其名称。
对我来说,系统编程就是这样一个术语。 我想尝试用简单的语言解释这意味着什么。
什么是系统?
在我们了解系统编程需要什么之前,我们首先需要了解系统是什么。 软件往往属于系统软件和应用软件两个阵营之一。
系统软件是旨在为其他软件提供平台的计算机软件。 系统软件的示例包括操作系统,计算科学软件,游戏引擎,工业自动化以及软件即服务应用程序。
…此类软件通常可以卸载而不会影响其他软件的功能,因此不视为系统软件。
— wikipedia.org
系统软件是一个平台,由操作系统(OS)程序和服务组成,包括设置和首选项,文件库以及用于系统应用程序的功能。 系统软件还包括运行基本计算机硬件和外围设备的设备驱动程序。
— techopedia.com
系统软件是指组成计算机操作系统的文件和程序。 系统文件包括功能库,系统服务,打印机和其他硬件的驱动程序,系统首选项以及其他配置文件。 系统软件的一部分程序包括汇编器,编译器,文件管理工具,系统实用程序和调试器 。
— techterms.com
Wikipedia的定义在系统软件上含糊不清,只要它为其他应用程序提供服务即可。 但是,其他两个定义仅专注于操作系统-驱动程序,内核,库和函数(请考虑内核/ libc头文件和共享对象)。 这暗示了与硬件的紧密关系。 如果我们查看有关系统编程的另一篇Wikipedia文章, 则会看到:
系统编程需要高度的硬件意识。
本文继续暗示,系统编程的核心部分是对事物的快速需求。 这很有意义,为什么我们需要了解很多有关硬件的知识。 如果速度(性能)是其他软件的平台,那么它也将成为系统编程的核心部分。
如果应用程序的最核心部分(系统软件“平台”)运行缓慢,则整个应用程序运行缓慢。 对于许多应用程序,尤其是大规模应用程序,这将是一个大问题。
简而言之,系统软件
上面的引号和其他资源[1] [2]使我遵循以下标准来定义系统软件:
- 提供一个平台来构建其他软件。
- 直接或紧密与计算机硬件接口,以获得必要的性能并公开抽象(作为平台的一部分)。
什么是系统软件和什么不是系统软件
什么是系统软件的示例:
- OS内核
- 车手
- 裸机虚拟机管理程序(例如Hyper-V和VM Ware ESXi )
- 编译器(产生本机二进制文件)和调试器
不是系统软件的示例:
- GUI聊天应用程序(Slack,Discord等)
- 基于Web的JavaScript应用程序
- Web服务API
您会注意到,虽然Web Service API为其他软件提供服务,但它们(通常)不与硬件进行交互以公开其抽象。 但是,有些应用程序位于中间的灰色区域内。 想到的是高性能计算应用程序和嵌入式软件。
高性能计算(HPC)应用程序(例如,证券交易所的实时交易)通常不会公开平台,但是它们编写直接与硬件接口的代码是很常见的。 一个示例是绕过内核提供的网络堆栈,并实现直接与NIC对话的自己的网络堆栈。 通过这种方式,我们可以看到HPC软件如何与系统软件共享许多相似之处,方法是直接与硬件交互以提供所需的性能提升。
嵌入式软件开发与系统软件也有许多相似之处,因为代码被编写为直接与硬件接口。 但是,提供的任何抽象通常都由同一软件使用,因此不能视为平台。
请务必注意与我们对系统软件的定义具有相似之处的应用程序,因为您可能会看到这些术语中描述的那些应用程序/工作(系统软件,系统工程师等)
系统编程(+语言)
定义系统后 ,我们现在可以将系统编程定义为使用系统编程语言构建系统软件的行为。 很简单吧?
好吧,我们跳过了一件事,语言。 人们经常以诸如“ X很棒,它快速,编译和使用系统编程语言”之类的方式谈论系统编程语言。 但是,关于系统编程语言,每个人是否都在同一页面上?
根据我们对系统的定义, 我将系统编程语言的标准定义为:
- 编译为本地二进制
- 可以在不依赖其他软件(包括内核)的情况下构建
- 性能特征类似于其他系统编程语言
免责声明:这是我的定义。 由于没有设定的标准,因此我在定义系统软件的上下文中,从对我有意义的定义中得出了定义。
编译为本地二进制
如果一种语言无法编译为CPU可以直接解释的可执行文件,那么根据定义,该语言将在平台(例如JVM,Ruby VM,Python VM等)上运行。 这里可能会有一些争论,但是为了简单起见,我认为这是一个合适的标准。
没有依赖
该参数类似于编译为本地二进制文件。 如果该语言始终要求存在一些其他软件才能执行,则说明该语言正在平台上运行。 Go就是一个例子,它包含了标准库。 它需要操作系统的支持才能执行基本操作,例如分配内存,生成线程(以便运行goroutine),内置网络轮询器以及其他操作。 虽然有可能重新实现这些核心功能 ,它创建一个屏障,在这种情况下使用,很容易想象,为什么不是所有的语言,甚至是编译成二进制代码静态,旨在为系统编程语言。
相似的性能特征
这是一个小问题。 但是,可以说,在通常被分类为系统编程语言的语言系统中,性能特征不应存在较大(数量级)差异。 通过特性,我明确地指代执行速度和内存效率。
比较基准的黄金标准是C和/或C ++,通常在比较基准中表示出来,它们以比C / C ++ 慢几个数量级的语言来衡量执行速度。
命名几个
鉴于以上定义,立即想到的语言是C和C ++。 但是,也有一些新语言(例如Rust和Nim)填补了这一空白。 实际上,已经有一个完全用Rust编写的操作系统(RedoxOS )和一个用Nim 编写的内核( nimkernel )。
让我们来谈谈
之前我曾暗示过Go可能不属于“系统编程语言”家族的事实。 但是,就像并非所有应用程序都能很好地适合应用程序软件和系统软件一样,语言也是如此。
人们经常将Go称为系统编程语言,甚至golang.org被引用为:
Go是一种通用语言,设计时考虑了系统编程。
但是,即使这并不是一个完全宣称Go 是一种系统编程语言的声明,也仅仅是因为在设计时就考虑到了它。 我发现它位于中间。
尽管Go确实可以编译为本地二进制文件,但包含有用的低级概念(原始/不安全的指针,字节和int32等本地类型以及内联汇编支持),并且它的性能相对较高; 它仍然需要克服一些挑战。 Go附带了运行时和垃圾收集器。
运行时意味着要在没有内核的环境中运行,需要对运行时进行引导/覆盖。 这更多地涉及到语言的内部实现,在将来的版本中可能会更改。 随着语言的发展,更改需要额外的引导工作。
甲垃圾收集器(GC) 任一装置,其Go是在可用于什么应用程序域,或该GC必须禁用,并用手工存储器管理替换限制。 在无法更换GC的情况下,实时域(由必须在给定时限内完成和/或性能以纳秒为单位定义的操作定义)将不会冒以下不确定的暂停时间: GC。
分布式系统软件
随着对分布式系统的谈论日益增多,以及诸如Kubernetes之类的应用程序变得非常流行,我们听到了许多新词汇,如果我们说实话,我们大多数人都不是完全理解。
到目前为止,我已经看到了术语“ 系统编程”和“ 系统工程师” ,它们实际上是指分布式系统编程和分布式系统工程师。
在本文中,我们已经定义了系统软件,系统语言和系统编程。 然而,当我们谈论分布式系统 , 制度变迁的意义。 虽然我在这里不打算深入探讨具体的差异(主要是因为我仍然需要自己更好地把握它们),但重要的是,我们应该做出这些精神上的区分,并使用更准确的语言,以便避免与那些仍然存在的混淆。学习空间。
希望您喜欢这篇文章,如果您想继续讨论,请留下任何评论。 您可以在Medium上关注我John Murray来了解最新信息,如果喜欢,请please。
参考文献
- [1]:盖伊,沃伦。 Raspberry Pi系统软件参考 。 纽约,纽约:Apress,2014年。印刷。
- [2]:英格兰人,欧文。 计算机硬件,系统软件和网络的体系结构:一种信息技术方法 。 新泽西州霍博肯:威利(Wiley),2009年。印刷。
From: https://hackernoon.com/systems-programming-d5917e41353f