導航:首頁 > 源碼編譯 > 編譯加強加速引擎副作用

編譯加強加速引擎副作用

發布時間:2024-09-16 18:16:23

1. GPU和CPU之間是如何協調數據處理的

因為設計的目標不同,當今的CPU和GPU功能上有本質的不同。作為通用處理器的CPU,顧名思義,它是設計用來處理通用任務的處理、加工、運算以及系統核心控制等等的。CPU中包含的最基本部件有算術邏輯單元和控制單元,CPU的微架構是為高效率處理數據相關性不大的計算類、復雜繁瑣的非計算類的等等百花八門的工作而優化的,在處理日常繁復的任務中應付自如。

計算機的「靈魂」——操作系統,以及幾乎100%的系統軟體都主要仰仗CPU來順利運行。CPU面對的算術、邏輯運算以及控制處理是非常繁瑣和復雜的,面對處理的數據和信息量不僅數量多而是種類多。CPU運算和控制多面手的這種設計,讓它在計算機中得心應手,位置不可動搖。

GPU設計的宗旨是實現圖形加速,現在最主要的是實現3D 圖形加速,因此它的設計基本上是為3D圖形加速的相關運算來優化的,如z-buffering 消隱,紋理映射(texture mapping),圖形的坐標位置變換與光照計算(transforming & lighting)等等。這類計算的對象都是針對大量平行數據的,運算的數據量大,但是運算的類型卻並不復雜,大多類似和雷同,計算性強但是邏輯性不強,如矩陣運算就是圖形運算的典型特性。

如今的游戲,單單從圖象的生成來說大概需要下面四個步驟:

1、Homogeneous coordinates(齊次坐標)
2、Shading models(陰影建模)
3、Z-Buffering(Z-緩沖)
4、Texture-Mapping(材質貼圖)
在這些步驟中,顯示部分(GPU)只負責完成第三、四步,而前兩個步驟主要是依靠 CPU 來完成。而且,這還僅僅只是3D圖象的生成,還沒有包括游戲中復雜的AI運算。場景切換運算等等……無疑,這些元素還需要CPU去完成,這就是為什麼在運行《魔獸世界》的時候,當場景切換時再強勁的顯卡都會出現停頓的現象。
對於需要CPU進行大量AI運算的游戲來說,在固定的顯示解析度下,CPU的架構越強、主頻越高的確有一定的優勢。著名的FPS第一人稱設計游戲——CSS,就是一個很好的例子。當你開啟了30個左右的機器人,在大混戰的時候就很容易體現出高端CPU與入門級CPU之間的區別了。
打造一套完整的游戲 PC 系統,CPU和顯卡的搭配應該相得益彰,高成低就或低成高就都是不平衡的組合方式。

