C語言概述

                  C語言概述node

                                           做者:尹正傑mysql

版權聲明:原創做品,謝絕轉載!不然將追究法律責任。linux

 

 

一.什麼是C語言程序員

  一提到語言這個詞語,天然會想到的是像英語,漢語等這樣的天然語言,由於它是人和人交換信息不可缺乏的工具。
    
  而今天計算機廣泛了咱們生活的每個角落,除了人和人的相互交流以外,咱們必須和計算機交流。

  用什麼的說明樣的方式和計算機最直接交流呢?人們天然想到的是最古老也是最方便的方式,即語言,而C語言就是人和計算機交流的一種語言。

  語言用來交流溝通。有一方說,有另外一方聽,必須有兩房參與,這是語言最重要的功能:
        (1)說的一方傳遞消息,聽的一方接收信息;
        (2)說的一方下達指令,聽的一方遵照命令作事情;

  語言是人和人交流,C語言是人和機器交流。只是,人能夠不聽另一我的,可是,計算機是無條件服從。、

  語言有獨特的語法規則和定義,雙方必須遵照這些規則和定義才能實現真正的交流。

 

二.計算機介紹面試

1>.計算機結構組成sql

2>. 計算機系統組成數據庫

 

3>.程序和指令編程

  (1)指令是對計算機進行程序控制的最小單位。
  (2)全部指令的集合稱爲計算機的指令系統。
  (3)程序是爲完成一項特定任務而用某種語言編寫的一組指令序列。

 

 

三.語言的發展歷程緩存

1>.機器語言服務器

  計算機的大佬或者說心臟就是CPU,它控制整個計算機的運做。每種CPU,都有本身的指令系統。這個指令系統,就是CPU的機器語言。

  機器語言是一組由0和1系列組成的指令碼,這些指令碼,是CPU製做廠商規定出來的,而後發佈出來,請程序員遵照。

  要讓計算機幹活,就得用機器語言(二進制數)去命名它。這樣的命令,不是一條兩條,而是上百條。並且不一樣型號的計算機其機器語言是不相互通的,按照一種計算機的機器指令編程的程序,不能再另外一種計算機上執行。

2>.彙編語言和編譯器

    機器語言編程時不是很使人煩惱呢,終於出現了彙編語言,就是一些標識符取代0和1.一門人類比較輕鬆認識的編程語言。

    只是這門語言計算機並不認識,因此人類還不能用這門語言命令計算機作事情。這正如如何才能讓中國人說的話美國人明白呢?那天然就是翻譯啦!

    因此,有一類專門的程序,既認識機器語言,有認識彙編語言,也就是翻譯器,將標識符轉換成0與1,知道怎麼把彙編語言翻譯成機器語言。

3>.高級語言

  彙編語言和機器語言都是面向機器的,機器不一樣,語言也不一樣。既然有辦法讓彙編語言翻譯成機器語言,難道就不能讓其餘更人性化的語言翻譯成機器語言嗎?

  1954年,Fortran語言出現了,其後相機出現了其餘相似語言。這批語言,使程序員拜託了計算機硬件的限制,把主要精力放在程序設計上,不在關注底層的計算機承硬件。這類語言,稱爲高級語言。

  一樣的,高級語言要被計算機執行,也須要一個翻譯程序將其翻譯成機器語言,這就是編譯程序,簡稱編譯器。

  這類高級語言解決問題的方法是分析出解決問題所須要的步驟,把程序看做是數據被加工的過程。基於這類方法的程序設計語言稱爲面向過程的語言。C語言就是這種面向過程的程序設計語言。

4>.語言的層次

5>. 語言進化史

 

四.爲何要學習C語言

1>.C語言特色

優勢:
  (1)代碼量小;    
  (2)執行速度快;  
  (3)功能強大;
  (4)編程自由

缺點:
  (1)寫代碼實現週期長;
  (2)可移植性較差;
  (3)對於自由,經驗不足易出錯;
  (4)對平臺庫依賴較多;

2>.學習C語言理由

1)全部大學理工科必修課程;
    (2)名企,外企,高薪程序員面試必考;
    (3)寫外掛,作黑客必須掌握的語言;
    (4)學習數據結構,C++的基石;
    (5)絕對重要的基石語言,Unix,Linux,Java,C++,C#底層實現都考C;

    咱們能夠比較狂妄的說,學會C/C++,走遍全球都不怕,哈哈哈~

