符号表

Java虚拟机原理

北战南征 提交于 2020-03-29 07:55:49
1、编译机制 分析和输入到符号表: 词法分析:将代码转化为token序列 语法分析:由token序列生成抽象语法树 输入到符号表:将类中出现的符号输入到类的符号表 注解处理: 处理用户自定义注解,之后继续第一步 根据符号表进行语义分析并生成class文件,并进行相关优化 虚拟机数据类型、字节码文件格式、虚拟机指令集 2、执行机制 2.1、加载、链接、初始化 2.1.1、加载 双亲委派、线程上下文类加载器、Web容器、OSGi: http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 2.1.2、链接 校验:校验二进制字节码格式是否符合Java Class File Format规范 准备:为类的静态属性分配内存和默认值,并加载引用的类或接口 解析:将运行时常量池中的符号引用替换为直接引用(静态绑定) 2.1.3、初始化 类的初始化时机: 创建类的实例 初始化某个类的子类(满足主动调用,即访问子类中的静态变量、方法) 反射(Class.forName()会触发,ClassLoader.loadClass()及X.class不会触发) 访问类或接口的静态变量(static final常量除外,static final变量可以) 调用类的静态方法 java虚拟机启动时被标明为启动类的类 初始化顺序: 父类静态成员、静态代码块

ELF文件格式解析

核能气质少年 提交于 2020-03-26 09:36:47
copy from : https://blog.csdn.net/mergerly/article/details/94585901 1. ELF文件简介 首先,你需要知道的是所谓对象文件(Object files)有三个种类: 可重定位的对象文件(Relocatable file) 这是由汇编器汇编生成的 .o 文件。后面的链接器(link editor)拿一个或一些 Relocatable object files 作为输入,经链接处理后,生成一个可执行的对象文件 (Executable file) 或者一个可被共享的对象文件(Shared object file)。我们可以使用 ar 工具将众多的 .o Relocatable object files 归档(archive)成 .a 静态库文件。如何产生 Relocatable file,你应该很熟悉了,请参见我们相关的基本概念文章和JulWiki。另外,可以预先告诉大家的是我们的内核可加载模块 .ko 文件也是 Relocatable object file。 可执行的对象文件(Executable file) 这我们见的多了。文本编辑器vi、调式用的工具gdb、播放mp3歌曲的软件mplayer等等都是Executable object file。你应该已经知道,在我们的 Linux 系统里面,存在两种可执行的东西

八、Python 模块

