有些計算機科學家的名字耳熟能詳:阿蘭·圖靈(Alan Turing)、高納德(Donald Knuth)、艾茲赫爾·戴克斯特拉(Edsger Dijkstra),這些人的名氣甚至大於他們突破性的成就。阿蘭圖靈的影響力是如此之大,以致於他的名字永久和計算機協會(ACM)最著名的獎項(也可 以說是計算機科學中最著名的獎項)綁定在一塊兒。在獎項的另外一邊,Kunth 和 Dijkstra 在算法和數據結構方面的革命也是衆所周知的。這些計算機科學家變的如此有名,贏得了全球的尊重,有時甚至是盲目的崇拜。另一些人也在進行相似使人印象深 刻和有影響的工做,卻沒有收穫如此大的名氣,Fabrice Bellard 走的是不一樣的路:他是過去20年中最閃亮和最有影響力的程序員之一,但他的名聲遠遠卻低於他的貢獻。程序員
Fabrice 1972年在法國格勒諾布爾出生,卻在法國南部的蒙彼利埃成長,許多計算機科學家在年輕時就在相關領域顯現超凡的智力或興趣,好比數學或技術。例如 Edsger Dijkstra 是一個化學家和一個數學家的孩子,這些背景對他有很是大的影響。從早期對數學和物理的興趣,到後來在這個領域的職業生涯。在這方面,Fabrice Bellard 沒有什麼不一樣。但 Dijkstra 偏心數學和物理,而 Bellard 卻鍾情於電子設備,他的第一個詞語是「magn ́etophone」 (錄音機)。也是對電子設備的興趣引導他獻身計算機科學。算法
做爲年輕的孩子,Fabrice Bellard 能夠經過從中上層家族得到的知識和技術來表達他對電子系統的激情。在 9 歲時,他經過爲他的 TI-59 科學計算器編程開始了程序設計的體驗,TI-59 是第一個可編程計算器,由德州儀器2年前建造。TI-59 有一個圖靈完備的語言,可是因爲它的10個數字的顯示設備和只有字母數字的字符集,這個語言有某些限制。例如,由於沒有縮進符號,直接在計算器上編寫 C 風格的程序很是的困難--必須在輸入TI-59以前在紙上(「代碼本」)上規劃出他們的程序。儘管如此,這個語言仍是比彙編要簡單不少,有更直觀的概念, 例如循環。無疑這個語言的困難和現代的語言比較促進了在底層代碼的早期傑出工做。這也是他後來工做的一個課題。編程
後來,在他11歲時,他的家庭給他買了一臺家用電腦,TI-49/4A,也是德州儀器生產的。TI-49/4A 是第一個 16 位私人電腦,雖然德州儀器的一些限制致使不少處理都要進行 16位到8 位的複用,丟失了附加位的功能。這個計算機包含一個 TI BASIC 解釋器,一個只能夠在 TI-49/4A 上使用的語言,雖然這個語言和當時流行的 Microsoft BASIC 不兼容,但有助於德州儀器保留家用電腦市場,TI BASIC 很容易學,它讓用戶很容易的訪問經常使用的功能,讓基本的程序很容易編寫,每行只包含一條命令,相似於 Bellard 先前在 TI-59 上編寫的程序,這讓從計算器上得到的程序設計經驗能夠輕易的轉移到更全面的電腦上。後端
在編寫 TI BASIC 的過程當中,Bellard 學習了程序設計技能,但實際上只看到特定機器的實現最終將限制他的發展。在 15 歲時,Bellard 收到了他本身的私人電腦:Amstrad PC1512,更強大的規格,全 qwerty 鍵盤,這臺電腦更加刺激了他的激情。數據結構
爲 PC1512 編程意外的變成了他的第一個主要成就。因爲在當時給他只有頗有限的磁盤空間,Bellard 看到須要一個有效的壓縮方法,這個結果就是 LZEXE,針對私人電腦的第一個可執行文件壓縮方法,它容許被壓縮的可執行文件在後續的啓動時不須要明確的解壓縮。數據結構和算法
他從 LZSS 獲得壓縮方法的靈感,LZSS 是一個無丟失的數據壓縮算法,那時在 Okumura 發佈的各類自由和開源軟件中實現。利用他先前編寫低級語言的經驗,他用 8086 彙編語言(PC1512的機器語言)重寫了LZSS,改善了程序的結構,容許很是快速的解壓縮。用機器語言編寫是本質上的解決方案,它容許 Bellard 保持解壓縮器使人難以置信的小,確保它佔用少於從壓縮可執行文件第一個位置獲得的空間。經過發佈 LZEXE 給幾個朋友和投遞到各類 BBS (進化爲現代的WEB論壇),LZEXE 當即得到成功。在展現了他的創造力和編程能力以後,Bellard 爲到世界著名的法蘭西學院,高等理工學院學習而繼續發展他的技能。分佈式
對於那些只熟悉美國式教育的人將發現法國高等教育明顯的和一般規則不一樣。法國學生在中學呆四年而不是三年,而後在法國國立高校呆三年,從高校畢業需 要經過學士學位,相似於 SATs 和 ACTs 的測試。從國立高校畢業後,學生參加兩個高等教育學校中的一個:大學或者巴黎高等學校。不象美國大學有 1,000 到 50,000 本科生的任何規模,法國大學很小,連中等規模的城市也有多個不一樣領域的大學。在法國文科學校是罕見的,大學一般只學習單個領域的知識。和大多數美國學生一 樣,中等教育畢業後直接進入大學。函數
但是,若是學生的成績在班裏老是排在前面,那麼他能夠嘗試進入巴黎高等學校,一個負盛名的大學,在法國排名最高,並躋身於世界一流大學。 [Ecole des Mines de Paris]在入學前,學生必須花兩到三年時間準備課程,以經過嚴格的入學考試,也就是 Classe Preparatories aux Grandes Ecoles (CPGE).工具
巴黎高等學校傳統上是難以置信的選擇,每一個班級有 300 到 500 名學生,其中,高等理工學院被認爲是最負盛名的,當進入 X 後,X 是高等理工學院的別名,一個學生須要花 5 年時間來得到一個工程師學位,這至關於一個美國大學的科學碩士學位。X 和美國大學的進一步區別是它是一所工程專業的軍校,全部學生在他的求學生涯中必須完成最少一年的軍事服務,不一樣於美國大學的學生傳統上能夠在第二年改變專 業,X 講究的是廣度而非深度。雖然大學是工程專業,但學生必須學習體育和人文。學生在軍事服務前必須花費 4 年學習本科課程,而後剩下的時間專門學習他們的專業知識。由於學校在技術領域很是突出,大量的學習資源,而且爲學生提供了慷慨的津貼,Bellard 找到了程序的自由。他也注意到軍事服務是不重要的,由於當時軍事服務對全部法國人都是必須的。佈局
X 課程的目標是培養學生的批判性的思惟能力,而不是爲工程職業作準備。結果是,從 Fabrice Bellard 身上能夠看到,一個擅長各個領域的人。Bellard 在計算機科學上的貢獻跨越了廣闊的不相關的領域:從數字信號處理處處理器仿真到數學創新,以及之間的一切。
他在程序設計方面的早期教育以及他在理工學院受到的教育對他認識計算機科學的總體面貌有很大的影響。他以爲計算機科學最重要的兩個方面是學習計算機 如何工做,以及經過學習計算自己,開發語言,用各類不一樣的方法讓計算機有效的工做[Gocke and Pizzolato]。首先,他基於原始程序設計經驗進行開發,從一個很是靠近機器的語言開始,慢慢發展爲高級的語言。他對計算原理的細心源於他受到的良 好教育。他以爲有抱負的計算機科學家經過彙編語言和計算機硬件來深度理解計算機是如何工做是必不可少的。
Bellard 的工做中有一項很是突出的方面是數學,尤爲是數字信號處理。在 1995 年,他創建了他的第一個進軍世界的數值算法–用 C 語言編寫了 Pollard 的 FFT 快速乘法。
FFT 是快速傅立葉變換的縮寫,這是一個在數字信號處理中很是經常使用和有效的算法,也是 Bellard 工做中反覆出現的主題。FFT最初是用來計算離散傅立葉變換的極其快速的方式。離散傅立葉變換是轉換採樣複雜函數到頻率域表現的 方法。這種表如今離散傅立葉轉換在離散(有限的)點操做的前提下,描述在原始函數中出現的頻率[Weinsstein] 。你立刻就能夠看到,這個數學理 論有巨大的影響 — 計算機不能在連續的函數上操做,因此有些函數,例如視頻和音頻,離散爲稱爲‘採樣’的過程。奈奎斯特-香農採樣定理指出,輸入函數的兩倍頻率的採樣率能夠 獲得完美的信息轉換[Nyquist 1928; Shannon 1949]。這意味着儘管存在有限數據點的限制,計算機仍是能夠準確的表示連續的函數(例如聲音)。所以,離散傅立葉轉換能夠用這個離散點來收集關於原始 函數的信息,例如分解波爲複合頻率–這是數字信號處理的寶貴信息。
但是研究人員很快明白 FFT 能夠應用到除離散傅立葉轉換以外的事情。John Pollard,一位歐洲數學家,發現用在 FFT 中的一個相似的過程能夠用作有效的乘法,他的工做成果是有效的乘大數序列以及分解大合數。但是它的數學原理是聲音,Pollard 的工做不多有任何實際完整的代碼實現,這就是 Bellard 出現的緣由–在1995年,他用 C 語言實現 Pollard 的工做。他用 Salamin的二次方程計算了 Pi 的幾百萬位數字證實了他的成功,進一步鞏固了做爲一個有敏捷和嫺熟的數學頭腦的主力程序員的地位[Salamin 1976]。
這個主題在他的工做中一而再,再而三的發生,但也許最顯著的是他的第一個突破性成就。在 1997 年 1 月 20 日,Fabrice Bellard 發佈了一個迄今爲止最快的公式,用來在計算機上計算 Pi 的第 n 位二進制數字,這個公式是先前 1995 年已知最快的 Bailey-Borwein-Ploue 公式的一個變體。Bailey-Borwein-Ploue 公式計算 Pi 的二進制數字在O (n3 (log n)3),Bellard 改進這個算法只須要 O (n2),從而提升使人印象深入的 43% 的二進制計算速度,在數學界贏得人們新的尊重。
年復一年,Bellard 的許多學生項目擔任了巨大事情的基礎。例如,在 1998 年,Bellard 開始一個叫作 VReng (虛擬現實引擎)的項目,這是一個分佈式 3D 應用程序,運用多播技術,容許經過 Internet 鏈接在虛擬世界中導航。在創建 VReng 以後,Bellard 注意到有效的 OpenGL 後端是基於軟件的,比實際須要的慢不少。做爲修改 Mesa 項目(一個交叉平臺的 OpenGL 開源實現)的替代,Bellard 決定從 VReng 的代碼來編寫一個更小和更快的 3D 光柵。在 2002 年,Bellard 發佈了 TinyGL,一個 OpenGL 的子集的小型實現,TinyGL 比 Mesa 和 Solaris 的 OpenWin OpenGL 快不少,是平臺獨立的,而且是數量級的小於它們中的任一個,總共才 400KB,而不是數十或百 MB。再一次,Bellard 證實了他編寫有效的 C 代碼的至關的技能,比競爭對手佔用少得多的資源(Mesa 3D 由 Tungsten 圖形公司維護,最近被虛擬化領導商 VMWare 收購)。
在 2000 年, Bellard 啓動了他最重要以及使用最普遍的項目,FFMPEG。FFMPEG 由 Bellard 以假名 「Gerard Lanta」 啓動,最後將 Bellard 在電信和數字信號處理方面的專長帶到了最前沿。FFMPEG 是數字視頻和音頻方面名副其實的「瑞士軍刀」,容許你錄製,流,以及在許多不一樣的格式之間進行轉換。FFMPEG 分割成幾個部分,由 libavcodec 和 libformat 構成,他們都發布爲自由的軟件庫。Libavcodec 收集音頻和視頻編解碼庫,Libavformat 提供音頻和視頻容器複用及解複用庫,結合起來,這兩個模塊提供瞭解析和在不一樣格式之間進行轉換的方法。
要理解 Bellard 的設計,首先必須理解數字音頻和視頻的格式,這些數據的表示可能有很大的不一樣。咱們說不一樣是指媒體的格式。對於原始的媒體流,它們主要是佈局上的區別。例 如,PCM(Pulse Code Modulation)是原始音頻數據採樣、量化、編碼的標準數字表示法。可能你會奇怪爲何對於同一媒體數據有多種不一樣的格式。答案主要在於存儲和播放 特定格式的費用。例如,PCM 一般是「未壓縮」的格式,它線性的存儲全部它獲得的數據。對於音頻和視頻,這是很是昂貴的,尤爲是數據的大小。爲了減小佔用的磁盤空間,不一樣的格式提供壓 縮算法,用來節省磁盤空間的同時不下降圖像的品質,或者須要強大的計算機能力。寫數據到這些格式的過程叫作「編碼」,讀則稱爲「解碼」,所以,知道如何針 對特定的格式作這兩件事情的文件或程序的名字稱爲「codec」(enCODe dECode)。但是有時不一樣的媒體片斷,或者「流」,須要進行組合。例如,一部電影由兩個流組成 — 一個視頻流和一個音頻流。混合多個輸入獲得單個輸出的過程稱爲「multiplexing」,相反的過程稱爲「demultiplexing」。在數字媒 體中,multiplexing 的流寫到稱爲「容器」或者「封裝」的新格式中,它包含了數據是如何存儲的信息,可是不包含編碼信息。
FFMPEG 是組合這兩個功能到單個包的系統,Libavcodec收集了針對各類多媒體格式的codec(如今有上百個),Libavformat 提供了針對各類容器格式的 mux/demux。結合起來,它們能夠從任何支持的格式轉化爲有效的,由 Bellard 設計的中間格式,而後輸出到相應的支持格式。Bellard 的結構讓這個項目變得很是靈活和容易擴展,這容許它被歸入其它各類不一樣的項目中。例如,FFMPEG 當前包含數十個,也許上百個多媒體工具和播放器,例如 VLC。VCL 從它的主頁上被下載了上億次,當前仍是以 5.5 次/秒的速度被下載。
在 2000 和 2001 年,在成立 FFMPEG 以後不久,Bellard 提交了 2 個做品給國際混淆C代碼大賽(IOCCC),IOCCC 是最具創造力的混淆 C 代碼競賽,競賽由 Landon Curt Noll 和 Larry Bassel 在 1984 年成立開始。年復一年,贏得 IOCCC 大賽幾乎是全部 C 程序員的榮譽勳章,反應了他們取得的成就的自豪感。Bellard 贏得了兩次大賽。
首先,用 4KB 實現了一個嚴格受限的 C 編譯器子集,這個做品不只贏得了 2000 年大賽,也做爲 Bellard 的 TinyCC 的一個起點。TinyCC 是一個 ANSI C99 編譯器,比其它 C 編譯器(例如 gcc)小數量級。9 年以後仍然被許多人使用。做爲一個演示,Bellard 寫了一個工具用 TinyCC 在 15 秒以內編譯和啓動 Linux 內核。
他的第二個獲獎做品是 2001 年一個 475 字節的程序用於計算和打印最大已知的素數(26972593 – 1,有成百萬的數字)。計算素數的常規方法比 Bellard 提交的慢不少,因此他沒有采納一個熟悉的算法,整數快速傅立葉轉換,在數分鐘以內打印結果。
後來,在 2005 年,Bellard 發佈了也能夠說是他最重要的項目:QEMU。QEMU 是一個處理器仿真,意味着用軟件來模擬不一樣處理器體系(ISAs),容許爲一個特定處理器編譯的程序,經過軟件仿真在另一個體繫上運行。Rellard 能夠這樣作是基於邱奇-圖靈理論,這個理論間接指出任何圖靈完備語言配合圖靈機能夠仿真其它的圖靈機。QEMU 加入了大量它本身的成就,它不簡單是一個處理器仿真器,它用動態翻譯來提升性能,這在 Usenix paper 中有解釋[Bellard 2005]。QEMU 在 ISA 中使用了新方法,它不是一次翻譯一條指令,QEMU 一次收集多條指令到一個 「chunk」 中,而後再翻譯這個「chunk」,以後 QEMU 記住這些「chunk」,在一個程序代碼中,特定的「chunk」常常會屢次出現,做爲分開爲它們花時間翻譯的替代,QEMU 存儲 chunk 和關聯的本土翻譯,下次只是簡單的執行本土翻譯,而不是再次翻譯 chunk。所以,Bellard 發明了第一個能夠在特定情形下接近真實機器的速度的處理器仿真器。
這不是 QEMU 的終結,近年來,虛擬化在計算機科學中變得愈來愈多,時下最大的硬件和軟件廠商(SUN 和 Microsoft) 支出大量資源來開發他們本身的虛擬化引擎(分別是 VirtualBox 和 Hyper-V)。市場領導者 VMWare 在 2008 年賺了 $1 億多[VMWare 2009],除了仿真處理器,QEMU 也支持一系列設備接口。從這個意義上來講,QEMU 能夠被看做是 hosted 虛擬機監視器,其中它容許在其它操做系統中完整的仿真完整的系統。最後,由於它的速度,它被包含在其它各類主要的虛擬化技術中,包括 VirtualBox,Xen,以及 Linux Kernel-based 虛擬機(KVM),直到 2009 年, Fabrice Bellard 仍是 QEMU 的領導開發人。
Bellard 相信 FFMPEG 和 QEMU 是他工做中的最重要的兩個項目[Gocke and Pizzolato]–卻不是由於傳統的金錢的理由。事實上,Fabrice Bellard 這麼多重要事情中的一個是,他在自由軟件受權協議保護下發布全部這些主要項目,這不只意味着全部人能夠自由的下載他的程序,也意味着任何人能夠下載和修改 程序的源代碼。自由軟件(尤爲是 copyleft 軟件)背後的哲學是複雜的,但是 Bellard 的理由不一樣,他對金錢和名譽沒有興趣(他的假名是這方面的證據),他只是簡單的喜歡在他感興趣和有用的項目上工做。當問他爲何決定在這樣寬廣的領域中工 做時,他回答說:「這也不是決定,只是每每我作一樣的事情時感受很無聊,因此我嘗試一次又一次的轉換項目…」,當 Bellard 在這些項目上工做時,他但願與全世界共享他的工做,也但願他的工做對他人有幫助或者有用。這也是他不屑於行政管理和社交任務的因素。Bellard 是一個了不得的程序員,他喜歡作好的,感興趣的事情。
從他的觀點來看,計算機科學分爲兩個部分:首先是計算機及其使用的實踐探索,第二部分是理論–計算的數學基礎,能夠「計算」什麼問題,以及計算特定 的問題有多快。不誇張的說,Fabrice Bellard 推進了這些領域的進步,難以想象的在多個領域裏真正功成名就。他在給未來的計算機科學家中強調:多獲取計算機科學的基礎知識。對於理論他推薦 D.E. Knuth—他編著了精湛的數據結構和算法,計算機程序設計藝術。在計算機系統方面,他相信全部計算機科學家應該具有計算機硬件,以及在之上運行的低級軟件的知識。這以後,一個計算機科學家就有了全部學習和創建任何他想要的軟件的工具。
他也尚未停下來的意思,他當前的項目旨在在數字信號處理中有效的利用多核,尤爲是軟件定義的無線設備。跟隨他的歷史,看看他下一步將帶來什麼驚喜。