泛型编程的困境

简介: 原文:http://research.swtch.com/generic常用的数据结构(vectors,queues,maps,trees,等等)似乎是评估一个新语言的一个热门话题。

原文:http://research.swtch.com/generic

常用的数据结构(vectors,queues,maps,trees,等等)似乎是评估一个新语言的一个热门话题。Go语言的FAQ中有一条就是关于Go中的泛型编程。对于泛型编程的通常有以下三种处理方式:

1.(C语言)放弃泛型。这样苦了程序员,但是这样没前增加太多复杂的东西到语言中。


2.(C++语言)编译期特化或者大量地展开代码。这样苦了编译器。编绎器生成一堆代码,而大部分是无用的,需要一个很好的链接器去清除重复的副本。为每一个类型生成一份代码,也许这样会让代码高效,但是程序是一个整体,这样会造成对cpu的cache不友好。我曾听说一个简单的库修正和移除了模板后,text段(即动态链接库的文件格式中的text段)的大小从M级降到10K。

3.(Java语言)隐式地把所有东西装箱。这样苦了程序,这样执行起来会变慢。
对比C语言的手写,C++语言的编译器生成,Java代码最简单,但是最低效,无论是从时间还是空间来说。因为所有的操作都要隐式地装箱和拆箱。一个byte的vector容器(Vector<Byte>)所占的空间比远超一个字节每一个byte。想要隐藏装箱和拆箱会让类型系统变复杂。从另一个方面来说,这个也许是指令cache友好的,因为它把一个byte的vector(Vector<Byte>)可以分开来写每一个byt e。


泛型编程的困境是:要么苦了程序员,要么苦了编绎器,要么降低运行时效率。


=====================================================

原文作者是Go语言的实现者之一。

从Go的FAQ中也可以看到他们并不急于去实现泛型,是因为还没有找到一个合适的实现方案去解决上面的困境。

因为Go目前没有泛型,所以只能用interface来实现常用的数据结构了。但是从我个人角度来看Go中的interface的效率有点慢(比C++中的虚函数要慢,想想一个Vector容器,调用一个get函数,都比调用C++的一个虚函数还要慢。。)。

所以在Go1.0之前,有Vector容器时,另外还有一个IntVector和一个StringVector。想想有够蛋疼的,如果我想用一个高效float的Vector,是不是还要写一个FloatVector?

如果Go能支持泛型,那真是相当令人高兴的一件事。


相关文章
|
4月前
|
安全 测试技术 开发者
测试驱动开发是解决技术债务的银弹吗?
测试驱动开发是解决技术债务的银弹吗?
|
4月前
|
JavaScript 前端开发 程序员
掌握构造函数:打破面向对象编程难题(二)
掌握构造函数:打破面向对象编程难题
|
4月前
|
JavaScript 前端开发
掌握构造函数:打破面向对象编程难题(一)
掌握构造函数:打破面向对象编程难题
|
4月前
|
并行计算 数据处理 开发者
编程范式的抉择:面向对象编程与函数式编程的对决
在当今的软件开发领域,面向对象编程(Object-Oriented Programming,OOP)和函数式编程(Functional Programming,FP)是两种重要的编程范式。本文将比较并探讨这两种编程范式的特点、优势和适用场景,以帮助开发者在编程选择上做出明智的决策。
|
自然语言处理 搜索推荐 Java
重拾面向对象软件设计
软件设计的最大目标,就是降低复杂性,万物不为我所有,但万物皆为我用。引用 JDK 集合框架创办人 Josh Bloch 的一句话来结束。学习编程艺术首先要学会基本的规则,然后才能知道什么时候可以打破这些规则。
10884 1
重拾面向对象软件设计
|
Java
工作几年后再来总结下Java泛型
泛型是 Java 的高级特性之一,如果想写出优雅而高扩展性的代码,或是想读得懂一些优秀的源码,泛型是绕不开的槛。
86 0
|
人工智能 Dart 安全
关于当今软件开发的四件会让过去的程序员大吃一惊的事
  过去的盲点给我们提供了另一种思考未来的方式。 技术变革的步伐并没有放缓。 在一两年之内,我们大多数人仍然会思考世界。 我们期待着很多变化,并且我们花了大量时间想象它们。 但是在雷达之下发生了什么? 我们期望哪些发展永远不会实现? 我们今天很少有人期望发生什么革命?   软件开发改变了世界。 我们只看到其中一些即将到来。关于当今软件开发的四件会让过去的程序员大吃一惊的事
138 0
|
设计模式
六大设计模式原则
java设计模式中,六大设计模式。
|
架构师 安全 NoSQL
多态对一个软件架构师的重要性
面试经常会被问到的题目之一,面向对象的三大特征是什么?多态则是三大特征之一,个人认为三大特征中最为重要的,另外的两大特征是封装和继承。 为什么说多态对软件架构师非常重要,对系统软件非常重要呢?举个例子,当软件面向一个客户的时候,你会发现软件写得很简单,很快就能满足其需求。随着时间的推移,软件面向的不再是一个客户。每个客户提出的需求千差万别,尤其当出现针对性的、个性化的需求。软件的迭代、升级会变得相对困难,拓展功能变得困难。
580 0
多态对一个软件架构师的重要性
《数学与泛型编程:高效编程的奥秘》一3.6 毕氏构想中的严重缺陷
本节书摘来自华章出版社《数学与泛型编程:高效编程的奥秘》一 书中的第3章,第3.6节,作者:丹尼尔E.罗斯(Daniel E. Rose),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1386 0

相关实验场景

更多