泛型編程

泛型編程(Generic Programming)最初提出時的動機很簡單直接:發明一種語言機制,能夠幫助實現一個通用的標準容器庫。所謂通用的標準容器庫,就是要能夠做到,比如用一個List類存放所有可能類型的對象這樣的事;泛型編程讓你編寫完全一般化並可重複使用的算法,其效率與針對某特定數據類型而設計的算法相同。泛型即是指具有在多種數據類型上皆可操作的含義,與模板有些相似。STL巨大,而且可以擴充,它包含很多計算機基本算法和數據結構,而且將算法與數據結構完全分離,其中算法是泛型的,不與任何特定數據結構或對象類型系在一起。

基本介紹

  • 中文名:泛型編程
  • 外文名:Generic Programming
  • 所屬門類:軟體學科
  • 代表作品STL
簡介,概述,由來,泛型的機制,機制,編譯機制,

簡介

概述

泛型編程的代表作品STL是一種高效、泛型、可互動操作的軟體組件。STL以疊代器 (Iterators)和容器(Containers)為基礎,是一種泛型算法(Generic Algorithms)庫,容器的存在使這些算法有東西可以操作。STL包含各種泛型算法(algorithms)、泛型疊代器(iterators)、泛型容器(containers)以及函式對象(function objects)。STL並非只是一些有用組件的集合,它是描述軟體組件抽象需求條件的一個正規而有條理的架構。
泛型的第一個好處是編譯時的嚴格類型檢查。這是集合框架最重要的特點。此外,泛型消除了絕大多數的類型轉換。如果沒有泛型,當你使用集合框架時,你不得不進行類型轉換。
關於泛型的理解可以總結下面的一句話,它是把數據類型作為一種參數傳遞進來。
泛型編程(Generic Programming)最初提出時的動機很簡單直接:發明一種語言機制,能夠幫助實現一個通用的標準容器庫。所謂通用的標準容器庫,就是要能夠做到,比如用一個List類存放所有可能類型的對象,這樣的事情;熟悉一些其它面向對象的語言的人應該知道,如Java裡面這是通過在List裡面存放Object引用來實現的。Java的單根繼承在這裡起到了關鍵的作用。然而單根繼承對C++這樣的處在語言鏈底層的語言卻是不能承受之重。此外使用單根繼承來實現通用容器也會帶來效率和類型安全方面的問題,兩者都與C++的理念不相吻合。

由來

泛型編程最初誕生於C++中,由Alexander Stepanov[2]和David Musser[3]創立。目的是為了實現C++的STL(標準模板庫)。其語言支持機制就是模板(Templates)。模板的精神其實很簡單:參數化類型。換句話說,把一個原本特定於某個類型的算法或類當中的類型信息抽掉,抽出來做成模板參數T。比如qsort泛化之後就變成了:
template<class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
其中first,last這一對疊代器代表一個前閉後開區間,疊代器和前閉後開區間都是STL的核心概念。疊代器建模的是內建指針的接口(解引用、遞增、遞減等)、前閉後開區間是一個簡單的數學概念,表示從first(含first)到last(不含last)的區間內的所有元素。此外,comp是一個仿函式(functor)。仿函式也是STL的核心概念,仿函式是建模的內建函式的接口,一個仿函式可以是一個內建的函式,也可以是一個重載了operator()的類對象,只要是支持函式調用的語法形式就可成為一個仿函式。
通過操作符重載,C++允許了自定義類型具有跟內建類型同樣的使用接口;又通過模板這樣的參數化類型機制,C++允許了一個算法或類定義,能夠利用這樣的接口一致性來對自身進行泛化。例如,一個原本操作內建指針的算法,被泛化為操縱一切疊代器的算法。一個原本使用內建函式指針的算法,被泛化為能夠接受一切重載了函式調用操作符(operator())的類對象的算法。

泛型的機制

機制

C#泛型代碼在被編譯為IL代碼和無數據時,採用特殊的占位符來表示泛型類型,並用專有的IL指令支持泛型操作。而真正的泛型實例化工作以"on-demand"的方式,發生在JIT編譯時。

編譯機制

1. 第一輪編譯時,編譯器只為Stack<T>(棧算法)類型產生“泛型版”的IL代碼與元數據-----並不進行泛型類型的實例化,T在中間只充當占位符
2. JIT編譯時,當JIT編譯器第一次遇到Stack<int>時,將用int替換“泛型版”IL代碼與元數據中的T---進行泛型類型的實例化。CLR為所有類型參數為“引用類型”的泛型類型產生同一份代碼;但如果類型參數為“值類型”,對每一個不同的“值類型”,CLR將為其產生一份獨立的代碼。

相關詞條

熱門詞條

聯絡我們