【C language part 1】浅谈 C 语言-认识C

在台科大大一的课程当了助教,也写了不少给大一新生看的讲义。
这边就分享一下当了两年助教的讲义内容给各位刚步入程序语言领域新生儿们~。

What is Programming

Understanding Programming in layman terms …

 Programming is a way to “instruct the computer to perform various tasks”.

Instruct the computer

  • 基本上意味着你向电脑提供了一组以电脑可以理解的语言编写指令。
  • 指令可以是各种类型。
  • 就像我们人类可以理解好几种语言一样,电脑也可以理解特定的语法写出来的指令。
    (就是所谓的 programming language

Perform various tasks

这些任务可以是简单的任务,也可以是涉及多个指令序列的复杂任务。


A programming language is the set of instructions through which humans interact with computers.
The code is pretty much like writing a paragraph of instruction or creating a to-do list to computers. Unlike us humans, the to-do list and instructions you write for the computer has to be extremely detailed and written in some logic.

撰写程序码就好像是在写一段指令,或是为电脑列出一个 to-do list。而电脑并不像我们人类一样,我们为电脑列出的 to-do list 需要非常的详细,并且要用某种逻辑来撰写。

程序语言的分类

机器语言 Machine Language

  • 指硬体内部所使用的语言,也是电脑唯一能直接辨识的语言。
  • 由於电脑是由电子电路所构成,在这个世界里只懂得两种讯号:1或0,用来表示开或关。也因此最早的电脑语言就是使用 0 和 1 所写成的。
  • 完全由这两个数字使用二进位编码来表示要执行的命令,这种语言不需要经过任何翻译,电脑就可以直接执行,这也就代表执行速度快,使用的电脑资源也少;但是要了结由「1」和「0」组合成的机器语言代表的意义,就必须透过查表才能得知,可读性相当低,於是,组合语言、高阶语言就陆陆续续产生了。

组合语言 Assembly

  • 最接近机器语言的程序语言。
  • 使用助忆符号(Mnemonics)取代机器语言的指令。例如:以 ADD 代表机器语言的加法动作指令。
  • 相较於机器语言,组合语言更有利於我们撰写程序,但是电脑无法直接执行组合语言程序,因此执行前必须先翻译成机器语言,而将组合语言翻译成机器语言的工具我们称它为组译程序(Assembler)。
  • 通常我们会将组合语言和机器语言都归类在「低阶语言」,而所谓低阶语言,就是比较能直接对硬体去做输入或输出控制的语言。组合语言与机器语言十分相似,撰写这两种程序码之前都必须了解电脑的架构,才能正确使用。

高阶语言 High-Level Language

  • 为了让电脑更广泛地使用,就出现了以人类日常生活中常使用的文字或符号来表达的程序语言,我们称它为高阶语言。其文法接近日常的英文用语,当然也包含一班常用的数学运算符号。
  • 从撰写者的角度来看,比起低阶语言,用高阶语言所写出来的程序较容易被我们所了解,也更容易维护。
  • 从电脑的角度来看,组合语言跟机器的相关性很高,不同的机器必须使用不同的组合语言,而高阶语言在不同的机器上差异不大。
  • 但是电脑真正能够理解的语言还是机器语言,所以高阶语言还是必须先透过编译程序(Compiler)或直译程序(Interpreter)翻译成机器语言才能执行。

直译程序 vs. 编译程序

直译程序Interpreted Language 编译程序Compiled Language
说明 需搭配直译器(Interpreter)每翻译一行指令後,就立刻交付电脑执行,不须经过编译。 需搭配编译器(Compiler)将全部的程序翻译後,先产生目的档(.obj),再将其他要连结的程序连结以後,才交由电脑执行。
优点 占用的记忆体较少。修改及除错容易。 执行时不需要重复编译,所以执行速度及效率较高。
缺点 每次执行前才翻译,执行速度慢、效率较低。 原始程序经过修改就必须重新编译。较占用记忆体空间。
举例 BASICHTMLJavaScriptPythonRuby 等 C/C++COBALPASCAL 等

计算机程序组成与执行概念

电脑怎麽来的? ENIAC

  • 我们认为最早的通用电脑是由美国宾州大学的莫奇来(Mauchly)和他的学生埃克特(Eckert)在 1946年2月14日当天所发表的「ENIAC」(Electronic Numerical Integrator And Computer,电子数值积分计算机)。

  • ENIAC 在进行每一次运算之前,都需要根据运算要求把不同的元件用人工插接线路的方式连接在一起。将输入输出装置设置好後,才进行通电。
  • 因为 ENIAC 没有储存程序的功能。最早的计算机器仅内涵固定用途的程序。

电脑怎麽来的? EDVAC

  • EDVAC 全名是 Electronic Discrete Variable Automatic Computer,离散变量自动电子计算机。
  • 建造者跟 ENIAC 一样皆由莫奇来(Mauchly)和埃克特(Eckert)。
  • EDVAC 可以说是第一台现代意义的通用计算机,采用的是范纽曼架构。

范纽曼架构 Von Neumann Architecture

范纽曼架构的设计概念

  • 范纽曼架构一词出自约翰.范纽曼的论文 First Draft of a Report on the EDVAC, June 30, 1945,其中建立了现代电脑的两大建构原则:
    1. 大胆舍弃了十进制,改以二进制运算和储存资料。
    2. 要被执行的程序得先放在记忆体中,等要执行时再去记忆体中抓出来。
  • 而这两点原则都指向了报告最核心的概念-「储存程序电脑」(Stored Program Computer)。
  • 1951年,美国军方根据这份报告并透过范纽曼的协助打造了计算机 EDVAC。

  • 讲白点,范纽曼架构就是一个打造电脑的数学模型,也是目前唯一被成功实作出来,全世界电脑唯一使用的数学模型。
  • 当然,电脑架构不只范纽曼架构,其他还有比如说:哈佛架构、仿生电脑、量子电脑等等,但基本上都还处於理论阶段。
  • 另外补充,储存程序电脑的概念并不是由范纽曼提出的,而是图灵(Turing)提出来的图灵机(Turing Machine)。在这里推荐一部电影-模仿游戏( The Imitation Game )

  • 范纽曼架构使用记忆体来储存计算机的指令与资料(program),方便 CPU 可以根据中间的结果来修改後续指令。
  • 而在范纽曼式的电脑中,电脑被分成了五大单元缺一不可。
    1. 控制器 Control Unit
    2. 运算器 Arithmetic Logic Unit, ALU
    3. 记忆体 Memory
    4. 输入设备 Input Device
    5. 输出设备 Output Device

Why better than ENIAC?

因为我们会先把要执行的程序码跟资料都储存於记忆体,所以如果我们想要变更任务,只需要修改程序即可,不需要去更改线路,省去这个步骤的麻烦。

指令集架构

  • 任何产品在设计的时候,都要先制定规格、再依据规格设计出相应的产品。
  • 所以,当我们想要设计 CPU 时,要制定的规格就是「指令集架构」(Instruction Set Architecture, ISA)。
  • 指令集架构包含:
    1. 指令集。
    2. 该指令集依附的机器结构叙述(Hardware Information)

  • 听起来有点抽象,但是我们可以用一条简单的叙述来描述指令集架构跟范纽曼架构的关系:

$$
ISA + Von\text{ }Neuman\text{ }Machine = Basic\text{ }Computer\text{ }Structure
$$

如果对电脑的基底有兴趣的话,未来可以去修「计算机程序」这门课 :smiley:

认识 C 语言

C-Language Introduction

  • C 语言是由美国贝尔实验室(Bell Laboratory)的 Dennis Ritchie 在 1972 年所开发出来的。
  • 前身是 B 语言(Basic Combined Programming Language - BCPL)。
  • 1978 年,Dennis Ritchie 和 Brain Kernighan 发布了第一版“ The C Programming Language”,俗称 K&RC。
  • C 语言在各种平台上快速发展,之後出了许多版本,为了统一各版本,1983 年美国国家标准局(ANSI)成立了一个委员会,为 C 语言提供了一套标准,我们把这一套标准 C 称为“ANSI standard”或“ANSI C”。而这套 ANSI C 也在 1989 年通过审查。於 1999 年进行了修订。

Features of C-Language

  • 可靠性 Reliability
  • 可携性 Portability
  • 灵活性 Flexibility
  • 互动性 Interactivity
  • 模组化 Modularity
  • 效率和有效性 Efficiency and Effectiveness

Uses of C-Language

C 语言常用於开发作业系统(如:Windows、UNIX 和 Linux)

  • 数据库系统 Database systems
  • Graphics packages
  • 文字处理器 Word processors
  • 试算表 Spreadsheets
  • 作业系统开发 Operating system development
  • 编译程序与组译程序 Compilers and Assemblers
  • 网路驱动 Network drivers
  • 直译器 Interpreters

C 程序的开发环境

C 程序在执行前会经过六个阶段

  1. 编辑:使用者可利用编辑器撰写或修改 C 程序码(source code)。
  2. 前置处理:前置处理器(preprocessor)会在开始编译前自动执行,依据程序码中 # 所标示的指示,进行代换或插入等动作。例如:#include <studio.h> 告诉编译器在为编译程序之前,先将程序库中的标头党 stdio.h 插入该位置。
  3. 编译:编译器(compiler)将程序码编译为目的码(object code)。
  4. 連结:連结器(linker)将一个或多个目的档(.obj)与静态程序库档(.lib)連结,产生可执行档(.exe)。
  5. 载入:载入器(loader)将可执行档(.exe)载入记忆体,并与动态程序库档(.dll)連结。动态程序库可减少执行档所占的硬碟和记忆体空间。
  6. 执行:最後,电脑在 CPU 的控制下,开始执行所载入的程序。


<<:  Day.8 Cache 的基本原理

>>:  树选手3号:XGboost [python实例]

前端工程学习日记第8天

有些学生提到还要多一个 clear div 来清除会把 HTML 弄脏, 这里老师也分享一个是使用 ...

Day8:EndPoint for Microsoft Defender 警示和事件

当我们布署完Microsoft Defender for Endpoint 接下来当侦测到威胁时,系...

[Day 27] 应用二:口罩下的人脸

前几天在谈到人脸识别有提到:大部分使用神经网路的模型都可以侦测与识别口罩下的人脸。 纳今天如果我们只...

[Day8] Fun with HTML5 Canvas

[Day8] Fun with HTML5 Canvas Canvas 的运用 需要用到的技巧与练习...

Motion 效果基本项目

上一篇介绍了Motion Graphic制作的基本流程,接下来要分析一下几个常用的动态效果。 Mot...