第一代 GPU 首先,CPU將數據傳遞給GPU進行處理,數據先進入T&L單元中的Transform Engine,在這里,數據將以頂 點的形式接受視野范圍的判斷,當處理單元判斷某部分頂點處於觀察者的視線范圍以外時,Transform Engine將把這部分頂點「剪除」以使其不會 干擾後續的流水線操作, 具個簡單的例子:當你在某FPS游戲中突然打開狙擊槍的狙擊鏡,視野變成了一個圓形的空洞,而其他部分則為黑色,這時 Transform Engine將去除這個圓形視野范圍以外的所有頂點,不過,這里進行的只是視野范圍的判斷,Transform Engine去除在 你的視線范圍內但是被其它東西擋住了的物體,另外,每一個三角形可能被旋轉,放大/縮小,上升,下降,左偏,右移等。 這就是多邊形轉換轉換。 Transform Engine根據你的視角,改變了由程序提供的組成3D物體的頂點的坐標。經過Lighting Engine處理後的圖象經過判斷 處理後的數據將流入T&L單元中的Lighting Engine,根據光源的類型,距離,角度,數目,應用方式等不同參數,每一個多邊形都會有 不同的光影表現和光影關系,因而需要不同的光線函數予以表徵,在Lighting Engine中,處理單元將根據軟體提出的光源分布情況為每個頂點計算 出它所具有的光線矢量,以便後續進行的光線紋理貼圖,著色等操作
經過Lighting Engine處理的畫面
其實,經由T&L單元處理過的數據還只是抽象的數據,並不是具體的圖形,上面兩副圖僅僅是方便讀者進行想像的示意圖。
接下來數據將流入Setup Engine,在這里,運算單元將進行三角形的設置工作,這是整個繪圖過程中最重要的一個步驟,Setup Engine甚 至直接影響著一塊GPU的執行效能。三角形的設置過程是由一個一個的多邊形組成的,或者是用更好的三角形代替原來的三角形。在三維圖像中可能會有些三角形 被它前面的三角形擋住,但是在這個階段3D晶元還不知道哪些三角形會被擋住。所以三角形建立單元接收到的是一個個由三個頂點組成的完整三角形。三角形的每 個角(或頂點)都有對應的X軸、Y軸和Z軸坐標值,這些坐標值確定了它們在3D景物中的位置。同時,三角形的設置也確定了像素填充的范圍
經過Setup Engine處理的畫面
最終著色完畢的畫面
在三角形設置完畢後,T&L單元的全部運算就完成了。接下來數據將進入NV15獨有的NSR像素處理單元進行一定的像素處理,接著流入像素流水線 進行後續的紋理像素填充等操作,這部分操作在DriectX7.0中的變化並不明顯,基本的渲染填充過程與過去的顯卡幾無二異
T&L雖然再一定程度上緩解了CPU運算能力的不濟所帶來的瓶頸,使得系統在圖形方面的資源得到了再分配和增強,但同時,T&L也將新的矛盾轉到了GPU上
T&L是一組相對固定的簡單的圖形函數,所實現的特效受到了函數本身語句的限制,雖然這種固定的指令集設計可以帶來比較高的執行效率,但這種設置 使得DX7下所能實現的特效受到了指令集的約束,許多逼真的特效無法實現,程序員的思想也被限定在一個相對狹窄的范圍內。
2、我要看到你飄逸的秀發和迷人的微笑—可編程Shader以及第二代GPU
DriectX8.0在傳統T&L的基礎上加入了兩個新的概念—可編程的Vertex Shader和Piexl Shader,同樣的,第二代 GPU的標志就是硬體級別的可編程Shader運算,代表產品為NV2X(Geforce3/4Ti),R2XX(Radeon8500)等
可編程Shader的復雜程度遠非T&L可比,為了方便大家理解第二代GPU的特點,我們先來認識一下什麼是可編程Shader,以及可編程Shader運算單元
可編程Vertex Shader及頂點處理器:
可編程Vertex Shader讓程序員能夠對特定物體,甚至整個畫面的每一個頂點,指定特別的運算程序,卻不需要CPU介入。每一個頂點都攜帶相當多 的信息,比如坐標,重量,法線,顏色,紋理坐標,霧和點大小數據。頂點處理器能夠以簡短的程序來改變上述這些信息。 這些小程序直接由頂點著色引擎本身執 行,不必勞駕CPU。 典型的T&L引擎將程序員限制在3D運算的光影轉換之前, 在有了頂點處理器的支持之後,游戲設計師對游戲場景里的3D物 體能夠為所欲為的操縱變化,而且不需要用到中央處理器。
這導致了一場革新,程序可以改變頂點的坐標,這樣基本上改變物體的形狀,以達到更接近真實的移動、移動殘影、混色、內插(在兩種外型間轉換),以及變形, 比如改變角色臉部的骨骼和皮膚一個產生一個適時的微笑。也可改變頂點上的顏色數據和紋理坐標,物體表面的顏色達到設計師所想要的色彩效果、投影、凹凸貼圖 設置(如Blinn Bump mapping)或者其它投射的紋理。光源也可以為程序員隨心所欲的調整,不再像過去那樣需要對光源的效果進行笨拙的光線 紋理貼圖,而這些在以前是不可想像的。這一切都歸功於可編程Vertex Shader和頂點處理器的出現
Blinn Bump mapping
可編程Piexl Shader以及像素處理器
在NV15中,nVidia曾經嘗試加入一個叫NSR的像素處理單元,它可以在數據進入像素流水線之前對每個像素進行一系列運算操作,雖然同為每像素操 作,但NSR與Piexl Shader可不能同日而語, NSR對於像素的運算只有7種,同T&L一樣,它依然是固定模式的,程序員依然要依照 規定好的條條框框寫出程序,而Piexl Shader則不同,我們可以用許多不同方式去編程,以實現不同的特效,下面就是一般的像素處理器所具備的特 性:
· 陰影貼圖
· 快速紋理載入
· 影像乘法,對稱核心
· 支持4096x4096或512x512x512 紋理
· 立方體貼圖每邊可4096x4096x32-位
· 支持YUYV的紋理(自動轉換成RGB三原色)
· 支持全景貼圖
可以指向任何一個圖像,如背景緩沖區(back buffer),而可直接當作紋理使用
· 邊緣色彩及邊緣紋理
· 硬體同步化讀/寫
對同一張紋理的讀及寫允許全流水線操作。
可以對背景緩沖區著色,然後馬上能當作紋理使用
· Pass through colors
· 支持DX6規格的環境凹凸/亮度貼圖(就是環境凹凸貼圖)
· 簡單的紋理,S,T 在alpha/紅(AB)及藍/綠 (BG)
· 等向的雙方向性反射分布功能光源
· 內積產生色彩貼圖或Z坐標
· 真實反射凹凸貼圖
這看起來似乎有點抽象,簡單的說,可編程Piexl Shader實現了一個非常重要的特效—真實的毛發
古老街道上昏暗燈光中的狼人
在3D渲染中,渲染真實的毛發一直是一件非常困難的事情,大量的多邊形給多邊形生成帶來了嚴峻的考驗,而每一根毛發之間復雜多變的即時光影關系更不是幾個簡單固定的指令所能實現的。Piexl Shader的可編程性和運算能力很好的解決了這個問題
好啦,現在讓我們來看看第二代GPU是如何完整處理一個畫面的吧
首先,來自CPU的各種物理參數進入GPU,Vertex Shader將對頂點數據進行基本的判斷,如果沒有需要處理的Vertex效果,則頂點數據直 接進入Transform&Lighting Unit進行傳統的T&L操作以節約時間提高效率,如果需要處理各種Vertex效果,則 Vertex Shader將先對各種Vertex Programs的指令進行運算,一般的Vertex Programs中往往包含了過去轉換,剪 切,光照運算等所需要實現的效果,故經由Vertex Shader處理的效果一般不需要再進行Transform&Lighting操作;另 外,當遇到涉及到曲面鑲嵌(把曲面,比如弓形轉換成為多邊形或者三角形)的場合時,CPU可以直接將數據交給Vertex Shader進行處理
另外,在DX8.0的Transform過程中,Vertex Shader可以完成Z值的剔除,也就是Back Face Culling—陰面隱去,這就意味著除了視野以外的頂點外,視野內被前面頂點遮住的頂點也會被一並剪除,這大大減輕了需要進行操作的頂點數目
接下來,經由Vertex Shader處理完成的各種數據將流入Setup Engine,在這里一如既往的進行三角形的設置工作,到這里為止,Vertex Shader的工作就完成了
過去,設置好的三角形本來應該帶著各自所有的參數進入像素流水線內進行紋理填充和渲染,但現在則不同,在填充之前我們還需要進行Piexl Shader的操作
其實Piexl Shader並非獨立存在的,它位於紋理填充單元之後,數據流入像素流水線後先進入紋理填充單元進行紋理填充,然後便是 Piexl Shader單元,經由Piexl Shader單元進行各種處理運算之後再進入像素填充單元進行具體的著色,再經由霧化等操作後,一個完整 的畫面就算完成了
值得注意的是,第二代GPU中普遍引入了獨立的顯示數據管理機制,他們位於Vertex Shader,Setup Engine以及像素流水線之間,負 責數據的更有效率的傳輸、組合,各種無效值的剔除,數據的壓縮以及寄存器的管理等工作,這個單元的出現對整個GPU的工作效率的保證其到了至管重要的作 用。
HyperZ系列:HyperZ技術本身就是一種類似nVIDIA的「Z-封閉甄別」的技術,但是比nVIDIA還更進一步。它的主要功能簡單說來就是分 析在Z軸上的場景,被遮擋的就會被忽略掉,只渲染我們能看到的部分場景;然後對渲染過的Z軸場景進行壓縮處理,數據的壓縮可減少他所佔用的空間,從而在存 取Z-Buffer數據的時候可以保留更多的顯存帶寬。而且這是一種畫面質量沒有損害的壓縮演算法,並不影響畫面質量。最後一步就是把經過渲染的場景中的Z -Buffer信息立刻清除掉,這樣就更加大了顯存帶寬的利用率。
LMA(光速顯存架構)系列:光速顯存架構採用的第一個技術是「顯存交錯控制」技術, LMA中的顯存控制器劃分成了4個獨立的顯存控制單元,每個單元最 大可以進行32bit圖形相關數據的存取工作,並且這4個單元之間以及它們和圖形處理單元之間都保持密切的通訊聯系,並隨時協調平衡各個子單元之間的數據 流量,因此整體來看LMA的顯存控制單元還是可以進行128bit數據的存儲,但是保證了顯存帶寬的充分利用。光速顯存架構採用的第二個技術是「無損Z壓 縮演算法」。傳統的圖形晶元對於每個待渲染的圖形象素都要進行Z軸數據的讀寫工作,因此存儲這些數據的Z緩存一向是消耗顯存帶寬的大戶。LMA中集成了硬體 「無損Z壓縮」單元,採用「無損Z壓縮演算法」對Z-緩存數據進行4:1的完全無損壓縮。 光速顯存架構採用的第三個技術是「Z-封閉甄別」。排除了圖象中 被遮蓋住而不可見的部分,這樣GPU就不做隱面模型構建(節省處理器的多邊形運算資源),並且渲染管線也不對隱面進行渲染(無需從幀緩存中讀寫隱面資料數 據,節省渲染管線的象素和紋理生成資源並完全消滅了隱面資料對顯存帶寬的佔用)。最後,LMA還包括了4組高速Cache,對數據傳輸進行緩沖。
3、夢中的鏡花水月—可編程Shader2.0以及第三代GPU
當你第一次看到3Dmark03中的MotherNature時,你有沒有感覺到震撼?
更加寬泛的色彩范圍能夠使得圖形的逼真度上升,這就是Shader2.0的由來,Shader2.0的核心實際上就是以擴大指令數目以及FLOAT數據形 式的應用來提高色彩表達的精確度,而第三代GPU的Shader單元也由此而具備了高精度FLOAT色彩數據的運算能力。從一般角度來講,第三代GPU同 第二代GPU相比在基本的操作控制形式等方面並沒有本質的區別,但是由於Shader2.0更大的指令長度和指令個數,以及通用程序+子程序調用的程序形 式等使得第三代GPU在處理高精度的龐大指令時效率上有了明顯的提升,同時也使得第三代GPU的可編程性躍上了一個新的台階
讓我們來看看第三代GPU到底有哪些改進吧
Vexter Shader部分
第三代GPU的頂點處理器部分除了一般的操作功能外還具備流程式控制制能力,包括循環,跳躍以及子程序調用等,這些控制指令以及更多向量(或標量)寄存器的應 用使得頂點處理器能夠以更高的效率執行Vertex Programs,提高了Vertex的處理速度。同時,加大的指令長度和指令數量使得頂點處理器的 功能得到了進一步的強化。另外,在第三代GPU中,傳統的T&L數據將完全交由頂點處理器來執行,Transform& Lighting Unit將徹底被頂點處理器「吞並」,這也是第三代GPU的一個重要特點
Piexl Shader部分
第二代GPU的Piexl Shader只能實現INT數據的運算,這勢必會帶來最終運算結果的不精確,而數據的不精確導致了顏色表現的不準確,干擾了最 終畫面的質量以及效果的表現,第三代GPU的重點改進就是運算單元和寄存器所支持的運算格式,現在Piexl Shader可以進行更高精度的FLOAT 運算和輸出,從而使得圖形的色彩顯示更加精確
暴光正確的圖象
數據精度不當而無法實現的特種暴光
另外,第三代GPU的像素處理器每周期所能處理的材質以及指令也分別增加了數倍,這些新特性使得第三代GPU可以處理各種復雜程度的效果,營造一個更為真實的3D畫面,比如更加真實的水面效果
INT Piexl Shader所表現的水面效果
FLOAT Piexl Shader所表現的水面效果
傳統的INT無法表現寬泛的波浪效果,程序員害怕數據精度范圍狹窄引起的上溢或者下溢的發生而不得不在一個很小的物理參數范圍內控制漣漪水面所需的波長、 波浪的大小、移動速度以及反射和折射效果等,現在,由於數據精度的提升,像素處理器完全可以處理一個非常寬泛的數據精度范圍,避免數據的溢出,這就使得更 加真實的水面效果得以被表現。第三代GPU的代表是NV3X系列,R3XX系列等,其中R3XX系列的基本處理方式和順序與第二代GPU在本質上基本相 同,僅僅是Vertex Shader和Piexl Shader的具體操作細節和運算精度上有些許不同,而NV3X雖然在基本原理上也與之大略相同,但 從流水線的角度來看則與完全不同,應該算是個「異類」。產生過程,只分析一下NV3X
以NV35為例:
首先,他具有8個紋理帖圖單元,但8個紋理貼圖單元並不在固定分布於每一條Piexl流水線,而是集簇在一起,根據情況來搭配,可以是4*2、8*1。
其次,他具有12條Shader流水線,但沒有全盤採用浮點渲染流水線,而只是把12條Shader流水線中的8條做成具備浮點處理能力;不過全部12條Shader流水線都具備Fixed-Point Shader的執行能力。
另外,NV3X將流水線後部的各種渲染單元,如霧化,Alpha混合等大幅削減,使得流水線在一定程度上公用這些單元
NV30的構架組成形式基本上與之相當,只是數目上略有不同
由於這個構架並不是傳統意義上的4*2或者8*1的固定構架,我們不能象過去那樣說NV35「每個流水線具有2個紋理帖圖單元」或者「每條管線具有3個Shader流水線」……我們只能說「NV35單位周期可以完成8次左右的紋理貼圖或者12次Shader操作」
另外,由於NV3X對於Fixed-Point Shader的支持精度是FP16和FP32,同時NV3X的Shader流水線的單位Fixed- Point Shader處理精度是16位,所以當遇到32位Fixed-Point Shader數據時,能進行Fixed-Point Shader 數據處理的8條Shader流水線也會根據情況進行搭配來運算32位的Fixed-Point Shader數據
Pixel Programs往往是由多條指令構成的,不同的指令需要不同的執行時間來完成,每個像素必須在應用在它「身上」的Pixel Shader 操作完成後才能由像素流水線寫入到幀緩存里。故此,對於應用了Piexl Shader的像素實際上是需要多個以上的周期才能寫入到幀緩存里,如果採用8 條完整的渲染流水線的話, 流水線後面的霧化、色彩混合等單元很多時候都會處在等待階段,這部分單元需要佔用的晶體管數量不在少數,如果這樣浪費就怪可惜 的,砍掉後其中的霧化等單元後,對整體的性能雖然有一些影響,但是卻可以把節省下來的晶體管用於加強Pixel Shader的功能和性能上來,同時可以 保證比較高的多重紋理效率,利大於弊。
簡單的,這個有點詭異的體系節省晶體管的同時能確保相對較好的Pixel Shader效能,同時還有極高的多重貼圖效能
nVidia本指望4條Pixel管線+ 12條Shader流水線的設計能夠在現在以及未來較長的一段時間的游戲里提供超過4條甚至8條 Pixel Pipeline顯卡的效能。不過,實際情況卻與nVidia的初衷有些背道而馳,Shader的完美應用帶來的一個結果就是越來越好的非多 紋理光效果,傳統的多紋理貼圖才能表現的很好的光效果現在只需要進行一次貼圖或者直接使用Shader就可以達到,這使得NV3X的設計成為了空架子,實 用意義大大降低,而在單紋理處理過程中由於NV3X的後續效果單元被削減,它的渲染效能註定沒有傳統的完整流水線高,另外,由於DX9中的最終FP精度被 定義為FP24,這導致了NV3X的相對低下的FP效能。最終,本來「先進」的NV3X構架落的個整體效能低下的下場
從本質上來講,圖形數據在NV3X中的實際處理過程依然是沿著頂點處理器—Setup Engine—像素流水線的順序進行的,這與R3XX以及所有的第二代GPU是相同的
天堂的入口—可編程Shader3.0,DriectX Next以及未來的GPU
在微軟剛剛公布的Driect9.0C中,Vertex Shader和Piexl Shader已經具有了幾乎相同的能力,而在nVidia新發布的第 四代GPU—NV40中,我們發現Vertex Shader包含了4個紋理取樣器,可以使用texld指令進行查表操作, NV40可以在一個 shader pass里完成4個紋理的讀取,這個對於通用替換貼圖而言相當的重要,有了vertex texturing功能後, vertex shader就能讀取紋理信息直接映射到頂點上,以實現displacement mapping(位移映射)等等效果,用不同的紋理和較 少的頂點傳輸時間就能實現外形復雜、平滑的模型,這表明GPU中Vertex Shader的功能正在逐漸接近Piexl Shader。隨著GPU的發 展,未來GPU中的Vertex Shader和Piexl Shader最終將被合並成一個統一的處理單元—Intergrated Shader,兩 種處理單元將使用完全相同的語法以及指令集,Shader的統一將帶來完全不同與現在的數據執行處理方式,GPU的內部結構將發生本質的變化, Intergrated Shader帶來了更低晶體管數目的解決方案,以更少的晶體管數目來完成現在需要數億晶體管才能完成的功能,同時統一 Shader將引出類似全通用I/O介面的設計以利資源的更合理的傳輸和分配,同時,為了解決越來越龐大的數據量,虛擬顯存、無限資源訪問以及幀緩沖操作 等技術的引入也勢在必行。另外,我們在DirectX Next中還發現了整數指令集,處理器等特殊的定義,這些新穎的設計為我們勾勒出了未來GPU的輪 廓
整數指令集
在編程中不必在擔心指令限制是一個很大的進步,不過想使得GPU更為通用還需要更多的工作。一個需要提高的主要區域就是整數處理能力。目前基於在著色器中 處理的所有數據都是浮點,這對於大多數顯卡操作而言是沒有問題的,不過不適合動態分支預測、非內插式顯存搜索(如頂點緩沖的索引)等操作。在目前的GPU 中,唯一的內存定址就是紋理查找,使用的也是浮點值。這樣的情況對於紋理定位而言沒有什麼問題,不過對於通用內存定址而言就不合適了,這里的連續內存塊可 以完全彼此沒有關聯,採用內插式查找沒有任何意義。微軟對於這樣的情況,在4.0版的Shader模型中引入了全新的、完整的整數指令集。拓撲處理器實際 上,目前的顯卡可以在某些情況下新生成三角形,比如在用到直線以及點的時候。大多數的娛樂級顯卡只具備對三角形進行光柵化處理的能力,這也就意味著所有的 點、線就必須轉化為三角形。點和線在最後都將以2個三角形結束,這樣就需要用到2-6個頂點(根據索引方式的不同而變化)。從本質上來說,這樣的做法是有 益處的,通過可編程的管線,顯示先前應該遮蔽的場景也就無需通過CPU,而可以通過微軟的「拓撲處理器」直接完成。從邏輯上來說,這個拓撲處理器和鑲嵌單 元是相互獨立的,這個處理器在兩種操作集中均可以使用。由目前的趨勢來看,未來的GPU將向著高運算能力,高精度,高通用性的方向發展,GPU在工作方式 上將越來越接近CPU,由於高通用性等CPU特性的引入,GPU可能在一定程度上替代一部分CPU在非繪圖領域的工作,也許在未來我們會看到由全GPU組 成的圖形工作站。盡管未來GPU需要面對由於這些改進而帶來得的諸多問題,尤其是通用性導致的效率低下,比如Intergrated Shader的效率 低下,但隨著時間的推移,各種問題都將會得到妥善的解決。