有些话、适合烂在心里 提交于 2020-03-10 15:02:38
1、Python3 模块定义 1) Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块 2) 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py 3) 模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。 2、import 语句 1) 想使用 Python 源文件,只需在另一个源文件里执行 import 语句 2) 一个模块只会被导入一次,不管你执行了多少次import 语法如下: import module1[, module2[,... moduleN] import sys # import sys 引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法 print('命令行参数如下:') for i in sys.argv: # sys.argv 是一个包含命令行参数的列表 print(i) print('\n\nPython 路径为:', sys.path, '\n') #sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表 3、from … import 语句 Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中 语法如下: from modname import name1[, name2

Lombok经常用,但是你知道它的原理是什么吗?(二)

余生长醉 提交于 2020-03-05 15:03:03
在上一篇 Lombok经常用,但是你知道它的原理是什么吗? 简单介绍了注解处理器,是用来处理编译期的注解的一个工具,我们只是自己生成了一些代码,但是和Lombok却不一样,因为Lombok是在原有类的基础上增加了一些类,你那么Lombok是如何做到修改原有类的内容呢?接下来我们就再进一步了解Lombok的原理。 Javac原理 既然我们是在编译期对类进行操作了,那么我们就需要了解在Java中Javac到底对程序做了什么。Javac对代码编译的过程其实就是用Java来写的,我们可以查看其源码对其简单的分析,如何下载源码,Debug源码这里我就不进行分析了,推荐一篇文章写的挺好的。 Javac 源码调试教程 。 编译过程大致分为了三个阶段 解析与填充符号表 注解处理 分析与字节码生成 这三个阶段的交互过程如下图所示。 解析与填充符号表 这一步骤是两个步骤,包括了解析和填充符号,其中解析是分为 词法分析 和 语法分析 两个步骤。 词法分析和语法分析 词法分析就是将源代码的字符流转变为Java中的标记(Token)集合,单个字符是程序编写过程中最小的元素,而标记(Token)则是编译过程中最小的元素,关键字、变量名、字面量、运算符都可以成为标记(Token)。比如在Java中 int a = b+2 ,这段代码则表示了6个标记 Token ,分别是 int、a、=、b、+、2

PHP垃圾回收深入理解

心已入冬 提交于 2020-02-27 09:51:31
PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完全兼容。PHP5.3在PHP5.2的基础上做了诸多改进,其中垃圾回收算法就属于一个比较大的改变。本文将分别讨论PHP5.2和PHP5.3的垃圾回收机制,并讨论这种演化和改进对于程序员编写PHP的影响以及要注意的问题。 PHP变量及关联内存对象的内部表示 垃圾回收说到底是对变量及其所关联内存对象的操作,所以在讨论PHP的垃圾回收机制之前,先简要介绍PHP中变量及其内存对象的内部表示(其C源代码中的表示)。 PHP官方文档中将PHP中的变量划分为两类:标量类型和复杂类型。标量类型包括布尔型、整型、浮点型和字符串;复杂类型包括数组、对象和资源;还有一个NULL比较特殊,它不划分为任何类型,而是单独成为一类。 所有这些类型,在PHP内部统一用一个叫做zval的结构表示,在PHP源代码中这个结构名称为“_zval_struct”。zval的具体定义在PHP源代码的“Zend/zend.h”文件中

内核符号表

拈花ヽ惹草 提交于 2020-02-23 01:33:46
Linux内核为了实现模块化,需要提供一个公共的内核符号表,它包含了所有的全局内核项(函数以及变量)的地址。当模块加载到内核中后,它所导出的任何符号都将成为内核公共符号表的一部分。内核模块只需要实现自己的功能而无需导出任何符号,但这样其他模块将无法使用该模块的功能, 一个新的模块可以使用自己其他模块导出的符号,这样可以实现在其他模块的基础上层叠新的模块,如msdos文件系统依赖于由fat模块导出的符号,USB输入设备模块会层叠在usbcore和input模块之上。模块层叠技术在复杂项目中非常有用,如果以设备驱动程序的形式实现一个新的软件抽象,则可以为硬件相关的实现提供一个“插头”。modprobe是处理层叠模块的一个非常实用的工具,它在装载指定模块的同时也会加载该模块所以来的其他模块。因此一个modprobe命令有的时候相当于执行了多次insmod命令。 当模块需要向其他模块导出符号时,应当使用下面的宏: EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name); 这两个宏都可以实现将给定的符号导出到外部模块, EXPORT_SYMBOL_GPL宏导出的模块只能被GPL许可证下的模块使用。符号的导出必须在模块文件的全局部分导出,不能在函数中导出符号。可以参考<linux/module.h>查看更多信息。 来源: CSDN 作者: 艾特号 链接:

php内存管理机制、垃圾回收机制

青春壹個敷衍的年華 提交于 2020-02-21 11:31:20
一、内存管理机制 先看一段代码: <?php //内存管理机制 var_dump(memory_get_usage());//获取内存方法,加上true返回实际内存,不加则返回表现内存 $a = "laruence"; var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage()); //输出(在我的个人电脑上, 可能会因为系统,PHP版本,载入的扩展不同而不同): //int 240552 //int 240720 //int 240552 定义变量之后,内存增加,清除变量之后,内存恢复(有些可能不会恢复和以前一样),好像定义变量时申请了一次内存,其实不是这样的,php会预先申请一块内存,不会每次定义变量就申请内存。 首先我们要打破一个思维: PHP不像C语言那样, 只有你显示的调用内存分配相关API才会有内存的分配. 也就是说, 在PHP中, 有很多我们看不到的内存分配过程. 比如对于: $a = "laruence"; 隐式的内存分配点就有: 1.1. 为变量名分配内存, 存入符号表 2.2. 为变量值分配内存 所以, 不能只看表象. 第二, 别怀疑,PHP的unset确实会释放内存, 但这个释放不是C编程意义上的释放, 不是交回给OS. 对于PHP来说,

