编程工作的演进史

1、CPU需要的只是1和0组成的二进制数据

(1)不管编程怎么变,最终编程得到的可执行二进制程序都是给CPU运行的。CPU需要的只是按照CPU设计时的规律(机器指令)排布的一串二进制1和0组成的数字(机器码),CPU根本不关心这些二进制是怎么来的。

(2)这些二进制可能是一个很厉害的程序员直接用1和0拼出来的;也可以是用汇编语言编写最终编译得到的;也可以是用C语言编写最终编译得到的;也可以是用java C# php bash等语言编写然后解释得到的;

(3)编程工作的演进其实一直是在处理上一个层次段落:就是使用何种语言编写程序(用某种语言进行编程),然后如何把这种程序源代码转成二进制(编译器的发明)。

(4)CPU接收到一串1010序列后如何工作达到目的,这就是设计制造CPU的公司要考虑的事情了,与软件工程师完全无关。

2、早期的纸卡打孔编程者

(1)最早期的时候,CPU也很简单,指令集很少,二进制位数也不多。那时候编译器也没被发明,编程语言也没被发明,那时候就是用二进制直接编程的。

(2)总结:最早的编程没有语言也没有编译器,程序员直接使用二进制和机器(CPU)对话。

(3)这种方式的坏处就是不容易扩展,随着CPU的进一步复杂化,指令的变多,指令位数的变多,编程难度呈几何倍数增长。人的大脑慢慢就跟不上这个节奏。

3、编程工作的第一次革命:由二进制机器码到汇编语言

(1)第一次革命就是:发明了汇编语言。汇编语言的本质就是用一个符号来代替一串二进制。

MOV 10101010101010

SUB 01010101010101

(2)有了汇编语言之后,程序员就不用再去记忆二进制序列了。编程时只需要用汇编指令来编程即可,汇编指令就是一个符号(符号就是由文字构成的,如MOV)。因为人类大脑天生对文字符号更加友好,因此用符号编程更简单。

(3)用汇编语言编写的源程序不能直接给CPU运行,必须通过一个翻译过程,把源代码翻译成二进制序列才能给CPU。这个翻译的过程就叫汇编,执行翻译动作的就是汇编器。

4、编程工作的第二次革命:由汇编语言到C语言

(1)汇编语言也有一些不尽如人意的地方,譬如:没有可移植性。在这个CPU上写的汇编程序无法直接在另一个CPU上运行。因此汇编语言是和CPU一一对应的。

(2)为了可移植性于是乎发明了高级语言。第一个高级语言就是C语言。C语言进一步靠近人的思维,为人的思维发明了很多CPU没有的东西,譬如数组。最终的目的就是降低编程难度,让高级语言更接近人的思维,然后通过编译器、汇编器等的翻译将这些源代码变成二进制然后给CPU运行。

5、革命无穷尽、层次变更多

(1)在C语言之上还有更高级语言,譬如:C++、Java、C#、bash等。越往上越靠近人的思维,越往上语言本身提供的封装越多,越往上编程难度越低、语言的掌握越容易。

1、CPU只认识二进制机器指令

(1)CPU是最终干活的,而CPU只认识只接受二进制。

2、人类喜欢符号而不是二进制

(1)人类的大脑本身不喜欢二进制而喜欢符号、文字。

(2)人类和机器之间天生有代沟,于是乎编程不容易。

3、连接人(程序员)与机器(CPU)的桥梁:编译器

(1)编译器降低了编程难度。编译器的代表就是编程语言,每一种编程语言都有对应的编译器,这个编译器的作用就是把这种语言的源文件编译成可执行程序。

(2)关键是:有了编译器(高级语言)之后,我们程序员就不再盯着CPU(二进制),而是改为盯着编译器(编程语言、编程语言的语法),所以我们学习编程的关键变成了学习编译器的习性,也就是编程语言的语法。

4、发明一门语言关键就在于发明它的编译器

(1)编译语言的关键就是编译器。yacc和lex工具就是用来发明编程语言的。

5、高级语言与低级语言的差别

(1)越高级的语言越靠近人类思维;越低级的语言越靠近机器的需要。

(2)人与机器总劳动量(总复杂度)守恒。人要是复杂一点机器就可以简单一点;人简单一点机器就需要复杂一点。这个规律描述的就是:编程语言越简单,人使用起来越简单,编译器设计起来就更复杂;编程语言越复杂、程序员使用起来越麻烦,则编译器设计越简单,CPU执行效率越高。

像编译器一样思考吧

语法是什么?语法就是编译器的习性

(1)编译器反应在编程中就是语法。

譬如1:

for (i=0; i<10; i++);

{

xxx;

}

譬如2:

int i; !!i;

解析:!在C语言中是逻辑取反的意思,逻辑取反意思就是0取反就是1,不是0的数取反就是0

问题:让你用C语言编程实现:如果一个数i是0则返回0,如果不是0则返回1

一般实现: if (i == 0){return 0;} else{return 1;}

或者可以用三母运算符: (i==0)?(0):(1);

