• 相逢是缘
    2019-11-16
    使用任何一个编程语言编写的程序,最终执行上都要落实到CPU一条一条指令的执行(无论通过虚拟机解释执行,还是直接编译为机器码),CPU看不到是使用何种语言编写的程序。对于所有编程语言最终目的是两种:提高硬件的运行效率和提高程序员的开发效率。然而这两种很难兼得。
    C语言在效率方面几乎做到了极致,它更适合挖掘硬件的价值,如:C语言用数组char a[8],经过编译以后变成了(基地址+偏移量)的方式。对于CPU来说,没有运算比加法更快,它的执行效率的算法复杂度是O(1)的。从执行效率这个方面看,开发操作系统和贴近硬件的底层程序,C语言是极好的选择。
    C语言带来的问题是内存越界、野指针、内存泄露等。它只关心程序飞的高不高,不关心程序猿飞的累不累。为了解脱程序员,提高开发效率,设计了OOP等更“智能”的编程语言,但是开发容易毕竟来源于对底层的一层一层又一层的包装。完成一个特定操作有了更多的中间环节, 占用了更大的内存空间, 占用了更多的CPU运算。从这个角度看,OOP这种高级语言的流行是因为硬件越来越便宜了。我们可以想象如果大众消费级的主控芯片仍然是单核600MHz为主流,运行Android系统点击一个界面需要2秒才能响应,那我们现在用的大部分手机程序绝对不是使用JAVA开发的,Android操作系统也不可能建立起这么大的生态。
    展开

    作者回复: 👍

     5
     190
  • 猫切切切切切
    2019-11-15
    操作系统是业务无关的,它更接近于底层计算机,因此更适合用面向过程的语言编写。而接近业务的也就是接近人的软件,则更适合用面向对象的语言编写。
     6
     161
  • 辣么大
    2019-11-15
    我们以历史的时间线看看这两种语言的演进过程。
    1969年贝尔实验室提出Unix操作系统
    1972年贝尔实验室的Dennis Ritchie开发C语言。
    1973年他用C语言重写了Unix。
    1991年Linus Torvalds提出Linux。

    另外一条线面向对象语言的发展:
    1972年第一个面向对象的编程语言是Simula发布。
    1996年,Java1.0发布,流行的主要原因是jvm,Write Once, Run Anywhere(编写一次,到处安装JRE)

    从时间上看,面向对象概念的提出晚于面向过程。C语言因商业应用成熟要比面相对象的编程语言早。

    C语言的流行主要是因为Unix和Linux操作系统的实现基于C语言。类Unix系统可以运行在服务器,嵌入式设备,移动设备上。

    一个东西的好坏要综合考虑:面向过程和面向对象各有各的优缺点。一门编程语言的提出是为了解决某些特定的问题。面向对象和面向过程在应用上各有各的位置。
    展开
     3
     39
  • Paul Shan
    2019-11-15
    思考题
    大学学习操作系统的时候,大部分内容已经忘了,还记得老师说过,虽然操作系统是用C语言写的,但是面向对象的思想早已深入到操作系统的源代码中。
    
     32
  • LYy
    2019-11-15
    操作系统虽然是用面向过程的C语言实现的 但是其设计逻辑是面向对象的。
    C语言没有类和对象的概念,但是用结构体(struct)同样实现了信息的封装,内核源码中也不乏继承和多态思想的体现。
    面向对象思想,不局限于具体语言。
    
     27
  • lijun
    2019-11-15
    深夜追设计模式!🤑
     2
     13
  • 李小四
    2019-11-15
    设计模式_06
    操作系统的源码一直没读过,但我认为如此复杂的系统设计,(站在现在的时间点)用面向对象风格(或实现相同目的其他方式)来编写代码是更合适的,而且从Linux的模块化分来看,推测有类似的实践。

    老话说, 机器能读懂所有代码, 但人不一定. 对于机器来说, 每一次业务调用流程都是序列化的, 机器并不在乎面向对象, 但人在乎. 正如本文所讲, 编程语言离机器越来越远, 离人越来越近. 为了迁就人, 我们使用了执行效率更低的语言, 有了更多的中间环节, 占用了更大的内存空间, 换来的是这个行业的蓬勃发展以及让人类的便捷生活和能力延伸.
    展开
    
     10
  • 墨雨
    2019-11-15
    Java代码的注释是不是没改呀……为啥还是结构体呢……。感觉这几篇都比较偏理论,有点拖踏

    作者回复: 注释忘了改 我改下 多谢提醒

     1
     8
  • 未未的未来
    2019-11-15
    疑问:
    老师举的文件那个例子,使用面向对象编程那个,不是封装了函数,用函数对操作过程进行了抽象了吗,为什么老师说没有用到封装、抽象这些特性?
    思考题:
    理解,C语言虽然是面相过程语言,但是面向过程语言也可以写面向对象的,另外,C语言更贴近底层一些,写操作系统的话还是有性能上的优势。

    作者回复: 你指出的这点很好。关于封装,有两种理解,一种是狭义的面向对象特性:封装是一种信息隐藏,需要把数据和方法放到一起,而c语言实现的代码,数据和方法是分离的。封装的另一种广义的理解,可以包含你指的封装函数。抽象实际上我们前面章节中也讲到过,比较没有特异性,有的时候不看做面向对象的特性。

     8
     7
  • 寒江独钓者
    2019-11-17
    读过linux内核源码和python解释器源码的应该都明白,所谓面向过程的C语言照样可以实现面向对象的思想,有很多设计都是非常优雅的,付出的代价并不高,我并不认为面向对象编程语言做相同的事情付出的代价会更低。编程思想、设计模式跟语言是没有关系的,编程思想和设计模式是指导我们编程的,而编程语言只是一种实现工具罢了。
    
     6
  • 养成好习惯
    2019-11-18
    go语言大力推举函数式编程,这是趋势吗老师

    作者回复: 函数式编程让写代码更加简单些,封装了很多设计模式、并发处理,可能是个趋势。

    
     4
  • 月坛小雨
    2019-11-15
    这套课程的配图,没有《算法》那套用心呀

    作者回复: 因为本身这门课的图就没有像算法那样多。这门课代码比较多。

     2
     4
  • 摸爬滚打三十年
    2019-11-15
    老师前几节讲的都是基本概念,每读一遍就感觉加深了一层印象和理解。学习本节最大的感受,面向对象和面向过程之间相互对比更容易理解,他们最大的区别1.代码的组织单元:面向对象是类和对象,面向过程是函数和数据。2.是否支持四大特性以及对四大特性的支持程度,面向过程不支持继承和多态,在封装和抽象上,面向对象要更加深刻一些。面向对象对类抽象,面向过程抽象成方法,面条式的执行过程,流水线的操作方式。通过访问控制,面向对象对外暴露有限的成员属性和方法。总体来说,面向对象编程更适合人的思维习惯,能够客观反映代码和真实世界的关系。我的一点体会,不知道对不对,过一段时间再来回顾一次,看到时候的理解会不会更深。
    
     4
  • CHS
    2019-11-26
    不矛盾,面向对象是一种思想,语言是一种工具,任何语言都可以使用面向对象的思想来写代码。系统使用C语言,是因为C语言更加底层,执行效率高。
    
     3
  • KaitoShy
    2019-11-15
    我理解C++的出现主要是为了C语言中的泛型编程问题。而Java 的出现是为了抽象对计算机的依赖,更专注于业务。对于计算机底层 C/C++ 可能更适合,而 C 的对于程序员来说自由度是最大的。再看Linux的发展,1991年,林纳斯基于Unix的编写的,可能他更善于这个语言,他编写 git 的时候也是用的 C。Unix选择C也是由于自己擅长的原因
    
     3
  • null
    2020-01-09
    OOP 更能应付复杂流程的程序开发,自己是深有体会。

    去年做了一个功能,第一版着急上线,就照着流程图翻译,最后就是一组顺序执行的方法集。if 分支特别多。

    上线后有空,自己重构了一版。这次是翻译了泳道图:data_provider、rule_filter_chain、data_consumer 和 data_writer。
    data_provider 提供 3 种类型的数据。每种类型数据有 2 种规则。匹配规则后,会有一些数据处理,如与订单绑定、返佣记录等。最后是将这些数据持久化到数据库。处理过程还使用了多态特性,因此在调用 rule_filter_chain、data_consumer、data_writer 处的代码都特别精简,都是从 Map 获取处理对象,然后直接调用方法。

    现在回看,重构时自己关注最多也是思考最多的是每个阶段的类对象,它的职责是什么。如入参是什么,业务逻辑处理,处理后的出参是什么。实现完这些类后,就真的是像搭积木一样将这些类串起来就可以了。就跟文章说的一样:业务建模、翻译需求为类、类之间交互。
    重构后的代码逻辑清晰了,也更简洁了。整个业务也更容易理解了。但是有一点,重构之后,类文件也增加了挺多。但是相比一个类几百上千行代码,我更喜欢简短的类。适当的增加一些类文件,也是能接受的。

    展开
    
     2
  • Better me
    2019-11-19
    讨论题发表一下自己的意见
    用面向对象语言结合面向过程思想写程序,这就相当于手握一把屠龙刀,却只是把它当作一把普通的刀剑来用。相反我们也可以用面向过程语言结合面向对象思想来写程序,那也能达到很好的易复用、易扩展、易维护的效果,相对来说代价会比较高,毕竟语言本身没有提供这种语法机制,需要在我们编程中体现处理实属不易。
    
     2
  • 苗
    2019-11-19
    面向过程最主要的特点就是数据和方法相分离。我哭了,虽然一直用的是MVC框架,但是没有业务建模;基本上都是数据导向,妥妥的面向过程开发。
    
     2
  • 筱乐乐哦
    2019-11-16
    我的理解不矛盾,理由如下
    1、操作系统更多的是和硬件打交道,需要考虑到语言本身翻译成机器语言的成本和执行效率,尤其总要。
    2、如linux内核、总线、文件系统网络等的设计,也是具有面向对象过程的思想,很好的支持了常见的文件系统的挂在、内核的升级和对硬件的热插拔、网络等的处理,常见的服务器多数都是linux,为啥不用window,我的理解和设计实现有很大的关系,尤其是网络、安全、权限、标准等等
    3、linux操作系统,本身就是一个大的抽象,属于一个硬件和高级软件连接的桥梁

    也希望争哥发表下自己的看法,指点指点
    展开
    
     2
  • hudson
    2019-11-15
    formatToText换成toString是不是更符合习惯?

    作者回复: 会不会有歧义呢?

    
     2
我们在线,来聊聊吧