俄罗斯套娃。 程序语言的层次系统

让我们尝试想象没有门捷列夫周期表(1869)的化学。 有多少元素必须牢记在心,并且按随机顺序......(然后 - 60。)

要做到这一点,一次考虑一种或几种编程语言​​\uXNUMXb\uXNUMXbat 就足够了。 同样的感受,同样的创意混乱。

现在,我们可以重温 XNUMX 世纪化学家在一张元素周期表中获得所有知识(甚至更多知识)时的感受。

俄罗斯套娃。 程序语言的层次系统


《俄罗斯套娃》一书。 《程序语言的分层体系》将C语言的各个单元一目了然。 这使您可以组织它们,纠正过时的信息,甚至澄清程序的概念。

如今,编程信息比 150 年前的化学元素更需要系统化。

第一个需要是教学。 当门捷列夫面临这个问题时,他开始创建自己的系统 - 从哪个元素开始讲授:O,H,N,He,Au ...同时,这对他来说更容易 - 他向最好的学生教授化学圣彼得堡大学学士。 学校已经开始教授编程,并且很快将在幼儿园开始教授。

第二个需要是科学的方法。 在元素周期表的帮助下,新的元素被发现,旧元素的信息得到纠正。 她帮助创建了原子模型(1911)。 等等。

第三个需要是澄清程序的概念。

用一只脚进行现代编程还停留在 50 世纪 XNUMX 年代。 那时候,程序很简单,但机器和机器语言很复杂,所以一切都围绕着机器和语言。

现在情况正好相反:程序是复杂的、主要的,语言是简单的、次要的。 这就是所谓的应用方法,似乎大家都很熟悉。 但学生和开发人员仍然相信一切都是一样的。

这让我们回到私人讲师门捷列夫的第一场讲座。 对新生说什么? 真相在哪里? 就是那个问题。

《俄罗斯套娃》一书。 程序语言的分层系统。 而且,它不仅是针对学生的,也是针对训练有素的程序员的,因为正是他们,也就是我们,必须寻求真理并扭转世界观。

以下是本书的摘要。

1。 介绍

1969 年,C 语言诞生,成为基础编程语言,并保持了 50 年之久。 为什么会这样呢? 首先,因为C是 应用的 提供程序的语言 人道 改为查看 机械。 这一成就由 C 家族的语言巩固:C++、JavaScript、PHP、Java、C# 等。 其次,它是一种简短而优美的语言。

然而,C 语言本身通常与机器汇编程序混合在一起,从而使其感知变得复杂和扭曲。 另一个极端是在语言上强加一些“哲学”:过程性的、对象性的、函数式的、编译性的、解释性的、类型化的等等。 这增加了情感,但无助于更好地描述语言。

真理位于中间,对于 C 语言来说,它严格位于哲学感知和机器感知之间。

C语言并不是独立的,它服从通常的书面语言,同时又控制着汇编语言本身。 这个位置描述了 程序的语音模型,根据该程序将程序分为三个从属类型:语音、代码、命令。 C 语言负责第二个,代码视图。

通过确定语言在程序中的位置,您可以安排有关它的信息,这使得 程序语言的层次系统,代表门捷列夫系统精神中的 C 语言 - 在一页上。

该系统的构建考虑到 应用语言的共性源于他们言语上的从属关系。 一组 C-Matryoshka 单元允许您通过创建一系列 C-Matryoshka 来描述和比较不同的语言:C++、PHP、JavaScript、C#、MySQL、Python 等。 不同的语言以基本语言的单位来描述是值得且正确的。

2. 第 1 章. 程序的语音模型。 可以理解的C

第一章介绍 程序语音模型,反映所应用的方法。 据他介绍,该程序具有三种明显的顺序类型:

  1. 演讲 - 程序员解决问题的直接演讲,
  2. 代码 - 将解决方案编码为 C 语言(或任何其他语言)的数学形式
  3. 和命令 - 直接机器命令。

语音模型解释了为什么 C 是一种简单易懂的语言。 C 是建立在我们熟悉的人类语言的形象和相似之处的。

第一种程序是程序员直接讲话。 言语对应于人类的思维。 在语音的帮助下,新手程序员首先用俄语编写程序,然后逐步将操作翻译成代码语言。 C 语言就是这样创建的。

程序员以语音表达的结论被转换为编码的数字形式。 这种转变应该称为 反射,因为语音和代码具有相同的性质(反射 - 诞生 - 属)。 如果我们比较程序的语音(左)和代码(右)类型,这一点非常明显。

俄罗斯套娃。 程序语言的层次系统

奇怪的是,反射的发生非常简单——只有两种表达方式。

然而,C 语言的现代描述(从 1978 年开始)并没有包含足够的名称列表,无论是用于一般描述该语言,还是特定于反射问题。 因此,我们不得不发挥创意并引入这些名称。

