想搞搞自己的編程語言,暫時命名為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)
- #include <stdio.h>
-
- int func( int a ) {
- return a + 1;
- }
-
- int main() {
- printf( "%d\n", func( 1 ) );
- return 0;
- }
非常簡單。哈。使用下面命令把這段代碼翻譯到匯編,不翻譯到二進制,不鏈接。
$ cc -S 1.c
$ ls
1.c 1.s
其中1.s的內容如下
- .file "1.c"
- .text
- .globl func
- .type func, @function
- func:
- .LFB0:
- .cfi_startproc
- pushl %ebp
- .cfi_def_cfa_offset 8
- .cfi_offset 5, -8
- movl %esp, %ebp
- .cfi_def_cfa_register 5
- movl 8(%ebp), %eax
- addl $1, %eax
- popl %ebp
- .cfi_def_cfa 4, 4
- .cfi_restore 5
- ret
- .cfi_endproc
- .LFE0:
- .size func, .-func
- .section .rodata
- .LC0:
- .string "%d\n"
- .text
- .globl main
- .type main, @function
- main:
- .LFB1:
- .cfi_startproc
- pushl %ebp
- .cfi_def_cfa_offset 8
- .cfi_offset 5, -8
- movl %esp, %ebp
- .cfi_def_cfa_register 5
- andl $-16, %esp
- subl $16, %esp
- movl $1, (%esp)
- call func
- movl $.LC0, %edx
- movl %eax, 4(%esp)
- movl %edx, (%esp)
- call printf
- movl $0, %eax
- leave
- .cfi_restore 5
- .cfi_def_cfa 4, 4
- ret
- .cfi_endproc
- .LFE1:
- .size main, .-main
- .ident "GCC: (GNU) 4.6.2"
- .section .note.GNU-stack,"",@progbits
而對於下面一段C++代碼(p1.cpp)
- #include <stdio.h>
-
- int func( int a ) {
- return a + 1;
- }
-
- int func( double a ) {
- return a + 1;
- }
-
- int main() {
- printf( "%d\n", func( 1 ) );
- printf( "%f\n", func( 1.0 ) );
- return 0;
- }