2. 中國科學院計算技術研究所怎麼樣

很牛逼。

中國科學院計算技術研究所(Institute of Computing Technology, Chinese Academy of Science,簡稱ICT)創建於1956年,總部坐落於北京海淀區,中關村科學院南路六號。是中國第一個專門從事計算機科學技術綜合性研究的學術機構。計算所研製成功了中國第一台通用數字電子計算機,並形成了中國高性能計算機的研發基地,中國首枚通用CPU晶元也誕生在這里。

計算所是中國計算機事業的搖籃。隨著學科與技術發展,從計算所陸續分離出中科院微電子研究所、計算中心、軟體研究所和計算機網路信息中心等多個研究機構,及聯想、曙光等高技術企業。計算所是中國科學院「知識創新工程」首批試點單位。

計算所擁有計算機體系結構國家重點實驗室、中國科學院智能信息處理重點實驗室、中國科學院網路數據科學與技術重點實驗室、移動計算與新型終端北京市重點實驗室、國家並行計算機工程技術研究中心、國家高性能計算機工程技術研究中心。[1] 依託科研基地,計算所加強了原始創新研究、重大關鍵技術研究和產業化共性技術研究,以解決計算機學科中的重大科學和技術問題,為計算所的長遠發展提供長期的、戰略性的技術儲備和基礎,並培養一批高水平、高素質的學科帶頭人與學術團隊。計算所正在發展成為由本部核心所和建在上海、洛陽、蘇州、寧波、東莞等地的若干個分部組成的網路型研究所。
中國科學院計算技術研究所
計算技術研究所是中國第一個專門從事計算機科學技術綜合性研究的學術機構,致力於計算機科學技術領域的科學發現和技術創新,為中國經濟建設、國家安全和社會可持續發展不斷做出基礎性、戰略性、前瞻性的重大創新貢獻,努力成為社會公認的引領我國信息產業和信息化的計算技術主要源頭。目前設立了計算機系統研究部、網路研究部、智能信息處理研究部,三個研究部下設十三個研究中心或實驗室。[2]
計算機系統研究部研究方向包括:高端計算體系結構、微體系結構、編譯和編程、VLSI與容錯計算、非傳統體系結構、高性能計算機系統、高性能計算機系統應用環境、高性能計算應用、高性能處理器體系結構、IP及系統晶元(SoC)設計技術、低功耗處理器設計技術、處理器驗證與測試技術、納米級集成電路設計技術、高速信號傳輸技術、存儲技術、計算機應用技術;網路研究部研究方向包括:雲計算系統與基礎設施、網路搜索與挖掘、輿情計算與內容安全服務、網路模擬與安全應用、網路科學與社會計算基礎理論、移動互聯網、可信互聯網、感測器網路、低耗能無線通信基帶晶元、協同無線通信與軟體無線電技術、高速寬頻移動通信技術、復雜異構移動通信網路控制、無線資源管理技術和新一代低功耗無線網路系統架構等;智能信息處理研究部研究方向包括:知識網格、智能科學、大規模知識處理、自然語言理解和翻譯、基於圖像的人機交互、多媒體信息的編碼與理解、大規模高維數據可視化、智能感知與交互技術、情境計算、嵌入式與先進終端技術、高速數字信號處理技術、無線傳輸技術、數字內容處理技術、基於「龍芯」的低成本信息化應用集成技術、生物信息處理、跨媒體計算、虛擬現實、網格操作系統等。[1]
截至2013年底,計算所獲得國家、院、市、部級科技獎勵206項,其中,國家級科技獎勵43項(含非第一完成單位7項),院、部級科技獎勵163項(含非第一完成單位7項)。[1]

現任領導編輯

孫凝暉
男,博士,研究員。1968年3月出生,籍貫安徽壽縣,1989年畢業於北京大學計算機系,隨後進入中科院計算所攻讀碩士學位,1992年碩士畢業後留所工作,1995年攻讀在職博士,1999年獲工學博士學位。1997年至2000年先後擔任計算所智能中心研發部副主任、主任,2000年至2005年任國家智能計算機研究開發中心主任, 2005年至2009年先後擔任計算所系統結構研究部主任、計算機系統結構重點實驗室主任,計算所副總工程師(兼),所長助理(兼)等職務,2009年7月起任中科院計算所常務副所長,2011年7月起任中科院計算所所長。
孫凝暉研究員先後參加並領導了曙光一號並行計算機,曙光1000大規模並行機、曙光2000-I、曙光2000-II超級伺服器、曙光3000超級伺服器、曙光4000超級伺服器、曙光5000A高效能計算機、曙光6000高性能計算機的研製,其中提出了一系列高性能計算機體系結構和系統設計方法,並行演算法和應用的優化方法,多次獲得國家和科學院科技進步獎,1999年獲中國科學院青年科學家獎一等獎,2001、2003、2006年三次榮獲國家科技進步二等獎,2005年獲中國科學院傑出科技成就獎,2006年獲得「中國青年科技獎」和「中國十大傑出青年」榮譽稱號。
孫凝暉研究員主要從事計算機體系結構方面研究,發表論文100多篇,現擔任中國計算機學會理事、高性能計算機專委會副主任,中國科學技術大學客座教授,計算機學報主編,Journal of Computer Science and Technology領域編委,計算機研究與發展編委。

李錦濤
男,博士,研究員,
李錦濤
1962年出生,現任中國科學院計算技術研究所黨委書記、副所長(兼)、前瞻研究實驗室主任(兼),計算所職代會和工會主席。李錦濤研究員於1986年考入計算技術研究所攻讀博士學位,於1989年獲得計算機應用專業博士學位後留所工作,並於1989-1990年在捷克斯洛伐克科學院做訪問學者。李錦濤研究員在工作期間,先後被聘為研究員、博士生導師,北京市自然科學基金委員會副會長等。李錦濤研究員主要從事數字媒體處理技術、虛擬現實技術和普適計算技術領域的研究,先後承擔了國家863計劃、科技部國際科技合作、國家自然科學基金、北京市科技計劃等項目,已申請40餘項專利,出版著作2部,發表學術論文80餘篇。他主持的智能化網路訪問終端系統研究取得了重大突破,並在全國10多個行業取得了良好的應用,獲得了北京市科學技術一等獎,是國務院政府特殊津貼專家。

隋雪青
男,研究員級高工,1964年出生,
隋雪青
現任中國科學院計算技術研究所副所長。1990年在國家智能計算機研究開發中心工作,參加曙光1號的應用開發,1995年進入曙光信息產業有限公司,從事國產曙光伺服器的產業化推廣工作。2001年調回計算所工作,歷任技術發展處處長、所長助理,主要從事技術轉移工作。先後以成立合資企業、建立孵化器進行技術入資,以成立計算所分部進行技術輻射,以技術拆分專利許可進行技術轉讓等多種方式進行技術轉移與輻射。

陳熙霖
男,博士、研究員、博士生導師。1965年出生,現任中國科學院計算技術研究所副所長。1988年、91年和94年分別於哈爾濱工業大學計算機系獲得學士、碩士和博士學位。畢業後留校任教,先後任講師(1994)、副教授(1996)、教授(1999)。2001年5月至2004年5月在美國卡內基梅隆大學計算機學院訪問。回國後入選中國科學院百人計劃,先後任中科院計算所研究員、中科院智能信息處理重點實驗室主任、副總工兼智能信息處理研究部主任、所長助理職務。主要研究領域為計算機視覺、模式識別、多媒體技術以及多模式人機介面。先後主持過自然科學基金重點項目、863計劃等項目的研究工作。先後獲得國家科技進步二等獎三項,省部級科技進步獎7項,獲得國家發明專利四項,合作出版專著1本,在包括IEEE Transactions在內的國內外刊物和會議上發表論文100多篇。擔任過十多個國際學術會議的程序委員會委員。