3>.C語言領用領域

    C語言的應用極爲普遍,從網站後臺,到底層操做系統,從多媒體應用到大型網絡遊戲,都可以使用C語言來開發:
        (1)C語言能夠寫網站後臺程序;
        (2)C與能夠專門針對某個主題寫出功能強大的程序庫;
        (3)C語言能夠寫出大型遊戲引擎;
        (4)C語言能夠寫出另外一個語言來;
        (5)C語言能夠寫操做系統和驅動程序,而且只能用C語言編寫;
        (6)任何設備只要配置微處理器,都支持C語言。從微波爐到手機,都是C語言技術來推進的。

  接下來咱們來講一下互聯網比較火的行業,各個語言的應用範圍:
    (1)嵌入式
        C打包天下,極少許彙編。
    (2)Web開發
        絕大部分Javascript,PHP和商量ASP,JSP,最近Python也加入了這一領域。
    (3)高性能服務
        Apache,Nginx,Memcached,Redis等等高性能Web服務器和數據庫都是純C開發。
    (4)分佈式應用
        Java,Python的天下。
    (5)遊戲服務器
        C,C++和Lua腳本。
    (6)並行計算:
        Java,Golang,Erlang,C對接Go語言很是方便。  
    (7)遊戲引擎
        C++和腳本。
    (8)遊戲邏輯
        腳本語言。
    (9)移動開發
        Java,Obj-C/Swift。
    (10)桌面開發
        C++,Qt+Script,C#都能作出漂亮的跨平臺界面。
    (11)操做系統
        C的天下
    (12)虛擬技術
        QEMU,KVM,Xen都是純C開發。
    (13)數據庫
        C的天下
    (14)編譯器
        C,C++並存
    (15)大數據
        Java的天下,固然用Python也能夠調用大數據組件的一些API,可是不少大數據開源軟件都是用Java實現的,固然C++在大數據領域中也有貢獻,好比由Cloudera公司開源的交互式計算引擎Impala就是使用C++編寫的。
    (16)雲存儲
        Java,Python包打天下,近年Go語言也參與了好多項目。

4>.C語言的簡介

  C語言僅有32個關鍵字,9種控制語句,34中運算符,卻能完成無數的功能。

  (1)32個關鍵字(由系統定義,不能重做其餘定義)
      auto  break  case  char  const  continue  default  do  double  else  short  signed  sizeof  static  struct  volatile
      enum  extern  float  for  goto  if  int  long  register  return  switch  typedef  unsigned  union  void  while

  (2)9種控制語句
      if()~else~
      for()~
      while()~
      do~while()
      continue
      break
      switch
      goto
  
  (3)34種運算符
      算術運算符  :  +  -  *  /  %  ++  --
      關係運算符  :  <  <=  ==  >  >=  !=
      邏輯運算符  :  !  &&  ||
      位運算符   :  <<  >>  ~  |  ^  &
      賦值運算符  :  =及其擴展
      條件運算符  :  ?:
      逗號運算符  :  ,
      指針運算符  :  *  &
      求字節數   :  sizeof
      強制類型轉換 :  (類型)
      份量運算符  :  ->
      下標運算符  :  []
      其它     :  ()

5>.學習C語言的技巧

  學習編程,先學會面向過程,才能學好面向對象,其它語言的語法有很大一部分都是繼承C語言。

  理解了指針,地址,更深刻了解語言內部原理。

  C語言的英文關鍵詞只有32個,9種控制語句,34種運算符,說實話,C語言只用到初中乃至小學的數學水平。(因此,咱們不要說英語,數學都學很差能學好c麼?有志者事竟成!)。

  學好C對於其餘計算機課程依賴不大。

  光看書是不可能學會的,多學多練就能學會。

 

五.C語言入門程序helloworld

1>.編寫C語言代碼

