A-level 计算机科学/WJEC (Eduqas)/第一部分/编程原理
范式是编程语言的基本方法。
过程式语言执行操作和计算,这些操作和计算用于以逻辑的逐步过程解决问题。C 和 Python 是使用这种方法的语言示例。它们遵循有序指令,并且每个步骤都明确定义。它们允许严格控制所用硬件的底层操作。它们通常用于大型复杂程序中,其中过程和函数在执行的不同阶段运行。这种范式是更广泛的命令式编程范式的一部分,这意味着语句可以分组到更小的过程和函数中。
非过程式语言允许程序员指定他们想要的结果,而不是指定如何解决问题。它们与发出查询有关,例如在数据库查询中,检索数据比检索数据的准确过程更重要。它们还用于人工智能、语法检查和语言翻译应用程序。
视觉化范式不用输入代码,而是用于生成对象、按钮和图标。视觉化范式适合在 GUI 或事件驱动语言中进行开发。Scratch 和 GameMaker 是使用这种方法的程序示例。例如,Scratch 使用拖放应用程序,其中命令从一组命令中拖入,从而生成代码。视觉化范式更好,因为它更直观,更容易为初学者学习,因为提供了很多帮助和工具。
事件驱动范式基于 GUI,并使用程序运行时发生的任何事件。VB.NET Windows 窗体使用这种方法。程序在一个常量循环中等待用户的任何输入。当触发交互时,例如用户单击按钮,就会调用一个监听器。监听器然后处理事件并在程序中执行相关代码。
面向对象编程 (OOP) 使用对象和类。它能够生成按钮和图标,这在视觉环境中非常有用。对象是属性(数据)和方法的组合。它们有很多优点:一旦创建,就无需了解它们的实现细节即可使用它们。对象控制其他对象如何与它们交互,防止错误,例如程序员无法将窗口宽度设置为 -500。在某些语言(如事件驱动语言)中,这些对象被放置在表单上(事件驱动语言)。一旦创建,它们可以在各种其他程序中重复使用。类是一个模板,指定方法(程序例程)和属性(信息)。
OOP 使用三个关键原则:封装、继承和多态性。
- 封装是指技术实现隐藏在对象内部。这意味着数据保留在类内部,并且无法访问程序的其余部分。封装的另一个优点是,一旦创建了一个对象,就不需要了解它的实现细节就可以使用它。以这种方式创建的对象可以轻松地重复用于其他程序,并且可以由不同的程序员使用。
- 继承是指属性和方法被复制到另一个类。它发生在类按相似的属性和方法进行分组时。可以在父类中赋予跨类共有的属性和方法,其他类成为此父类的子类。这样做的影响是子类继承了父类的属性和方法,可以像使用自己的属性和方法一样使用它们。这是一种优势,因为它意味着只有在定义一次方法后,所有其他使用它的类都可以查看它们的父类,而不是重新定义它。继承与创建新对象(实例化)有关。
- 多态性是指创建一个可以与各种数据类型一起使用的通用对象。它只是说,方法可以根据运行它的类或提供给它处理的数据的不同而不同地工作。例如,一个 Area 方法将为“圆形”和“正方形”类计算不同的面积,但两者都将从它们的父类“形状”继承该方法。
标记语言向文本文档添加命令以赋予文本一些意义。这些命令提供有关如何格式化和显示文本的指令。例如,HTML 中的命令称为标签,并用尖括号括起来,例如
<h1> This represents text in a heading in HTML. </h1>
命令是打开的,因此任何后续文本将应用于文本的格式,例如标题。它们随后由带有正斜杠的标签关闭。
另一个例子是 XML(可扩展标记语言),有时用于对数据进行结构化以存储,而不是显示它。XML 没有固定的约定,开发者可以自由地为每块数据添加自己的含义,例如参见右侧的图片。这些标记语言通常与其他语言一起使用,例如 JavaScript 与 HTML。
脚本语言嵌入到其他语言中,可以为网页添加额外的功能(例如 JavaScript)。
专用语言是指为特定目的而设计的语言。它们可能包含与应用程序相关的基本/有用的功能。专用语言在仿真和控制等领域都有应用。它们非常独特,内置的功能/能力直接适用于解决语言设计用于解决的问题。它们通常用于计算机辅助设计 (CAD)、人工智能 (AI)、专家系统、科学应用和游戏编程等应用程序。
高级编程语言更容易理解、学习和编程,因为代码更类似于英语(与低级编程相比)。它使用标识符,这些标识符可以是自文档化的,以及可以在整个程序中重复使用的模块。高级语言转换为许多行可执行机器代码(0 和 1)。
在低级编程语言中,开发者可以直接访问和操作内存寄存器和 CPU,以及直接与连接到计算机的硬件设备通信。不同的 CPU 架构执行不同的指令集,开发者可以通过低级编程访问这些指令。可以使用诸如汇编语言之类的语言,它使用助记符来执行机器代码。要将汇编语言转换回高级代码,必须使用汇编器。
低级编程语言用于速度至关重要的场合,例如 ROM 上的引导程序和嵌入式系统。由于它们的体积更小,它们比高级语言效率更高。由于它们更小,它们需要更少的时间来转换为机器代码。诸如汇编语言之类的语言用于命令具有一对一映射的场合(一行汇编代码 = 一行机器代码)。
USB(通用串行总线)连接介质是标准的一个例子。标准用于确保各种产品能够相互集成,例如通过 USB 连接的外部 HDD 在操作系统上读取/写入文件,而操作系统利用了所有计算机上的 USB 标准。将组建各种人员参与的团队以开发标准。
标准很有用,因为用一种语言编写的程序更有可能在完全不同的计算机架构上运行,并且熟悉使用一种编程语言的程序员可以轻松地切换到使用另一种语言,即使是在不同的架构上。由于不同的制造商可能出于商业原因(例如市场份额)不愿意标准化,因此很难实现标准化。
歧义是指含义不确定,可能存在不同的解释。高级编程语言必须是无歧义的,因此每个语句只有一个解释方式,例如两个 Else 语句是歧义的。这是为了允许准确地转换为可执行的机器代码。巴克斯-诺尔范式 (BNF) 使用无歧义规则。
巴克斯-诺尔范式 (BNF) 是一种正式的编程语言语法编写方式。其主要思想是引入规则,以确保源代码在语法上正确(每个部分的排列正确)且无歧义。BNF 比英语更可取,因为英语是歧义的,而 BNF 则不是。为了将这些概念引入代码,我们使用类似于普通英语的语法规则,这些规则包含在尖括号(<>)中。这些“语法规则”中可以包含两种部分:终结符和非终结符。终结符不能再进行评估(这意味着它不能再分解),而非终结符需要进一步评估(它必须分解才能进行解释)。要创建规则,我们首先必须熟悉规则中使用的符号及其含义。以下是一个例子
<Digit> ::= 0|1|2|3|4|5|6|7|8|9
<Digit> 用于启动规则并将其命名为“Digit”,请注意使用的尖括号。“::=” 用于表示赋值。“|” 用于表示逻辑运算符 OR(这是一个管道字符)。此规则可用于构建所需的任何数字,因为所有数字都必须包含 0-9。从 0 开始非常重要,否则无法包含诸如 100 或 900 之类的较大数字。此示例中的数字(0-9)将被视为终结符,因为您不能再对其进行评估。
<TwoDigitNumber> ::= <Digit><Digit>
这里,我们声明了“TwoDigitNumber”规则,该规则包含两个“Digit”规则。如您所见,我们需要查询“Digit”规则以了解此规则的含义 - 我们需要进一步评估它 - 所以这是一个非终结符。您可能想知道我们如何用 BNF 构建单词或字母,这是很正确的!假设我们正在使用 BNF 创建电子邮件以表示所有内容。我们需要以下规则来做到这一点
<Uppercase> ::= A|B|C|D|E ... |Z
(请注意,这里我们使用 ... 来表示延续,您也可以在考试中这样做!)
<Lowercase> ::= a|b|c|d|e ... |z
这允许使用字母表中的任何字母,但必须是小写字母。
<Digit> ::= 0|1|2|3|4|5|6|7|8|9
(通常在所有 BNF 问题中都需要,例如,某些电子邮件可能包含 EmployeeID)。到目前为止,这些是我们创建电子邮件所需的所有规则,但我们使用的当前规则存在问题。人们只能拥有由单个字母和数字组成的电子邮件。当我们想要在电子邮件中使用全名时,这显然是有问题的。我们可以使用前面介绍的概念递归来解决这个问题
<Name> ::= <Lowercase>|<Lowercase><Name>
在<Name>规则中,有两个可能的路径,第一条路径和第二条路径。在第一条路径中,它接受一个单个小写字符,如果只有一个字母,则会调用它。否则,将调用第二条路径,它将接受一个单个字符,但也会再次调用该规则 - 因此您可以根据需要使用任意多个小写字符来创建全名。这种思维方式非常有用,因为它可以让您正确地记住递归规则,因为该规则必须采用这种确切的格式,否则就不正确(这是评分标准中的格式)。必须有两条路径,要么是单个字符,要么是单个字符和再次调用的规则。
最后,在解决了所有可能的数据约束之后,我们创建了一个包含所有逻辑的最终规则。以下是在此示例中使用的示例问题
电子邮件考试问题 国家银行员工的电子邮件地址由名字、一个句点、姓氏、一个数字、@ 符号和“nb.co.uk”组成。所有名字仅包含小写字母,并且可以是任意长度。 答案 <Lowercase> ::= a|b|c|d|e ... |z <Digit> ::= 0|1|2|3|4|5|6|7|8|9 <Name> ::= <Lowercase>|<Lowercase><Name> <Email> ::= <Name>.<Name><Digit>@nb.co.uk
|
我们也可以用图表的形式来表示 BNF,但这只是为了让人们更容易地看到它所代表的内容,而不是有更大的目的。为此,使用三种形状:一个带有左右两条线的矩形,表示非终结符,一个椭圆形表示终结符,一个箭头表示信息流(所走的路径)。这两种符号内部都包含文本,以显示它们所代表的内容。一个椭圆形(终结符)可能包含“1”,而一个矩形(非终结符)可能包含“Digit”。递归是通过在决定通过非终结符之前画一条带有箭头的线来表示的,因此这表明你可以一直回到整个字符串被构建出来为止。