shell 脚本是否与 "close to silicon" 一样?

Is shell script as "close to silicon" as C?

几年前,当我转行编程时,我记得学习了现在很熟悉的低级到高级编程语言的层次结构:机器代码 -> 汇编语言 -> C -> Java, Python, C#等

但是,我总是难以将shell 脚本放入该层次结构。从一个角度来看,在终端中输入 shell 脚本命令是程序员将指令传递给 Linux 机器的最直接方式。然而,我怀疑所有人所做的一切都是将指令传递给 操作系统 ,它充当程序员和实际硬件之间的一种干预中间人。

我记得有人教过 - 这一定是在 2017 年 - shell 脚本是 C 的子集。现在回想起来,我对编程有了更多的了解,这种说法充其量只是对 shell 脚本和 C 的历史共同开发的粗略过度简化,而且可能完全错误。无论如何,如果有人能从历史或技术角度,或两者兼而有之,让我直接了解这两种语言之间的关系,我将不胜感激。

that shell script is a subset of C

绝对不是真的。 sh可能受C的影响,有一些类C的特性,但它是一门完全不同的语言。

最显着的区别是sh没有被编译。是一行一行的运行,或者是一条一条的命令,而C在运行之前需要整体编译。 (这在技术上是不正确的;它存在 C interpreters,但很少使用,严格来说,也不符合 C 标准)

此外,编译与解释并不能说明它是否是高级的。如果与 C 和 Java.

相比,汇编更接近于逐行解释而不是编译

另一个区别是 sh 是一种非常高级的语言。当 C 刚出现时,它被认为是一种高级语言,但那是与汇编相比。今天它被认为是一种低级语言。

I've always had difficulty fitting shell script into that hierarchy.

层次结构“硬件 -> 机器代码 -> 程序集 -> 其他一切”很容易,但拆分“其他一切”并非易事,可以通过多种不同方式完成。究竟应该如何做到这一点往往是非常自以为是的。就个人而言,我会做这样的事情:

Fortran -> C -> Java -> Python -> Sh

基本上,shell 脚本类似于 Python。他们都有自己的解释器(/bin/sh/usr/bin/python),因此 shell 脚本在“语言进化”中排在最后。此外,您可以将 shell 视为类似于用户界面的东西,因为最初创建 shell 是为了启动程序。例如,当您执行 cp file1 file2 时,您会启动名为 cp 的 GNU coreutils 工具。就像一个人说的,shell 是 Unix 的粘合剂。

所以没有,shell根本不“接近硅”。

严格来说“shell”只是一个交互式 REPL。任何提供 REPL 的编程语言都可以令人满意地用作 shell(我知道有人使用 ipython 作为他们的主要 shell)。

就“水平”而言,它可以是从 JIT 编译到本机执行(例如 https://luajit.org/)到标准 Ruby 所做的标记化解释之间的任何东西。

典型的 *nix shell (ash, dash, bash, zsh) 是一个令牌解释器,它通过脚本逐个令牌地自行工作,并且每个令牌都会更改其内部状态因此。将令牌解释器想象成一个 VM,它不对二进制操作码进行操作,而是对人类可读的字符串进行操作。

另外一个 shell 不仅仅是向操作系统传递命令。里面还有很多事情要做。

当您在终端中键入命令时,您离直接与操作系统交互还有很长的路要走。 (它本身通过提供许多有用的服务在您和硬件之间进行调解。)

首先,您正在查看由“window 经理”绘制在屏幕上的图像。 window 管理器只是另一个程序,根本不是操作系统的一部分(至少在 Linux 和其他类 Unix 系统的情况下是这样。)

顾名思义,window管理员主要负责windows在屏幕上的排列; windows 的内容由您正在 运行 的各种程序生成,这些程序指示 window 管理器在为它们保留的矩形中绘制什么。

您可以通过 window 管理器 运行 的其中一个程序是所谓的“终端”,更准确地说是“终端仿真器”。这个名字来源于你通过一个独立的设备与你的计算机交互的日子,它有自己的屏幕,它接受计算机通过串行电缆(或使用调制解调器的电话)发送的简单命令。

Linux,像许多其他类 Unix 系统一样,确实包含一个“控制台”,它是与键盘和屏幕的直接接口。 Linux 控制台没有 windows:它是一个占据整个屏幕的字符数组。使用控制台绕过 window 管理器和终端仿真器,但您离直接与操作系统交互还很远。

在这两种情况下,您实际与之交互的是“shell”,这是一个无需特殊权限即可运行的简单程序。 shell 甚至没有图形界面;它只是发送字符(和 dome 简单格式化命令),就好像它在与真实终端通信一样。在 Linux 中,这是由称为“伪终端”(简称为“pty”)的操作系统接口调节的。

shell 读取您键入的命令,这些命令主要是对 运行 其他程序的请求。大多数 shell 命令只不过是找到一个程序,然后 运行 它带有您提供的参数。 shell 确实提供了一些工具,例如变量替换、条件和循环,这使得编写程序(或“脚本”)成为可能。但是这些脚本每次 运行.

都会被 shell 重新解释

此链的底部是命令行实用程序,如 ls(这是一个实际程序,您可以在文件系统中找到它,可能位于 /bin/ls)。这些程序确实与操作系统交互。它们通常用 C(或某种类似的编译语言)编写,并调用特定的库函数来请求操作系统服务。

这是您键入终端命令时发生的事情的非常简短和浓缩的视图。您可能可以通过搜索上面介绍的术语找到更多详细信息,但更结构化的学习方法是选择入门教科书。

这是看待问题的另一种方式:

你能从汇编程序中执行 C 吗? ...是的,但通常是相反的
所以C比汇编高一级!

你能从 C 中执行 Python 吗?我真的不知道,但(我猜)通常是相反的!
所以 Python 比 C.

级别更高

你能执行(为了执行的适当定义)来自 BASIC 的正则表达式吗...是的(也许 [我不知道]),所以 BASIC 比正则表达式更高级别.

...