乐趣区

关于php:写给换编程语言的你

在大学里,你可能学的是 c,c++,java…. 到社会上工作后,你有可能换成其它语言了,这没方法,毕竟决定权不在咱们手上,饭碗规定要用 go, 要用 rust 你都会马上去学习,就算饭碗决定你用 asp 你也得上,毕竟人在江湖人不禁已,尽管有时候咱们会听到某某语言天下第一,某某语言如何如何,有时候甚至跟他人吵一架,然而他人的饭碗有可能就是用这个语言的。在咱们每个人的心中都可能感觉本人的货色才是最好的,他人的货色不行。

不过你在用什么语言,什么工具,反正只有能糊口,保住饭碗就是好语言,工作数年后,咱们用的语言可能很多,然而咱们的我的项目大部分都是运行在最风行的操作系统之上 Linux,Linux 零碎源码, 工作多年的敌人也晓得整个零碎 90% 以上都是 c 源码写成,咱们的程序都要在下面运行,尽管咱们用着各种编程语言,php,python,java,c++,c,rust,go,nodejs,lua,ruby… 等,尽管咱们每天都在为哪个语言最好,哪个框架最好,哪个库最好而争吵没有达成大家心中的想法,然而大家是否想过,咱们的程序写好的源码最终是要在用 c 编写而成的 Linux 零碎上运行!linux 提供的零碎 api 接口都是一样的,特地是外围接口,咱们的程序最终都要用零碎提供的零碎调用函数 API。只不过下层语言做了各种封装造成了各种写法开公布而成的利用,包含咱们的各种编译器,汇编器,各种开发库。

大学的敌人多少也撸过 c,也晓得撸好了须要编译,如果大学里的是间接在 win 上开始学的话,可能你四年都没有装过编译器,如果你在 linux 上或是其它嵌入式芯片,那么编译器品种特地多,有 PC 的,有 ARM 的,avr 单片机的等,这些编译器最终会把咱们写的各种源码会解释成汇编,这个时候它只有连贯一下一些重要的库,特地是零碎重要的库函数就能够启动了。
c,c++,java,go, 嵌入式 c 等都须要编译器解决输入指标文件,而这个指标文件含有大量的数据,并且会分门别类的存储好。在 linux 零碎中如 go

大家也知道,当我输出./go run xx.go 文件后它就能够运行了
同样看 java

同样看 python

再看 php

我置信大家应该看到共同点了,尽管大家用的编程语言不同,然而没有关系,咱们还是有独特的话题,如果你感兴趣且不在乎什么语言的话

大家能够看出

  • 它们是 ELF 文件
  • 它们的标识是 LEF 64-bit LSB
  • 它们都要依赖 /lib64/ld-linux-x86-64.so.2 当然 linux 发行版本不同也没有什么关系,你多少也能看出共同点。




我置信大家必定听过动静库和动态库的概念,而下面的.so 文件其实就是一个动静库文件,我画线的呢是它们 java,go,python,php 运行时会加载起来,它能够作为程序的一部分进行映射,你能够当作一个函数库,加载进来当前,咱们就能够调用它提供的函数了,而这些函数是 Linux 操作系统提供的比拟重要的一些函数了,这些.so 文件它们也是 ELF 文件的一种

咱们能够通过 nm 命令能够查看它提供了哪些函数

大家能够看我有线画进去了,右边是函数的地址,左边是函数的名称,当咱们加载此库后,能够调用 execve 函数,我置信做 Android,ios 开发的搭档应该用过.so 文件【c++,c 这些敌人是十分相熟了】

那么接下来,咱们运行一下各种编程语言写的程序并跟踪零碎调用 System call

  • 看看 go 语言

这 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/course/…

退出移动版