目前信息技術主要經歷了互聯網、移動互聯網以及以大數據、雲計算、人工智能和區塊鏈爲表明的新興技術三個階段。而5G網絡的到來則會加速物聯網、無人駕駛的應用場景落地。html
自從1945年至今,計算機經歷了電子管計算機,晶體管計算機,集成電路計算機以及超大規模集成電路計算機。程序員
電子管計算機(1945年-1957年)
第二次世界大戰是電子管計算機產生的催化劑,而最著名的電子管計算機是來自美國的埃尼阿克(ENIAC),這一時期的計算機有以下特色:數據庫
晶體管計算機(1957年-1964年)
1948年,貝爾實驗室的三個科學家發明了晶體管,相比電子管而言,晶體管有着更小的體積,更低的功耗以及更高的運算效率。而全世界第一臺晶體管計算機TX-0誕生於麻省理工大學的MIT林肯實驗室,而當時性能最高的計算機是PDP-1,它具有4K的內存,每秒能夠執行20W條指令,同時配備了512*512的顯示器,晶體管相對於電子管計算機而言:編程
集成電路計算機(1964年-1980年)
集成電路計算機出現的背景是德州儀器的工程師發明了集成電路(IC),windows
超大規模集成電路計算機(1980年-今)
CPU就是超大規模集成電路的典型產品,一個芯片能夠集成上百萬的晶體管。
並且超大規模集成電路計算機速度更快,體積更小,價格更低,更能被大衆接受,同時在此階段計算機用途也變得豐富起來,能夠用於文本處理,表格處理以及高交互的遊戲和應用。
而喬布斯在這個階段推出了Apple,Apple二代。瀏覽器
將來計算機
隨着計算機的發展,將來會出現生物計算機和量子計算機。安全
生物計算機是以蛋白質分支做爲主要原材料,和人體結合起來進行相關的運算。並且生物計算機體積小,不易損壞,提供生物級別的自動修復以及不受信號干擾和無熱損耗。服務器
量子計算機是遵循量子力學的物理計算機,目前量子計算機已經有相關的研究成果微信
微型計算機主要是計算機發展你的第三個階段集成電路計算機開始。
微型計算機的發展主要是從計算能力區分的,在早期微型計算機是使用的單核CPU,而單核CPU的發展也經歷了以下幾個階段網絡
計算機能夠按照不一樣的用途分爲超級計算機,大型機,小型機,我的計算機。
超級計算機
超級計算機是功能最強,運算速度最快,存儲容量最大的計算機,主要用於國家高科技領域尖端技術研究,咱們使用每秒一萬億浮點數計算(1TFlop/s)指標來衡量超級計算機的性能。
若是想要了解超級計算機的排名,能夠訪問網站 https://www.top500.org/。
大型計算機
大型計算機又稱爲大型機、大型主機、主機等等,大型計算機具備高性能。可處理大量數據與複雜運算,應用場景一般是銀行、證券等金融機構。在大型機市場領域,IBM佔據着很大的份額。
因爲大型機造價高昂,不夠靈活,伸縮性弱,目前不少企業替換成小型機。
阿里巴巴在2008年發起去IOE行動,I就是IBM大型機,O就是商業數據庫Oracle,E就是EMC存儲,IOE表明了高成本,高維護費用的存儲系統。去IOE就是將大型機換成了普通的服務器,將Oracle替換成了分佈式的MySQL,去IOE行動直接驅動了阿里雲的誕生。
服務器
服務器也被稱爲小型機,普通服務器,相對於大型機而言,不要特殊的空調場所,同時也具有不錯的算力。常見的服務器廠商包括戴爾,聯想,IBM。
普通服務器已經替代了傳統的大型機,成爲大規模企業計算機的中樞紐,好比國內的阿里雲、騰訊雲、華爲雲都是基於服務器構建的。
工做站
工做站是高端的通用微型計算機,能夠提供比我的計算機更強大的性能,相似於普通臺式電腦,體積大,性能強勁,例如Mac Pro。
微型計算機
微型計算機又稱爲我的計算機,是最普通的一類計算機,能夠分爲臺式機、筆記本電腦、一體機,微型計算機是成本最低的,可是從構造本質來說,我的計算機與超級計算機、大型機、小型機、工做站沒有區別。
日常開發人員一般接觸的比較多的是微型計算機,例如筆記本、臺式機,而運維人員一般接觸的是服務器。
馮諾依曼體系就是將程序指令和數據一塊兒存儲的計算機設計概念結構。
早期的計算機僅能運行固定用途的程序,若是想要運行別的程序,必需要更改計算機結構、從新設計電路。而馮洛伊曼是把程序存儲起來,並設計通用的電路。存儲程序指令,設計通用電路。
馮諾依曼體系由如下部分組成
CPU是由運算器和控制器組成,而馮諾依曼結構是將存儲器和CPU分開,會致使馮諾依曼瓶頸:CPU和存儲器速率之間的問題沒法調和,CPU常常空轉等待數據的傳輸,這樣沒法充分利用CPU。
現代計算機結構由馮諾依曼結構基礎之上進行修改,主要是解決CPU和存儲器速度差別的問題:存儲器、運算器和控制器集中在一塊芯片上。
CPU:
現代計算機結構的運算器和控制器、存儲器組成了CPU,主要功能負責數據的計算以及其餘設備的控制,程序運行時CPU負責從內存中讀取程序的指令和數據執行後將結果返回給內存或者是寫入磁盤。
內存
馮諾依曼體系結構中的存儲器就是指的內存和外存,其中內存是程序運行時的工做區,即程序運行時的指令和數據都會被加載到內存中,斷電後內存的數據容易丟失,內存是編址存儲的,一般32位操做系統只能尋址4G,而64位操做系統則會操過4G,一般按照計算機不一樣的用途是16G-128G之間。
磁盤
磁盤是馮諾依曼體系結構中存儲器的一種,負責永久性存儲大容量的數據(TB甚至是PB級別),按照不一樣的用途能夠分爲機械硬盤和固態硬盤兩大類。
IO設備
顧名思義就是負責計算機數據的輸入輸出,經常使用的輸入設備有鼠標、鍵盤,經常使用的輸出設備有聲卡、顯卡。
網卡也是IO設備的一種,主要是負責數據在網絡中的傳輸。
在後期程序排查異常時除了考慮程序自己的問題,還要考慮硬件問題,例如網絡不通、磁盤存儲空間以及內存運行空間不足等等。
每一個計算機組件的IO性能也各不相同,核心組件(CPU,內存,磁盤)都遵循容量越大,IO性能越差,以下圖所示,彙總了它們的IO性能,在後期程序優化時,一般須要考慮時間和空間的問題。
開發者在購買筆記本或者臺式機時,一般須要關注CPU,內存、磁盤以及顯卡的相關配置。
和普通用戶不一樣,因爲開發時須要安裝許許多多相關的應用程序和配置各個集成開發環境,所以推薦購買高配置的電腦,若是你想購買MacBookPro,能夠參考以下配置。
組件名稱 | 配置 |
---|---|
CPU | i9 2.3HZ |
內存 | 32G |
磁盤 | 512SSD |
顯卡 | Radeon pro Vega 20 |
若是你想購買運行Windows的筆記本,參考以下配置。
若是是想要成爲軟件開發人員,電腦最低配置不要低於Intel i7 CPU + 內存 16G+ 固態硬盤 256G,出色的硬件可以提升開發效率
計算機軟件就是運行在硬件之上的各類應用程序。軟件的出現改善了人和計算機的交互方式,軟是由開發者編寫的一系列計算機指令和不一樣業務邏輯產生的數據所組成。
軟件按照不一樣的用途分類能夠分爲系統軟件和應用軟件。
系統軟件:系統軟件有Unix,Linux,macOS,Windows,Android,IOS,編譯器、數據庫等等。
應用軟件:應用軟件有淘寶、京東、微信、支付寶等等。
不一樣平臺的軟件有不一樣的交互方式:
服務器端:運維開發人員基於命令行的字符界面實現人機交互。
PC桌面端:開發人員、普通用戶一般是基於圖形化界面實現人機交互。
移動端:用戶一般是經過語音,手勢觸控實現人機交互。
主流的操做系統(Windows,Linux(Ubuntu),MacOS)及大多數應用程序都提供了基於命令行和圖形化界面兩種交互方式,而移動端是採用手勢觸控、語音等進行交互。做爲普通用戶來說,圖形化界面容易上手,並且交互效果更加直觀。
可是做爲一個程序員來說,應該去熟悉各個操做系統的命令行的使用,由於命令行相對圖形化界面而言,絕大多數場景下使用更加高效。並且圖形化界面本質是對命令行的封裝,能用圖形化界面實現的基本均可以採用命令行實現。並且在服務器端(CentOS,RedHat)基本上是不會安裝圖形界面。
Windows系統能夠按下windows鍵而後輸入cmd,以下圖所示
文件目錄相關
命令名稱 | 功能描述 |
---|---|
dir | 列出當前目錄列表 |
cd | 切換目錄(只能在根盤符(例如C盤)內切換) |
md | 建立目錄 |
rd | 刪除空目錄 |
echo | 輸出提示信息 例如echo %PATH%查看環境變量 |
del | 刪除文件 |
type | 顯示文本文件內容 |
cls | 清除屏幕內容 |
exit | 退出終端 |
系統應用相關
命令名稱 | 功能描述 |
---|---|
notepad | 記事本 |
calc | 計算器 |
mspaint | 畫圖 |
explore | 文件資源管理器 |
timedate.cpl | 日期和時間 |
cleanmgr | 磁盤清理 |
desk.cpl | 分辨率設置 |
powercfg.cpl | 電源設置 |
regedit | 註冊表編輯器 |
msconfig | 系統配置 |
mstsc | 遠程鏈接 |
firewall.cpl | 防火牆 |
appwiz.cpl | 添加或修改程序 |
tasklist | 查看進程列表 |
taskkill /f /im process.exe | 關閉指定進程 |
msinfo | 系統信息 |
sticky notes | 便籤 |
ipconfig | 查看ip |
winver | 查看windows版本 |
dxdiag | DirectX診斷工具 |
聊天:應用程序監聽鍵盤輸入的數據,放到內存,而後傳給網卡,經過網絡傳遞給另一個網卡,再從網卡傳到內存,顯示在顯示器上。
聽音樂:應用程序將音樂數據加載到內存以後,而後寫到聲卡上。
看視頻:應用程序將視頻數據加載到內存,而後寫到顯卡上。
讀文檔: 應用程序將磁盤中的文檔數據加載到內存後顯示到屏幕上。
寫文檔: 應用程序將內存中的數據寫入到磁盤上。
以下列表展現了平常使用的開發工具和應用程序
操做系統(Operating System)是實現通用目的的程序,其內核(Kernel)負責和底層硬件交互,應用軟件運行在操做系統之上。所以操做系統起着承上啓下的做用,操做系統提供的功能以下
目前(2019/7/15)主流的操做系統包含運行在桌面端的Windows10,macOS10.14,Ubuntu18.04以及移動設備的Android 9, IOS12和服務器端的CentOS7.6,Ubuntu Server。
ABI(Application Binary Interface)描述了應用程序與OS之間的底層接口,容許編譯好的目標代碼在使用兼容ABI的系統中無需改動就能運行,ABI涉及了程序的各個方面,好比:目標文件格式、數據類型、數據對齊、函數調用約定以及函數如何傳遞參數、如何返回值、系統調用號、如何實現系統調用等。
API(Application Programming Interface)定義了源代碼和庫之間的接口,所以一樣的源代碼能夠在支持這個API的任何系統中編譯。
開發人員在編寫應用程序時,一般都是藉助API接口實現通用目的的功能,而應用程序編譯後,經過ABI接口連接生成可執行的程序格式後運行。
因爲高級編程語言和計算機底層語言是互不相通的,計算機最底層只能識別01010這種二進制的機器指令,所以須要使用工具進行語言之間的轉換。這個就是程序編譯或者解釋的由來。
爲了理解程序編譯和程序解釋,這裏引入兩種語言,分別是高級計算機語言L1,以及低級計算機語言L0。
程序編譯
開發人員使用高級編程語言L1編寫的應用程序經過編譯器生成成計算機底層可以識別的低級語言L0,L0就是計算機實際執行的語言,而編譯器生成的計算機底層識別的二進制機器指令過程就是程序編譯。常見的編譯型語言有C/C++/Objective-C/Go
程序解釋
首先使用L0語言實現另一個程序,也就是解釋器,而後將開發人員使用高級語言L1編寫的應用程序做爲輸入,每一句L1編寫的程序都會在L0中做爲等價的轉換而後執行,解釋的過程就是由L0編寫的解釋器去解釋L1程序。常見的解釋型語言有PHP,Python,JavaScript。
而Java和C#屬於編譯+解釋型語言,以Java爲例子,Java程序在運行以前首先被編譯成Java字節碼,而後在JVM虛擬機上解釋運行。
計算機的層次由上到下能夠分爲以下幾個層次:
應用層
高級語言層
高級語言就是用來開發平常應用的計算機語言,常見的高級語言有C/C++/Java/Python/Go等等。
彙編語言層
彙編語言也是一種編程語言,彙編語言能夠編譯成直接執行的機器語言,而完成編譯的過程就是彙編器,從彙編語言開始使用的語言就是人類比較容易理解的語言。
操做系統層
操做系統主要是用於給應用軟件提供運行平臺,同時管理和調度硬件資源。位於軟件和硬件的適配層。
傳統機器層
編程語言主要是CPU指令集(機器指令),而開發人員使用機器指令編寫的程序能夠交由微程序直接進行解析,指令集存儲在CPU內部,對CPU的運算進行指導和優化應用程序。CPU能夠經過指令集運行程序以及進行相應的邏輯處理。
傳統機器層的編程語言和硬件直接相關,可是因爲不一樣架構的CPU使用的是不一樣的CPU指令集,也就是英特爾的CPU上運行的程序不能在AMD的CPU上運行。
微程序機器層
編程語言主要是微指令集,微指令所組成的微程序直接交由硬件執行。主要由硬件廠商的開發人員編寫。一條機器指令對應一個微程序,一個微程序對應一組微指令,微程序=機器指令。
硬件邏輯層
硬件邏輯層主要有門電路、觸發器等邏輯電路組成,所屬電子工程領域。
傳統機器層、微程序機器層和硬件邏輯層屬於實際機器層,和物理設備相關。
操做系統層、彙編語言層、高級語言層和應用層稱爲虛擬機器。而操做系統層、彙編語言層、高級語言層統稱爲系統軟件,應用層主要是完成平常任務的各類程序,例如Office,微信等等。
任何事物都是從無到有,逐步發展壯大起來的,編程語言也是同樣。
計算機程序設計語言經歷了機器語言到彙編語言和高級程序設計語言三個階段,其特色是使得程序員用編程語言開發、測試、部署應用程序愈來愈方便、高效。可是是以犧牲效率爲代價,可是隨着計算機硬件的發展,絕大多數應用場景的效率損失能夠忽略不計。
機器語言
計算機發展的最先期,程序員編寫程序採用二進制的指令(010010101)來實現的,而每種CPU都有各自不一樣的指令系統(SPARC/Intel X86/ARM),所以在不一樣的機器上使用不一樣的機器語言實現。其特色是性能特別高效,而面向機器編程也就意味着不能移植,須要手動處理底層硬件的差別性,並且二進制的指令難以理解和維護。
彙編語言
隨着時代和計算機技術的發展,彙編語言和編譯器的出現解決了機器語言須要記住很是多的二進制機器指令的難題,可是仍是沒有從根本上解決移植性的問題,只是將機器指令轉換爲易懂的英文單詞,而後由編譯器編譯成機器指令,由於計算機終歸揭底只能識別0001110100110機器指令,並且彙編語言是面向機器的,不一樣機器(SPARC/Intel X86/ARM)的彙編指令是不相同的。
高級程序設計語言
高級程序設計語言的高級之處體如今開發人員在編寫程序時無需關心計算機底層硬件差別而只須要專一於業務模塊實現便可。甚至是能夠實現 一次編譯,處處運行,這裏以Java爲例子:經過實現不一樣平臺的JVM,編譯生成的字節碼文件能夠在任意的JVM上運行。
高級語言一般都須要編譯器或者是解釋器將源碼編譯或者解釋後執行。
高級語言主要分爲面向過程和麪向對象兩種,其中典型的面向過程語言就是C,面向對象的編程語言有Java,C++,Python等等。
若是想知道目前主流的編程語言有哪些,能夠訪問tiobe 首頁獲取編程語言排行榜,以下圖所示,從Tiobe官網獲取最新(2019年6月)的編程語言排行榜的前20名,
根據Tiobe排行榜得知,Java/C/Python 分別排在前三名, 隨後緊跟着C++,VB.NET,C#,JavaScript,PHP等等,每種語言都有不一樣的應用場景和擅長的領域,以下表格所示。
編程語言 | 應用場景 |
---|---|
C | 硬件驅動、操做系統、系統軟件 |
C++ | 系統軟件、網絡通信、科學計算、遊戲 |
C# | Windows應用,Web應用、遊戲 |
Java | 大型互聯網應用(淘寶、天貓),Android,大數據 |
Python | 人工智能、機器學習、自動化運維、數據分析 、圖形處理 |
PHP | 中小型網站開發 |
Objective-C/Swift | macOS,iPhone,iPad應用開發 |
JavaScript | 瀏覽器端、服務端、PC桌面 |
Go | 高併發、區塊鏈 |
在購買電腦時,一般會選擇高配置的內存、硬盤。例如最新款(2019)15寸的macBookPro已經能夠選配32G內存和4T的固態硬盤,而這裏的32G和4T就是經常使用的容量單位。
在物理層面,咱們使用高低電平來記錄信息,一般使用高電平表示1,低電平表示0,所以在計算機底層只能認識0,1兩種狀態。而0,1可以表示的內容太少了,迫切須要更大的容量表示方法,所以誕生了字節(Byte),千字節(KB),兆字節(MB),吉字節(GB),太字節(TB),拍字節(PB),艾字節(EB),它們之間的換算關係以下所示
1EB=1024PB
1PB=1024TB
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024B
1Byte=8bit
位(bit)是最小的計算機容量單位,一般用於門電路。
而字節(Byte)表示網絡傳輸,文件大小,是最基本的容量單位。
兆字節(MB)表示網速的容量單位
吉字節(GB)一般用於表示計算機內存、磁盤的容量單位
太字節(TB),拍字節(PB)一般是用於表示雲硬盤的容量單位
艾字節(EB)一般是用於表示數據中心的容量單位
如今一般筆記本的內存一般是8G,16G,32G,64G等等,而運行在筆記本之上的操做系統廣泛都是64位的,由於32位系統只能使用4G內存,下面是4G的內存換算
4G=2^2 * 2^10 * 2^10 * 2^10 =4*1024*1024*1024=2^32
在購買內存或者買移動硬盤時,一般使用的存儲單位就是GB或者是TB,
可是在買4T的移動硬盤時,實際的可用容量卻只有3T多,由於計算機的存儲單位是以2的10次方(即1024)換算,而硬盤廠商們是以1000爲換算單位。
4T的硬盤換算成位以下所示
4T=4*1024GB*1024MB*1024KB*1024B*8bit
而硬盤廠商的實際容量
4T=1000*1000*1000*1000*8
所以實際的可用容量是
4*1000*1000*1000*1000/1024/1024/1024/1024≈3.63T
而在一些互聯網巨頭(例如國內的BAT,國外的亞馬遜、蘋果、微軟、谷歌,臉書)公司中,可能使用到比TB更大的海量數據,也就是PB或者EB,它們的換算單位以下所示。
1PB=1024TB
1EB=1024PB
網絡經常使用的單位是Mbps
而網絡帶寬提供商(例如長城寬帶)聲稱的百兆帶寬其實是100Mbit/s,可是100M光纖測試的峯值速度只會有12MB/s,它們之間的換算是100Mbit/s=(100/8)MB/s=12.5MB/s。
CPU的速度通常是由CPU的時鐘頻率所體現的,而時鐘頻率的單位是赫茲(HZ),目前主流的CPU時鐘頻率通常都在2GHz以上,而赫茲(Hz)其實就是秒分之一,也就是每秒鐘的週期性變更重複次數的計量。
2GHz=21000^3Hz=2100010001000=20億,也就是說2GHz的CPU每秒能夠變化20億次。
在計算機底層(內存、硬盤)都是使用01001二進制的方式存儲數據,而字符編碼集是描述了計算機數據(例如字符數據)和底層二進制數據的對應關係,例如在ASC||碼中字符a對應的十進制整數是97,字符A對應的十進制整數是65。
ASC||碼
因爲計算機最先是誕生在英美,所以最先的字符集是ASC||,用於表示平常開發中經常使用的大小寫字母以及經常使用的符號,使用7bits表示,包含95個可打印字符課33各個不可打印字符(包括控制字符),95+33=128,即2的7次方。
可擴展的ASC||碼
隨着計算機的發展以及逐漸普及,ASC||碼在不少應用或者國家中的符號沒法表示,例如數學符號"≠,≥,≈,π",所以對ASC||進行擴充,由原來的7bit擴充到8bits,所以能夠表示256個字符。擴展的運算符增長了數學運算符、帶音標的歐洲字符以及其餘經常使用符、表格符等等。
1.6.2.3 Unicode
隨着計算機的進一步發展。愈來愈多的國家開始使用使用計算,而對於歐洲、中亞、拉丁美洲國家的語言多樣性,因爲語言體系不同,不以有限字符組合的語言,而中國、韓國、日本的語言最爲複雜。
Unicode定義了世界通用的符號集,能夠表示世界上全部的國家、全部語言的文字、符號,使用UTF-8,UTF-16,UTF-32實現了編碼。
UFT-8:一種變長的編碼方案,使用 1~6 個字節來存儲;
UFT-32:一種固定長度的編碼方案,無論字符編號大小,始終使用 4 個字節來存儲;
UTF-16:介於 UTF-8 和 UTF-32 之間,使用 2 個或者 4 個字節來存儲,長度既固定又可變。
1980年國內發佈了中文編碼集 GB2312,一共收錄了7445個字符,包含6763個漢字和682個其餘符號,可是GB2312不符合國際標準,後來在1995年推出了GBK編碼,向下兼容GB2312,向上支持國際ISO標準,GBK收錄了21003個漢字,支持所有中日韓漢字。
可是GBK,GB2312都只是本地化的編碼集,若是中國人使用GBK或者GB2312開發了一個網站程序,被國外的用戶訪問了,可是國外的用戶不支持GBK或者GB2312,那麼看到的網站內容就是亂碼。
在國內,Windows系統的默認編碼是GBK編碼,而平常開發中最常使用的是UTF-8字符集。