張光輝
男,博士,高級工程師。1964年出生,現任中國科學院計算技術研究所紀委書記兼黨委副書記。1985年8月至2007年12月,在總參某部從事通信系統的國防科研與管理工作。多次參與國家和軍隊大型通信系統科研項目,涉及數字信號處理系統的DSP軟硬體實現、通信裝備的嵌入式系統設計、信源的編解碼演算法、信道糾錯的軟硬體實現、各類多址信號的調制與解調、寬頻模擬信號與高數據率數字信號的實時採集與存貯、電子設備在線測試診斷技術等。作為主要貢獻者,取得軍隊科技進步一等獎1項;以第一完成人的身份,取得軍隊科技進步二等獎3項。

學術委員會編輯
學術委員會是計算所的最高學術管理組織。[3]
名譽主任:夏培肅汪成為
主任委員:徐志偉
副主任委員:孫凝暉
委 員: (按姓氏音序排序)
陳熙霖 程學旗 方濱興 高慶獅 胡偉武 李德毅 李國傑
李錦濤 李凱 李曉明 李忠誠 陸汝鈐 孟丹 倪光南
倪明選 孫凝暉 王兆其 徐志偉 許魯 趙偉 諸葛海
秘 書

研究實體編輯

計算機系統研究部
中國科學院計算技術研究所
計算機系統研究部成立於2005年11月,主要從事計算機系統相關領域的研究。
計算機系統研究部下設:
計算機體系結構國家重點實驗室
微處理器研究中心
高性能計算機研究中心(國家智能計算機研究開發中心)
先進計算機系統研究中心(中科院計算所-華為聯合實驗室)
數據存儲技術研究中心
計算機應用研究中心[4]
研究方向:
●計算機體系結構
●計算機系統
●高性能計算機
●伺服器技術
●處理器技術
●編譯技術
●並行演算法和應用
●存儲技術

中國科學院計算技術研究所
操作系統
●高性能嵌入式計算機系統
●地理信息系統與空間信息服務支撐技術

網路科學與技術研究部
網路科學與技術研究部下設:
網路數據科學與技術重點實驗室
網路技術研究中心
無線通信技術研究中心(移動計算與新型終端北京市重點實驗室)
專項技術研究中心[2]
信息科學技術正面臨著系統化、跨越式發展新的臨界點。網路科學所關注基本問題正是信息技術發展的趨勢之一。網路科學與技術研究部針對新型網路基礎設施平台、網路服務和網路信息安全保障等多層次實際需求,研究網路科學的基礎理論體系、新一代網路通信互連標准與關鍵技術、網路體系結構與系統軟體平台、惠及大眾的低成本網路服務軟體以及網路與信息安全關鍵技術與系統。 研究部下設科研實體包括:下一代互聯網研究中心、信息智能與信息安全研究中心、網格與服務計算研究中心、感測器網路實驗室與網路管理技術課題組。
研究部的主要研究方向包括:1、面向下一代網路通信、接入、互聯研究。包括核心關鍵技術與標準的研究以及相應的實驗網建設;2、面向服務和計算共享的新型網路體系結構研究。包括網路環境下的協作共享基礎理論、系統軟體平台與行業應用軟體;3、新型網路環境下的網路與信息安全研究。包括網路信息內容安全、網路安全管理、可控可管的新型網路體系結構與信息安全保障體系的研究;4、網路科學基礎理論及新一代網路服務基礎理論與系統研究。
中國科學院計算技術研究所
研究部的主要目標包括:1、面向科學問題,形成網路科學與技術研究領域國際著名團隊,在網路科學的基礎理論、網路系統的專利標准等方面有一定的國際話語權;2、面向國家需求,承擔國家網路信息安全保障、新一代網路基礎設施平台以及國家級網格平台等方面的重要任務,建設完成一系列重大系統;3、面向廣大的社會信息網路終端用戶需求,研製惠及億萬網路群體的網路服務軟體,提供低成本、社會化、智能化的網路信息服務。

智能信息處理研究部
智能信息處理研究部下設:
智能信息處理重點實驗室
普適計算研究中心
前瞻研究實驗室[2]
為我國信息技術的長期發展積累知識、創新技術和培養人才。智能信息處理研究部的主要研究方向包括:知識網格,涉及Internet上實現分布知識的共享、集成、運用和知識管理的模型、理論、方法體系以及平台和機制;海量知識庫,涉及大規模知識獲取與組織、基於知識的計算機藝術和自然語言處理、並行地理圖象知識處理系統、NKI支撐下的應用研究;圖像理解與識別,涉及人臉識別等生物特徵識別技術以及人體行為分析技術;可視化與復雜數據展示,涉及大規模虛擬人與環境的建模與合成技術;多媒體分析與處理,涉及音視頻數據的編碼、分析理論與應用;多語言與多模態人機交互,涉及自然語言處理、評測與交互技術以及手語識別與合成等技術。
前瞻研究實驗室創立於2005年11月,其目標聚焦在基礎性、前瞻性和交叉學科研究,與國內外研究團隊的合作研究,推動計算所在信息技術領域和交叉學科研究的持續發展;為計算所的長遠發展奠定人才基礎。 前瞻研究中心實行「機構開放、人員流動、公平競爭、擇優支持、鼓勵創新」的運行機制,旨在營造一個「創新、求實、高效、和諧」的研究氛圍,倡導敢為天下先、勇於開拓、容忍失敗的創新理念,努力把中心建成知識創新骨幹人才的培養基地和基礎性、前瞻性計算技術研究的樂園。
中國科學院計算技術研究所
首批進入前瞻研究實驗室的研究實體包括信息檢索課題組和影視動漫關鍵技術課題組等。
普適計算研究中心創立於2007年3月,其目標聚焦在面向低成本信息化重大需求的相關先進技術研發上。
普適計算研究中心為所直屬研究中心,由普適研究中心所級領導小組具體指導中心的工作。中心堅持「團結進取、務實創新」的原則,協調並集中網路終端方面的資源和力量,緊密結合應用需求,努力承擔國家重大專項,爭取成為國家級先進普適終端方向的工程技術中心。
首批進入普適計算研究中心的科研實體包括媒體計算課題組、網路終端課題組以及實時信號處理課題組。

管理部門編輯

綜合處
綜合處是計算所的中心樞紐,它對外代表計算所的形象,對內是聯系工作的窗口,肩負著綜合、協調、管理、服務等多方面的職能。
行政工作:主要負責代表法人單位的印章管理、公文管理、辦公用房的管理、職工宿舍的管理、房產管理、住房補貼的發放、職工體檢安全保衛、科研環後勤境的支撐保障等工作。
黨務工作:主要負責黨務、紀檢監察、統戰和群眾等工作。
基建園區建設:主要負責計算所新園區的建設。
宣傳工作:主要負責代表法人單位的政務信息、宣傳、科普、網站等工作,同時承擔所刊《創新·求實》編制、所中文網站的內容建設和系統管理等工作。
所務工作:所務會、所長辦公會相關工作;所內外重要聯絡工作。[5]

人力資源處
本著「用好現有人才,穩定關鍵人才,引進急需人才,培養未來人才」的原則,為計算所發展戰略目標的實施及加強科技創新隊伍建設,提供有力的人才和組織保證。主要工作有:人員的招聘與配置工作;崗位聘任、專業技術職務評聘工作;員工培訓和繼續教育工作;薪酬管理;員工福利和社會保險的管理;員工的績效考核的管理;人力資源信息系統的管理;人事檔案的管理;各類專業人才培養計劃(「百星計劃」、「定向培養制度」「人力資源基金」、「出國留學基金」等);「百人計劃」的招聘工作;科技副職的選派和管理;「西部之光」人才項目的引進與管理;外國專家的引進工作;王寬誠項目的申請與管理;各類公派留學的申請與管理;人事印章管理等。[6]

科研處
科研處是所務會領導下的一個執行機構,是所務會有關科研工作決議的執行者和推動者,代表所務會對計算所與科研相關的重大活動進行必要的策劃、組織、協調和管理,為科研人員工作的開展提供所需的服務和支撐,規范計算所的科研工作。
科研處下設機構包括:學術規劃辦公室、科研項目(軍工)辦公室、科研管理辦公室(含保密辦公室、綜合檔案室、質量管理辦公室)
學術規劃辦公室職責:負責全所科研與學術戰略與規劃的研究、制定與調整,組織全所春秋兩季戰略規劃會的舉辦;承擔所學術委員會日常工作事務,負責全所所級學術報告的發布、組織與管理;承擔全所科技論文和專著的統計、優秀學術論文的評選;負責國際合作和外事管理,包括辦理因公出國的手續、國際會議的舉辦以及其他與國際合作有關的事宜;與科研管理辦共同負責每年科學院組織的研究所評估工作等。
科研項目(軍工)辦公室職責: 圍繞計算所的科學發展戰略及科研規劃,負責全所科研項目(含軍工)的策劃、爭取以及軍工產品生產的組織管理、產品交付及交付後的跟蹤等;負責裝備承製單位資格、武器裝備科研生產許可證的申請、自查、整改等。
科研管理辦公室職責:負責科研項目立項到結題的全過程管理;負責全所縱向課題(國家基金委、科技部(含863計劃、973計劃、科技支撐計劃)、科學院、國家其它部委、地方政府等)的申報組織工作;負責課題的合同評審工作;負責除知識產權外的科技成果的管理(包括成果的驗收、鑒定、登記、獎勵申報等);負責重點實驗室、國家工程實驗室與國家工程中心的管理;與學術規劃辦共同負責研究所評估;負責科技部和科學院的綜合統計等。
保密辦公室職責:負責組織宣傳貫徹上級有關保密工作的方針、政策和法律法規;制定和組織落實保密委員會工作計劃;開展全所保密日常管理;監督、指導和檢查各單位(部門)保密管理工作情況;提出年度保密培訓計劃和協同人力資源處開展保密教育;監督全所實施各項保密審查審批;完成全所保密檔案。
綜合檔案室職責:負責全所綜合檔案管理,監督、指導實體(部門)各類檔案預立卷工作,督促全所各類檔案材料歸檔,完成全所各類檔案分類、整理、裝訂、立卷和數據錄入、編目、上架等工作,實現對全所各類檔案的規范管理,為全所各項工作提供檔案查詢、利用服務。
質量管理辦公室職責:歸口管理計算所質量和標准化相關工作。組織質量管理體系的建立、運行和持續改進,組織質量管理相關文件的制定與修改,組織質量管理體系的內外部審核,監督質量管理體系的運行狀況;負責重點項目的質量監控與跟蹤,組織質量問題的歸零處理;負責出所檢驗、合格證簽發及質量證明文件提供;負責重點項目的標准化審查、組織企業標准制定及國家、行業標準的推廣應用工作;負責全所質量相關工作的宣傳與培訓;計算所質量相關工作的外部聯絡。[7]

