在大学里,你可能学的是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。只不过上层语言作了各类封装造成了各类写法开发布而成的应用,包括咱们的各类编译器,汇编器,各类开发库。
java
大学的朋友多少也撸过c,也知道撸好了须要编译,若是大学里的是直接在win上开始学的话,可能你四年都没有装过编译器,若是你在linux上或是其它嵌入式芯片,那么编译器种类特别多,有PC的,有ARM的,avr单片机的等,这些编译器最终会把咱们写的各类源码会解释成汇编,这个时候它只要链接一下一些重要的库,特别是系统重要的库函数就能够启动了。
c,c++,java,go,嵌入式c等都须要编译器处理输出目标文件,而这个目标文件含有大量的数据,而且会分门别类的存储好。在linux系统中如go
你们也晓得,当我输入./go run xx.go文件后它就能够运行了
一样看java node
一样看python
再看php python
我相信你们应该看到共同点了,虽然你们用的编程语言不一样,可是没有关系,咱们仍是有共同的话题,若是你感兴趣且不在意什么语言的话 linux
你们能够看出ios
我相信你们确定听过动态库和静态库的概念,而上面的.so文件其实就是一个动态库文件,我画线的呢是它们java,go,python,php运行时会加载起来,它能够做为程序的一部分进行映射,你能够看成一个函数库,加载进来之后,咱们就能够调用它提供的函数了,而这些函数是Linux操做系统提供的比较重要的一些函数了,这些.so文件它们也是ELF文件的一种 c++
咱们能够经过nm命令能够查看它提供了哪些函数 git
你们能够看我有线画出来了,左边是函数的地址,右边是函数的名称,当咱们加载此库后,能够调用execve函数,我相信作Android,ios开发的伙伴应该用过.so文件【c++,c这些朋友是很是熟悉了】 程序员
那么接下来,咱们运行一下各类编程语言写的程序并跟踪系统调用System callgithub
这go语言啊语法是长这样的,语法规定,写法是由开发的那一批人规定的,毕竟人家的编译器就是专门识别这种写法,若是你们有相应的实力开发本身的编译器,那么我相信你,本身折腾一套编程语言也没有问题【我知道有的伙伴大学就撸过了,可是不出名^_^】
如今我运行一下
你们能够看到,咱们调用了linux提供的execve函数,它在libc.so库中,这个库是Linux给咱们提供的
它会去打开这个动态库,固然了c,c++程序员调用它提供的函数也是很是简单方便
你们能够看到go这个ELF文件,它自己是把Linux提供的libc.so中提供的execve作为启动时运行的第一个函数【我并无提bash进程接收命令后的进一步系统调用,你们有兴趣能够关注我,详细聊】
它打开了demo.go文件作了什么处理,固然它知道^_^
好如今咱们来看java的程序
一样要调用execve
好咱们再看php
那么剩余的python道理同样。
看完上面的演示,我相信你们应该有一个认识,虽然语言写法不一样,可是它们的系统调用都是同样的,你们应该往深的方向看,不要局限于表面的编程语言,脚本语言。
咱们知道这些语言的写法五花八门,这些语言的函数,构建起来的应用都在是用Linux 提供的API,这些API都是c定义的API,咱们能够很是方便的查阅它,相反Win提供的系统API查起来麻烦,写法也复杂。函数名长的要命。
你们一块儿这函数,就很是清晰的知道,哦原来是根据文件filename执行它,而且把argv当作参数传递给它,这样咱们就知道原来我执行php,java,go,python它们会执行这个才加载我写的程序的。
我相信你们无论学什么编程语言,都会遇到多进程,多线程,网络编程方面的内容,除非靠着这些语言撸好的框架进行crud 工做,固然我也是这样之前。它们的写法用法不一样,可是低层的东西是相同的。你们不要迷惑于语言的表面用法。
若是你们以为有意义或是有必要,对这方面,多进程编程,网络编程感兴趣的朋友能够watch my video
video link:https://edu.51cto.com/sd/75a3d