操作系统-编译器-编程语言
操作系统
进程的创建流程主要为:
创建一个独立的虚拟地址空间
读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系
将 CPU 的指令寄存器设置成可执行文件的入口地址,启动运行
操作系统通过设置 CPU 的指令寄存器将控制权交给进程,由进程开始执行
操作系统在进程启动前会将跟进程运行环境相关的信息提前保存到进程的虚拟空间的栈中
进程执行
可执行文件执行结束,操作系统会自动清理它占用的各种资源
操作系统要先加载相应的“解释器”程序,
然后解释器程序加载对应的脚本文件,一边把脚本指令翻译成机器码、一边执行它
编译器可以独立于操作系统存在,但在现代计算机系统中,编译器通常依赖于操作系统来执行一些底层操作
###数据结构+算法
程序构建
编译器
Compile 编译时 compiler 编译器
GCC编译
C语言的编译有两种方式,
一种是本地编译(在一个平台上编译该平台运行的程序),
另一种是交叉编译(在一个平台上编译供另一个平台运行的程序
程序运行时
.静态库(static library) 动态库(共享库,shared library)
类库是编写操作系统所必须的,编译器也是必须的
编译器已经在自己和编写函数定义的人之间建立了契约
编程语言
编程语言的执行模型
程序(program)是完成特定【计算任务】的【指令】序列,指令由相应的【图灵机】读取并操作
01. 可执行文件:包含了一个可以被操作系统创建一个进程来执行之的文件
操作系统-可执行程序
程序执行时需要的指令和数据必须在内存中才能正常运行
地址空间
操作系统会提供一种机制,能够将不同进程的虚拟地址空间与不同内存的物理地址映射起来,
这样所有进程都不能直接访问物理内存,都只能访问自己的虚拟内存空间
每个程序被运行起来后,都将拥有自己的独立虚拟地址空间,虚拟地址空间的大小由 CPU 的位数决定的
装载的方式
静态装入
动态装入 覆盖装入(Overlay)和页映射(Paging)
02.ABI,是 Application Binary Interface 的缩写,应用程序二进制接口
C-ABI 包含两个关键的内核:数据的内存布局方式 以及 函数如何调用
Cpp ABI
案例
1.C运行时库由编译器生产商提供
Runtime Library就是运行时库,也简称CRT(C Run Time Library)。
在不同平台上都有相对应的 Standard Library,但大部分实现都是与各个平台有关的
是程序在运行时所需要的库文件,通常运行时库是以Lib或Dll形式提供的
C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。
你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,
不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。
因为C run-time library包含了C程序运行的最基本和最常用的函数
)Windows环境下,VC提供的 C run-time library又分为动态运行时库和静态运行时库。
动态运行时库主要是
DLL库文件 msvcrt.dll (or MSVCRTD.DLL for debug build),
对应的Import library文件是 MSVCRT.LIB(MSVCRTD.LIB for debug build)
静态运行时库(release版)对应的主要文件是:
LIBC.LIB (Single thread static library, retail version)
LIBCMT.LIB (Multithread static library, retail version)
msvcrt.dll msvcrtd.dll
libc.lib,libcmt.lib
编译时到底哪个C run-time library联入你的程序取决于编译选项:/MD, /ML, /MT, /LD (Use Run-Time Library)
CRT是指Microsoft开发的C/C++ Runtime Library
2.C++ Standard Library
C++ Standard Library
C++ 世界里,有另外一个概念:Standard C++ Library,它包括了上面所说的 C run-time library 和 STL
标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。
面向对象类库: 这个库是类及其相关函数的集合
The Standard Template Library (STL) is a set of C++ template classes
libc是Linux下原来的标准C库 后来逐渐被glibc取代,也就是传说中的GNU C Library
glibc 是Linux系统中最底层的API,几乎其它任何的运行库都要依赖glibc glibc最主要的功能就是对系统调用的封装
glib 将C语言中的数据类型统一封装成自己的数据类型,提供了C语言常用的数据结构的定义以及处理函数,有趣的宏以及可移植的封装等
3.Rust and essentially no runtime system
系统编程、安全、并发、高效,是Rust语言的核心特征
拆分标准库(std),提取出专门针对底层开发的极其轻量级的核心库(core)
libnative 运行时库的实现,是基于操作系统本地线程,加上libc阻塞I/O调用
rust 所宣称的没有运行时(“without runtime”)的理解应该是没有单独的运行时环境。
可以理解为内存的管理在编译期就已经确定 -中间没有JVM之类的语言虚拟机
Rust编程语言的标准发行版包含两个运行时库( libgreen 和 libnative
4. Go
Go 编译器给可执行程序内部添加了一个go语言运行时
Go runtime,即运行时库,负责管理可执行程序的内存和执行环境
通常简称为运行时,它是每个 Go 程序的一部分。该库实现了垃圾收集、并发、堆栈管理和 Go 语言的其他关键功能。
尽管 Go 的运行时对于语言来说更为核心,但它类似于libcC 库
Go 的运行时不包括虚拟机,例如 Java 运行时提供的虚拟机。 Go 程序提前编译为本机机器代码
并发提供高级语言支持的最成功的模型之一来自 Hoare 的通信顺序进程 (CSP)。 Occam 和 Erlang 是源自 CSP 的两种著名语言
使用 goroutine 而不是线程
5.Cangjie
在底层实现上,仓颉语言的ABI定义与C语言高度兼容
编译形态 CJNative libcangjie-runtime.so
仓颉程序执行的最小系统由仓颉的核心库(libcangjie-std-core.so)和仓颉轻量运行时(libcangjie-runtime.so)构成
Cangjie-TPC(Third Party Components)
开发
(底层)系统底层开发,强调对底层硬件的控制;
(中层)系统应用开发,对CPU和内存的占用十分敏感;
(上层)普通应用开发,更倾向于方便快捷的开发效率。
通常意义上所说的“系统编程”,往往是指中底层系统开发
数据库
阿里 PolarDB Ocean
华为 OpenGausee
在云厂家这种体系中,你无需创新,只要按照云厂家给你点亮的技术树去开展你的IT工作就行了。
对于有些企业来说,这也许不是坏事,而是一件好事。
参考
仓颉语言运行时轻量化实践 https://mp.weixin.qq.com/s/D2SlRTibrqSrYpb2mp4Afg