技術發展處
技術發展處是計算所為實現技術轉移和孵化所設立的專門機構,是技術轉移工作的規劃者、監督者、協調者和服務者。技術發展處下設知識產權辦、技術轉移辦,分別擔負計算所技術轉移工作中涉及到的不同職責。
技術發展處通過產業關鍵技術、技術入股、專利許可、技術孵化和院地合作等不同方式與社會各界進行了泛合作。在技術發展處的推動下,計算所在科研成果孵化方面取得了較大成績,例如:通過大力開展院地合作,從2002年開始,先後與地方政府合作成立了蘇州分部、上海分部、肇慶分部、寧波分部、台州分部和東莞等分部,共計吸引當地政府與企業資金2.2億元,這些分部不僅推動了計算所的成果輻射面,也成為當地科技建設的中堅力量;通過科研成果轉化參股創立北京神州龍芯集成電路設計有限公司、北京神州天脈網路計算機有限公司等多家高科技公司,為科研成果的產業化貢獻力量;同時,在對外合作中還承擔了Intel、Nokia、聯想等知名企業委託的許多高科技研究開發課題。
技術發展處各辦公室主要職能設置介紹如下:
技術轉移辦:技術轉移辦主要負責計算所在技術轉移過程中執行層面的工作,兼有管理和拓展業務兩方面的職能,負責包括融資與企業孵化、技術許可與轉讓、分部管理、參股公司管理和企業聯合實驗室管理、企業合作的橫向實驗室管理等科研成果產業化的各項工作。計算所分部的管理和計算所科研成果在分部所在區域的成果輻射與轉化。
知識產權辦:主要負責工作包括專利分析與專利策略、知識產權管理、專利技術許可政策、標准策略與推進及與知識產權密切相關的合同審查和法律事務等工作,其職能貫穿科研選題立項-研發中期-形成科研成果-技術轉移全過程。[8]

研究生部
研究生部是所務會和所黨委領導下的、執行所學位評定委員會和教育工作指導小組有關研究生教育工作決議的教育管理職能部門。本部門的主要職責是:
1.貫徹落實中科院研究生院關於研究生教育與培養的方針、政策;
2.緊密配合本所發展戰略,堅持「以人為本」,德、智、體、美全面發展的原則,以培養具有「科研為國分憂,創新與民造福」精神的IT領域領軍型人才和創業者為特色,開展計算所教育品牌建設;
3.規范教育管理工作,內容包括:制定教育發展規劃、招生工作、研究生思想政治工作、學生住宿、學籍及檔案管理、課程建設、助學金/獎學金、論文答辯、導師遴選與培訓上崗、學生社團、就業指導、博士後進出站、受理同等學力人員申請學位、客座學生、同學會、教育基金會管理等;
4.開展對研究生教育工作的研究。[9]

財務資產處
財務資產處是按照國家財經政策,負責做好全所經濟事項的會計核算、執行財務、資產管理制度,提高財務管理水平,合理用好用活各項資金、實現資產保值、增值的職能部門。
其工作職責為: [10] (1)根據計算所戰略發展規劃制定財務工作規劃,根據研究所年度計劃,在所長授權范圍內,匯總並調整各部門預算,編制年、季度財務預、決算並監督執行;
(2)合理配置財務機構和人員,確保高效率的管理和服務;
(3)根據國家法律法規,制定並完善全處的管理制度和工作程序並監督執行;
(4)負責研究所資金的運籌、調配、核算等工作;
(5)定期進行研究所財務狀況分析,及時、准確地報告重大財務風險並提出解決方案;
(6)負責研究所各類項目的預算評估、成本核算和控制,並且對項目的財務風險實施監控;
(7)建立規范的核算體系,及時、准確、完整地提供財務、資產信息;
(8)負責國有資產年報、年檢、產權變動登記;
(9)負責對分部和下屬企業以及基建項目有關財務的監督管理。
(10)負責全所屬固定資產(儀器、設備、傢具)的管理。
(11)組織和配合科研項目等各類審計工作;

支撐部門編輯

科研支撐中心
科研支撐中心是在所務會領導下的執行機構,於2009年11月成立,是進一步加強我所科技創新基礎平台建設的一個重大改革舉措,負責全所科研支撐體系的建設。
科研支撐中心的主要職責包括:全所公共科研支撐平台建設、運維服務和管理工作;全所網路環境建設規劃、實施與日常維護、技術支持;全所信息化工作規劃與實施推進管理(包括網路信息安全日常管理與定期檢查);圖書期刊的購入管理與借閱服務;圖書、資料數字資源建設與管理維護;文獻檢索與全文傳遞服務;公共EDA設計平台建設與運行管理;集成電路相關公共資源庫的建立、使用服務與管理;EDA 相關渠道管理;集成電路設計服務等;負責《計算機研究與發展》、《計算機學報》、《Journal of Computer Science and Technology》、《計算機輔助設計與圖形學學報》四個學術期刊的出版工作等。
中心擁有一套13萬億次計算能力、270TB共享存儲空間的共享計算平台和20多台高速信號傳輸、集成電路驗證加速、硬體調試測試實驗室設備和防靜電實驗環境,提供基於虛擬化和雲技術的統一IT支撐服務、同構千核實驗環境和全流程EDA設計技術服務。圖書情報方面能夠提供多元化的圖書情報服務,包括圖書資料查閱、項目查新、影響力分析等知識化服務,定期出版的《信息技術快報》為計算機界同行及企業和政府的決策者了解計算所科研工作的窗口。四個學術刊物多年來一直排名國內計算機專業前列,多次獲得國家科技期刊獎項和基金資助。

成果介紹編輯
到2006年底,全所共取得科技成果593項,共獲國家、院、市、部級科技獎勵:203項,其中:國家級科技獎勵33項,院、部級科技獎勵145項。
農村科技遠程教育和信息主動推送的集成系統
基於龍芯CPU的大規模並行計算機系統的關鍵技術研究
基於龍芯的SMP晶元組及其相關系統的研究
中國科學院計算技術研究所
虛擬計算環境的關鍵技術研究
動態容災模型及其關鍵技術研究
語義與知識網格的理論及應用研究
蛋白質質譜鑒定中的優化問題
支持移動、漫遊的多媒體會晤業務系統
基於三維人體運動模擬與視頻分析的計算機輔助運動系統及示範應用
基於IPv6移動話音業務關鍵技術試驗
新一代機群關鍵技術研究
中科SoC晶元系列化關鍵技術研究
可互操作空間數據引擎的高速通道研究
能力伺服器——低成本信息化技術
網路化內存關鍵技術及原型系統研究
無線感測器網路系統級關鍵技術研究及兩個典型示範應用
新型結構龍芯CPU研究
藍鯨網路存儲技術成果轉化
生物運行機制的形式化描述探索
車載綜合信息處理與紅外安全系統的研製和智能交通信息交互的研究

3. 如何編譯SQLite-How To Compile SQLite

SQLite是ANSI-C的源代碼。在使用之前必須要編譯成機器碼。這篇文章是用於各種編譯SQLite方法的指南。

這篇文章不包含編譯SQLite的每個步驟的反饋,那樣可能會困難因為每種開發場景都不同。所以這篇文章描述和闡述了編譯Sqlite的原則。典型的編譯命令已經作為例子提供了,以期望應用開發者能夠使用這些例子作為完成他們自己定製的編譯過程的的一個指南。換句話說,這篇文章提供了想法和見解,而不是交鑰匙的解決方法。

融合VS單獨源文件

Sqlite是由超過一百個c源碼文件以及眾多的目錄下的腳本構建的。Sqlite的實現是純粹的ANSI-C,但是許多C語言源代碼文件是由輔助的C程序生成或者轉換來的,並且AWK,SED和TCL腳本會融合到完成的sqlite庫中。對Sqlite構建需要的C程序和轉換和創建C語言源碼是一個復雜的過程。

為了簡化這些,sqlite也通過一個預打包的合並後的源碼文件:sqlite3.c。這個合並文件是一個ANSI-C源碼實現整個SQLite庫的唯一文件。合並後的文件更容易處理。所有的東西都包含在這一個文件里,所以很容易進入一個更大的C或者C++程序的源碼樹。所有的代碼生成和轉換步驟都已經實現了,因此沒有輔助的C程序需要去配置和變異,也沒有腳本需要去運行。並且,因此所有哭都包含在一個翻譯單元,編譯器可以做更多高級的優化從而提升5%到10%的性能。因為這些原因,融合後的源碼文件sqlite3.c對所有程序來講都是值得推薦的。

推薦所有的應用程序使用融合文件。

直接從單獨的源碼文件中構建sqlite當然可以,但是並不推薦。對一些特殊的應用程序,可能需要修改構建程序去處理使用那些從網站上下載的預構建的源碼文件不能完成的情況。對於這些情況,推薦構建和使用一個定製過的合並文件。換句話說,即使一個工程需要以單獨的源碼文件構建sqlite,仍然推薦使用一個融合後的源碼文件作為一個中間步驟。

編譯命令行介面(CLI)

構建命令行介面需要三個源碼文件:

sqlite3.c:Sqlite融合的源碼文件

sqlite3.h:匹配sqlite3.c以及定義sqlite的c語言介面的頭文件

shell.c:命令行介面程序本身。這個c源碼文件包含一個main()的常式和每輪循環的用戶輸入的提示符並將輸入傳給sqlite資料庫引擎用於處理。

所有的上述源碼的三個文件都被包含在下載頁面的amalgamation tarball中。

為了構建CLI,簡單的將這三個文件放置在相同的目錄下然後一起編譯他們。用MSVC:
cl shell.c sqlite3.c -Fesqlite3.exe

在unix系統上(或者在windows上用cygwin或者mingw+msys)典型的命令會有些像這樣:
gcc shell.c sqlite3.c -lpthread -ldl

為了SQLite線程安全,需要pthreads庫。但是因為CLI是一個單線程的,我們可以指示SQLite構建一個非線程安全的庫並因此護綠pthreads庫:
gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl

-ldl庫是在支持動態裝載時需要,例如sqlite3_load_extension() 介面和load_extension()
SQL function。如果這些特性都不要求,那麼我們也可以使用SQLITE_OMIT_LOAD_EXTENSION編譯時間選項忽略他們。
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c

有人可能想要提供其他的編譯時間選項(compile-time options),例如SQLITE_ENABLE_FTS3去全文本搜索或者SQLITE_ENABLE_RTREE用於R*樹搜索引擎擴展。而有人將正常指定一些編譯優化開關。(預編譯的CLI可以從選擇sqlite網站上使用「-Os」下載下來)有無數種可能的變數在這里。

關鍵點在這里:構建CLI需要編譯一起兩個C語言文件。shell.c文件包含入口的定義和用戶輸入的loop,而sqlite融合文件sqlite3.c包含完整的sqlite庫的實現。