极客式写法: !!i;

习得一门语言就像认识一个朋友

(1)从新开始认识一个人到成为好朋友,这里面要经历:时间、共事。

(2)学习一门编程语言也需要:时间、实践(共事)

学习编程语言要懂得换位思考

(1)预处理中处理程序注释、空行。

转载于:https://blog.51cto.com/songmao/1880887

说说程序员、编译器、CPU之间的三角恋相关推荐

  1. 对程序员来说CPU是什么?

    对程序员来说CPU是什么? 前言 本文参照<程序是怎样跑起来> 这本书,不断更新我的博文,一是用于填补我的计算机基础"空白",二是通过对该书提到的知识进行总结和凝练以加 ...

  2. 作为一个程序员,CPU的这些硬核知识你必须会!

    CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是 ...

  3. 程序是怎样跑起来的:第一章-对程序员来说CPU是什么

    文章目录 一:CPU的内部结构解析 (1)CPU的作用 (2)CPU的构成 (3)简单了解内存 (4)程序运行的简单描述 二:CPU是寄存器的集合体 (1)CPU是寄存器的集合体 (2)寄存器的分类 ...

  4. 《论程序员与老板之间的道德问题》

    前两天有个朋友跟我聊天,诉苦,内容如下: " 最近不知道怎么了,干不进去了. 感觉再怎么努力,也无济于事. 欠了亲戚朋友那么多钱,四十多万.我不想欠人情,我怎么还?就我现在挣得这点钱,我一个 ...

  5. 好虐!一张图看懂程序员和测试之间的关系!

    在开始我们今天的话题之前,我们先看一张图: 微博网友评论: 小A:最近一直在被测试按在地上反复摩擦 小B:笑死!!不够专业的测试也是浪费超级多沟通时间呀!! 小C:最后都是杰瑞赢了 小D:真的是挺悲哀 ...

  6. 程序员与代码之间的搞笑日常,笑的人肚子痛

    一:程序员面试篇 面试官:"熟悉哪种语言". 应聘者:"JAVA". 面试官:"知道什么叫类么". 应聘者:"我这人实在,工作努力 ...

  7. 程序员与代码之间的搞笑日常,笑的人肚子痛!

    一:程序员面试篇 面试官:"熟悉哪种语言". 应聘者:"JAVA". 面试官:"知道什么叫类么". 应聘者:"我这人实在,工作努力 ...

  8. 程序员在城市之间如何抉择?一线城市、二三线城市哪里更适合?

    一线城市容不下肉体 二三线城市安放不了灵魂 北京赚钱北京花,一分别想带回家 深圳赚钱深圳花,交完房租又白搭 -- 这几年对于工作城市的讨论一直没有停止过,城市的选择也一直摆在我们面前:大学毕业踏入社会 ...

  9. 如果美工请假了,要程序员做图顶上!会是什么样的场景?经常我们都能听见程序员和设计师之间的互怼日常!

    程序员:"你们设计都是一帮大少爷,拿张破草稿纸在那边瞎胡笔划几下,就让我做东飞西跳的牛逼效果,我哪知道是什么效果???你们怎么不去动物园耍猴呀!" 设计师:"你妹的!技术 ...

最新文章

  1. 怎样处理重命名系列案例代码
  2. 为什么极度随机树比随机森林更随机?这个极度随机的特性有什么好处?在训练阶段、极度随机数比随机森林快还是慢?
  3. Android EventBus使用(不含源码解析)
  4. 万字长文:详解 Spring Boot 中操作 ElasticSearch
  5. linux oracle12c dbca,Linux下Oracle 12c R2图形化安装笔记
  6. jquery总结_代码收藏
  7. gradle生命周期
  8. python从list中取出连续的数_python list 中找连续的数字(由网友处学习)
  9. JDK 8时代的抽象类与接口
  10. Leetcode--438. 找到字符串中所有字母异位词
  11. 一晚浓浓的程序员鸡汤,先干为敬
  12. 自学前端1年,靠着这份面试题和答案,我找到了20K工作
  13. Django 分页组件替换自定义分页
  14. 第九讲 博弈论在机制设计中的应用练习题
  15. 如何在Docker中列出容器
  16. 2个表 遍历 组合_7.2 图的存储结构(2)
  17. google“退出”中国?
  18. Double和Float类型的max、min、isNaN、isFinite、isInfinite方法
  19. 图解Oracle数据库(二)
  20. 我认得embdedding

热门文章

  1. fft的c语言和matlab对比_Matlab系列之程序控制
  2. 集合框架源码分析六之堆结构的实现(PriorityQueue)
  3. Android性能优化 - 内存优化
  4. JavaWeb:MVC设计模式
  5. SppNet 多尺度训练
  6. linux 控制台输入命令无效_在控制台输入什么命令都提示commandnotfound原因是什么?suselinux...
  7. Linux系统root密码重置教程
  8. Spring 详解(五):Spring声明式事务
  9. mysql按照datetime精确查询_MySQL datetime字段查询按小时:分钟排序
  10. Python爬虫==【openurl】