歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 匯編告訴你為什麼C++可以對函數重載

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

日期:2017/3/1 10:49:55   编辑:Linux編程
想搞搞自己的編程語言,暫時命名為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. int func( int a ) {
  3. return a + 1;
  4. }
  5. int main() {
  6. printf( "%d\n", func( 1 ) );
  7. return 0;
  8. }
非常簡單。哈。使用下面命令把這段代碼翻譯到匯編,不翻譯到二進制,不鏈接。

$ 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. int func( int a ) {
  3. return a + 1;
  4. }
  5. int func( double a ) {
  6. return a + 1;
  7. }
  8. int main() {
  9. printf( "%d\n", func( 1 ) );
  10. printf( "%f\n", func( 1.0 ) );
  11. return 0;
  12. }
Copyright © Linux教程網 All Rights Reserved