寫給換編程語言的你

在大學裏,你可能學的是c,c++,java....到社會上工做後,你有可能換成其它語言了,這沒辦法,畢竟決定權不在咱們手上,飯碗規定要用go,要用rust你都會立刻去學習,就算飯碗決定你用asp你也得上,畢竟人在江湖人不禁已,雖然有時候咱們會聽到某某語言天下第一,某某語言如何如何,有時候甚至跟別人吵一架,可是別人的飯碗有可能就是用這個語言的。在咱們每一個人的心中均可能以爲本身的東西纔是最好的,別人的東西不行。php

不過你在用什麼語言,什麼工具,反正只要能餬口,保住飯碗就是好語言,工做數年後,咱們用的語言可能不少,可是咱們的項目大部分都是運行在最流行的操做系統之上Linux,Linux系統源碼,工做多年的朋友也知道整個系統90%以上都是c源碼寫成,咱們的程序都要在上面運行,雖然咱們用着各類編程語言,php,python,java,c++,c,rust,go,nodejs,lua,ruby...等,雖然咱們天天都在爲哪一個語言最好,哪一個框架最好,哪一個庫最好而爭吵沒有達成你們心中的想法,可是你們是否想過,咱們的程序寫好的源碼最終是要在用c編寫而成的Linux系統上運行!linux 提供的系統api接口都是同樣的,特別是核心接口,咱們的程序最終都要用系統提供的系統調用函數API。只不過上層語言作了各類封裝造成了各類寫法開發布而成的應用,包括咱們的各類編譯器,彙編器,各類開發庫。
圖片.png java

大學的朋友多少也擼過c,也知道擼好了須要編譯,若是大學裏的是直接在win上開始學的話,可能你四年都沒有裝過編譯器,若是你在linux上或是其它嵌入式芯片,那麼編譯器種類特別多,有PC的,有ARM的,avr單片機的等,這些編譯器最終會把咱們寫的各類源碼會解釋成彙編,這個時候它只要鏈接一下一些重要的庫,特別是系統重要的庫函數就能夠啓動了。
c,c++,java,go,嵌入式c等都須要編譯器處理輸出目標文件,而這個目標文件含有大量的數據,而且會分門別類的存儲好。在linux系統中如go
圖片.png
你們也曉得,當我輸入./go run xx.go文件後它就能夠運行了
一樣看java
圖片.pngnode

一樣看python
圖片.png
再看php
圖片.pngpython

我相信你們應該看到共同點了,雖然你們用的編程語言不一樣,可是沒有關係,咱們仍是有共同的話題,若是你感興趣且不在意什麼語言的話 linux

你們能夠看出ios

  • 它們是ELF文件
  • 它們的標識是LEF 64-bit LSB
  • 它們都要依賴/lib64/ld-linux-x86-64.so.2 固然linux發行版本不一樣也沒有什麼關係,你多少也能看出共同點。

圖片.png
圖片.png
圖片.png
圖片.png

我相信你們確定聽過動態庫和靜態庫的概念,而上面的.so文件其實就是一個動態庫文件,我畫線的呢是它們java,go,python,php運行時會加載起來,它能夠做爲程序的一部分進行映射,你能夠看成一個函數庫,加載進來之後,咱們就能夠調用它提供的函數了,而這些函數是Linux操做系統提供的比較重要的一些函數了,這些.so文件它們也是ELF文件的一種
圖片.pngc++

咱們能夠經過nm命令能夠查看它提供了哪些函數
圖片.pnggit

你們能夠看我有線畫出來了,左邊是函數的地址,右邊是函數的名稱,當咱們加載此庫後,能夠調用execve函數,我相信作Android,ios開發的夥伴應該用過.so文件【c++,c這些朋友是很是熟悉了】 程序員

那麼接下來,咱們運行一下各類編程語言寫的程序並跟蹤系統調用System callgithub

  • 看看go語言
  • 圖片.png

這go語言啊語法是長這樣的,語法規定,寫法是由開發的那一批人規定的,畢竟人家的編譯器就是專門識別這種寫法,若是你們有相應的實力開發本身的編譯器,那麼我相信你,本身折騰一套編程語言也沒有問題【我知道有的夥伴大學就擼過了,可是不出名^_^】
如今我運行一下
圖片.png
你們能夠看到,咱們調用了linux提供的execve函數,它在libc.so庫中,這個庫是Linux給咱們提供的
圖片.png
圖片.png
它會去打開這個動態庫,固然了c,c++程序員調用它提供的函數也是很是簡單方便
圖片.png
你們能夠看到go這個ELF文件,它自己是把Linux提供的libc.so中提供的execve作爲啓動時運行的第一個函數【我並無提bash進程接收命令後的進一步系統調用,你們有興趣能夠關注我,詳細聊】
它打開了demo.go文件作了什麼處理,固然它知道^_^

好如今咱們來看java的程序
圖片.png
圖片.png
圖片.png
圖片.png
圖片.png
一樣要調用execve
圖片.png

好咱們再看php
圖片.png
圖片.png
圖片.png
圖片.png

那麼剩餘的python道理同樣。
看完上面的演示,我相信你們應該有一個認識,雖然語言寫法不一樣,可是它們的系統調用都是同樣的,你們應該往深的方向看,不要侷限於表面的編程語言,腳本語言。
咱們知道這些語言的寫法五花八門,這些語言的函數,構建起來的應用都在是用Linux 提供的API,這些API都是c定義的API,咱們能夠很是方便的查閱它,相反Win提供的系統API查起來麻煩,寫法也複雜。函數名長的要命。
圖片.png
你們一塊兒這函數,就很是清晰的知道,哦原來是根據文件filename執行它,而且把argv當作參數傳遞給它,這樣咱們就知道原來我執行php,java,go,python它們會執行這個才加載我寫的程序的。

我相信你們無論學什麼編程語言,都會遇到多進程,多線程,網絡編程方面的內容,除非靠着這些語言擼好的框架進行crud 工做,固然我也是這樣之前。它們的寫法用法不一樣,可是低層的東西是相同的。你們不要迷惑於語言的表面用法。

若是你們以爲有意義或是有必要,對這方面,多進程編程,網絡編程感興趣的朋友能夠watch my video

video link:https://edu.51cto.com/sd/75a3d

相關文章
相關標籤/搜索