单元 1.2.2 应用生成
闭源程序是指软件被编译后提供给用户,而不公开源代码。这可以防止用户为了个人利益或恶意使用而修改代码。它通常以商业方式出售,这意味着它经过了彻底的测试,并且通常附带免费的支持。
- 源代码不可用
- 用户购买软件使用许可证
- 专门的帮助或联系热线
- 适应性、纠正性和完善性维护
开源软件的源代码公开供下载。这意味着任何人都可以根据需要修改代码并帮助进一步开发软件。最著名的开源项目是 Linux,它是 Android 操作系统的基础。它通常是免费的,但是一些公司会提供免费软件,但收取支持费用。开源项目往往是由志愿者、编码员和测试人员组成的团队开发的。它们可能缺乏闭源程序的完善性和彻底的测试,这可能会使它们感觉有点笨拙。但是,如果有很多人愿意为它们做出贡献,它们将定期更新,并且一个志愿者的任何缺陷都可以由另一个志愿者弥补。
- 源代码可用
- 用户可以修改、修改、学习或分享
- 通常拥有庞大的开发者群体
- 通常免费
一家游戏公司决定发布一款新的视频游戏主机。该主机将使用名为 Linux 的操作系统的修改版本。
Linux 是开源的。
解释 Linux 开源将如何使游戏公司受益。
[2]
答案
这意味着他们需要的许多核心功能已经可用(1),因此公司只需对特定于其系统的功能进行修改/添加(1),从而节省时间和金钱(1)。
实用程序是一个相对较小的程序,具有单一用途,通常涉及系统维护。例如,防病毒软件、反垃圾邮件软件、防火墙、备份软件、磁盘碎片整理程序、压缩程序和文件管理器。
描述以下实用程序软件示例,并说明如何使用它们。
(i) Hardware driver
描述 [2]
用途 [1]
(ii) Virus checker
描述 [2]
用途 [1]
答案
(i) -Software that is supplied with a piece of peripheral hardware
-允许硬件和操作系统之间进行通信
-将来自一方的命令转换为另一方可以执行的指令
用途:-允许设备与计算机通信 [3]
(ii) -Software that is loaded permanently in memory
-它持续检查系统是否有病毒迹象
-在后台运行
-如果发现有病毒指示,则隔离该文件
用途:
-例如:教师可以使用它来检查学生导入的文件中是否存在病毒
-保持系统无病毒
-如果发现病毒,则删除/隔离 [3]
翻译器将源代码转换为目标代码,同时检测源代码中的错误。
用高级语言(如 Python、Basic、C++ 或 Ruby)编写的程序。这些语言允许在自然语言和机器代码之间建立一个中间桥梁 - 这使得开发更容易。
- 但是,计算机无法运行源文件
- 它需要将其翻译成机器代码
一旦程序被转换为机器代码,它就被称为目标程序,由目标代码组成。目标/机器代码和汇编代码之间存在一一对应关系。每个操作码都有一个机器和汇编代码等效项。此规则的唯一例外是标签,标签是在运行时创建的,因为实际位置在翻译中替换了标签。
解释器一次翻译并运行一行/一条代码语句。解释器在翻译包含错误的行时会报告错误,然后停止解释并指示错误的位置。每次运行程序时,都必须存在解释器。由于翻译需要时间并且某些行被翻译多次(例如,如果它们位于循环中),因此程序运行速度会变慢。解释器通常用于程序开发,以便在不为每个测试编译程序的情况下查找错误。
解释为什么在编写高级语言程序时,解释器可能比编译器更受青睐作为翻译器。[5]
答案
- 整个程序尚未编写...
- 因此可能无法编译
- 需要进行测试...
- 诊断将更加完整
- 可以运行各个片段...
- 允许隔离错误
- 在进行非常小的更改后,将需要运行。
- 持续编译整个代码非常浪费/耗时(每个最多 5 个)
在汇编代码中,操作码由助记符表示,操作数为十进制或十六进制数。汇编器在程序执行之前将其转换为机器代码。它为指令和数据保留存储空间,并将助记符操作码替换为机器代码。符号地址被替换为数字地址,它创建一个符号表以匹配标签和地址。它还将检查语法并提供错误诊断。
- 获取每条汇编指令
- 检查语法错误
- 从操作码表中查找助记符的值
- 为标签分配内存地址
- 转换为机器代码
(a) 汇编器可以用来生成机器码。
(i) State the type of language that an assembler processes to produce machine code. [1]
(ii) Describe machine code. [3]
(iii) Describe the steps an assembler performs when producing machine code. [4]
答案
- 汇编(语言) [1]
- 二进制表示/可执行形式
- 所有可用指令的集合
- (指令操作)取决于体系结构/处理器设计的字节数据 [3]
- 为指令和数据保留存储空间
- 用机器码替换助记符操作码
- 用数字地址替换符号地址
- 创建符号表...
- ...以匹配标签和地址
- 检查语法/给出错误诊断 [4]
编译器将整个高级程序作为一个单元进行翻译,并创建一个可执行程序。这可以保护程序免受恶意使用或修改。编译后的程序是特定于体系结构的,在编译期间,编译器可能会报告源代码中的许多错误,其中一些错误可能是虚假的。在编译期间,程序会被优化,这将提高其速度并减小其大小。一旦创建了可执行文件,就不再需要编译器。
编译过程分为几个阶段,如下所述
- 从程序中删除所有注释和空白字符。
- 使用计算机能够识别的保留字,将高级代码转换为一系列标记。
- 创建一个符号表,用于跟踪变量和子程序。
- 检查代码是否以有效的语法编写
- 为用户编译错误列表,其中代码不遵循语言规则
- 它生成一个抽象语法树,表示程序。
- 进行语义分析,编译器在此阶段检查逻辑错误
- 类型不匹配,例如尝试将字符串字面量赋值给整数
- 未声明的变量或访问超出范围的变量
- 在同一范围内多次声明同一个变量
- 使用超出范围的整数字面量访问数组
- 在此,将抽象语法树中的代码转换为目标代码。
- 删除所有不必要的代码。
- 它查找指令或指令组的任何更有效的替代方案,并替换它们。
http://www.ocr.org.uk/Images/142267-mark-scheme-unit-f453-advanced-computing-theory-january.pdf
在编译过程中使用标记。描述标记并在哪个阶段创建它们。 [3]
在每一行中勾选一个框,以显示以下每个语句为真的阶段。 [6]
库包含预先编写的代码,程序可以访问和运行这些代码。它们允许开发人员使用预先编写和预先测试的代码,这些代码通常旨在处理图形或密码学等复杂任务,这些任务通常需要一定的专业知识。它们通过应用程序编程接口 (API) 进行访问和使用。
库例程是这些预先编写代码片段的示例。它们是预编译的且无错误的,因此可以使用,从而减少编程所需的工作量和时间。它们可以多次使用,并且许多是用不同的源语言编写的。它允许程序员利用其他人的专业知识,这意味着您无需不必要地“重新发明轮子”。
链接器的目的是将任何库中使用的代码包含到最终程序中。它们可以是静态的或动态的;静态链接器将代码直接合并到可执行文件中,这会大大增加其大小。动态链接器仅在运行时链接到代码,因为它存储在程序的计算机上,从而减小了可执行文件的大小。
加载器是操作系统的一部分,负责将程序及其依赖项(如动态链接库)加载到内存中。它在程序运行时处理地址。
程序将在计算机系统上运行。
解释以下内容在准备程序运行时的作用。
(i) 链接器
(ii) 加载器
答案
(i)
- 用于组合已经编译的过程...
- 生成可执行文件
- 处理从主程序到其他(预编译)模块的外部引用
(ii)
- 将目标代码/可执行代码复制到...
- 主存,准备执行
- 处理寻址异常/可重定位地址
(每条一行,最多 4 条)
[4]