有人問:
c++與windows程式設計關係
“我一直弄不懂windows程式是什嗎?也不知道c++與windows程式有什麼關係,哪位高手知道,能不能告訴我一下,謝謝……”
反正天黑,我就胡扯一通,才發現完全答非所問。寫到這裡來。
--------------------------------------------------
Windows 是一個作業系統……
作業系統必須支援他人(軟體開發人員)在它上面開發出新程式……開發程式,自然要有開發語言的選擇,c? c++? pascal? BASIC? C#? java?Python? 這些語言在這個層面上,並不是平等的……
因為,為windows等作業系統最初只提供了一種語言的開發介面——那就 C語言。
這當然也不能懷疑微軟開發人員偷懶,而是因為……因為曆史的原因,C語言尾隨彙編被選為作業系統開發的主要語言。而在對外(提供給軟體開發人員上)介面語言選擇上,彙編不僅太複雜了,而且是硬體相關的……所以(加上種種其它原因),曆史讓C語言成為了作業系統開發介面上的第一語言。
事情當然不會僅僅是這樣……因為如果僅僅作業系統的支援,那C語言也稱霸不了多久……
關鍵是,既然作業系統不直接支援其它語言……那其它語言就只好倒過來去支援作業系統——所謂既然沒辦法讓山走向穆罕默德,但穆罕默德可以走向山。
而c++,c,pascal,java,python等等語言,雖然在走的方式上有所不同,但都要走向作業系統這座山,既然作業系統這座山的近乎唯一的路是C語言——所有開發語言就只好放下身段都提供了對C的支援(編譯的或者連結的)。關於C就這樣了:作業系統是天子其它語言是諸侯那句曹孟德說的話,我就不說了。C的江山就是這樣打下的。
八仙過海,各顯神通……現在來說說它們各用各的什麼招數走入C的內心……
C++既然你問的C++,那我就先說它,並且說得正經一點——c++,噢,它是走得最近的,基本在語言,文法上都完全相容C。當初世上最早的C++編譯器,不過是把C++語言直接翻譯成C語言,然後再調用C語言的編譯器……如果那時候有馬甲這個詞——Cer 一定要嘲笑Cpper了,說它們是馬甲,是山寨,是……但隨著名稱為“C with class”到"C++"的變換……這一切都是過去式了,C++終於有了真正的編譯器,可以直接將C++搞成彙編,不再需要通過C的中轉。當然了,C++也可以直接使用彙編 。而語言的相容,以及庫的相容依然不變。雖然後面二者慢慢的也有一些各走各的路了,但——C++永遠是眾多語言中,對C最直接的支援者。
PascalPascal曾經是C的競爭者……曾經在在歐洲大陸,它的使用者甚至比C還多……因為,它是學院裡首選的語言。它有自己的庫……比如那些數學庫,這其中原因,當然是因為:它同樣可以驕傲直接使用組合語言,以及它覺得其實自己在效率上根本不比C差。WINDOWS提供的函數介面形式,最初就命名為PASCAL不過……曆史沒有選擇它,大概是因為……人類總是懶的,誰讓在用花括弧的地方,pascal偏偏喜歡用begin和end呢?當然,這是一句玩笑話。誰當真誰是250——C採用的{},在N多國家的鍵盤上,根本找不到。這一點還得倒過來說pascal有國際觀……言歸正傳,曆史在發展,作業系統作用突然變大……於是pascal終於還是要能調用C的函數……用於Delphi的老人都知道,它要調用windows的某個DLL,那個方便的,VB簡直要流汗——MS自家的VB,在這點上竟然比不過別人家的delphi……也沒有什麼神奇的,不過是borland的程式員兄弟們比較勤快,早早的將一大堆的Windows C形式的介面,翻譯成了Pascal的。停,關於pascal,我說太多了。還是要補充一句,作業系統已經在又一次變得不重要了……
Python我要跳過java,先說說可愛的python.啊,它當然可以有 Java的實現,也可以有.NET的實現。因為它的發明者說:實現了python的語言,及它的必須執行階段程式庫,那就是一門python。(原話是怎麼說的?要不怕被某奇怪的事實給傷到我的心,可以去官方查一查)但CPython必然是Python中的Python。它和C語言可以雙向互調——它可以非常方便地調C寫的模組C也可以嵌一個它的解譯器,有肚子裡運行Python寫的指令碼。對C++也有很好的支援,包括資料結構……推薦一下boost.python。Pythoner已經不認為Python只是一個解譯器,他們說:Python其實已經是一個虛擬機器。其實這根本是侮辱Python.Python真正強大的地方在於:有C/C++的XXX基本上,就會有一個pyXXX在神奇地那兒候著——什麼叫老牌指令碼語言!不管啥場子內,都有人認識他,這才尊稱“老”。
Java好吧說到虛擬機器,Java當然應該要出場。雖然VM這個東西,60年代Pascal就在玩了……但誰叫它出生得太早?沒遇上Internet?(網路當然只是表象,關鍵是那用K計的記憶體喝兩杯啤酒就得溢)作業系統是彙編和C寫的,猜一下虛擬機器會是誰寫的?Java.exe 是作業系統萬千進程中的的一個進程……而所有java寫成的class都活在是java.exe這個進程從OS裡分來的記憶體裡……其中某個帶有靜態,名叫main的函數的類,是某個java程式的最外面的那個門。進了這個門,那叫一個大同世界……再也沒有人世間鬧人的差距……就差連貧富分化也解決了。偶爾Javaer也覺得不爽,於是在那個門口,伸出了一隻腳。腳上一隻鞋,牌子 JNI。(結論:Java仍然沒有放棄對C的支援)若要問Java和Windows的關係?你可以一併問:Java和Linux/UNIX的關係? Java和Android的關係?我來回答你:沒什麼關係,因為它是平台無關的,作業系統就是平台。原因?因為Java很牛,這麼多年來,只有它真正成為語言界的穆罕默德……它逼著作業系統走向了它——方法不過幾句話:先說: “當今作業系統,跨平台是主流……”然後說: “你是一個作業系統?”關鍵一問:“可是你居然不支援java語言?”結論:“那你還是一個正常的作業系統嗎?”。大多數男人在一句“那你還是一個正常的男人嗎?"就生氣地脫下褲子證明一下……但也有不吃這一套的,像微軟,反正已經是微軟,脫了也還是微軟。沒辦法,曾經的“日”公司,只好自己替它寫一個。用什麼寫? C和C++啊。還有其它的每個作業系統的廠商,也一樣。操著C寫一個JVM實現了Java搶走了c++的曾經的大塊地盤。 C# 和 .NET 那一天一定是特別的一天……Windows的開發人員學著上帝說:作業系統要有支援多種語言的API!於是有了COM形工的編程介面。它果真支援C——當然,沒有它也支援C。它還支援C++,還是物件導向的,當然用起來那是怪怪的。還願意支援其它語言,不過數來數去,也就Borland亦敵亦友跟著他玩啊啊……生氣,直接從borland挖走它們的靈魂人物:Anders Hejlsberg於是一切有了很大的改觀:先是終於borland也沒法陪他玩了——因為Borland沒有了Ander Hejlberg,拖再久也終要在語言這條路上玩完。而跑到微軟的Ander Hejlberg也沒閑著先是搞了java比sun還要快,雷得SUN公司裡焦外嫩……硬是不允許這世上有MS自己寫的JVM。後來sun也……落幕。 突然的悲哀啊,這段就不寫了……還好有gooooooogle,還有它們的go. 洗洗……睡