词语的选择必须准确、清晰。 这需要一种特殊的方法,简单地说就是严格使用母语。 对于英国人来说,那就是英国人,但我们不是英国人。 所以我们利用我们现有的资源,尝试说俄语。

反射由两种表达式执行:

  1. 计算 (Vh) - 反映主体属性的变化。 对象的属性是用数字来表示的,那么对属性的作用就是对数字的作用——操作。
  2. 从属 (Pch) - 反映动作顺序的变化。 Pch的原型是动词复合句,因此,大多数类型的Pch都以从属连词“if”、“otherwise”、“bye”、“for”开头。 其他类型的个人电脑对它们进行补充。

顺便说一句,你能相信在 C 的描述中没有表达式计算的名称 - 它们被简单地称为“表达式”吗? 此后,属从属名称和关联的缺乏,以及名称、定义和概括的缺乏,将不再令人惊讶。 这是因为著名的 C/R(The C Language,Kernighan/Ritchie,1978)不是描述,而是使用该语言的指南。

但是,我仍然想要对该语言的描述。 因此提供 程序语言的层次系统.

3. 第 2 章. 图层系统。 短C

任何描述都应该准确且尽可能简短。 对于程序语言来说,正面描述是很困难的。

这里我们有一个程序。 它由模块组成。 模块由子例程和集合(结构)组成。 子程序由单独的表达式组成:声明、计算、从属。 隶属有十种。 从属连接子级别和子例程。 还有几则公告。 然而,公告不仅包含在子例程和子级别中,还包含在模块和集合中。 大多数表达方式都是由难以描述的单词组成的,因此通常只给出两个列表 - 原始单词和派生单词,您将在学习和使用该语言的过程中熟悉这些单词。 让我们添加标点符号和一些其他表达式。

在这样的演讲中,很难理解谁站在谁一边。

描述语言的直接分层方法会过于复杂。 对弯路的探索导致了基于语言本质和命令方面的语言描述。 因此,层系统诞生了,与门捷列夫的周期系统部分重合,这也是 层数。 其出版 42 年后(1869 年)证明,该系统的周期性与电子有关。 层数 (1911 年,玻尔-卢瑟福原子模型)。 此外,分层系统和周期系统的共同点是所有单元都以表格形式放置在一页上。

语言单位的描述很短——只有10种表达方式和8种其他单位,而且信息丰富、视觉丰富。 尽管对于初次相识来说很不寻常。

语言单元分为6个级别:

  1. 小队 - 表行
  2. 部门 - 属的特殊群体(第一线的部分)
  3. 属 - 细胞(主要分裂水平)
  4. superspecies - 物种分隔符(稀有级别)
  5. 视图 - 单元格底部或单独的单位公式
  6. 样本 - 单位本身(仅适用于单词)

词型描述 字典 - 一个单独的子系统,由相同的六个级别组成。

C 语言的语音成分是相当明显的,尽管它仍然值得描述。 但是该语言的命令部分仅与编译管理相关,在此过程中创建了第三种类型的程序 - 命令型程序。 下面我们就来谈谈C语言最精彩的一面——美。

4. 后续章节。 奚帅哥

C 语言是现代编程的核心。 为什么? 首先,凭借最大的言语对应。 其次,因为它很好地绕过了机器处理数字的限制。

习近平具体提出了什么建议? 图像和图层。

“图像”一词是英语单词“type”的翻译,它来源于希腊语“原型”——“原型”。 在俄语中,“类型”一词并没有传达所表达概念的基石,而且它与官方含义“种类”混合在一起。

最初,图像解决了纯粹的机器计算问题,然后成为对象语言诞生的跑道。

该层立即解决了机器制造和应用方面的几个问题。 因此,我们将从单任务图像开始考虑,然后转向多任务层。

历史规划的令人不快的特征之一是大多数概念,包括基本概念,都是在没有定义的情况下给出的。 “编程语言(河流的名称)有一个整数和一个浮点类型的数字......” - 并进一步划痕。 没有必要定义什么是“类型”(图像),因为作者自己并没有完全理解这一点,并“为了清楚起见”而隐瞒了它。 如果它们被钉在墙上,它们就会给出一个模糊且无用的定义。 隐藏在外来词后面有很大帮助:对于俄罗斯作者来说 - 在英语单词(类型)后面,对于英语作者 - 在法语(子例程)、希腊语(多态性)、拉丁语(封装)或其组合(临时多态性)后面。

但这不是我们的命运。 我们的选择是用纯俄语的凸起遮阳板进行定义。

图片

图片 是值的预先形成名称,它定义 1) 该值自己的属性以及 2) 该值的操作选择。

“类型”(种类)一词对应于定义的第一部分:“数量的内在属性”。 但图像的主要含义在第二部分:“数量运算的选择”。

