跳转到内容

单元 1.2.2 应用生成

来自 Wikibooks,开放世界中的开放书籍


开源和闭源

[编辑 | 编辑源代码]

闭源程序是指软件被编译后提供给用户,而不公开源代码。这可以防止用户为了个人利益或恶意使用而修改代码。它通常以商业方式出售,这意味着它经过了彻底的测试,并且通常附带免费的支持。

  • 源代码不可用
  • 用户购买软件使用许可证
  • 专门的帮助或联系热线
  • 适应性、纠正性和完善性维护

开源软件的源代码公开供下载。这意味着任何人都可以根据需要修改代码并帮助进一步开发软件。最著名的开源项目是 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 个)


汇编器

[编辑 | 编辑源代码]

在汇编代码中,操作码由助记符表示,操作数为十进制或十六进制数。汇编器在程序执行之前将其转换为机器代码。它为指令和数据保留存储空间,并将助记符操作码替换为机器代码。符号地址被替换为数字地址,它创建一个符号表以匹配标签和地址。它还将检查语法并提供错误诊断。

  1. 获取每条汇编指令
  2. 检查语法错误
  3. 从操作码表中查找助记符的值
  4. 为标签分配内存地址
  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]


编译器

[编辑 | 编辑源代码]

编译器将整个高级程序作为一个单元进行翻译,并创建一个可执行程序。这可以保护程序免受恶意使用或修改。编译后的程序是特定于体系结构的,在编译期间,编译器可能会报告源代码中的许多错误,其中一些错误可能是虚假的。在编译期间,程序会被优化,这将提高其速度并减小其大小。一旦创建了可执行文件,就不再需要编译器。

编译器的工作原理

[编辑 | 编辑源代码]

编译过程分为几个阶段,如下所述

1. 词法分析
[编辑 | 编辑源代码]
  • 从程序中删除所有注释和空白字符。
  • 使用计算机能够识别的保留字,将高级代码转换为一系列标记。
  • 创建一个符号表,用于跟踪变量和子程序。
2. 语法分析
[编辑 | 编辑源代码]
  • 检查代码是否以有效的语法编写
  • 为用户编译错误列表,其中代码不遵循语言规则
  • 它生成一个抽象语法树,表示程序。
  • 进行语义分析,编译器在此阶段检查逻辑错误
    • 类型不匹配,例如尝试将字符串字面量赋值给整数
    • 未声明的变量或访问超出范围的变量
    • 在同一范围内多次声明同一个变量
    • 使用超出范围的整数字面量访问数组
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]

华夏公益教科书