今天想要來介紹一本對軟體工程師來說很棒的書,叫做軟技能:代碼之外的生存指南 (Soft Skills : The software developer’s life manual) 。最一開始會關注到這本書是因為有人介紹說這本書堪稱是軟體界的「原則」。由於對「原則」有還不錯的評價,所以就有了閱讀的興趣。這本書號稱是給軟體工程師看的書,但是裡面卻沒有任何一行程式碼,作者希望告訴讀者的是要成好的軟體工程師,不能只專注在專業上,要把重點放在「整個人」上。書中分享了如何找工作、自我營銷、自我學習等等,甚至還有理財、健身和愛情。同樣身為軟體工程師,我認為可以從前人身上觀察和學習他的經驗應該是蠻有幫助的,因此下面會分享幾個從書中學到比較重要的概念。
int __builtin_types_compatible_p(TYPE1, TYPE2):檢查TYPE1和TYPE2是否是相同type,相同回傳1,否則為0。注意這邊const和非const會視為同種類型。
TYPE __builtin_choose_expr(CONST_EXP, EXP1, EXP2):同CONST_EXP?EXP1:EXP2的概念,但是這個寫法會在編譯時就決定結果。常用方式是在寫macro時可以搭配__builtin_types_compatible_p當作CONST_EXP,選擇要呼叫什麼函式。
int __builtin_constant_p(EXP):判斷EXP是否是常數。
long __builtin_expect(long EXP, long C):預先知道EXP的值很大機率會是C,藉此做最佳化,kernel的likely和unlikely也是靠這個實現的。
void __builtin_prefetch(const void *ADDR, int RW, int LOCALITY):把ADDR預先載入快取使用。
intmain() { printf("This is main function\n"); return0; }
1 2 3 4 5
$ make test $ ./test before main This is main function after main
結果的確如我們所料。另外這邊有點要注意,跟前面不一樣的是,__attribute__((constructor))和__attribute__((destructor))必須放在函式前面,不然會有error: attributes should be specified before the declarator in a function definition的錯誤。
繼續以 rtenv 為例,當指定了_sidata的 symbol 位置後,AT 就是要求載入到 FLASH 時要在.text的後面,換句話說.data的 LMA 要在.text後
1 2 3 4 5 6 7 8
/* Initialized data will initially be loaded in FLASH at the end of the .text section. */ .data : AT (_sidata) { _sdata = .; *(.data) /* Initialized data */ *(.data*) _edata = .; } >RAM
$ gcc -c -fPIC hello.c world.c $ gcc -shared -o libmylib.so hello.o world.o world.o: In function `test': world.c:(.text+0x0): multiple definition of `test' hello.o:hello.c:(.text+0x0): first defined here collect2: error: ld returned 1 exit status
$ docker diff e2cf9ea13bb4 C /run A /run/nginx.pid C /var C /var/cache/nginx A /var/cache/nginx/client_temp A /var/cache/nginx/fastcgi_temp A /var/cache/nginx/proxy_temp A /var/cache/nginx/scgi_temp A /var/cache/nginx/uwsgi_temp A /var/www
commit我們所做的改變變成新的image
1 2 3 4 5 6
$ docker commit -m "New nginx" -a "evshary" e2cf new_nginx sha256:ed66214b3e3a510a7cc47e341f64f6596560164d6f06a22f93dca8d05ecac081 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE new_nginx latest ed66214b3e3a 17 seconds ago 109MB nginx latest ae513a47849c 11 days ago 109MB
可以從history看我們所做改變歷史
1 2 3 4 5
$ docker history new_nginx IMAGE CREATED CREATED BY SIZE COMMENT ed66214b3e3a About a minute ago nginx -g daemon off; 2B New nginx ae513a47849c 11 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 11 days ago /bin/sh -c #(nop) STOPSIGNAL [SIGTERM] 0B
$ nm --size-sort -r -S test 00008464 00000064 T __libc_csu_init 00008444 00000020 T main 000084c8 00000004 T __libc_csu_fini 000084d4 00000004 R _IO_stdin_used 00011028 00000001 b completed.9228