代码是什么组成的【代码是什么组成的,项目代码由什么组成】
文章插图
代码是一组由字符、符号或信号码元组成的 , 是一种以离散形式表示信息的明确的规则体系 。代码就是程序员用开发工具所支持的语言写出来的源文件 。计算机源代码最终目的是将人类可读文本翻译成为计算机可执行的二进制指令 , 这种过程叫编译 , 它由通过编译器完成 。
代码设计的原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等 。源代码是代码的分支 , 某种意义上来说 , 源代码相当于代码 。现代程序语言中 , 源代码可以书籍或磁带形式出现 , 但最为常用格式是文本文件 , 这种典型格式的目的是为了编译出计算机程序 。
项目代码由什么组成字母 数字 符号--楼上的很精辟.代码确实无法一一说清,
再很下说就是由字符串组成的语句了.这个要长期积累,不
是只能问下就可以解决的..
c语言代码组成部分一段C语言经过编译连接后 , 成为一段可以运行的代码 , 可运行的代码可以分为以下四个部分组成:全局变量/静态变量区、堆、栈、代码区 。其中全局变量/静态变量区又分为未初始化变量区和初始化变量区 , 代码区又分为代码和常量区 。即汇总下来 , 代码可以分为6部分组成 , 包括:BSS区(未初始化的全局变量/静态变量区)、Data区(实始化的全局变量区)、Stack区(栈区)、heap区(堆区)、Code区(代码区)、const区(常量区) 。
一、BSS区和Data区
C语言编程中定义的全局变量、静态局部变量 , 就是分配在全局变量/静态变量区域 , 但是为什么又要分为BSS区域和Data区域呢?其实我们在定义全局或者静态变量区 , 有时我会对它赋初始值 , 有的又不会赋初始化 , 比如我们定义的全局变量 , 初始化的赋值 , 是怎么样写到变量区域中的 , 我们定义的静态局部变量 , 在定义时初始化后 , 为什么后面函数被调用 , 又不会再初始化呢?这个局部静态变量是怎么样实始化的 , 什么时候初始化的?
如果分析编译后的汇编代码 , 就会发现在代码运行起来后 , 会有一段给变量赋值的指令 , 这一段代码 , 不是我们C代码对应的汇编 , 而是C编译器生成的汇编译代码 , 这段代码的作用就是给初始化了的静态变量和全局变量进行初始化 。这也是为什么全局/静态变量区域 , 要分BSS和Data的原因 。
二、Stack区
栈是一种先进后出的数据结构 , 这种数据结构正好完美的匹配函数调用时的模型过程 , 比如函数f(a)在运行过程中调用函数f(b) , f(a)在运行过程中的变量就是分配在栈中 , 通过在调用f(b)前 , 会将代码中用到的R0~Rn寄存器的值保存到栈中 , 同时将函数的传入参数写入到栈中 , 然后进入f(b)函数 , 函数f(b)的变量b分配在栈中 , 当函数运行完毕后 , 释放变量b , 将栈中存放的f(a)函数的运行的R0~Rn寄存器值恢复到寄存器中 , 同时f(b)的返回结果存入到栈中 , 这样f(a)继续运行 。当一个函数运行完毕后 , 它在栈中分配的临时变量会全部释放 。
对于中断也是一样的 , 中断发生时 , 也是一个函数打断了另一个函数的运行 , 这种现场的保存(即寄存器的值),都是通过栈来完成的 。所以栈的作用有:
三、Heap区
全局变量分配的内存在代码整个运行周期内都是有效的 , 而在栈区分配的内存在函数调用完成后 , 就会释放 。这两种内存模型都是由编译器决定它的使用 , 代码是无法控制的 。那有没有内存是由用户控制的 , 要用时 , 就自由分配 , 不用时 , 就自行释放?答案是肯定的 , 这部分内存就是堆 。
用户需要使用的动态内存 , 就是通过malloc函数 , 调用分配的 , 在没有释放前 , 可一直由代码使用 。当这部分内存不再需要使用时 , 可以通过free函数进行释放 , 将它归还到堆中 。从这中可以看出 , 堆的内存 , 是按需分配的 。这就是赋予了代码很大的自由度 , 但这也是会带来负作用的 , 比如:内存碎片化导致的malloc失败;忘记释放内存导致的内存泄露 , 而这些往往是致命的失误 。
四、Code区
代码区就是编译后机器指令 , 这些指令决定了功能的执行 。我们编译的代码一般是下载进flash中 , 但是运行 , 却有两种方式:在RAM中运行和在ROM中运行 。在RAM中运行 , 即是boot启动后 , 将flash中的代码复制到RAM中 , 然后PC指针在指到RAM中的代码中开始运行 。有时在调试时 , 我们可以直接将代码下载进RAM中运行进行调试 , 这样加快调试速度 。便是大部分的情况我们的代码是从flash中开始运行的 。
五、常量区
代码中的常量 , 一部分是作为立即数 , 在代码区中 , 但是像定义的字符串、给某数组赋值的一串数值 , 这些常量 , 就存在常量区 , 我们常用const来定义一个常量 , 即该变量不能再必变 。这部分的变量 , 编译器一般将它定义的flash中 。
六、各个区域大小的是如何决定的:
code区和const区:是由代码的大小和代码中常量的多少来决定的 。
bss区和data区:这是由代码中定义的全局变量和局部变量的多少来决定的 。
stack区:这个可以由使用都自行定义大小 , 但使用都要根据自已代码的情况 , 评估出一个合理的值 , 再定义其大小 , 如果定义的太小 , 很容易爆栈 , 导至代码异常 , 但是如果定义的太大 , 就容易浪费内存 。
heap区:RAM剩下的部分 , 编译器就会作为堆区使用 。
七、嵌入式代码一般启动过程
以STM32为例 , 通过分析其汇编启支代码 , 大致可以分为以下几个步骤:
如果大家想看编译扣 , 代码文件的组成 , 可以查看统后生的map文件 , 里面有详细的数据 , 包括各个函数的分配内存 , BSS , Data , Stack , Heap , Text的分配情况 。
如果相要了解详细的代码启动过程 , 可看它的启动汇编文件 。
推荐阅读
- 油焖大虾上面那一层红油是什么
- 做自媒体有收益吗?做自媒体的核心思想是什么?
- 花中君子指的是什么
- 幌字的意思 幌是什么意思
- 麻油和黄油是什么油?用什么做成的?为何我国产量低靠进口?
- 头发的主要成分是什么
- 比喻身体是父母所给的成语是什么
- 人员配备的任务是什么
- 初三又称什么日
- 七月十四是什么节,七月十四是广西的节日吗