編譯TCL介面

sqlite的tcl介面是一個小的模塊被添加到一般的融合文件中。結果是一個新的融合後的源碼文件,稱之為「tclsqlite3.c」。這個源碼文件是生成一個可以使用TCL

load命令去載入到一個標準的tclsh或者wish中,或者隨著sqlite構建成功生成一個單獨唯一的tclsh的共享庫所需要的。一個tcl的融合的副本被包含在下載頁的TEA
tarball中作為一個文件。

為了生成一個linux上的sqlite的TCL-loadable庫,下面的命令需要滿足:
gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl

不幸的是構建Mac OS X 和 Windows的共享庫並不是如此簡單。對於這些平台最好使用包含在TEA tarball中的configure腳本和makefile.

為了生成一個單獨的tclsh,可以用於sqlite靜態鏈接,使用如下的編譯器調用:
gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm

這里的技巧是-DTCLSH=1選項。sqlite的TCL介面模塊包含一個main的過程,用於初始化一個TCL解釋器並在以-DTCLSH=1編譯後進入到一個命令行loop。上述命令可以工作在Linux和Mac
OS X,雖然有時可能需要依賴於平台調整庫選項以及編譯的TCL的哪一個版本。

構建融合文件

下載頁提供的sqlite融合文件的版本對大多數用戶來說是足夠的。然而,一些工程可能想要或者需要構建他們自己的融合文件。一個常見的構建一個定製的融合文件的理由是為了使用特定的compile-time options來定製sqlite庫。回想sqlite融合文件中包含了許多C代碼由輔助程序和腳本生成。許多的編譯時間選項影響這一成聖代碼而且必須在融合文件組裝前提供給代碼生成器。這一系列必須傳給代碼生成器的編譯時間相關的選項會使得sqlite的發布版本各不相同,但是在寫這邊文章的時候,代碼生成器需要知道的這組選項包括:

SQLITE_ENABLE_UPDATE_DELETE_LIMIT
SQLITE_OMIT_ALTERTABLE
SQLITE_OMIT_ANALYZE
SQLITE_OMIT_ATTACH
SQLITE_OMIT_AUTOINCREMENT
SQLITE_OMIT_CAST
SQLITE_OMIT_COMPOUND_SELECT
SQLITE_OMIT_EXPLAIN
SQLITE_OMIT_FOREIGN_KEY
SQLITE_OMIT_PRAGMA
SQLITE_OMIT_REINDEX
SQLITE_OMIT_SUBQUERY
SQLITE_OMIT_TEMPDB
SQLITE_OMIT_TRIGGER
SQLITE_OMIT_VACUUM
SQLITE_OMIT_VIEW
SQLITE_OMIT_VIRTUALTABLE

為了構建一個定製的融合文件,先下載原始的獨立源碼文件到一個unix或者類unix開發平台。確定獲取的原始源碼文件不是「預編譯過的源文件」。任何人都可以通過到下載頁或者直接從configuration management system.獲取完整的一套原始源碼文件。

假設sqlite源碼樹被存在一個名為「sqlite」的目錄下。計劃構建一個平行目錄下的名為「bld」的融合文件。首先通過運行sqlite源碼樹種的configure腳本運行或者通過製作一份源碼樹頂層的的makfile模板的一份,來構建一個合適的makefile.然後手動編輯這個Makfile去包含需要的編譯時間相關的選項。最終運行:
make sqlite3.c

在windows上使用MSVC:
nmake /f Makefile.msc sqlite3.c

sqlite3.c的make
target會自動構造一般的「sqlite3.c」合並的源碼文件,以及它的頭文件「sqlite3.h」,和包含TCL介面的融合源碼文件「tclsqlite3.c」。之後,需要的文件可以被拷貝到文件目錄下然後根據上述勾勒的過程編譯。

構建一個windows的動態鏈接庫DLL

為了在windows構建一個sqlite的dll使用,首先獲取對應的融合過的源碼文件,sqlit3.c和sqlite.h。這些可以從SQLite website上下載或者和上述告知的一樣去定製生成。

使用工作目錄下的源碼文件,一個dll可以在msvc中使用如下命令生成:
cl sqlite3.c -link -dll -out:sqlite3.dll

上述命令需要運行在msvc的MSVC Native Tools Command
Prompt.如何你已經在機器上安裝了msvc,你可能有多個版本的這種命令提示符,針對於x86和x64的自帶構建的,或者交叉編譯到ARM的。依賴要求的DLL去使用對應合適的命令提示符工具。

如果使用MinGW編譯器,命令是這樣的:
gcc -shared sqlite3.c -o sqlite3.dll

注意MinGW只生成32位的dll。另有一個分開的MinGW64工程可以用來生成64位的dll。可以推斷其命令行語法是類似的。需要注意的是最近的MSVC的版本生成的DLLs可能不能工作到WinXP或者更早版本的windows上。因此為了最大限度的兼容你的生成的dll,推薦MinGW。一個好的經驗法則是使用MinGW去生成32位的dlls,使用msvc去生成64位的dlls。

4. C/C++發展小問題

個人認為這是一個很好的文字,說的很清楚:

C是一種結構化語言,如譚父說:「它側重於演算法和數據結構。 C程序設計的首要考慮的是怎麼一個過程,來獲得輸出輸入(或環境條件)運算處理(或實現過程(事務)控制),而對於C + +,首要考慮的是如何構建對象模型中,因此這種模式是能夠符合相應的問題域,這樣你就可以通過對象的狀態信息輸出或實施過程式控制制(交易)。

所以C和C + +是最大的區別在於他們的思維來解決問題的方式是不一樣的。究其原因,是C + +比C更先進,因為「的設計理念已經被集成到了C + +」,在C中,演算法語言本身是更概念化。這是不是C並不重要,錯!演算法的基礎程序設計,良好的設計,沒有一個很好的演算法,同樣不能。此外,「C加上好的設計」也可以寫一個非常好的事情。

語言本身,C是C + +的一個子集,那麼什麼樣的一個子集?從上面可以看出,CC + +,實現了過程式控制制等相關功能,而在C + +中C(我稱它為「C +」),相對於原來的C已經加強,重,內聯函數,異常處理,所以項目的引進,C + +是面向對象的設計來擴展其內容,如類,繼承,虛函數,模板和容器類等。

進一步提高一點,在C + +的數據包,輸入的東西是什麼新東西,如:選擇對象的粒度,界面設計對象和繼承,需要考慮結合使用繼承等其他問題。

所以相對於在C,C + +包含了更豐富的「設計」的概念,但C是一個C + +的子集,自洽,而且還具有強大的功能,還值得研究。

一些學習建議:

1。基本概念是非常重要的。無論是學習C,或了解C + +的基本概念是第一個,它是比較困難的,但只有在掌握基本概念,才能從總體上把握背景下,居高臨下。

2。 C是C + +,是比較容易理解的,其基本理念和設計方法,初學者可以從它開始的一個子集。

3。如果你想學習C + +,最好不要推薦適合初學者使用,如VC,BCB平台編寫程序,自動代碼生成,豐富多彩的界面,可以讓你知道該怎麼做。最好先找到一個開放的空間,從點滴做起(UNIX,DOS),寫了幾個大點的程序,輪數,然後VC,BCB下看,你會很容易。在我看來,對學習C / C + +是成為VC,BCB高手的唯一途徑。

4。做不是妄想崩潰,你必須有一個位元組,有點拉,揣摩每一個問題。

5。幾本書:

機械工業出版社的「計算機科學系列」從C到C + +面向對象的設計,隨手可得,都TMD是經典中的經典,價格是公平的,非圓頂欺負。

有幾本書,譚父的書都很好,就是太多的錯誤。清華大學周的英語強烈推薦「現代軟體工程」(上,中,下),它是我見過一些好書,精華中的精華,點對點,薄的材料,至少它是國家降龍十八掌級的東西。

如果人們仍然希望學習C / C + +,然後有一些小問題,我很高興回答,但我想學習C / C + +並不重要,重要的是如何行使你的想法。不要找一些混淆的問題,甚至自己做。

我認為,雖然「譚浩強」同志詐騙的犯罪嫌疑人(我有一個幾乎相同的英文書籍),但他把底漆進入中國,所以很多程序員理解C語言,我認為他的功勞也不可磨滅的這本書中的所有例子可用於思考的基石,他的節目給大家做的練習是非常有幫助的,我認為這是值得一買的。例子來思考課後編程很有幫助,你不要小看一個簡單的例子,它們是你通往成功的道路。

當你能基本掌握了前面的例子在這本書中,你會發現他們的程序的一些例子看到的。開始讀,但如果他們努力工作是沒有問題的,當你已經看到了一些很好的例子,你會突然看到了光明,(讀了很多的例子程序,是學習C / C + +快捷鍵)你會發現,你的水平已經顯著提高。看例子越多,你在Windows / DOS了解更多。更好看一些有關系統的知識的書籍,他將不得不在你的程序非常有用。

這是我學習C / C + +的經驗,我希望我沒有害怕,想繼續學習C / C + +的朋友有一定的幫助。恐怕有些同志說我破壞中國的軟體人才發展。

在最後我祝願所有堅持學習C / C + +的朋友成功!也感謝閱讀我的文章的同志。

想學習C + +,C也不能非學校! ! !

今天我這么肯定了這里的言論雖不是新手落入錯誤的語言越多,越好,這個話題是不是很嚴格,但我必須說幾句講,對於C平反! !

C + +和C有什麼區別會做什麼呢?我們現在一步步來分析

一,階級,階層,我並沒有說有什麼不妥,但對於初學者來說,它是一個負擔。類包允許初學者程序產生厭倦,不適和麻煩。

二,引用,引用在C + +最趾高氣揚的事情,最好是不要盡可能地使用它,我只是從來沒有使用引用,除非萬不得已。引用更容易為初學者感到困惑,不知道這是引述,這是變數。

三,函數重載,函數重載初學者學習似乎是沒有傷害,但是,這使得C語言初學者潛意識變數類型產生稀釋的重要性,記得C語言是最敏感的變數類型,類型在C語言中的變數重要性是不言而喻的。

四,流運營商,同樣的道理,所以變數類型的重要性產生淡化,況且,CIN這東西有點不方便,可以讓初學者有時會產生奇怪的結果。

五,操作符重載,一個典型的先進應用,初學者可能並不需要所有這些東西會令他們感到,C + +的難,門檻高,不能讀......... ....

六,繼承,虛函數,一個典型的模仿四不象,這狗屎看起來深奧的東西,除了低..................實用價值。我怎麼可能把一個指針到另一個類類型,但不同類型的類的繼承關系是實現動態綁定,暈............

..................一些東西,我不會加以評論,如:新建,刪除運營商,等等............

