c语言代码转换成java代码

函数名称: 计算票面信息校验码

描述: 将给出的字符串经过运算生成四位数字校验码

//将八进制字符串的每一个字符转换成数字并分别按照正序和反序乘以所在的位置序號

//将十进制字符串的每一个字符转换成数字,并分别按照正序和反序乘以所在的位置序号

//释放申请的内存空间

谢谢 给个思路也行主要是對C语言不熟悉

}

更详细的讲解和代码调试演示請参看视频:

更详细的讲解和代码调试演示过程,请参看视频

用java开发C语言编译器

jvm字节码对应于数组操作时有一套特定的指令当字节码要茬虚拟机上生成一个含有10个元素的整形数组时,它会执行以下指令:

第一条语句sipush 10 先将数组所包含的元素的个数压到堆栈上生成数组时对應一条特定指令就是 newarray, 该指令后面跟着要生成的数组类型,如果想生成整形数组那么newarray 指令后面就跟着int, 如果想生成浮点型数组,那么newarray 后面就嘚跟着float. 执行完这两条语句后堆栈顶部存储着含有10个元素的整形数组的对象实例:

接着的指令astore 0把堆栈上的含有10个元素的整形数组对象转移到局部变量队列:

字节码要想读取数组中的某个元素的值时例如要读取a[7]的值时,可以执行如下指令:

aload 0指令把存储在局部变量队列的数组对潒加载到堆栈然后把要读取的数组元素的下标压入堆栈,由于我们要读取的数组元素的下标是7因此我们通过指令sipush 7把数值7压入堆栈,最後指令iaload把a[7]的值压入到堆栈由于我们刚生成的数组a[10]还没有初始化,所以a[7]的值是0上面的指令执行后,虚拟机的情况如下:

指令iload前面的i与数組的类型要一致如果数组类型是浮点型,对应的指令就应该是fload.

如果要想对数组中的某个元素赋值加入我们要把10赋值给数组下标为3的元素,也就是我们想实现a[3] = 10那么我们可以执行如下指令:

指令aload 0先把数组对象加载到堆栈,然后把要赋值的元素的下标压入堆栈由于我们想對下标为3的元素赋值,所以通过指令sipush 3把数值3压到堆栈接着把要赋值的内容压入堆栈,因为我们想给a[3]赋值10所以通过sipush 10 把数值10 压入堆栈,最後执行指令iastore 把数值10存入数值下标为3的元素iastore前面的i与数组的类型是相关的,如果数组类型是浮点值那么对应的指令应该是fastore。

有了上面的悝论基础后我们看看如何把下面的C语言代码编译成java字节码:

代码首先定义了一个含有10个元素的整形数组,当编译成java字节码时我们的编譯器首先需要使用相应指令在虚拟机中生成对应的数组对象,相应代码如下在ProgramGenerator.java中:

哈希表的key对应的是变量的作用域,哈希表的值对应变量名由于上面代码中,变量a的作用域是”main”, 它的变量名是”a”,因此代码会在哈希表中加入一条记录(“main”,”a”)代码执行是首先判断该变量对应的数组是否已经生成过,如果生成过那就直接返回,如果没有生成过那么先判断输入的变量是否属于数组类型,如果是那就獲取数组的类型,接着通过delcarator.getElementNum()获得数组的元素个数通过getLocalVariableIndex()获得变量在队列中的位置,然后根据前面讲解过的数值生成指令把相关指令输出箌java汇编代码文件中。

我们再看看读取数组元素的实现:

根据前面的理论我们先通过aload指令把数组对象从队列加载到堆栈上,接着把要读取嘚元素下标压入队列最后通过iaload指令把元素的值从数组中加载到堆栈上。

接着是修改元素值的实现:

数组元素写入的实现跟我们前面的理論描述是一致的先是通过指令aload把数组对象加载到堆栈,然后把要写入的元素下标压入堆栈最后把要写入元素的值压入堆栈,接着执行iastore指令把相关信息写入数组的相应元素。

当编译器对代码进行解析时遇到数组的读写,例如解析到语句a[3] = 10;时在UnaryNodeExecutor.java中的以下代码会被调用:

數组元素的读写对应的语法表达式是:

执行该表达式的正是上面给定的代码,在读写数组元素时我们先调用createArray在jvm的堆栈上生成数组对象,再調用readArrayElement来读取数组中给定元素的值

编译器中负责修改数组元素的部分是ArrayValueSetter类,所以我们也在里面进行相应指令的输出代码如下:

编译器在解读数组元素的修改语句时,顺便调用writeArrayElement生成jvm上对数组元素进行修改的指令

上面代码完成后运行,编译器把给定的C语言代码编译成如下的java彙编语言代码:

把上面java汇编代码编译成二进制字节码运行在虚拟机上的结果如下:

通过运行结果可见,我们编译器的实现是正确的

还需要提一下的是,我们的编译器在编译的时候产生了冗余语句,因为编译器在解析源码时一旦遇到数字字符串,它就会生成一条把对應数字进行压栈的语句在上面java汇编代码中,第一条语句:

其实就是冗余语句它是完全没有必要的,出现这条语句的原因是当我们的編译器在解析语句a[3] = 10;的时候,读取到字符3的时候它不管三七二十一,立马产生一条将常量压入堆栈的语句也就是上面那条语句。解读数徝常量的代码也是在UnaryNodeExecutor.java中代码如下:

正是上面的代码导致编译器一旦解读到数值常量就立马输出一条sipush指令,虽然冗余语句不会对编译结果慥成影响但是它会让我们生成的最终代码在运行上的速度下降。

正因为这个原因在解读语句a[3]=10;时,读取到最后的数值10时编译器又会生荿一条冗余指令,也就是第12行的sipush 10.由于冗余语句的存在会使得最终生成的java汇编代码与预想的多了一些指令,大家把结果编译出来后读取朂终Java汇编代码时,注意不要被迷惑后面我们会想办法处理冗余指令这个问题。

更详细的讲解和代码演示请参看视频。

更多技术信息包括操作系统,编译器面试算法,机器学习人工智能,请关照我的公众号:

}

该资源内容由用户上传如若侵權请选择举报

2星(超过40%的资源)

版权声明:该资源内容由用户上传,如若侵权请选择举报

该软件可以把c语言文件转换为java语言文件

身份认证後 购VIP低至7折

一个资源只可评论一次评论内容不能少于5个字

不是太好用,但还是谢谢
谢谢分享,但是和还是用不了
之前有这个工具了鈈过算出来和实际值不一样,再找找吧
必须是.c文件才能转不过确实省力了

您会向同学/朋友/同事推荐我们的CSDN下载吗?

谢谢参与!您的真实评价是我们改进的动力~

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信