歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

匯編告訴你為什麼C++可以對函數重載

想搞搞自己的編程語言,暫時命名為Fun吧,希望最終的結果是這東西能用,大家覺得有趣,就可以了。雖然不一定能成功,但做到多少是多少吧。過程中學到的才是關鍵。

目標是要把語言最終翻譯到native code。因為總不喜歡有虛擬機的語言,雖然平時用著也很爽。喜歡c的高效,但是也喜歡c#、python之類的表達能力強的語言。貌似目前能翻譯到native code的語言,表達能力是一個問題,至少沒有一些高級特性的支持,編碼量就一下子上去了。總是在考慮how to do,而不是what to do。

然後就想,能不能搞個試驗,看能否把這幾個結合起來,於是就有了上述的想法。先從linux開始吧,畢竟資料比較多,以後如果看著還有點用途,有人加入的話,才照顧windows吧。

綜合衡量之後,大體方向是翻譯到匯編語言(at&t語法,可以用as來編譯),對接glibc的部分功能形成core。畢竟用匯編system call封api,linus、gnu那幫大牛早就做了。在這點上花時間不大值得。

只是興趣,不喜歡的請繞路,別亂噴。

既然要用到glibc,必須在匯編層面把需要的東西都摸得一清二楚。

在本系列的文章中,我將比較深入地介紹有關匯編、c\c++、glibc之類的知識。也不能說 很系統全面,在做筆記之余,跟大家分享,希望對大家有點用途。

我將使用gnu tool chain系列的工具。

c\c++編譯器為gcc,連接器為ld,匯編器為as

因為as雖然是用at&t語法,但是支持的cpu以及instruction都比較多,而且還有各種優化選項,比nasm強大點。畢竟是linux裡頭的國家隊。哈哈。

系統為linux(本人有系統潔癖,同時是個更新控,使用archlinux,需要啥才裝啥。賣個廣告吧,速度的確非常快。之前貪新鮮裝了Ubuntu11.10,對那個unity界面十分不爽,比gnome-shell差多了,而且漂亮是漂亮了,但是響應速度跟以前相比,降低的不是一個數量級呀。受不了,就折騰了一個星期東google,西baidu,終於裝上archlinux以及配置好gnome-shell了)

當然,在windows平台上,結果也應該是一樣的。有興趣的可以使用mingw試試。

廢話說多了,開始正題吧。這篇文章結構如下

1、比較c,c++對於類似的函數,翻譯到匯編語言裡頭的區別

2、為什麼這麼多project,特別是庫,要用C,而不用C++【這裡純屬個人體會】

先看下面一段C函數  (文件名是1.c)

  1. #include <stdio.h>   
  2.   
  3. int func( int a ) {  
  4.         return a + 1;  
  5. }  
  6.   
  7. int main() {  
  8.         printf( "%d\n", func( 1 ) );  
  9.         return 0;  
  10. }  
非常簡單。哈。使用下面命令把這段代碼翻譯到匯編,不翻譯到二進制,不鏈接。

$ cc -S 1.c

$ ls
1.c  1.s

其中1.s的內容如下

  1.     .file   "1.c"  
  2.     .text  
  3.     .globl  func  
  4.     .type   func, @function  
  5. func:  
  6. .LFB0:  
  7.     .cfi_startproc  
  8.     pushl   %ebp  
  9.     .cfi_def_cfa_offset 8  
  10.     .cfi_offset 5, -8  
  11.     movl    %esp, %ebp  
  12.     .cfi_def_cfa_register 5  
  13.     movl    8(%ebp), %eax  
  14.     addl    $1, %eax  
  15.     popl    %ebp  
  16.     .cfi_def_cfa 4, 4  
  17.     .cfi_restore 5  
  18.     ret  
  19.     .cfi_endproc  
  20. .LFE0:  
  21.     .size   func, .-func  
  22.     .section    .rodata  
  23. .LC0:  
  24.     .string "%d\n"  
  25.     .text  
  26.     .globl  main  
  27.     .type   main, @function  
  28. main:  
  29. .LFB1:  
  30.     .cfi_startproc  
  31.     pushl   %ebp  
  32.     .cfi_def_cfa_offset 8  
  33.     .cfi_offset 5, -8  
  34.     movl    %esp, %ebp  
  35.     .cfi_def_cfa_register 5  
  36.     andl    $-16, %esp  
  37.     subl    $16, %esp  
  38.     movl    $1, (%esp)  
  39.     call    func  
  40.     movl    $.LC0, %edx  
  41.     movl    %eax, 4(%esp)  
  42.     movl    %edx, (%esp)  
  43.     call    printf  
  44.     movl    $0, %eax  
  45.     leave  
  46.     .cfi_restore 5  
  47.     .cfi_def_cfa 4, 4  
  48.     ret  
  49.     .cfi_endproc  
  50. .LFE1:  
  51.     .size   main, .-main  
  52.     .ident  "GCC: (GNU) 4.6.2"  
  53.     .section    .note.GNU-stack,"",@progbits  
而對於下面一段C++代碼(p1.cpp)
  1. #include <stdio.h>   
  2.   
  3. int func( int a ) {  
  4.     return a + 1;  
  5. }  
  6.   
  7. int func( double a ) {  
  8.     return a + 1;  
  9. }  
  10.   
  11. int main() {  
  12.     printf( "%d\n", func( 1 ) );  
  13.     printf( "%f\n", func( 1.0 ) );  
  14.     return 0;  
  15. }  
Copyright © Linux教程網 All Rights Reserved