在C语言中引入图像的出发点是简单的计算,例如加法运算。

数学,无论是手写还是打字,对不同类型的数字没有太大区别,通常假设它们是真实的。 因此,它们的处理操作是明确的。

数学严格地将数字分为整数和分数。 不同类型的数字以不同的方式存储在内存中,并由不同的处理器指令处理。 例如,整数和小数相加的指令是对应于两个不同处理器节点的两条不同指令。 但是缺少添加整数和小数参数的命令。

应用 数学,即 C 语言,将数字的类型分开,但将运算组合在一起:整数和/或小数的加法用一个动作符号编写。

图像概念的明确定义让我们可以明确地谈论另外两个概念: и 手术.

价值与运营

是正在处理的号码。

手术 - 处理初始值(参数)的值以获得最终数字(总数)。

其值与操作相关。 每个操作都是一个值,因为它有一个数字总计。 而每个值都是将值传入/传出处理器寄存器的结果,即运算的结果。 尽管存在这种关系,但最主要的是它们单独描述的可能性,尽管一个单词在字典的不同部分中重复,这种情况发生在 ma3 中。

机器方法将程序员使用的所有数字除以 命令 и 数据。 以前,这些和其他都只是数字,例如命令是用数字代码编写的。 然而,在应用语言中,命令不再是数字,而是变成了 用语言 и 行动迹象。 只有“数据”仍然是数字,但继续称它们如此荒谬,因为当从机器转向数学的角度时,数字是除以原始的量(数据)和最终的(寻求)。 “未知数据”听起来很愚蠢。

这些团队还分为两种类型的行动:数学和服务。 数学动作-运算。 我们稍后会联系工作人员。

在C语言中,通常的纸和机器明确的,或者说单一的,数学运算几乎无一例外地变成了多重。

多个操作是具有不同类型参数和不同但含义相似的操作的同名操作。

整数参数对应于整数运算,小数参数对应于小数运算。 这种差异在除法运算中尤其明显,此时表达式 1/2 给出的总数为 0,而不是 0,5。 这样的表示法不符合纸上数学的规则,但 C 语言并不努力遵守这些规则(与 Fortran 不同)——它有自己的方式。 应用 规则。

在混合整数和小数的情况下,仅包含正确的一个 参数值的强制 - 将值从一幅图像选择性地转换为另一幅图像。 确实,当整数和小数相加时,结果是小数,所以运算的图像 拿起 将整数参数转换为小数值的操作。

仍有多项操作 复数单身的。 此类运算仅针对一种参数定义:除法的余数是整数参数,堆栈(按位运算)是自然整数。 Ma3通过符号(#^)指示操作的多重性,该符号指示为其定义操作的模式。 这是每个操作的一个重要但以前被忽视的属性。

所有函数都是任意单元操作。 例外的是运营商 - 括号函数内置于语言中(原始操作)。

晋升

晋升 ——伴随操作的动作。

如果我们将操作视为主要操作,那么我们可以区分提供该操作并与之不同的两个伴随操作。 它们是 1) 可变控制和 2) 从属关系。 这个动作称为 协助.

这里需要跑题,单独说一下编程教材的俄语翻译。 C/R 文本中引入了一个新词来记录操作 声明 (表达式)试图将机器指令的概念分成不同的操作:1)操作,2)声明,3)从属(称为“控制结构”)。 这一尝试被俄语翻译者埋葬,用“运算符”一词取代了“表达式”,其中:

  1. 成为机器词“命令”的代名词,
  2. 原来是“行动标志”这个短语的同义词,
  3. 并且还获得了无限数量的附加值。 也就是变成了一种英文文章“uh ...”。

考虑相关活动,或 促进.

变量控制

变量控制 (UE) — 可变单元格的创建/删除。
UE 在声明变量时隐式发生,该变量已因不同原因而写入 - 指示值的图像。 只有一种是显式管理的 附加变量 使用 malloc() 和 free() 函数。

应该指出的是,隐式操作更方便编写,因为它们根本不需要编写任何内容,但更难以理解 - 它们更难以考虑和解释。

服从

服从 — 层部分的连接/断开。

C 语言提供了一种与汇编语言不同的应用方法来控制操作顺序 - 从属关系。 它反映和发展了一个动词复杂句子,明确分为主要部分(句子从属)和从属部分(部分子级别/子程序)。

声明和提交都完全建立在概念上 .

是有限的单级选择性表达式集。

该层同时显式和隐式地承担多项任务:

  1. 精简程序
  2. 限制名称的可见性(隐式),
  3. 管理变量(存储单元)(隐式),
  4. 定义提交的附属部分,
  5. 功能和选择的定义等。

在机器语言中没有层的概念,所以它也没有出现在K/R中,如果没有什么东西,那么在后续书籍中引入它就是异端和自由思想。 因此,层的概念根本没有出现,尽管它非常有用并且非常明显。