7個錯誤:問題和答案格式:

Q:C + +面向對象和C是面向過程,面向?

答:第二對,錯的第一個問題,C + +不完全的面向對象的技術,恐怕只對Java才算得上真正的面向對象的語言。

問:C + +實現的C函數不能做?

答:至少我還沒有發現......

問:學習C語言,學習C + +有障礙嗎?如程序設計......

答:至少我還沒有看到有這種症狀。

問:學習C語言,學習C + +你必須重新開始嗎?

答:不,C + +下可以實現所有的C語言函數。

問:我完成學校C將肯定需要學習C + +編程?

答:絕對沒有必要的。

問:C + +比C好?

答:更一致的軟體工程

問:成品學校學習C到C + +是不是很容易嗎?

答:這取決於你所學到的是不是真的完成了C語言,我學會了從C到C + +卧床時間的前一個星期讀兩本書,然後大徹大悟。然後來這里發布一些狗屁文章。

最近看到很多人在網上學習方法,我堅決不同意。很多人想一口吃個胖子,想學習學習最新的,因為如果沒有人願意去學習那些老的,舊的編程語言?但是,你可以學習理解呢?不學習TC2。 0早期優秀的編程語言,你可以了解在VC6。 0?如果你真的可以,我寧願做你的弟子!奇怪了,誰不明白最基本的語言的人,如何理解那些人可能最新的編程語言?我學到現在,三年的編程。性能不是太多,只有一台電腦和高程證書四卡,但我覺得我學習VC,你不明白有很多。沒有人教我要靠自己的,其中包括所有級別,我總是依靠自己,我從來沒有報班。學習的VC超過六個月,我想我基本上已經開始,但依然有很多的困惑。剛開始學習VC,正面臨著一個項目,我真的很喜歡在一般情況下,觸摸四個恐慌,毫無章法,最後幾乎勉強算是一個傻瓜。 VC去學校學習其他先進的Windows編程,我覺得它是很容易的,畢竟,在WINDOWS裡面的東西很多,可以直接調用由VC,第一件事情,你可以有WINDOWS有了新的認識,你們去學習其他語言不能簡單嗎?

我的感覺是面向過程和面向對象的,其實非常重要的,在VC仍然會需要的過程中,很多事情都是相互關聯的,也沒有面向過程思考,如何編程成為可能?更值得推薦的Windows編程的書,但大多數都是比較老的書呦!我仍然記得那天TC編程很難,但我仍然懷念當年的勞動付出,畢竟我得到了我想要得到的一切 - 編程思想。我認為,一個良好的編程思路,比你一定學習好更重要的一種計算機語言。要形成自己的編程風格。在你的心目中,一個好的編程思想一旦形成,什麼樣的語言將是很容易學的,因為在這個時候,你不會是簡單易學,但驗證!

參考文獻: http://weichy.blogchina.com/2962575.html C語言是結構化和模塊化的語言,它是面向過程的。在處理較小的程序,採用C語言的程序員比得心應手。但是,當問題是更復雜的,大規模的計劃,結構化程序設計方法將顯示其不足之處。 C程序設計者必須仔細設計過程中的每一個細節,准確地考慮程序運行時發生的每一刻,例如,每個變數的變化,應執行的價值如何,當輸入在屏幕上應該出口等。這需要程序員是比較高的,如果面臨著一個復雜的問題,程序員往往感到力不從心。最初提出的結構化程序設計方法的目的是解決軟體設計危機,但這一目標尚未完全實現。為了解決軟體設計的危機,在20世紀80年代,面向對象編程(面向對象編程),在這種情況下,C + +應運而生。

C + +完全兼容C C.它也可用於結構化編程的面向對象編程的一個超集,所以它是一個功能強大的混合編程語言。

增強主要表現在兩個方面:

1在原有的面向過程的機制,基於C語言的功能做了很多的擴展。
2增加了面向對象機制。

5. C語言是哪個公司的產品

