对各种编程语言的思考

读了《ruby元编程》之后,发现面向对象也可以这样用,而且用的如此的灵活。

再结合以前学习的有关Java, Python, Golang中的面向对象相关部分,其实各种编程语言其实还是非常类似的。

从大到小看组织程序的基本元素

文件夹

往往被称为包(Python, Java)或库(Go)。

文件

被称为模块(Python)或库或被单独封装成为类或接口(Java)

包含了属性(数据)和方法(接口),在Go语言中强制将数据和方法分开,为了提高并发性。

方法

属于某个对象的函数,在类中定义,必须实例化后才可以使用。

函数

像C语言中的函数,在文件中可以被全局调用,与类无关,无需实例化即可使用。

各种编程语言的不同点有哪些?其实核心功能都是类似的,事实如此。也毕竟因为都是C语言所生,毕竟都运行在那有限的几种CPU架构之上,运行在有限的几种计算机体系结构之上。

从大的方面概括各种编程语言的不同

关键字

关键字会有所区别。

语法

if,else, 是否有end

数据结构

例如有字符串、数组(列表)、映射(Map/Hash)、集合(只有Py有)、元组(Py特有),对于数据结构也是各有不同。

重点考虑类型,定长或变长,是否可改,是否可迭代,唯一性,是否有序,CRUD,排序,性能,连接(使用+或join),底层实现(引用/非引用),按值传递或按引用传递。

这些不同的编程语言有所不同,底层原理应该是类似的。

面向对象思想(核心思想类似)

引入的访问权限private, public, proteced等,使用上有所不同。

方法调用

方法调用,和库的使用有细微差别。

错误和异常处理

有细微差别。

并发编程

有多进程,多线程,协程等之分。它们的主要区别是粒度的大小。

作用域

其实文件夹、文件、类、方法、函数,这些都是作用域和封装的概念。动态语言(Python/Ruby)的弱类型,作用域边界不明确,经常带来奇怪的问题,导致调试困难,当程序规模变大时,变得难以控制。

说说比较核心的概念:类,类无非是想对原来散落的数据和特定的符合某种借口的方法进行包装,其初衷的为了显示的将一类事务的数据和其特有的方法包装在一起,提高扩展性,重用性,整洁等。

当然这样会引入一些复杂度,在效率上有所损失,对人来说可以比以前维护更大的项目(代码行数更多,对象更多,对象之间的关系更复杂),但对计算机来讲未必最合适的,单从并发性来讲,会比以前难以处理和协调。还有这样的封装带来的其他复杂性在于,类(对象)之间的访问权限问题,比如在Java中有private, public, proteced, default等关键字,Ruby中也同样有private, public, proteced, 是否有必要分这么细?这值得我们思考。

Go语言强制将数据与方法分离,接口是隐含自动匹配来实现了面向对象中的功能,这样可以提高程序的并发性。对于访问权限也只分为两种,大写字母开头的和小写字母开头的。

归根结底,编程语言要高效地(这里高效包括对计算机本身和人都有考虑)处理和协调好数据和行为在特定的硬件体系结构上的实现和运作方式。 管理好对象的属性(数据)和其行为(方法)之间的关系,本质上是一种作用域划分,权限划分和管理关系。

动态语言有很多的不确定性,长期来看并不会带来什么所谓的开发效率提升。

其他参考