没有一层,就不可能简单清晰地解释程序的许多动作和规则。 例如,为什么简单到三戈比的 goto 是不好的,而复杂的 while 却是好的。 只能无奈地发誓,就像 Dijkstra 所做的那样(“程序员的技能是 goto 语句在程序中出现频率的反函数。”简而言之,只有山羊才会使用 goto。理由的程度就是上帝。)确实如此,事实并非如此不好的是,如果您的书一般而言,它们没有义务解释任何事情,但是,正如我们已经说过的,这不是我们的命运。

顺便说一句,可以假设 Dan Ritchie 留下 goto 正是寻找某些未命名概念的关键,因为 goto 表达式没有必要或美丽。 但是需要对语言的新原理进行简单易懂的解释,而里奇本人并不想给出这种解释,而这些解释只是基于概念 .

偏差

偏差 — 更改新名称的正常属性。

最重要的偏差只是与程序的图层属性有关,用“静态”一词来描述,在每种类型的图层中都有不同的含义。

5. 最后一章。 应用语言的通用性

应用程序语言是 比喻的 语言(有图像,“打字”)。 它们基于图像的显式或隐式使用。 这里又出现了一个矛盾:清晰的图像更容易理解,但不太方便,反之亦然。

俄罗斯套娃。 程序语言的层次系统

(表格布局尚未交付,因此表格以图片形式给出。)

C之后,应用语言的发展走的是增加比喻性的道路。 对于理解高形象性来说最重要的是C的直系后代——C++语言。 他提出了对数量进行任意选择操作的想法,并将其在 C 表达式选择的基础上具体化,并获得了一个新名称——对象。 然而,由于新集合和相关规则的过载,C++ 并不像 C 那样简洁和富有表现力。 顺便说一下“超载”。

重载和多态

“过载”这个词是一个过时的机器术语,用于创建 多次操作.

机器(系统)程序员 多重性 操作很可能很烦人:“这个符号 (+) 是什么意思:整数加法、小数加法,甚至是偏移量?! 现在他们不再这样写了!” 因此,所选词具有负面含义(“破产”、“疲倦”)。 对于应用程序员来说,多重操作是 C 语言的基石、重大成就和遗产,它是如此自然以至于常常是无意识的。

在 C++ 中 多重性 不仅扩展到原始操作,还扩展到函数 - 单独的和组合成类 - 方法。 伴随多种方法而来的是在扩展类中重新定义它们的可能性,这被模糊地称为“多态性”。 多态性和过载的结合产生了爆炸性混合物,分解为两种多态性:“真实”和“临时”。 无论指定的名称如何,您都只能理解这一点。 广告之路是由外国名字铺成的。

“过载”形式的声明最好用这个词来表达 附加公告 - 添加具有不同图像参数的同名函数的声明。

“多态性”形式的声明更适合称为“多态性”这个词 重新宣布 — 具有相同图像参数的同名函数的新扩展层中的重写声明。

那么就很容易弄清楚不同图像(参数)的同名方法了—— 还额外公布了,和一张图像 - 重新宣布.

俄语单词决定。

跑道

对高度比喻语言的概念的考虑证实了基本概念的清晰定义的重要性。 通过正确描述 C,学习高度形象化的语言将变得轻松而愉快。

这对于 隐含的高度比喻语言 (PHP、JavaScript)。 对于他们来说,对象(复合图像)的重要性变得比 C++ 中更高,但图像的概念变得隐含且难以捉摸。 从方便的角度来看,它们变得更加简单,但从理解的角度来看,它们变得更加困难。

因此,你应该从C语言开始学习编程语言,并按照C家族语言出现的顺序继续前进。

描述语言也是如此。 不同的语言具有与 C 类似或更少的单位性别集合。 物种和模式的数量在两个方向上都可能不同:C++ 的物种比 C 多,JavaScript 的物种少。

MySQL 语言值得特别提及。 看似没有任何共同点,但俄罗斯套娃却完美地描述了它,了解他变得更快更容易。 考虑到它对网络(现代编程的用餐之路)的重要性,这一点很重要。 哪里有MySQL,哪里还有其他SQL。 好吧,只要手一到,Matryoshka 也会描述各种 Fortran-Pascal-Python。

因此,伟大的事情正在等待着我们 - C 语言的应用描述和其后的语言的单一描述。 “我们的目标很明确,任务也很明确。 同志们,开始工作吧! (雷鸣般的、长时间的掌声,变成了热烈的鼓掌。大家起立。)”

我们将非常重视您的意见,我们将非常感激您对创建嵌套娃娃网站的帮助。 有关这本书的更完整信息位于网站上,巧妙地隐藏在 Matryoshka Si 中。

来源: habr.com

添加评论