C語言之所以要起名為「C」,是取的「BCPL」的第二個字母(第一個字母用來命名之前被發明的B語言) 。當C語言發展到頂峰的時刻,出現了一個版本叫C with Class,那就是C++最早的版本,在C語言中增加class關鍵字和類,那個時候有很多版本的C都希望在C語言中增加類的概念;後來C標准委員會決定為這個版本的C起個新的名字,那個時候徵集了很多種名字,最後採納了其中一個人的意見,以C語言中的++運算符來體現它是C語言的進步,故而叫C++,成立了C++標准委員會。 美國AT&T貝爾實驗室的本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)博士在20世紀80年代初期發明並實現了C++(最初這種語言被稱作「C with Classes」)。一開始C++是作為C語言的增強版出現的,從給C語言增加類開始,不斷的增加新特性。虛函數(virtual function)、運算符重載(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、命名空間(name space)逐漸被加入標准。1998年國際標准組織(ISO)頒布了C++程序設計語言的國際標准ISO/IEC 1988-1998。C++是具有國際標準的編程語言,通常稱作ANSI/ISO C++。1998年是C++標准委員會成立的第一年,以後每5年視實際需要更新一次標准,下一次標准更新原定是在2009年,目前我們一般稱該標准C++0x,但是由於對於新特性的爭端激烈,除了在Technical Report 1(tr1)中的新增修改被基本確定外,完整的標准還遙遙無期。況且遺憾的是,由於C++語言過於復雜,以及經歷了長年的演變,直到現在(2010年)都沒有有一個編譯器完全符合這個標准。
編輯本段組成部分
根據Effective C++第三版第一條款的描述,現在C++由以下四個「子語言」組成: 1、C子語言。C++支持C語言的幾乎全部功能,主要是c89的部分,在語法上與C語言僅有極微妙的差別(如括弧表達式的左右值性,具體請參考C++標准文獻)。 2、面向對象的C++語言。C++語言原本不具備面向對象的設計功能,然而隨著面向對象編程的概念的提出以及如Java等語言的發展成熟,C++語言也開發出了支持面向對象功能的版本. 3、泛型編程語言。C++強大(但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運行期效率。 4、STL(C++標准模板庫,Standard Template Library)。隨著STL的不斷發展,它已經逐漸成為C++程序設計中不可或缺的部分,其效率可能比一般的native代碼低些,但是其安全性與規范性使它大受歡迎。 此外,包含在TR1等中的C++0x將實現的新功能在開發和測試中。
編輯本段語言發展
C++語言發展大概可以分為三個階段: 第一階段從80年代到1995年。這一階段C++語言基本上是傳統類型上的面向對象語言,並且憑借著接近C語言的效率,在工業界使用的開發語言中占據了相當大份額; 第二階段從1995年到2000年,這一階段由於標准模板庫(STL)和後來的Boost等程序庫的出現,泛型程序設計在C++中占據了越來越多的比重性。當然,同時由於Java、C#等語言的出現和硬體價格的大規模下降,C++受到了一定的沖擊; 第三階段從2000年至今,由於以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最復雜的一員。
編輯本段入門書籍
C++是一種語言,僅僅是它的語法、特性、標准類庫就已經是一門非常高深的課程,所以在開始學習的時候,必須先要打好基礎。在市面上有很多Visual C++的書,雖然其中可能會花1-2章來介紹C++的基本特性,但是那絕對不會讓你入門。因此,初學者學習C++應該選擇針對C++語言本身的書籍,而不能是針對Visual C++、MFC或者Windows API的。 學習C++應該由易至難,循序漸進。以前經常有人說學習C++之前應該學習C語言。事實上那不是必須的,C++和C語言雖然有關系,但仍然是兩種不同的語言。當然,在學習C++之前學習過其他編程語言是很有好處的。那會使學習C++的速度更快,畢竟很多計算機語言的概念都是相通的。而對於零基礎的初學者來說,則是應該靜下心來,不要急躁。要成為C++的高手,不是那麼容易的,必須要花很大的努力。 從入門教材的選擇上,主要看學習者的自身情況。如果已經有過學習高級語言的經歷,那麼推薦使用譚浩強的《C++程序設計》。注意是04年版的,06年版的那本書是閹割版,上來就面向對象。雖然說C和C++是相似的,但是前面已經說了,C和C++應該作為兩種語言來學習,所以06年的那本內容就稍微欠缺一點了。譚浩強04版的這本書內容比較規整的,條理也很清晰。如果有過其他高級語言的基礎,那麼估計半年就能對C++的概況有個了解了。譚浩強老師的書已經成為了全國各大高等院校的教科書,是比較受到認可的。 如果是從零基礎開始學C++,那麼推薦使用潘嘉傑的《易學C++》。這本書是2008年出的新書,聽說是個學生在讀書的時候寫的。這本書網上有下載免費的電子版。這本書主要就是針對初學者的,講得也比較生動有趣,比較提得起學習的興趣。所以沒有基礎的初學者選這本書也是不錯的,就是想要很快成為高手,可能看這本書還不夠。 至於看完入門的書之後,就應該看一些高層次的書了。比如<<The C++ Programming Language>>和<<C++ Primer>>,同時也可以向STL、MFC、API等各個方向發展。如果對別的語言感興趣,還能去看看C#和Java,它們和C++從語法和很多概念上都是類似的。
編輯本段設計原則
· C++設計成靜態類型、和C同樣高效且可移植的多用途程序設計語言。 · C++設計成直接的和廣泛的支援多種程序設計風格(程序化程序設計、資料抽象化、面向對象程序設計、泛型程序設計)。 · C++設計成給程序設計者更多的選擇,即使可能導致程序設計者選擇錯誤。 · C++設計成盡可能與C兼容,籍此提供一個從C到C++的平滑過渡。 · C++避免平台限定或沒有普遍用途的特性。 · C++不使用會帶來額外開銷的特性。 · C++設計成無需復雜的程序設計環境。 出於保證語言的簡潔和運行高效等方面的考慮,C++的很多特性都是以庫(如STL)或其他的形式提供的,而沒有直接添加到語言本身里。關於此類話題,C++之父的《C++語言的設計和演化》 里做了詳盡的陳述。 Hello World程序
在使用兼容C89標准(也稱為ANSI C)的編譯器時,下面這個程序顯示「Hello, world!」然後結束運行:
(事實上這並不是符合98標准[ISO C++]的C++程序,而且在多數編譯器上這個程序也不能運行,若要在比較舊的編譯器上編譯該程序,應將stdio.h改為iostream.h)
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
(以上是c語言代碼,c++語言是c語言高一級的版本)
在使用兼容C++98標准(ISO/IEC 14882-1998)的編譯器時,下面的程序也是可以的:
#include <iostream.h>
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
在使用兼容C++ STL的編譯器時,應當是:
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello,world!"<<endl;
return 0;
}
根據ISO C++的規定,main函數的形式只能是
int main(void)
{
...
}
以及
int main(int argc,char * argv[])
{
...
}
盡管如此,但在Visual C++ 2003以前的Microsoft Visual Studio編譯器上,
void main()
{
...
}
也被支持,但這並不正確,也不標准。這樣的寫法會使程序代碼喪失跨平台的特性。每年都有專業人士規定C++的語法,這也是C++優於其他編程語言的原因之一,由它衍生的Java已成為通用編程語言中廣受歡迎的一種。

編輯本段代碼性能
一般認為,使用Java或C#的開發成本比C++低。但是,如果你能夠充分分析C++和這些語言的差別,會發現這句話的成立是有條件的。這個條件就是:軟體規模和復雜度都比較小。如果不超過3萬行有效代碼(不包括生成器產生的代碼),這句話基本上還能成立。否則,隨著代碼量和復雜度的增加,C++的優勢將會越來越明顯。造成這種差別的就是C++的軟體工程性。在Java和C#大談軟體工程的時候,C++實際上已經悄悄地將軟體工程性提升到一個前所未有的高度。這一點被多數人忽視,並且被大公司竭力掩蓋。 語言在軟體工程上的好壞,依賴於語言的抽象能力。從面向過程到面向對象,語言的抽象能力有了一個質的飛躍。但在實踐中,人們發現面向對象無法解決所有軟體工程中的問題。於是,精英們逐步引入、並拓展泛型編程,解決更高層次的軟體工程問題。(實際上,面向對象和泛型編程的起源都可以追溯到1967年,但由於泛型編程更抽象,所以應用遠遠落後於面向對象)。
編輯本段應用實例
哪些程序是用C++寫的: 主流的3種操作系統Windows內核都是用C語言和匯編寫的,上層高級特性是用C++寫的。 《魔獸世界》等幾乎所有的網路游戲,網路搜索引擎,我們所用的大多數軟體都是用C++寫的(硬體也有很多用到C++的)。 以下是一些C++的應用: Amazon:Software for large-scale e-commerce Apple: OS X is written in a mix of language, but a few important parts are C++(當然最核心的部分都是匯編與c語言). AT&T:The largest US telecommunications provider. o provisioning systems o systems for rapid network recovery after failure Autodesk: A large number of major number of application in the CAD domain Ericsson: o server platform. o TDMA-CDMA HLR o GSM-TDMA-CDMA mobility gateway Google: web search engine, etc。 HP: Here is a tiny fraction of HP's C++ apps: o C, C++, Fortran90 compilers, and linker for the new HP IA64 platform (these add to more than 1 million lines of C++ code). IBM: o OS/400. o K42: a high performance, open source, general-purpose operating system kernel for cache-coherent multiprocessors. Intel: o Vtune performace analysis software o compilers and optimizers o lots of chip design and manufacturing software JPL (Jet Propulsion Lab, NASA): Mars rover autonomous driving system (incl. scene analysis and route planning). C++ on Mars! Also lots of supporting software "on the ground" (i.e. Earth). Microsoft: o Windows XP o Windows NT (NT4 and 2000) o Windows 9x (95, 98, Me) o Microsoft Office (Word, Excel, Access, PowerPoint, Outlook) o Internet Explorer (including Outlook Express) o Visual Studio o SQL Mozilla: Firefox browser and Thunderbird mail client (open source) MySQL: MySQL Server (about 250,000 lines of C++) and MySQL Cluster. Arguably the world's most popular open source database Nokia: o Mobile Communications radio-station/internet bridges: FlexiGGSN (Gateway GPRS Support Node) and FlexiSGSN (Server GPRS Support Node). o MSC/HLR Sun: o The HotSpot Java Virtual Machine is written in C++ Symbian OS: rationale: "[...] using C++ for all system code, from the kernel upwards." This is one of the most widespread OS's for cellular phones KDE from linux is written in C++. telephone systems: I think it would be almost easier to list the systems which aren't written in C++ C++寫出的軟體,還包括 VLC, 著名的開源視頻播放器; LAMMPS,著名分子動力學模擬軟體,其中包括一部分Fortran代碼;
編輯本段編程技巧
使用new和delete進行動態內存分配和釋放
運算符new和delete是C++新增的運算符,提供了存儲的動態分配和釋放功能。它的作用相當於C語言的函數malloc()和free(),但是性能更為優越。使用new較之使用malloc()有以下的幾個優點: (1)new自動計算要分配類型的大小,不使用sizeof運算符,比較省事,可以避免錯誤。 (2)自動地返回正確的指針類型,不用進行強制指針類型轉換。 (3)可以用new對分配的對象進行初始化。 使用例子: (1)int* p; p=new int[10]; //分配一個含有10個整數的整形數組 delete[] p; //刪除這個數組 (2)int* p; p=new int (100);//動態分配一個整數並初始化
使用inline內聯函數替代宏調用
對於頻繁使用的函數,C語言建議使用宏調用代替函數調用以加快代碼執行,減少調用開銷。但是宏調用有許多的弊端,可能引起不期望的副作用。例如宏:#define abs(a)(a)<0?(-a):(a)),當使用abs(i++)時,這個宏就會出錯。 所以在C++中應該使用inline內聯函數替代宏調用,這樣既可達到宏調用的目的,又避免了宏調用的弊端。 使用內聯函數只須把inline關鍵字放在函數返回類型的前面。例如: inline int Add(int a,int b);//聲明Add()為內聯函數 這樣編譯器在遇到Add()函數時,就不再進行函數調用,而是直接嵌入函數代碼以加快程序的執行。
使用函數重載
在C語言中,兩個函數的名稱不能相同,否則會導致編譯錯誤。而在C++中,函數名相同而參數數據類型不同的兩個函數被解釋為重載。例如: void PutHz(char* str);//在當前位置輸出漢字 void PutHz(int x,?int y,?char * str);//在x,y處輸入數字 使用函數重載可以幫助程序員處理更多的復雜問題,避免了使用諸如intabs()、fabs()、dabs()等繁雜的函數名稱;同時在大型程序中,使函數名易於管理和使用,而不必絞盡腦汁地去處理函數名。同時必須注意,參數數據類型相同,但是函數返回類型不同的兩個函數不能重載。
用引用(reference)代替指針進行參數傳遞
在C語言中,如果一個函數需要修改用作參數的變數值的時候 ,參數應該聲明為指針類型。例如: void Add(int *a) { (*a)++; } 調用時則使用 Add(&x); //其中x為int或可以轉化為int的類型,如unsigned int, 但這時候編譯器通常會給出warning 對於復雜的程序,使用指針容易出錯,程序也難以讀懂。在C++中,對於上述情況 可以使用引用來代替指針,使程序更加清晰易懂。引用就是對變數取的一個別名,對引用進行操作,這就相當於對原有變數進行操作。例如使用引用的函數定義為: void Add(int& a) { a++;//a為一個整數的引用 } 調用時使用 Add(x);//其中x為int 這個函數與使用指針的上一個函數的功能是一樣的,然而代碼卻更為簡潔和清晰易懂。
使用預設參數
在C++中函數可以使用預設參數,例如: void PutHzxy(char *str,int x=-1, int y=-1) { if(x==-1) x=wherex(); if(y==-1) x=wherex(); moveto(x,y); PutHx(str); } 可以有三種方式調用函數PutHzxy(),例如: PutHzxy("C++語言");//使用預設參數,在當前位置輸出 PutHzxy("C++語言",10,10);//沒有使用預設參數 PutHzxy("C++語言",10);//對y使用預設參數,指定x的位置 通常的情況下,一個函數應該具有盡可能大的靈活性。使用預設參數為程序員處理更大的復雜性和靈活性問題提供了有效的方法,所以在C++的代碼中都大量地使用了預設參數。 需要說明的是,所有的預設參數必須出現在不預設參數的右邊。亦即,一旦開始定義預設參數,就不可再說明非預設的參數。否則當你省略其中一個參數的時候,編譯器無法知道你是自定義了這個參數還是利用了預設參數而定義了非預設的參數。 例如: void PutHzxy(char*str,int x=-1,int y=-1)//正確 void PutHzxy(int x=-1,int y=-1,char*str)//錯誤
使用STL
STL(Standard Template Library,標准模板庫), STL的代碼從廣義上講分為三類:algorithm(演算法)、container(容器)和iterator(迭代器),並包括一些工具類如auto_ptr。幾乎所有的代碼都採用了模板類和模版函數的方式,這相比於傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。 #include<vector>// 包含相關的頭文件/ typedef std::vector<int> intvector;//使用typedef 使代碼看起來更簡潔 int main() { intvector vi; for(int i=0;i<10,i++) vi.push_back(i);//使用push_back添加元素 for(int i=0;i<vi.size();i++) std::cout<<vi[i]<<" ";//[]操作符被重載,使得我們可以像訪問數組一樣訪問vector中的元素 }
編輯本段開發方式
在unix世界有大量的程序員是傳統的非IDE的方式進行軟體開發。一般是如下組合: 1.編譯器:gcc,clang等 2.編輯器:一般是vim/emacs 3.make:gnu make 或者bsd 的pmake等,功能與用法基本一樣 4.版本管理:cvs,svn,git等 5.代碼閱讀:cscope,ctags,lxr等
編輯本段開發環境
1.Visual Studio(Visual C++) 2.Borland C++ Builder 3.Eclipse(Myln + CDT + Mingw32 + GCC) 4.Dev-C++(Mingw32 + GCC) 5.Code::Blocks(可配合多款編譯核心使用) 6.Codelite 7.C-Free 如上所示,目前流行的GNU GCC和微軟的Visual Studio系列各執一套基本的編譯鏈,其他的IDE都是衍生產品

閱讀全文

與編譯加強加速引擎副作用相關的資料

熱點內容
java與sqlserver資料庫連接 瀏覽:21
鐵路解壓視頻全過程 瀏覽:442
主備核心交換機如何連接伺服器 瀏覽:704
白金卡哪個app最靠譜 瀏覽:666
本田汽車空調壓縮機保險絲 瀏覽:155
康佳led47r5500pdf通病 瀏覽:821
cad圓相切命令 瀏覽:69
bmp文件夾打開 瀏覽:502
u盤裝系統文件下載到哪個文件夾 瀏覽:21
es系統封裝教程程序員大本營 瀏覽:523
程序員聚餐喝什麼酒好 瀏覽:608
編譯程序生成安裝文件 瀏覽:955
linux查看usb設備 瀏覽:284
安卓怎麼禁止app充值 瀏覽:559
動盪對加密貨幣的影響 瀏覽:358
國家反詐app哪裡看注冊時間 瀏覽:563
打孔式文件夾怎麼裝視頻 瀏覽:29
php怎麼學比較好 瀏覽:381
python中關於函數調用 瀏覽:362
debian系統命令行如何排序 瀏覽:407