当前位置: 首页 > news >正文

Smalltalk语言是何物?面向对象鼻祖Simula的诞生?Simula和Smalltalk有什么区别?面向对象设计?

Smalltalk语言是何物?

Smalltalk语言的前身可以追溯到Flex系统,这是由Alan Kay最早提出的。在随后的发展中,Smalltalk逐渐演化,并出现了Smalltalk-72和Smalltalk-76等版本。最终,在经过近10年的研究与发展后,Xerox研究小组于1980年正式推出了Smalltalk-80系统。Smalltalk语言对后来的许多编程语言产生了深远影响,包括Objective-C、Java、Ruby等。这些语言都借鉴了Smalltalk的面向对象编程概念,如对象、类和消息传递等。因此,Smalltalk也被誉为“面向对象编程之母”。

面向对象鼻祖Simula的诞生

Simula 是一种早期的高级编程语言,它对后来的编程语言产生了深远的影响,特别是在面向对象编程(OOP)方面。Simula 的设计者是挪威计算机科学家奥利·约翰·达尔(Ole-Johan Dahl)和克里斯蒂安·诺尔·克里斯特(Kristen Nygaard),他们在1960年代中期开始设计这种语言。它们一开始在研究如何将仿真技术应用于计算机程序,他们意识到现有的编程语言,如 FORTRAN 和 ALGOL,并不适合于模拟复杂系统。1966年,Simula I 语言发布,1967年,Simula 67 版本发布,它是一个更加成熟和完整的语言。Simula 67 增加了更多的语言特性,如多继承和动态绑定,这些特性使得它更适合于模拟和仿真。Simula 67 也成为了第一个被广泛使用的面向对象编程语言,它的成功促进了后来的面向对象编程语言的发展,如 Smalltalk、C++ 和 Java。

Simula和Smalltalk有什么区别?

这两者都比C语言诞生还早,它们都是对面向对象编程语言研究的产物。Simula更静态,倡导编译期决定,因此C++和Simula更亲近,而Smalltalk更注重消息动态发送,不在乎编译期是否绑定,在此思想,ObjC和Smalltalk更接近。

面向对象设计

通常的认知,面向对象程序设计最早从Simula发展而来,而后的SmallTalk也为面向对象提供了参考。ObjC借用SmallTalk消息的概念,C++扩大发展了OOP技术,为Java/C#等语言提供了坚实的基础。还有其他语言,Module-2提出模块MODULE概念,可以封装子程序和数据结构,限制访问权限,Clu提出了里氏替换原则,也为OOP设计提供了思路。面向对象最基本的就是类设计。

面向对象思想

  • 面向过程和面向对象思维
    • 习惯C语言函数过程思维,第一次接触面向对象可能有很强的不适应感。感觉这个世界应该是按过程去执行,而不是new一个对象。事实上,面向对象并没有改变程序的本质,依然是函数过程代码执行,只不过要找一个宿主。数据和对数据操作的函数分离造成很大的不便,面向对象就为了解决这个问题。
    • 面向对象类就是C语言的"结构体",将操作函数和花哨特性加进来,访问更方便,这就是面向对象的本质。
    • 包含对于C语言main函数而言,简单直接,输出hello world即可。Java和C#必须新建一个类,类里面写Main函数。Java更甚,还要求至少一个类名是public,且和文件名相同,这造成了一些困扰。理解它需要了解,Java是为了规范化,用类让所有人都遵循,Main函数也不例外。这对于写测试代码,会产生冗余,这是语言的要求带来的"副作用"。C++比较圆滑,C语言虽然有时不够稳健,但main函数是C语言说的算,这让C++成为一门极其有特色的语言,你可能写的像C语言,也可以像Java,有的人写的四不像,高手写成一段经典,新手写得不能看。
  • 不同访问权限
    • 社会上有一些公共设施,大家都可以了解,去使用,这是public. 爸爸可能会希望房子继承给他的儿子,这是protected,房子目前爸爸和儿子都可以去住。爸爸为了自己的生活能继续,私自藏了200块,这是private. 请你最好的朋友来你家做客,他能在你家很随意,这是friend.
    • 最早Smalltalk提出public/private概念。
  • 多态
    • 孩子高考填志愿,爸爸妈妈和老师都给了建议,但孩子坚持要听从内心的想法,这是多态。孩子父母落下一句话,一定要听他们的建议,这是不可重写的函数。
  • 消息
    • 一般而言,类函数并没有消息的概念,SmallTalk和ObjC强化了消息的概念,调用一个类对象的函数方法被称为发送消息,这个消息和GUI消息机制完全无关,它仅仅是函数调用的代名词。它们之所以这么称呼,源于有一套动态库,处理消息转发,即使目标对象根本不存在这个消息,编译依然不会报错。这在C++/Java/C#/Python是不能想象的。这有一个优点,可以模块化,主模块可以不用知道被调用模块是否存在,只管去调用,不管有还是没有,最终做对应处理即可。这简化了某些时候的处理。

支持面向对象设计OOP的语言

  • 面向对象设计相比面向过程有不少优点,一些很老的编程语言也在新标准中纷纷加入。比如Fortran/Ada等。
  • ObjC/C++/Java/C#/Python/JS 均支持面向对象设计。
  • Go语言作者之一原本参与C语言设计,不太喜欢C++复杂的设计,用一套类似C语言结构体组合的方式模拟面向对象设计。Rust和Swift也是不太喜欢纯面向对象设计,用trait和结构体组合模拟面向对象设计。
  • JS正式引入类是ECMAScript 2015(也称ES6)版本,但本质上它并不是Java/C#这种纯面向对象类设计,而是基于原型的继承模式。


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

http://www.lryc.cn/news/529826.html

相关文章:

  • KVM/ARM——基于ARM虚拟化扩展的VMM
  • Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher
  • 【架构面试】二、消息队列和MySQL和Redis
  • 算法【完全背包】
  • 二叉树的遍历
  • 1.31 实现五个线程的同步
  • three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)
  • 【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
  • 《大数据时代“快刀”:Flink实时数据处理框架优势全解析》
  • antdesignvue统计数据源条数、计算某列合计值、小数计算不精确多了很多小数位
  • 02.05、链表求和
  • dmfldr实战
  • Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
  • 爬虫基础(二)Web网页的基本原理
  • 外网访问禅道软件项目管理系统
  • Python 梯度下降法(五):Adam Optimize
  • 笔试-二进制
  • springboot 2.7.6 security mysql redis jwt配置例子
  • FreeRTOS从入门到精通 第十六章(任务通知)
  • TensorFlow 简单的二分类神经网络的训练和应用流程
  • 无人机图传模块 wfb-ng openipc-fpv,4G
  • .cc扩展名是什么语言?C语言必须用.c为扩展名吗?主流编程语言扩展名?Java为什么不能用全数字的文件名?
  • 【MyDB】4-VersionManager 之 3-死锁及超时检测
  • 【Linux】使用管道实现一个简易版本的进程池
  • 【OpenGL】OpenGL游戏案例(二)
  • 28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
  • Java 泛型<? extends Object>
  • FPGA|使用quartus II通过AS下载POF固件
  • “新月之智”智能战术头盔系统(CITHS)
  • php:代码中怎么搭建一个类似linux系统的crontab服务