深入程序编译链接和装载过程

僤鯓⒐⒋嵵緔 提交于 2020-02-20 02:29:27
文章目录 预编译 编译 汇编 链接 基础先知 指令和数据 分析二进制可重定位目标文件 main.o 的组成 强符号和弱符号 符号表 链接过程分析 运行 提问:一个源文件是如何变成可执行文件的? 在linux中,使用GCC来编译程序,我们逐步来分析: 预编译 gcc -E hello.c hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s -o hello.o 链接 gcc hello.o -o hello 运行 ./hello 预编译 预编译阶段主要处理以"#"开头的预编译指令。 删除宏定义并作文本替换 递归展开头文件“#include” 处理#if、#ifdef、#elif、#else、#endif等 删除注释“//”和 “/* */” 添加行号和文件标识,以便编译器产生编译调试时的行号信息,以及产生错误或警号时能够显示行号 保留所有的#pragma指令 编译 词法分析 语法分析 语义分析 代码优化 生成汇编指令 汇编 将汇编指令转换成机器指令 链接 基础先知 指令和数据 局部变量属于指令,静态变量和全局变量属于数据。 int gdata1 = 10; //数据 int gdata2 = 0; //数据 强符号 int gdata3;//数据 static int gdata4 = 11; //数据 static int

定义函数

人盡茶涼 提交于 2020-02-13 03:50:52
关键字 def 引入了一个函数 定义 。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。 函数体的第一行语句可以是可选的字符串文本,这个字符串是函数的文档字符串,或者称为 docstring 。(更多关于 docstrings 的信息请参考 文档字符串 ) 有些工具通过 docstrings 自动生成在线的或可打印的文档,或者让用户通过代码交互浏览;在你的代码中包含 docstrings 是一个好的实践,让它成为习惯吧。 函数 调用 会为函数局部变量生成一个新的符号表。确切的说,所有函数中的变量赋值都是将值存储在局部符号表。变量引用首先在局部符号表中查找,然后是包含函数的局部符号表,然后是全局符号表,最后是内置名字表。因此,全局变量不能在函数中直接赋值(除非用 global 语句命名),尽管他们可以被引用。 函数引用的实际参数在函数调用时引入局部符号表,因此,实参总是 传值调用 (这里的 值 总是一个对象 引用 ,而不是该对象的值)。 [1] 一个函数被另一个函数调用时,一个新的局部符号表在调用过程中被创建。 一个函数定义会在当前符号表内引入函数名。函数名指代的值(即函数体)有一个被 Python 解释器认定为 用户自定义函数 的类型。 这个值可以赋予其他的名字(即变量名),然后它也可以被当做函数使用。这可以作为通用的重命名机制: >>> fib

JVM之---Java源码编译机制

空扰寡人 提交于 2020-02-12 08:45:46
Sun JDK中采用javac将Java源码编译为class文件,这个过程包含三个步骤: 1.分析和输入到符号表(Parse and Enter) Parse过程所做的工作有词法和语法分析。词法分析要完成将代码字符串转变为Token序列。语法分析则是根据语法将Token序列生成抽象语法树。 Enter过程将符号输入到符号表,通常包括确定类的超类型和接口、根据需要添加默认构造器、将类中出现的符号输入类自身的符号表中等。 2.注解处理(Annotation Processing) 该步骤主要用于处理用户自定义的annotation,可能带来的好处是基于annotation来生成附加的代码或进行一些特殊的检查,从而节省一些共同的代码的编写。此功能基于JSR269,在Sun JDK6 中提供了支持,在注解处理完之后,再次进入上一步骤。 3.语义分析和生成class文件(Analyse and Generate) 该步骤基于抽象语法树进行一系列的语义分析,包括将语法树中的名字、表达式等元素与变量、方法、类型等联系在一起;检查变量使用前是否已声明;推导泛型方法的类型参数;检查类型匹配性;进行常量折叠;检查所有语句都可到达;检查所有checked exception 都被捕获或抛出;检查变量的确定性赋值(例如有返回值的方法必须确定有返回值);检查变量的确定性不重复赋值