1.2 编程语言的发展
自从1946年第一台通用电子计算机问世,人类与计算机交流的编程语言经过了机器语言、汇编语言和高级语言3个阶段的发展。随着时代发展,编程语言对人类越来越友好。
第一代程序设计语言被称为机器语言。用这种语言写出来的程序是一串0和1组成的数字,机器直接就能理解,但对于人来说就太难理解了。下面是计算1+2+3+…+100的机器语言代码(冒号左边是内存地址,可忽略),看上去像不像天书?
400526: 01010101 400527: 01001000 10001001 11100101 40052a: 01001000 10000011 11101100 00010000 40052e: 11000111 01000101 11111000 00000000 00000000 00000000 00000000 400535: 11000111 01000101 11111100 00000000 00000000 00000000 00000000 40053c: 11101011 00001010 40053e: 10001011 01000101 11111100 400541: 00000001 01000101 11111000 400544: 10000011 01000101 11111100 00000001 400548: 10000011 01111101 11111100 01100100 40054c: 01111110 11110000 40054e: 10001011 01000101 11111000 400551: 10001001 11000110 400553: 10111111 11110100 00000101 01000000 00000000 400558: 10111000 00000000 00000000 00000000 00000000 40055d: 11101000 10011110 11111110 11111111 11111111 400562: 10010000 400563: 11001001 400564: 11000011
事实上,上面代码左边的内存地址是无须存储的,而且代码也不会一行一行清晰排列。计算机里的代码是下面这样的。
01010101 01001000 10001001 11100101 01001000 10000011 11101100 00010000 11000111 01000101 11111000 00000000 00000000 00000000 00000000 11000111 01000101 11111100 00000000 00000000 00000000 00000000 11101011 00001010 10001011 01000101 11111100 00000001 01000101 11111000 10000011 01000101 11111100 00000001 10000011 01111101 11111100 01100100 01111110 11110000 10001011 01000101 11111000 10001001 11000110 10111111 11110100 00000101 01000000 00000000 10111000 00000000 00000000 00000000 00000000 11101000 10011110 11111110 11111111 11111111 10010000 11001001 11000011
世界上第一台通用电子计算机ENIAC使用的是最原始的穿孔卡片,这种卡片所使用的语言就是机器语言。
穿孔卡片示例图
历史上最大的穿孔卡片程序是20世纪50年代的SAGE防空系统,这个程序使用了62 500张穿孔卡片(大约5MB的数据)。
汇编语言被称为第二代程序设计语言,它使用一组帮助记忆的符号(助记符)来表示每条命令。下页图是计算1+2+3+…+100的汇编代码(最左侧的数字表示内存地址,<>内是注解)。相比于看上去像天书的机器代码,汇编代码友好了不少,但门槛依然比较高。
400526: push %rbp 400527: mov %rsp, %rbp 40052a: sub $0x10, %rsp 40052e: movl $0x0, -0x8(%rbp) 400535: movl $0x1, -0x4(%rbp) 40053c: jmp 400548 <main+0x22> 40053e: mov -0x4(%rbp), %eax 400541: add %eax, -0x8(%rbp) 400544: addl $0x1, -0x4(%rbp) 400548: cmpl $0x64, -0x4(%rbp) 40054c: jle 40053e <main+0x18> 40054e: mov -0x8(%rbp), %eax 400551: mov %eax, %esi 400553: mov $0x4005f4, %edi 400558: mov $0x0, %eax 40055d: callq 400400 <printf@plt> 400562: nop 400563: leaveq 400564: retq
再后来,就有了被称为第三代程序设计语言的高级语言,如C语言和Python语言。同样是计算1+2+3+…+100的值,用高级语言写出来的程序看上去就友好多了。
#include <stdio.h> void main() { int sum=0; for (int i=1; i <=100; i++) sum=sum + i; printf ("1+2+3+…+100=%d\n", sum); }
用C语言写出的计算1+2+3+…+100的程序
n=0 for x in range (101): n=x+n
用Python写出的计算1+2+3+…+100的程序
最后,我们来看本书的主角——Scratch。下面这段程序是用Scratch编写的计算1+2+3+…+100的程序,看上去是不是很亲切?可以说,以Scratch为代表的图形化编程工具对大家已经非常友好了,搭积木搭得溜的小朋友很快就能上手。
当然,计算机是无法直接执行高级语言编写的程序的。用高级语言编写的程序首先要经过编译或解释成计算机能理解的机器语言后,计算机才能一条条地执行指令。在这里,编译器或解释器就充当了人和机器之间的翻译,把人易于理解的高级语言程序翻译成机器易于理解的机器程序。