编译器是如何翻译函数,函数调用的? 从汇编语言角度去解释 ?

时间:2021-02-13 01:28:52
编译器是如何翻译函数,函数调用的? 从汇编语言角度去解释 ?

10 个解决方案

#1


好像是把函数名称翻译成label

#2


函数 就是一段功能二进制代码和函数入口地址
调用 就是把参数写到对应函数的栈空间 保存现场 跳转到函数入口地址 

#3


编译器的角度来说,编译过程就是把代码变成二进制码流(也可能是中间态 类似汇编 最后再转换),然后分配地址(build time),函数地址可以看做label,函数调用就是call label,跳转过去,然后linking,把代码段连接成一个东东,之后就ooxxxxx了

#4


基本上就是楼上说的这个样子了,楼主用编译工具看看C语言编译后的汇编代码不就知道了?

#5



 

那如果有两个线程要调用同一个函数,是不是会有同步的问题?
 

#6


两个线程去调用同一个函数,是不会有同步问题的

程序在内存里面,存在代码段和数据段的概念,函数入口只是代码段的概念,相关的需要操作的变量,是存在调用者的数据段(堆栈啥的,具体看声明)的,换句话说,两个线程同时去调用一个函数,其共用的只有这个函数的处理流程,而内部数据是相互独立的,所以不存在同步问题

但是有两种情况比较特殊:
1 两个线程隶属于同一个进程,因为进程是资源分配的最小单位,两个线程实质上共用资源,所以会存在同步问题
2 被调用函数存在全局变量,这个也会引发同步问题,这也就是所有的编码建议都提到减少全局变量使用的重要原因之一

#7


引用 5 楼 wtjd 的回复:
那如果有两个线程要调用同一个函数,是不是会有同步的问题?

你说的同步指的是什么? 从汇编角度并没有这个问题。
单个CPU的话,同一时间是只能执行一条指令的。所谓多线程也只是操作系统利用时钟进行了一个任务调度而已。

#8


编译器的角度来说,编译过程就是把代码变成二进制码流(也可能是中间态 类似汇编 最后再转换),然后分配地址(build time),函数地址可以看做label,函数调用就是call label,跳转过去,然后linking,把代码段连接成一个东东,之后就ooxxxxx了
顶!

#9


引用 7 楼 sherlock_lai 的回复:
引用 5 楼 wtjd 的回复:
 那如果有两个线程要调用同一个函数,是不是会有同步的问题?


 你说的同步指的是什么? 从汇编角度并没有这个问题。
 单个CPU的话,同一时间是只能执行一条指令的。所谓多线程也只是操作系统利用时钟进行了一个任务调度而已。

同意

#10


大家都说得很对,

函数是放在代码段中,各线程只是用了函数的处理流程而已,各线程每一次的函数调用都有自己的函数栈,
因此函数内的局部变量,形参是不会有同步问题的,对于全局变量则存在同步问题。
因此大家写代码的时候,要注意线程与全局变量可能会存在的同步问题。

“函数 就是一段功能二进制代码和函数入口地址 
调用 就是把参数写到对应函数的栈空间 保存现场 跳转到函数入口地址 ”
这句话说得很对,说出了函数的本质。
希望大家都能理解函数是什么,为什么几乎大多数计算机语言都有函数的概念,
我想函数无法对一段可复用逻辑的封装吧,这样一个大程序分配一段一段的小逻辑,
这样也是乎合人的大脑思考问题,分解问题的习惯的。

好了,就说这么多,把分给大家了。

#1


好像是把函数名称翻译成label

#2


函数 就是一段功能二进制代码和函数入口地址
调用 就是把参数写到对应函数的栈空间 保存现场 跳转到函数入口地址 

#3


编译器的角度来说,编译过程就是把代码变成二进制码流(也可能是中间态 类似汇编 最后再转换),然后分配地址(build time),函数地址可以看做label,函数调用就是call label,跳转过去,然后linking,把代码段连接成一个东东,之后就ooxxxxx了

#4


基本上就是楼上说的这个样子了,楼主用编译工具看看C语言编译后的汇编代码不就知道了?

#5



 

那如果有两个线程要调用同一个函数,是不是会有同步的问题?
 

#6


两个线程去调用同一个函数,是不会有同步问题的

程序在内存里面,存在代码段和数据段的概念,函数入口只是代码段的概念,相关的需要操作的变量,是存在调用者的数据段(堆栈啥的,具体看声明)的,换句话说,两个线程同时去调用一个函数,其共用的只有这个函数的处理流程,而内部数据是相互独立的,所以不存在同步问题

但是有两种情况比较特殊:
1 两个线程隶属于同一个进程,因为进程是资源分配的最小单位,两个线程实质上共用资源,所以会存在同步问题
2 被调用函数存在全局变量,这个也会引发同步问题,这也就是所有的编码建议都提到减少全局变量使用的重要原因之一

#7


引用 5 楼 wtjd 的回复:
那如果有两个线程要调用同一个函数,是不是会有同步的问题?

你说的同步指的是什么? 从汇编角度并没有这个问题。
单个CPU的话,同一时间是只能执行一条指令的。所谓多线程也只是操作系统利用时钟进行了一个任务调度而已。

#8


编译器的角度来说,编译过程就是把代码变成二进制码流(也可能是中间态 类似汇编 最后再转换),然后分配地址(build time),函数地址可以看做label,函数调用就是call label,跳转过去,然后linking,把代码段连接成一个东东,之后就ooxxxxx了
顶!

#9


引用 7 楼 sherlock_lai 的回复:
引用 5 楼 wtjd 的回复:
 那如果有两个线程要调用同一个函数,是不是会有同步的问题?


 你说的同步指的是什么? 从汇编角度并没有这个问题。
 单个CPU的话,同一时间是只能执行一条指令的。所谓多线程也只是操作系统利用时钟进行了一个任务调度而已。

同意

#10


大家都说得很对,

函数是放在代码段中,各线程只是用了函数的处理流程而已,各线程每一次的函数调用都有自己的函数栈,
因此函数内的局部变量,形参是不会有同步问题的,对于全局变量则存在同步问题。
因此大家写代码的时候,要注意线程与全局变量可能会存在的同步问题。

“函数 就是一段功能二进制代码和函数入口地址 
调用 就是把参数写到对应函数的栈空间 保存现场 跳转到函数入口地址 ”
这句话说得很对,说出了函数的本质。
希望大家都能理解函数是什么,为什么几乎大多数计算机语言都有函数的概念,
我想函数无法对一段可复用逻辑的封装吧,这样一个大程序分配一段一段的小逻辑,
这样也是乎合人的大脑思考问题,分解问题的习惯的。

好了,就说这么多,把分给大家了。