[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat hello.c
/*
    當前代碼塊爲塊註釋

@author :yinzhengjie
blog:http://www.cnblogs.com/yinzhengjie
EMAIL:y1053419035@qq.com
*/

#include <stdio.h>   //包含頭文件,std是標準庫,io分別對應爲input和output,導入系統庫用"<>"表示,".h"是自定義頭文件。總結來講:導入標準輸入輸出庫,當前行爲註釋行,用"//"表示行註釋

//main是定義主函數,一個程序有且只能有一個主函數,int表明函數的返回值類型,int爲整型,注意void表示空類型,即主函數的參數爲空。若是參數是void能夠省略不寫!
int main(void)
{
    //這是第一個C語言代碼
    printf("Hello World\n");
    //這是行數的返回值,咱們返回必須和上面定義的int類型要一致!咱們這裏返回的是0.若是在主程序中遇到return關鍵字表明程序結束
    return 0;
}
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat hello.c          #有註釋的版本,對每行參數都有說明
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat hello.c          #C語言的源代碼文件是一個普通的文本文件,但擴展名必須是「.c」
#include <stdio.h>

int main()
{
    //這是第一個C語言代碼
    printf("Hello World\n");
    return 0;
}
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat hello.c          #C語言的源代碼文件是一個普通的文本文件,但擴展名必須是「.c」
[root@node101.yinzhengjie.org.cn ~]# yum -y install gcc
Loaded plugins: fastestmirror
Determining fastest mirrors
epel/x86_64/metalink                                                                                                                                                                                       | 6.5 kB  00:00:00     
 * base: mirrors.aliyun.com
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
base                                                                                                                                                                                                       | 3.6 kB  00:00:00     
epel                                                                                                                                                                                                       | 4.7 kB  00:00:00     
extras                                                                                                                                                                                                     | 3.4 kB  00:00:00     
mysql-connectors-community                                                                                                                                                                                 | 2.5 kB  00:00:00     
mysql-tools-community                                                                                                                                                                                      | 2.5 kB  00:00:00     
mysql56-community                                                                                                                                                                                          | 2.5 kB  00:00:00     
updates                                                                                                                                                                                                    | 3.4 kB  00:00:00     
zabbix                                                                                                                                                                                                     | 2.9 kB  00:00:00     
zabbix-non-supported                                                                                                                                                                                       |  951 B  00:00:00     
(1/3): epel/x86_64/updateinfo                                                                                                                                                                              | 1.0 MB  00:00:00     
(2/3): updates/7/x86_64/primary_db                                                                                                                                                                         | 5.0 MB  00:00:01     
(3/3): epel/x86_64/primary_db                                                                                                                                                                              | 6.7 MB  00:00:02     
Resolving Dependencies
--> Running transaction check
---> Package gcc.x86_64 0:4.8.5-36.el7_6.2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================================================================================================================================================
 Package                                          Arch                                                Version                                                          Repository                                            Size
==================================================================================================================================================================================================================================
Installing:
 gcc                                              x86_64                                              4.8.5-36.el7_6.2                                                 updates                                               16 M

Transaction Summary
==================================================================================================================================================================================================================================
Install  1 Package

Total size: 16 M
Installed size: 37 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : gcc-4.8.5-36.el7_6.2.x86_64                                                                                                                                                                                    1/1 
  Verifying  : gcc-4.8.5-36.el7_6.2.x86_64                                                                                                                                                                                    1/1 

Installed:
  gcc.x86_64 0:4.8.5-36.el7_6.2                                                                                                                                                                                                   

Complete!
[root@node101.yinzhengjie.org.cn ~]# 
[root@node101.yinzhengjie.org.cn ~]# yum -y install gcc                  #安裝GCC編譯器
[root@node101.yinzhengjie.org.cn ~]# rpm -qa | grep gcc                   #查看gcc的安裝包
gcc-4.8.5-36.el7_6.2.x86_64
libgcc-4.8.5-36.el7_6.2.x86_64
[root@node101.yinzhengjie.org.cn ~]# 
[root@node101.yinzhengjie.org.cn ~]# rpm -qa | grep gcc                   #查看gcc的安裝包
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 4
-rw-r--r-- 1 root root 104 May 22 06:13 hello.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc -o hello hello.c     #編譯後會生成一個名爲hello的可執行文件。
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 16
-rwxr-xr-x 1 root root 8440 May 22 06:13 hello
-rw-r--r-- 1 root root 104 May 22 06:13 hello.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ./hello             #執行編譯後的文件
Hello World
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]#

