这几天在学机器学习,可能太浮躁了,学到 k-fold 交叉验证有点学不下去了。正好看到大一自己写的 C 语言笔记,大概有 $2^6$ 这么多页。从 C 语言的由来一直讲到函数(似乎是老师也就说了这么多,后面的指针全是带过的),内容蛮全的。试试看自己能不能将他完全写进我的博客里吧~

机器学习和 C 语言笔记将会同步更新。理论上不会弃坑

因为笔记上面好多地方都是用符号标记的,有些忘记了的地方,还请各位多多指教~

C 语言的由来

在计算机诞生以来,是不像现在一样拥有各式各样的编程语言供大家根据不同的场景选择最合适的语言。当时候的计算机只认得 0 和 1 两种变量的输入,计算结果也是 0 和 1 组成的一串数据。这时候我们管这个编程语言叫 机器语言 Machine Language

机器语言

他是由一组二进制 (0, 1) 组成的,它的优点有:计算机能直接识别、编写的程序直接就是 目标程序 可以被直接执行,所以它的运行效率也是最高的。但是缺点也非常显而易见的:难学、难记、难写、难改。而且呀,当时不同计算机的指令系统 command system 有差别,这也导致了不同机器之间代码移植性低。

汇编语言

后来,出现了一种语言那就是 汇编语言 Assembly Language。他是属于低级语言的一种,也是编程语言中的第二代语言。当时的程序员 / 工程师们将二进制串转换成助记符,这两者之间可以相互转换,即:程序员在编写程序时使用的是助记符(也就是汇编语言),而计算机则将助记符翻译成二进制串(binary)再进行执行。而他的原理是将计算机的各种指令(二进制串,后续我会抽空说明 CPU 的原理)烧录到 CPU 中,以让 CPU 去识别这些助记符。

挖个坑,后续如果我们需要讲解 Turing Complete 游戏的时候会讲到这个。

如:

ADD # 加法
SUB # 减法
MOV # 在内存之间传送数据

汇编语言的好处就是:易懂、方便修改和维护、有效发挥硬件的功能和特长、程序精炼、质量高。但是上面提到,工程师得先将指令烧录进 CPU 才能让计算机取识别这类型代码,所以汇编语言也 依赖机器硬件,同样的,移植性也不好。

高级语言

这时候,人类就在想,能不能有一门计算机语言,能够接近于数学语言或者人类的自然语言(当然,也就是英语),而且不再依赖于计算机硬件,同时解决这两个缺点的编程语言。这时候,就出现了最早的高级语言:

FORTRAN

FORTRAN 的全称是 Formula Translator,公式翻译器。它的优点就是:功能强大、易学、易懂、易维护,这简直解决了当时程序员狂掉头发的问题,让更多的程序员拥有一头还算乌黑的头发。但是这种语言,由于他已经经过了多层包裹,导致她不能直接被计算机运行,需要经过翻译,也就是我们熟悉的 Compile 编译。

这时候,我们对高级语言编写出来的代码称之为源程序(Source Program)而源程序就需要翻译成目标程序,这个过程我们就叫他编译程序(compiling program)。

发展

当 FORTRAN 问世的时候,他还是属于 非结构化的语言

非结构化语言

非结构化语言是什么呢?也就是说这类型的语言风格随意、他没有编程规范可以遵循流程、可以随意的跳转、难阅读以及维护。这就好比你拿到一本故事书然后你看着看着,作者让你跳到第 100 页去看,然后再从一百页翻回来 60 页去看接下来的故事。显而易见的,这类型的语言非常的难以被人理解,尤其是如果没有良好的编程习惯的话,那情况会更加糟糕。这类型的语言以 FORTRAN、ALGOL 以及 BASIC 等为代表。

结构化语言

到了大约 1969 ~ 1970 年代,人们创造出了结构化语言。那么这类型的语言的特点,就是它规定程序必须要有良好的基本结构,比如说顺序、分支、循环结构等。他不允许程序随意的跳转。程序是由上而下,一行一行顺序的执行的。这类型的语言有 QBasic,Pascal 和 C 语言为代表。其中 Pascal 是这类型语言的第一个,也就是鼻祖。

面向对象语言

而后来大约在二十世纪八十年代开始出现了面向对象语言,这类型语言呢有 C++、C#、Visual Basic、Java 等。这些类型的语言让我们能够将现实世界的实体抽象成代码中的一个个对象。使代码更加容易地被阅读以及操作。

程序设计语言的功能

程序设计语言是人类与计算机之间进行交流的桥梁。我们需要让计算机按照自己的意愿处理数据,就必须用程序设计语言表达所要处理的数据与即控制数据处理的流程。因此,程序设计语言必须要具有数据表达。(就是变量定义)与数据处理(就是流程控制)的能力。

除了要有数据表达的能力之外,程序设计语言还需要具备流程控制的能力。其中包括了顺序控制分支控制,也就是 if、else 或者是 switch 分支,以及循环控制,如 for 循环,while 循环 do while 循环等。这三种结构的特点是:

  • 单一的入口和出口
  • 结构中的每个部分都有被执行的可能
  • 结构内不应该出现永不终止的死循环

而程序设计方法就是结构化程序设计 (structured programming),C 语言就是典型的结构化程序设计语言。

程序的算法表示

计算机科学家尼·沃斯 (N · Wirth) 表示,计算机科学就是研究算法的学问。算法的特点就是:

  • 确定性
  • 有穷性
  • 可行性
  • 有零个或多个输入
  • 有一个或多个输出

而一个算法,我们可以通过四个步骤来实现。

  1. 用文字描述算法,把所要进行的算法写出来
  2. 用流程图去描述,绘制流程图是程序员应该要具备的一项技能
  3. 伪代码表示,计算机无法运行伪代码
  4. 所以最后一步我们还需要把它转换成程序设计语言