POJ(JVM의 Pascal)을 따르지 않는 사람들을 위해 하위 집합을 Pascal에서 JASM( Java Assembly)를 통해 JVM을 실행 환경으로 사용할 수 있습니다.
지난 게시물에서는 Pascal의 read/readln 지원, 즉 표준 입력(stdin)에서 데이터를 읽을 수 있는 기능이 구현되었습니다. 이 간행물에서는 POJ의 목표 중 하나인 표준 입력에서 숫자를 읽고 계승을 재귀적으로 계산하는 작업을 완료합니다.
JVM용으로 컴파일하는 동안 이 놀라운 가상 머신의 다양한 지점의 기능을 자세히 설명할 필요가 있습니다. 따라서 JVM의 내부 기능과 일부 지침(opcode)을 여러 번 자세히 설명합니다.
프로젝트 초반에 언급했듯이 목표 중 하나는 표준 입력에서 계산할 숫자를 읽어 팩토리얼을 재귀적으로 계산할 수 있도록 하는 것이었습니다. 현재까지 POJ의 구현을 통해 다음과 같은 목표가 가능해졌습니다.
이제 지금까지 개발된 내용을 검증할 때가 왔습니다. 아래 Pascal 프로그램에서는 다음과 같습니다.
program fatorial; var numero : integer; function fatorial(n : integer) : integer; begin if n<0 then fatorial := 0 else begin if n<=1 then fatorial := 1 else fatorial := n * fatorial(n-1); end; end; begin write('Introduza numero inteiro: '); readln(numero); writeln; writeln('O fatorial de ', numero, ' e: ', fatorial(numero)); end.
POJ는 다음 어셈블리를 올바르게 생성합니다.
// Code generated by POJ 0.1 public class fatorial { public static numero I static fatorial(I)I { iload 0 sipush 0 if_icmpge L4 iconst 1 goto L5 L4: iconst 0 L5: ifeq L1 sipush 0 istore 100 goto L2 L1: iload 0 sipush 1 if_icmpgt L9 iconst 1 goto L10 L9: iconst 0 L10:ifeq L6 sipush 1 istore 100 goto L7 L6: iload 0 iload 0 sipush 1 isub invokestatic fatorial.fatorial(I)I imul istore 100 L7: L2: iload 100 ireturn } public static main([java/lang/String)V { getstatic java/lang/System.out java/io/PrintStream ldc "Introduza numero inteiro: " invokevirtual java/io/PrintStream.print(java/lang/String)V invokestatic java/lang/System.console()java/io/Console invokevirtual java/io/Console.readLine()java/lang/String invokestatic java/lang/Integer.parseInt(java/lang/String)I putstatic fatorial.numero I getstatic java/lang/System.out java/io/PrintStream invokevirtual java/io/PrintStream.println()V getstatic java/lang/System.out java/io/PrintStream ldc "O fatorial de " invokevirtual java/io/PrintStream.print(java/lang/String)V getstatic java/lang/System.out java/io/PrintStream getstatic fatorial.numero I invokevirtual java/io/PrintStream.print(I)V getstatic java/lang/System.out java/io/PrintStream ldc " e: " invokevirtual java/io/PrintStream.print(java/lang/String)V getstatic java/lang/System.out java/io/PrintStream getstatic fatorial.numero I invokestatic fatorial.fatorial(I)I invokevirtual java/io/PrintStream.print(I)V getstatic java/lang/System.out java/io/PrintStream invokevirtual java/io/PrintStream.println()V return } }
이제 이 프로젝트로 배움의 여정이 끝났습니다.
이 프로젝트를 통해 컴파일러 영역의 몇 가지 흥미로운 사항(예: 생성된 코드 최적화)을 탐색할 수 있습니다. 누가 알겠습니까? 가까운 시일 내에 최적화를 통해 새로운 시리즈를 시작할 것입니다 :-)
프로젝트의 전체 코드와 문서가 포함된 저장소가 여기에 있습니다.
위 내용은 화재 테스트: 재귀 계승의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!