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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
相关文章:
Smalltalk语言是何物?面向对象鼻祖Simula的诞生?Simula和Smalltalk有什么区别?面向对象设计?
Smalltalk语言是何物? Smalltalk语言的前身可以追溯到Flex系统,这是由Alan Kay最早提出的。在随后的发展中,Smalltalk逐渐演化,并出现了Smalltalk-72和Smalltalk-76等版本。最终,在经过近10年的研究与发展后,Xerox研究…...

KVM/ARM——基于ARM虚拟化扩展的VMM
1. 前言 ARM架构为了支持虚拟化做了些扩展,称为虚拟化扩展(Virtualization Extensions)。原先为VT-x创建的KVM(Linux-based Kernel Virtual Machine)适配了ARM体系结构,引入了KVM/ARM (the Linux ARM hypervisor)。KVM/ARM没有在hypervisor中引入复杂的…...
Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher
Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher Windows系统中Docker可视化工具对比分析1. 工具概览2. Docker Desktop官网链接:主要优点:主要缺点:版本更新频率: 3. Portainer官网…...

【架构面试】二、消息队列和MySQL和Redis
MQ MQ消息中间件 问题引出与MQ作用 常见面试问题:面试官常针对项目中使用MQ技术的候选人提问,如如何确保消息不丢失,该问题可考察候选人技术能力。MQ应用场景及作用:以京东系统下单扣减京豆为例,MQ用于交易服和京豆服…...
算法【完全背包】
完全背包与01背包的区别仅在于每种商品可以选取无限次。时间复杂度O(物品数量 * 背包容量) 下面通过题目加深理解。 题目一 测试链接:疯狂的采药 - 洛谷 分析:这是一道完全背包的模板题。对于第i个物品的可能性展开也有两种,第一种是不取第…...
二叉树的遍历
有一个结点的二叉树。给出每个结点的两个子结点编号,建立一棵二叉树,如果是叶子结点,则输入 0 0。 建好树这棵二叉树之后,依次求出它的前序、中序、后序列遍历。 输入格式: 第一行一个整数n ,表示结点数。 之后n 行…...

1.31 实现五个线程的同步
1.使用互斥锁实现 1>程序代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include &l…...

three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)
春节忙完一轮,总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论,所以像相机矩阵推导这种网上已经很多优质文章的内容,笔者就一笔带过。 然而关于负缩放…...

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
本文项目编号 T 165 ,文末自助获取源码 \color{red}{T165,文末自助获取源码} T165,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
《大数据时代“快刀”:Flink实时数据处理框架优势全解析》
在数字化浪潮中,数据呈爆发式增长,实时数据处理的重要性愈发凸显。从金融交易的实时风险监控,到电商平台的用户行为分析,各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架,在这一领域崭露头…...
antdesignvue统计数据源条数、计算某列合计值、小数计算不精确多了很多小数位
1.在</a-table>下方加如下代码 <div>数据总条数:{ {tableData.length}}       <template>A列合计:{ {sum}}</template> </div> 注:tableData为<a-tabl…...
02.05、链表求和
02.05、[中等] 链表求和 1、题目描述 给定两个用链表表示的整数,每个节点包含一个数位。 这些数位是反向存放的,也就是个位排在链表首部。 编写函数对这两个整数求和,并用链表形式返回结果。 2、解题思路 本题要求对两个链表表示的整数…...

dmfldr实战
dmfldr实战 本文使用达梦的快速装载工具,对测试表进行数据导入导出。 新建测试表 create table “BENCHMARK”.“TEST_FLDR” ( “uid” INTEGER identity(1, 1) not null , “name” VARCHAR(24), “begin_date” TIMESTAMP(0), “amount” DECIMAL(6, 2), prim…...

Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
文章目录 Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)1. 副本的基本概念2. 副本同步和一致性2.1 AR(Assigned Replicas)2.2 ISR(In-Sync Replicas)2.3 OSR(Out-of-Sync Replicas…...

爬虫基础(二)Web网页的基本原理
一、网页的组成 网页由三部分构成:HTML、JavaScript、CSS。 (1)HTML HTML 相当于网页的骨架,它通过使用标签来定义网页内容的结构。 举个例子: 它把图片标签为img、把视频标签为video,然后组合到一个界面…...

外网访问禅道软件项目管理系统
禅道项目管理软件是一款国产的开源免费项目管理软件,专注于研发项目管理,旨在帮助企业或团队提高项目管理的效率和质量。 本文将详细的介绍如何在 Windows 系统电脑端下载运行禅道软件项目管理系统,并且结合路由侠内网穿透实现外网访问本地的…...

Python 梯度下降法(五):Adam Optimize
文章目录 Python 梯度下降法(五):Adam Optimize一、数学原理1.1 介绍1.2 符号说明1.3 实现流程 二、代码实现2.1 函数代码2.2 总代码2.3 遇到的问题2.4 算法优化 三、优缺点3.1 优点3.2 缺点 四、相关链接 Python 梯度下降法(五&a…...
笔试-二进制
应用题 将符合区间[l,r]内的十进制整数转换为二进制表示,请问不包含“101”的整数个数是多少? 实现 l int(input("请输入下限l,其值大于等于1:")) r int(input("请输入上限r,其值大于等于l&#x…...
springboot 2.7.6 security mysql redis jwt配置例子
数据库结构用的是若依的数据库基本结构,ruoyi.vip。 总体参考了文章:https://blog.csdn.net/qq_45847507/article/details/126681110 本文章只包含不同的地方,相同的不再赘述。 1、创建spring工程,jdk1.8,maven。 pom.xml中依赖部…...

FreeRTOS从入门到精通 第十六章(任务通知)
参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、任务通知简介 1、概述 (1)任务通知顾名思义是用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 (2&#…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...