本章将用本系列第二章中提到的 类比 思维来让读者快速了解什么是.NET。

当年在网上看到一个初学者问《Java编程思想》第一章看不懂怎么办。然后我发现在很多经典的技术书中,如《C#入门经典》、《C#高级编程》、《Java核心技术》、《Go程序设计语言》它们都会在前面一两章介绍该语言的特色,然而因为提到的概念太过大而且很多,导致初学者一下子很难消化,而且有些初学者认为第一章看不懂,后面就跟难了,导致学习的信心被打击了,其实是可以跳过前面章节的,而学了后面的章节后,再回去看第一二章。.NET也包含很大知识体系,我不会整体去介绍,而是给读者提供一个切入点,让读者找到一个了解什么是.NET的方法。

编译器-翻译员

如果要和外星人沟通,又不想学外星人的语言,那么这个时候你需要一个翻译员。

在电脑诞生之初,人们和电脑沟通是用机器语言,猜猜下面的机器语言是什么意思~

0010 0001 0000 0100
0001 0001 0000 0101
0011 0001 0000 0110
0111 0000 0000 0001
0000 0000 0101 0011
1111 1111 1111 1110
0000 0000 0000 0000

上面机器码的意思是:求 83+(-2) 的值。

机器语言[machine language]是一种指令集的体系。这种指令集称为机器代码[machine code],是计算机的CPU可直接解读的数据。

直接用机器语言和机器沟通和其痛苦,人类都希望能用接近人类的语言和机器沟通,所以设计了接近人类表达方式和思考方式的高级语言,同时发明编译器,用来将高级语言编译成机器语言,于是,我们得到的 类比 图是这样的:

注意上图的 机器码(Windows) ,这样表达的原因是因为现在机器(硬件)是由操作系统管理的,因此你可以把操作系统也比喻成精通各种机器语言的翻译员,所以要和机器沟通,那么是和操作系统沟通(貌似编写驱动级别的程序是可以绕过操作系统直接和机器沟通的)。

高级语言编译器(翻译)(操作系统 → 硬件)

(操作系统 → 硬件) 这样描述的原因是因为,现在硬件可以说是有操作系统管理和保护的,如程序A有登陆功能,把密码保持内存地址A10086处,而如果程序B可以去读取内存地址A10086,那么就...

所以我们现在面对的问题是和各种操作系统沟通。为了能和各种各样的操作系统沟通,Sun提出了Java解决方案,请看下面的 类比 图:

这种方案很不错,我们说一句话英语,所有外星人都听懂了。

高级语言编译器(翻译)中间语言虚拟机(翻译)多种(操作系统 → 硬件)

同时,90%的人类都是使用Windows和机器沟通,也就是Windows上面运行着用各种编程语言的软件。有些软件功能很好,其他软件想复用,但编程语言不一样,如用C语言去调用R语言编程的功能,用 类比 思维来讲,就如同汉语说几句突然说了几句英语,然后又说了几句日语。Windows表达这个翻译员不好当啊,于是微软提出了.NET解决方案,请看下面的 类比 图:

多种高级语言编译器(翻译)中间语言虚拟机(翻译)(操作系统 → 硬件)

将上面两种解决方案相结合就是 .NET Core ,那么我们得到的 类比 图如下所示~

多种高级语言编译器(翻译)中间语言虚拟机(翻译)多种(操作系统 → 硬件)

总结

类比思维

你可以把.NET当作是翻译员,而.NET Core是更强大的翻译员作为切入点去理解。以后还要介绍这个翻译员需要什么,提供了什么,制定了什么规则,从而慢慢扩散到了解整个.NET知识体系。

分层思维

正如我在第二章学习思维种提到计算机科学是属于人造科学,我们从编程语言的发展来发现计算机科学家们是用什么思维来解决问题的。

从一开始的:机器语言机器

发展到:多种高级语言编译器(翻译)中间语言虚拟机(翻译)多种(操作系统 → 硬件)

以前 現在
机器语言 高级语言
编译器(翻译)
中间语言
虚拟机(翻译)
操作系统
机器硬件 机器硬件

我们发现计算机科学家们是通过 加层分层 来解决问题的。计算机网络七层模型也是用同样的思维:

计算机网络七层模型 编程语言
应用层 高级语言
表示层
会话层
传输层
网络层
数据链路层
物理层 机器硬件

可以调侃说,计算机科学没有什么是加一层不能解决的,如果有,那么就再加一层。

所以 加层分层 是很重要的计算机科学思维,请牢记!

吐槽

如果微软在2002年的时候就将 .NET 按上面图4去实现,那么...算了,没有如果~

结束语

本章介绍了:

  • 类比 思维通常可以让你很快速切入了解某个知识点。
  • 计算机科学家们经常用 加层分层 来解决问题。

下一章,我们将介绍怎么如何像上帝一般创造万物。

最新文章

  1. 使用Akka.net开发第一个分布式应用
  2. 【代码笔记】iOS-浮动的云
  3. JS中数组Array的用法
  4. Swift游戏实战-跑酷熊猫 12 与平台的碰撞
  5. Android屏幕适配常识
  6. 模板引擎逻辑语句处理之对单层for循环的处理
  7. [原]Unity3D深入浅出 - 脚本开发基础(Scripts)
  8. Mysql的执行顺序
  9. Qt5:Qt中屏幕或窗口截图功能的实现
  10. Java 核心内容相关面试题【1】
  11. HttpSessionActivationListener序列化与反序列化
  12. python3 使用代理
  13. thinkphp5省市区三级联动例子
  14. D. Equalize Them All Codeforces Round #550 (Div. 3)
  15. 转://使用insert插入大量数据的总结
  16. jvm-垃圾收集
  17. [20180627]测试bbed是否支持管道命令.txt
  18. [转][osg]关于PagedLOD 加载卸载机制
  19. MariaDB 数据库系统概述(1)
  20. Generate Parentheses leetcode java

热门文章

  1. ubuntu20.04修改静态ip不生效问题
  2. 使用kubeadm方式搭建K8S集群
  3. Encodings: URL
  4. 【GUI开发案例】用python爬百度搜索结果,并开发成exe桌面软件!
  5. vim快捷键及命令大全
  6. python中调用C代码
  7. JavaEE Day00 Java Web课程介绍
  8. aiohttp、asyncio使用协程增加爬虫效率
  9. go-micro v3 rpc服务一次改造经历
  10. Mybatis-plus实现数据库的增删改查操作