c语言 程序与系统关系 dark语言的演进

单文件代码:
源代码 是符号,他只是地址的映射。最初 所有代码都在一个文件里,在编译的时候 首先需要将源代码翻译成机器语言,这包括两个步骤:
1:源代码语义转换,即将人类语言转换为机器语言,将字母符号转化为数字符号
2:在上一个步骤中,只是将字母符号翻译成数字符号而已,之所以翻译成数字符号 是因为计算机可以看的懂,及计算机可以区分这些符号,下面就是给符号加上真正的地址,因为符号本身是没有意义的,只有在他的背后 存在值的时候 才具有意义。
通过上面两个步骤,我们的代码 就可以被计算机运行起来,因为我们的代码变成了二进制,同时这些二进制 中又明确的将数据保存在了内存中,同时明确的告诉了计算机如何运算,同时又调用了系统库 进行控制台输出。因为在链接的时候 实际上 将系统库调用这个符号 给赋予了真正的意义,即计算机本社已经包含了系统库,只不过存在其他的地方,链接只不过是将符号引入 改为引入真正的系统库地址,因为系统库后面连接着系统,这样我们就完成了系统调用。

多文件模块:
随着代码的增多,势必需要将代码分在多个文件中,每个文件中都有方法和变量,那么文件之间是如何互相使用到对方的方法和变量呢?这和系统库引入类似,都是在完成机器码转换后,在链接过程中 完成地址添加。

程序的本质:
程序的本质 就是编写算法,通过系统引入参数,然后输出参数,在这里,输入输出是系统库提供的能力,算法本身由cpu执行。所以我们的程序除了系统调用与所在系统有关,其他的都没有关系。

系统是如何运行程序的:
安装:程序安装只不过是将编译生成的可执行文件拷贝到系统目录里,顺带将依赖库拷贝到系统目录里,有的时候 设置一下注册表,安装前后 实际上没有什么不同。
启动:启动是指,用户点击了快捷图标,告诉系统 想要启动某个应用,于是系统将数据从硬盘拷贝到内存,然后执行程序入口文件。程序入口文件 因为依赖了很多扩展包,所以可以实现 图形绘制,网络请求,后台监听等多种功能。
运行:操作系统为了可以运行多个程序,于是发明了进程的概念,对于程序而言,进程环境就是计算机,因为它提供了计算机环境的一切,但是实际上这些都是假的,例如,内存只是虚拟内存,cpu也不是时刻都被运行的,但是即使如此,程序本身并不知道。当启动的时候,系统会为程序提供一个进程,相当于为程序提供了一个子计算机,让程序运行。

动态链接库:
程序在打包的时候 会将标准库也打包进项目中,而标准库本质上 是可以单独拿出来放到系统中的,这样既减少了程序的体积,也有助于降低程序运行时候的内存,这就是动态连接库。

运行时:
运行时是动态链接库的升级版,运行时 的目的是屏蔽底层不同系统之间的差异,同时顺便做到了其他的事情,比如 程序公用的部分 都可以放到运行时里面去,但是运行时和动态链接库 都有一个缺点就是需要用户提前安装到系统中。

AOT:运行前编译,性能更好
JIT:即时编译,借助于虚拟机实现跨平台

dark语言的策略:
dark语言可以针对不同平台进行打包,这有点类似于c++, 同时提供JIT模式 方便开发
https://cloud.tencent.com/developer/article/1637321

v8引擎的策略:
v8引擎 采用JIT模式,但是做了许多优化


GUI本质:
cpu负责给出界面数据结构图,gpu负责将数据结构图绘制成界面,然后将界面放到帧缓冲区中,显示器从帧缓冲区获取到界面后 就会显示。

skia:
skia是一个独立于系统的第三方图形绘制库,skia生成图形数据后,将数据直接交给gpu。

框架与平台:
平台是指汇聚多个开发者在一起,针对某一个生活领域的数字化解决方案来构建生态。
框架是指 针对某个场景开发出一个完备的解决方案,使得开发人员通过使用这个解决方案 可以很方便的进行开发,而不需要考虑其他事情,例如:
vue react使得前端人员专注于业务开发,而不需要关注界面绘制,
jvm虚拟机 使得开发人员只需要关注编写程序,而在不同系统的适配问题 由jvm负责
node使得开发人员只需要关注开发,而在不同系统的兼容问题 则由node负责
.net framework使得开发人员只需要关注开发,其他的关于 适配系统,适配屏幕等所有的事情 都交给框架去完成
操作系统甚至也是一个框架,他让程序只需要放心运行即可,至于底层硬件的兼容 则交给系统去解决
编译器也可以理解为一个框架,它使得开发人员只需要使用编程语言去写即可,剩下的如何让机器执行 ,交给编译器去处理
flutter也是一个框架,它使得开发人员只需要专注于一套代码,剩下的在不同系统之间的问题 由flutter解决

flutter原理:
fluter利用skia的跨平台性,实现了GUI的跨平台,选择dark语言而不是js语言实现了 运行层面性能的提升。
1:开发人员使用dark语言和数据绑定的方式构建出应用程序
2:flutter在监听到数据的改变后,会根据双向绑定的原理 重新绘制出界面数据
3:flutter将数据交给skia
4:skia将flutter给出的数据 改为GPU可以看懂的格式
5:GPU拿到数据后,生成界面,交给帧缓冲区
6:显示器从帧缓冲区拿到界面后,开始显示

1:开发人员希望调用系统API
2:使用flutter提供的管道机制可以与原生进行通信
3:开发人员在原生测写出调用api的方法
4:开发人员在flutter测使用管道机制 去调用原生测写好的方法


1:开发人员希望访问文件
2:由flutter提供 文件API

1:开发人员希望进行网络请求
2:flutter通过在底层监听原生的数据变动,实时的数据拿到程序中

程序的本质:
抽象化业务逻辑,以数理逻辑的方式描述出来,并使用系统调用与系统融合一体。

posted @ 2020-08-27 22:01  dami.white  阅读(461)  评论(0编辑  收藏  举报