2>.經過gcc編譯C代碼

  (1)gcc編譯器介紹
      編譯器(如vi,記事本)是指我用它來寫程序(編輯代碼)的,而咱們寫的代碼語句,電腦是不懂的,咱們須要把它轉成電腦能懂的語句,編譯器就是這樣的轉換工具。就是說,咱們用編輯器寫程序,由編譯器編譯後才能夠運行!
      編譯器是將易於編寫,閱讀和維護的高級計算機語言翻譯成計算機能解讀,運行的低級機器語言的程序。
      gcc(GNU Compiler Collation,GNU編譯器套件),是由GNU開發的編程語言編輯器。gcc本來做爲GNU操做系統的官方編輯器,先已被大多數類Unix操做系統(如Linux,BSD,Mac OS X等)採納爲標準的編譯器,gcc一樣適用於微軟的Windows。
      gcc最初用於編譯C語言,隨着項目的發展gcc已經成爲可以編譯C,C++,Java,Ada,fortran,Obejcet C,Object C++,Go語言的編譯器你們族。
      編譯命令格式以下:
          gcc [-option1] ... <filename>
          g++ [-option1] ... <filename>
          1)命令,選項和源文件之間使用空格分隔
          2)一行命令中能夠有零個,一個或者多個選項
          3)文件名能夠包含文件的絕對路徑,也可使用相對路徑
          4)若是命令中不包含輸出可執行文件的文件名,可執行文件的文件名會自動生成一個默認名,Linux平臺爲a.out,Window平臺爲a.exe
      gcc,g++編譯經常使用選項說明:
          1)-o filename
              指定生成的輸出文件名的filename
          2)-E 
              只進行預處理
          3)-S(大寫)
              只進行預處理和編譯
          4)-c(小寫)
              只進行預處理,編譯和彙編
  
  (2)Linux平臺下編譯代碼
      [root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
      total 4
      -rw-r--r-- 1 root root 848 May 22 06:30 hello.c
      [root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
      [root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc hello.c 
      [root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
      [root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
      total 16
       -rwxr-xr-x 1 root root 8440 May 22 06:50 a.out
      -rw-r--r-- 1 root root 848 May 22 06:30 hello.c
      [root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
      [root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]#
      須要注意的是,gcc warning的意思是警告,是有問題,但不影響編譯;而error是錯誤,若是遇到error,那麼就不用編譯了,先把錯誤解決掉在進行編譯。

  (3)Window平臺下gcc環境配置
      Windows命令行界面下,默認是沒有gcc編譯器,咱們須要配置一下環境,咱們能夠安裝Qt,由於Qt是一個集成開發環境,內部集成gcc編譯器,配置一下環境變量便可使用gcc。或者你也能夠安裝Visual Studio軟件,他也集成了gcc開發環境。

 

六.系統調用函數system

1>.system函數的使用

#include <stdlib.h>
int system(const char *command)

功能:
    在已經運行的程序執行另一個外部程序(系統自帶的外部程序或者你自定義的程序)

參數:
  外部可執行程序名字 返回值:   若成功,不一樣返回值不同
  若失敗,一般是-1
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 8
-rw-r--r-- 1 root root 848 May 22 06:30 hello.c
-rw-r--r-- 1 root root 158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat system_demo.c 
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    int value = system("cal");
    printf("調用日曆工具cal的返回值爲:%d\n",value);
    return 0;
}
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc -o system_demo system_demo.c 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 20
-rw-r--r-- 1 root root  848 May 22 06:30 hello.c
-rwxr-xr-x 1 root root 8504 May 22 07:19 system_demo
-rw-r--r-- 1 root root  158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ./system_demo 
      May 2019      
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

調用日曆工具cal的返回值爲:0
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat system_demo.c          #案例實操(戳我)

2>.system返回值不一樣系統

    C語言全部的庫函數調用,只能保證語法是一致的,但不能保證結果是一致的,一樣的庫函數在不一樣的操做系統下執行結果多是同樣的,也多是不同的。

    在學習Linux發展史中,咱們得知Linux發展離不開POSIX標準,只要符合這個標準的函數,在不一樣的系統下執行的結果就能夠一直。

    Unix和Linux不少函數庫都是支持POSIX的,但Window支持的比較差。

    若是將Unix代碼一直到Linux通常代價很小,若是把Windows代碼移植到Unix或者Linux就比較麻煩。

 

七.C語言編譯過程

1>.C語言編譯步驟

    C代碼編譯成可執行程序通過4步:
        (1)預處理
        宏定義展開,頭文件展開(你會發現展開後會把頭文件內容加載進來,文件內容會比你原始代碼內容要多),條件編譯等,同時將代碼中註釋刪除,這裏並不會檢查語法。
        (2)編譯
             檢查語法,將預處理後文件編譯生成彙編文件。
        (3)彙編
        將彙編文件生成目標文件(二進制文件)。
        (4)連接
              C語言寫的程序是須要依賴各類庫的,因此編譯以後還須要把庫連接到最終的可執行程序中去。

2>.gcc編譯過程

[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 8
-rw-r--r-- 1 root root 848 May 22 06:30 hello.c
-rw-r--r-- 1 root root 158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat hello.c 
/*
    當前代碼塊爲塊註釋

@author :yinzhengjie
blog:http://www.cnblogs.com/yinzhengjie
EMAIL:y1053419035@qq.com
*/

#include <stdio.h>   //包含頭文件,std是標準庫,io分別對應爲input和output,導入系統庫用"<>"表示,".h"是自定義頭文件。總結來講:導入標準輸入輸出庫,當前行爲註釋行,用"//"表示行註釋

//main是定義主函數,一個程序有且只能有一個主函數,int表明函數的返回值類型,int爲整型,注意void表示空類型,即主函數的參數爲空。若是參數是void能夠省略不寫!
int main(void)
{
    //這是第一個C語言代碼
    printf("Hello World\n");
    //這是行數的返回值,咱們返回必須和上面定義的int類型要一致!咱們這裏返回的是0.若是在主程序中遇到return關鍵字表明程序結束
    return 0;
}
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat hello.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 8
-rw-r--r-- 1 root root 848 May 22 06:30 hello.c
-rw-r--r-- 1 root root 158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc -E hello.c -o hello.i
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll -h
total 28K
-rw-r--r-- 1 root root 848 May 22 06:30 hello.c
-rw-r--r-- 1 root root 17K May 22 15:35 hello.i
-rw-r--r-- 1 root root 158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# wc -l hello.i 
847 hello.i
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# wc -l hello.c
18 hello.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc -E hello.c -o hello.i          #預處理操做
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll -h
total 28K
-rw-r--r-- 1 root root 848 May 22 06:30 hello.c
-rw-r--r-- 1 root root 17K May 22 15:35 hello.i
-rw-r--r-- 1 root root 158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc -S hello.i -o hello.s
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll -h
total 32K
-rw-r--r-- 1 root root 848 May 22 06:30 hello.c
-rw-r--r-- 1 root root 17K May 22 15:35 hello.i
-rw-r--r-- 1 root root 448 May 22 15:42 hello.s
-rw-r--r-- 1 root root 158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# cat hello.s 
    .file    "hello.c"
    .section    .rodata
.LC0:
    .string    "Hello World"
    .text
    .globl    main
    .type    main, @function
main:
.LFB0:
    .cfi_startproc
    pushq    %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $.LC0, %edi
    call    puts
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size    main, .-main
    .ident    "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-36)"
    .section    .note.GNU-stack,"",@progbits
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc -S hello.i -o hello.s          #編譯操做
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll -h
total 32K
-rw-r--r-- 1 root root 848 May 22 06:30 hello.c
-rw-r--r-- 1 root root 17K May 22 15:35 hello.i
-rw-r--r-- 1 root root 448 May 22 15:42 hello.s
-rw-r--r-- 1 root root 158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc -c hello.s -o hello.o
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll -h
total 36K
-rw-r--r-- 1 root root  848 May 22 06:30 hello.c
-rw-r--r-- 1 root root  17K May 22 15:35 hello.i
-rw-r--r-- 1 root root 1.5K May 22 15:46 hello.o
-rw-r--r-- 1 root root  448 May 22 15:42 hello.s
-rw-r--r-- 1 root root  158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# wc -l hello.c 
18 hello.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# wc -l hello.i
847 hello.i
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# wc -l hello.s
26 hello.s
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# wc -l hello.o
5 hello.o
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc -c hello.s -o hello.o          #彙編操做,生成二進制文件
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 36
-rw-r--r-- 1 root root   848 May 22 06:30 hello.c
-rw-r--r-- 1 root root 16895 May 22 15:35 hello.i
-rw-r--r-- 1 root root  1496 May 22 15:46 hello.o
-rw-r--r-- 1 root root   448 May 22 15:42 hello.s
-rw-r--r-- 1 root root   158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc hello.o -o hello.exe
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 48
-rw-r--r-- 1 root root   848 May 22 06:30 hello.c
-rwxr-xr-x 1 root root  8440 May 22 15:49 hello.exe
-rw-r--r-- 1 root root 16895 May 22 15:35 hello.i
-rw-r--r-- 1 root root  1496 May 22 15:46 hello.o
-rw-r--r-- 1 root root   448 May 22 15:42 hello.s
-rw-r--r-- 1 root root   158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# gcc hello.o -o hello.exe           #連接操做
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ./hello.exe 
Hello World
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 48
-rw-r--r-- 1 root root   848 May 22 06:30 hello.c
-rwxr-xr-x 1 root root  8440 May 22 15:49 hello.exe
-rw-r--r-- 1 root root 16895 May 22 15:35 hello.i
-rw-r--r-- 1 root root  1496 May 22 15:46 hello.o
-rw-r--r-- 1 root root   448 May 22 15:42 hello.s
-rw-r--r-- 1 root root   158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# file hello.c 
hello.c: C source, UTF-8 Unicode text
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# file hello.i
hello.i: C source, ASCII text
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# file hello.s
hello.s: ASCII text
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# file hello.o
hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# file hello.exe 
hello.exe: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=48e4c11901d54d4bf1b6e3826baf18215e4255e5, not stripped
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ./hello.exe                   #執行連接後的程序

3>.查找程序所依賴的動態庫(以Linux平臺的ldd命令爲例,Windows平臺可使用Dependency Walker工具)

[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ll
total 48
-rw-r--r-- 1 root root   848 May 22 06:30 hello.c
-rwxr-xr-x 1 root root  8440 May 22 15:49 hello.exe
-rw-r--r-- 1 root root 16895 May 22 15:35 hello.i
-rw-r--r-- 1 root root  1496 May 22 15:46 hello.o
-rw-r--r-- 1 root root   448 May 22 15:42 hello.s
-rw-r--r-- 1 root root   158 May 22 07:19 system_demo.c
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# ldd hello.exe       #使用ldd工具查看我們編譯後的文件所依賴的動態庫,動態庫在Linux平臺通常爲"*.so"
    linux-vdso.so.1 =>  (0x00007ffefa7ab000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f05d73c4000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f05d7791000)
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 
[root@node101.yinzhengjie.org.cn /yinzhengjie/code/day001]# 

 

八.CPU內部結構與寄存器(瞭解)

1>.64位和32位系統區別

1)寄存器是CPU內部最基本的存儲單元;

    (2)CPU對外是經過總線(地址,控制,數據)來和外部設備交互的,總線的寬度是8位,同時CPU的寄存器也是8位,那麼這個CPU就叫8位CPU;

    (3)若是總線是32位,寄存器也是32位的,那麼這個CPU就叫32位CPU;

    (4)有一種CPU內部的寄存器是32位的,但總線是16位,準32位CPU
    
    (5全部的64位CPU兼容32位的指令,32位要兼容16位的指令,因此在64位的CPU上是能夠識別32位的指令; 6)在64位的CPU架構上運行了64位的軟件操做系統,那麼這個系統是64位;

    (7)在64位的CPU架構上,運行了32位的軟件操做系統,那麼這個系統就是32位;
    
    (864位的軟件不能運行在32爲的CPU之上,換句話說,32位的CPU是沒有辦法安裝64位的操做系統的。

2>.寄存器名字(瞭解便可)

 

3>.寄存器,緩存,內存三種關係

  按與CPU遠近來分,離得最近的是寄存器,而後緩存(CPU緩存),最後內存。

  CPU計算時,先預先把要用的數據從硬盤讀取到內存,而後再把即將要用的數據讀到寄存器。因而CPU<--->寄存器<--->內存,這就是它們之間的信息交換。  那爲何有緩存呢?由於若是總是操做內存的同一地址的數據,就會影響速度,因而就在寄存器和內存之間設置一個緩存。  由於從緩存提取的速度遠高於內存。固然緩存的價格確定遠遠高於內存,否則的話,機器裏就沒有內存的存在。  由此看出,從遠近來看:CPU <---> 寄存器 <---> 緩存 <---> 內存。
相關文章
相關標籤/搜索