java
文章平均质量分 83
tyler_download
这个作者很懒,什么都没留下…
展开
-
java高级特性:使用反射实现万能序列化1
很多时候我们需要将一个类的实例变成二进制数据存储或是通过网络发送,这个过程叫序列化。如果将二进制数据解析成位于内存中的类实例或是相关数据结构,那叫反序列化。所有的序列化算法都遵循一定的套路,例如:class A {public int a = 1;public int b = 2;protected B b = new B();private float c = 3.0;}如果要序列化类A的实例,那么通常需要将变量a,b的数值对应的二进制数写入,然后获得类B实例序列化后的二进制数据,最后将变原创 2021-11-28 15:28:21 · 732 阅读 · 0 评论 -
java开发C语言编译器:jvm的return指令以及局部变量的操作
本节我们研究jvm的return指令,以及对局部变量的操作,同时给出了一段C语言代码,展示了我们的编译器是如何把给定C语言编译成java字节码的原创 2017-06-20 17:42:00 · 1943 阅读 · 0 评论 -
文章标题
如果你喜欢编译原理,请参看视频 用java开发C语言编译器如果你喜欢面试算法,请参看视频 如何进入google,算法面试技能全面提升指南如果你对机器学习感兴趣,请参看一下链接: 机器学习:神经网络导论如果你喜欢操作系统内核,请参看视频 Linux kernel Hacker, 从零构建自己的内核对二叉树节点的遍历一般来说有中序,后序,和前序三种遍历方法,如果二叉树的高用h来表示,那三种遍历原创 2017-05-27 15:46:15 · 351 阅读 · 0 评论 -
算法面试题:使用两个堆栈实现一个队列
队列的插入和删除遵循先入先出的原则,而堆栈元素的插入和删除遵循后进先出的原则。在很多应用场景下,我们需要使用堆栈来模拟队列,或者是使用队列来模拟堆栈。在数学上,已经能够严格证明,我们是不能使用含有n个元素的堆栈来模拟含有n个元素的队列的,这个证明非常复杂,详细证明可以参看论文: The Power of the queue.用一个堆栈来模拟一个队列是不可能的,但是用两个堆栈来模拟一个队列确是可能的。原创 2017-04-16 11:20:02 · 1136 阅读 · 1 评论 -
面试算法:用队列计算滑动窗口内的最大网络流量
在网络流量的控制过程中,有时候需要找到从给定的某个时间点开始,往前倒退若干个时段内的最大网络流量m(t, w). 其中 t 是给定的某个时间节点,w就是滑动窗口大小,于是m表示的就是在时间段[t - w, t] 之间的最大网络流量。原创 2017-04-04 15:48:38 · 831 阅读 · 0 评论 -
面试算法:堆栈元素的在线排序
更详细的讲解和代码调试演示过程,请参看视频 如何进入google,算法面试技能全面提升指南给定一个存有整形数的堆栈,你能使用的操作有,peek 获得堆栈顶部元素的值但不把元素弹出堆栈,pop 把堆栈顶部的元素出栈,push 压入一个堆栈,empty 判断堆栈是否为空,要求你只能使用这几种操作,同时在不分配新内存的情况下,将堆栈中的元素从大到小排列,假定堆栈中,元素由栈底到栈顶如下: stack:原创 2017-03-25 07:15:50 · 1538 阅读 · 1 评论 -
java开发C语言解释器:结构体内存与成员变量的一致性
本节,我们要实现的是,如果代码修改了动态内存头四个字节的数据,那么结构体的成员变量p的值也需要跟着改变。上一节做法的思路是,解释器监视结构体成员变量,每当结构体成员的值发生改变,那么解释器就把所有成员变量的值复制到内存中。这次,我们反其道而行之,在解释器读取结构体成本变量的数值之前,先把内存中的信息拷贝到每个结构体成员中原创 2017-04-11 16:36:27 · 725 阅读 · 0 评论 -
java开发系统内核:第一个控制台命令
有一类程序叫命令行程序,此类程序没有花哨的窗口特效,他们的运行方法是,用户在黑色的命令行窗口中,输入程序的名字,后面跟着提交给程序的参数,点击回车,然后程序开始运行,然后把计算后的结果展示在命令行窗口里。早期的DOS,以及现在Linux系统的Shell, 都可以通过命令行来运行一系列程序,我们这一节的内容,就是实现一个命令行程序运行的功能原创 2017-03-14 16:31:36 · 803 阅读 · 1 评论 -
java开发C语言解释器:实现结构体的动态内存读写
本节的目的是继续完善C语言解释器对结构体成员的访问执行机制,我们通过malloc来为一个结构体指针分配动态内存,那么解释器必须保证,当代码对结构体的成员变量赋值后,结构体所对应的动态内存所存储的信息必须与赋值后的成员变量的数值相一致。原创 2017-03-27 16:23:46 · 1373 阅读 · 0 评论 -
java开发C解释器:实现解释器内部模块间的通讯
本节我们讨论,如何使用观察者模式在解释器的不同组件间实现消息通讯机制原创 2017-03-20 15:41:12 · 651 阅读 · 0 评论 -
java开发C语言模拟器:sizeof函数的实现
在C语言中,有一个非常基础,也是极其重要的函数,就是sizeof, 这个函数的作用是计算变量所占内存的大小。只有知道了对应变量的大小,那么我们才能动态分配对应大小的内存原创 2017-03-09 16:07:49 · 1272 阅读 · 0 评论 -
面试算法:计算堆栈当前元素的最大值
堆栈的常用操作有, pop 弹出堆栈顶部的元素;push 向堆栈压入一个元素;peek 获得堆栈顶部的元素值,但不弹出堆栈。现在要去你增加一个操作max, 它的作用是返回堆栈当前所有元素中值最大的那个元素原创 2017-02-24 10:11:14 · 2326 阅读 · 0 评论 -
java开发C解释器:实现动态内存的分配和读写
C语言有一个强大的功能,就是通过指针直接操作内存,正是因为C语言含有直接读写内存的机制,使得C语言在系统开发,底层开发等方面,占据了难以撼动的地位,同时也正是这个原因,C语言开发的程序常常出现内存泄漏和野指针等及其令人头疼的问题。本节,我们为解释器添加动态内存的分配和读写机制,完成本节内容后,解释器能解释执行有关动态内存的分配和读写的C代码原创 2017-02-02 12:10:55 · 1272 阅读 · 0 评论 -
算法面试题:逆时针打印二叉树外围边缘
本文研究了二叉树外部边缘的逆时针遍历算法原创 2017-06-17 17:34:12 · 1980 阅读 · 1 评论 -
java开发C编译器:jvm函数调用时的参数传递
在上一节我们把C代码转换成java字节码的例子中,C语言函数含有两个局部变量,这两个变量会对应于队列上的某两个元素,他们到底对应队列上哪个元素是可以由代码指定的,只要访问变量时,从队列的相应位置读取就可以,但有一种情况,局部变量与队列中的元素位置是一一对应的,这种情况就是函数的输入参数原创 2017-06-29 16:36:42 · 1085 阅读 · 0 评论 -
java开发操作系统:一个程序向另一个程序伸出的咸猪手
一个恶意进程如何侵入用户进程的内存原创 2017-12-06 16:17:51 · 2952 阅读 · 0 评论 -
java开发系统内核:使用LDT保护进程数据和代码
使用LDT局部描述符表保护进程代码和数据原创 2017-12-08 15:28:29 · 560 阅读 · 0 评论 -
java开发编译器:把C语言的循环指令编译成java字节码
把C语言的循环指令:for, while等编译成java字节码原创 2017-10-24 16:37:39 · 723 阅读 · 0 评论 -
面试算法: 隐藏在《编程珠玑》中二十年的bug及二分查找法的实现
我们看看隐藏在《编程珠玑》有关二分查找法代码实现中隐藏了二十年的bug,并探讨与二分查找相关的面试算法题。原创 2017-09-12 17:02:04 · 2553 阅读 · 1 评论 -
java开发编译器:把结构体数组编译成java字节码
把含有结构体数组的C语言代码编译成java字节码原创 2017-09-02 16:56:22 · 884 阅读 · 0 评论 -
java开发C语言编译器:消除冗余语句和把ifelse控制语句编译成字节码
把C语言ifelse控制分支语句编译成java字节码原创 2017-09-23 17:13:33 · 760 阅读 · 0 评论 -
java开发C编译器:把struct编译成class
把C语言中的struct结构体编译成java中的class原创 2017-08-15 17:27:16 · 1007 阅读 · 0 评论 -
面试算法:波浪型数组的快速排序法
波浪型数组是具备这样特性的数组,它的元素先是递增,到达某个点后开始低贱,接着达到某个点时又递增,接着右递减。我们看看如何依赖堆排序对波浪形数组进行快速有效的排序。原创 2017-08-04 11:00:22 · 1595 阅读 · 0 评论 -
java开发C语言编译器:把C语言的数组操作转换成java字节码
让编译器把C语言代码中对数组的相关操作编译成java字节码原创 2017-07-24 15:57:49 · 2278 阅读 · 0 评论 -
微软亚洲工程院面试题:寻找两个二叉树节点的最近祖先
给定一颗二叉树,并指定二叉树中任意两个节点,要求找出这两个节点在二叉树中的最近祖先,假定二叉树每个节点都有一个指向其父节点的指针原创 2017-06-27 12:01:21 · 693 阅读 · 0 评论 -
java开发C语言编译器:把printf编译成java字节码的算法详解
本文详细描述了如何把C语言中的printf函数调用编译成对应的java字节码原创 2017-07-11 15:42:07 · 863 阅读 · 0 评论 -
java开发C语言解释器:实现指针直接读写
上一节,我们实现了内存的数组化访问,本节的目的是实现通过指针直接对内存进行读写,完成本节后,我们的解释器将能正确的解释执行如下语句:*(p+1) = 1;原创 2017-02-14 12:05:41 · 723 阅读 · 0 评论 -
java开发C语言解释器:间套结构体的解释和执行
根据上一节的理论,我们知道,结构体变量所对应的Symbol对象,它包含了一个链表,这个链表把结构体里面的变量串联起来,当要访问结构体的某个子域时,先找到该结构体的 Symbol对象,从该对象中得到子域链表,再从链表中,根据要访问的子域的名称,找到子域对应的Symbol对象,那么对结构体子域的读写可以直接转换成子域Symbol对象的读写。原创 2017-03-02 11:55:38 · 702 阅读 · 1 评论 -
java开发C语言解释器:函数递归调用时的环境保护
函数调用时,参数的传递是通过堆栈实现的,也就是每次出现函数调用,系统会先设置好一个堆栈,然后把要传递的参数压入堆栈,函数执行完毕后,再将参数从堆栈中弹出。但是,我们解释器的实现是,所以变量在符号表中只有一份拷贝,因此递归调用时,子函数对自己局部变量的修改会同时影响到父函数的对应变量,这样就会导致运行时逻辑混乱,本节将致力于解决这个问题。原创 2017-01-24 10:55:50 · 681 阅读 · 0 评论 -
用java做操作系统内核:软盘读写
在前两节,我们将一段代码通过软盘加载到了系统内存中,并指示cpu执行加入到内存的代码,事实上,操作系统内核加载也是这么做的。只不过我们加载的代码,最大只能512 byte, 一个操作系统内核,少说也要几百兆,由此,系统内核不可能直接从软盘读入系统内存。通常的做法是,被加载进内存的512Byte程序,实际上是一个内核加载器,它运行起来后,通过读取磁盘,将存储在磁盘上的内核代码加载到指定的内存空间原创 2016-07-10 11:27:38 · 6045 阅读 · 14 评论 -
java开发编译器:中间语言格式
在通常情况下,编译器会将目标语言转换成某种中间语言格式,而不是直接将源代码转换成二进制机器指令。不少C语言编译器,都会将代码编译成汇编语言,然后再通过汇编编译器将汇编代码转换成目标机器可执行的二进制代,这一节我们讨论编译器如何生成中间代码原创 2016-08-17 15:49:02 · 1968 阅读 · 0 评论 -
用java开发编译器:构建LR跳转表
本节,我们探讨如何通过LALR(1)有限状态机构建能用于自底向上语法分析的跳转表原创 2016-08-04 16:19:46 · 940 阅读 · 0 评论 -
java开发编译器:自底向上语法解析的基本原理
自底向上的语法解析,依赖于一种语法格式,我们可称之为LALR(1),跟LL(1)语法类似,LALR语法有以下特点,第二个L表示在解析语法时,从左向右读取语法文本。R表示right most, 也就是在做语法解析时,我们从推导表达式最右边的非终结符开始进行替换解析,LA意思是LOOK AHEAD, 跟LL(1)一样,LALR(1)语法解析时,也需要预先读取输入字符才能做下一步的解析。LR语法比LL语法更灵活,也更容原创 2016-06-20 15:53:13 · 1930 阅读 · 1 评论 -
java开发编译器:构建LR语法的有限状态自动机
前一节,我们看到,要使用LR语法来解析输入文本,需要根据语法规则构建一个有限状态自动机,然后根据自动机创建一个解析表,然后我们的解析程序才能依赖解析表对输入文本进行解析。本节我们主要研究,在给定了LR语法后,有限状态自动机是如何构建的。原创 2016-07-01 19:21:55 · 2212 阅读 · 0 评论 -
java开发编译器:LR 状态机的缺陷与改进
前两节我们构造的状态机有些缺陷,本节,我们详细讨论上一节构建的LR有限状态自动机存在的缺陷,同时给出弥补缺陷的算法实现原创 2016-07-10 11:39:11 · 1839 阅读 · 2 评论 -
java开发编译器之:LALR语法解析及代码生成
自顶向下的语法解析中,可以通过属性传递的方式去实现代码生成,属性传递的方式主要是在父函数调用子函数时,将属性作为参数进行传递。但是,就如上节我们看到的,LALR语法解析过程是通过栈而不是函数调用的方式来实现的,这节,我们注重研究如何在LALR的解析过程中实现属性传递,从而实现代码生成。原创 2016-06-25 11:27:41 · 1517 阅读 · 0 评论 -
用java开发编译器之:代码实现Thompson构造1,输入文本预处理
阅读博客的朋友可以到我的网易云课堂中,通过视频的方式查看代码的调试和执行过程: http://study.163.com/course/courseMain.htm?courseId=1002830012本节目的是Thompson构造实现的第一步,输入文本预处理.本节的代码可以在云课堂的附件中提取。本节代码的目录结构如下: 我们程序的目的,是希望将文本格式的正则表达原创 2016-04-14 10:32:01 · 3339 阅读 · 2 评论 -
用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机
阅读博客的朋友可以到我的网易云课堂中,通过视频的方式查看代码的调试和执行过程: http://study.163.com/course/courseMain.htm?courseId=1002830012上一节,我们通过代码,实现了一个有限状态自动机,并将其应用于对整形和浮点数的识别。构造有限状态自动机,并驱动它,从而实现对输入字符串的识别,整个过程就是词法分析的本质。 上原创 2016-04-06 10:18:41 · 7878 阅读 · 0 评论 -
编译原理动手实操,用java实现编译器-算术表达式及其语法解析器的实现
大家在参考本节时,请先阅读以下博文,进行预热:http://blog.csdn.net/tyler_download/article/details/50708807 本节代码下载地址:http://pan.baidu.com/s/1sjWiwPn代码的理解和运行是吃透编译原理的关键,如果我们看的是爱情动作片,自然选择无码的好,但如果看得是计算机课程,则必须有码,无码的计算机理原创 2016-02-26 17:14:53 · 6145 阅读 · 3 评论 -
用java实现编译器之有限状态机驱动的整形,浮点型数值识别器
大家好,欢迎大家来到coding迪斯尼.本节代码可在如下链接下载:http://pan.baidu.com/s/1jHqNGjk或是网易云课堂视频所在附件。阅读博客的朋友可以到我的网易云课堂中,通过视频的方式查看代码的调试和执行过程: http://study.163.com/course/courseMain.htm?courseId=1002830012继上一节原创 2016-03-21 16:40:12 · 1672 阅读 · 1 评论