oop - “广泛”使用的纯面向对象语言应该是什么样子?
问题描述
我所知道的最面向对象的语言是 Smalltalk。与其他语言相比,它的独特之处在于将一切都定义为对象。
但是(如果我们不考虑历史事件),难道不是这种特殊性使它成为一种比大多数其他面向对象语言(Java、C++、Python 等)使用较少的语言吗?
今天最常用的面向对象语言并非完全如此,因此学习它们相对容易(如果不考虑范式,它们与类 C 并没有太大区别),使用外部元素( API、C 库、DLL 等),或者使用类创建您自己的对象(然后我们将更多地讨论面向类的编程)。
所以我的印象是,大多数面向对象的语言都没有遵循原始 OOP 的“哲学”(我错了吗?)。
然后我想知道一个纯粹的面向对象的语言是否可以像这个范式中的大多数语言一样被广泛使用,以及应该是什么特性才能使这种语言不与它的环境隔离(不可能例如在 Smalltalk 中使用 C 库)?
解决方案
在现代 Smalltalks 中与 C 接口并不难。还有其他纯 OO 语言(Erlang、CLOS、Scala 等等),所以我认为纯度不是问题。
问题是:Smalltalk 不仅仅是一种语言。语法是次要的。
Smalltalk 卓越的生产力来自于它是一个活动对象环境。您通过在内存中创建类对象、向其中添加方法对象、然后创建实例并迭代地重塑类和实例来进行编程,直到您拥有可以执行您想要的对象的集合。这些对象的二进制快照存储在图像中。为了稍后再次使用它们,快照将恢复。
源代码本身是次要的,它只是一个操作对象的接口。您为定义类而键入的源代码甚至不会被存储,类对象会在需要时生成它。类似地,方法的源代码仅保留格式、注释和变量名,行为的主要定义是方法对象。
这使得很难与其他语言进行比较。对于那些认为文本文件中的源代码是编程本质的主流程序员来说,这感觉很陌生。恕我直言,这就是为什么今天没有更广泛地采用 Smalltalk 的主要因素。
推荐阅读
- bash - 如何使用 Bash 根据不同的白天无限期地运行命令?
- mesos - 在 minidcos 上部署 apache spark 时,在“/sys/**”“没有用于挂载的子系统””处将“cgroup”挂载到 rootfs“/var/lib/docker/overlay2”
- c++ - QTimer::timeout 没有触发
- angular - 如何仅在 ngOnInit() 完成后执行方法(由插值调用)
- javascript - 不以“/”结尾的相对路径 URL 的完整路径 Javascript
- grafana - 如何在 ubuntu 中安装最新版本的 prometheus/promtool?
- openstack - Openstack Nova 中的通知
- c# - 在 NHibernate 中的 GroupBy 订购
- django - Django 使用 ssh 和 pem 文件连接到远程数据库
- python - 循环字典时将值存储在列表中