繁体   English   中英

shell 脚本是否与 C 一样“接近硅”?

[英]Is shell script as “close to silicon” as C?

A couple of years ago, when I switched careers to programming, I remember learning the now-familiar hierarchy of low level to high level programming languages: machine code -> assembly language -> C -> Java, Python, C#, etc.

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

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

基本上,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)是一个令牌解释器,它通过脚本逐个令牌工作,并且每个令牌相应地更改其内部 Z9ED39E2EA9312EF576A985A6E。 将令牌解释器想象成一个 VM,它不在二进制操作码上运行,而是在人类可读的字符串上运行。

此外,shell 不仅仅是将命令传递给操作系统。 里面还有很多事情要做。

shell 脚本是 C 的子集

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

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

此外,编译与解释并没有说明它是否是高级别的。 如果与 C 和 Java 相比,汇编更接近于逐行解释而不是编译。

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

我一直很难将 shell 脚本安装到该层次结构中。

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

Fortran -> C -> Java -> ZA7F5F35426B9237411FC9231B92315S

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

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

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

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

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

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

shell 读取你键入的命令,这些命令大多是运行其他程序的请求。 大多数 shell 命令只不过是找到一个程序并使用您提供的 arguments 运行它。 shell 确实提供了一些工具,例如变量替换、条件和循环,这使得编写程序(或“脚本”)成为可能。 但是这些脚本每次运行时都会被 shell 重新解释。

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

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

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

您可以从汇编程序执行 C 吗? ...是的,但通常情况相反
所以 C 比汇编器级别更高!

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

你能从 BASIC执行(对于执行的适当定义)一个正则表达式...是的(也许 [我不知道]),所以 BASIC 比正则表达式更高级别。

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM