화재 테스트: 재귀 계승

PHPz
풀어 주다: 2024-08-14 10:45:05
원래의
1149명이 탐색했습니다.

Teste de fogo: fatorial recursivo

POJ(JVM의 Pascal)을 따르지 않는 사람들을 위해 하위 집합을 Pascal에서 JASM( Java Assembly)를 통해 JVM을 실행 환경으로 사용할 수 있습니다.

지난 게시물에서는 Pascalread/readln 지원, 즉 표준 입력(stdin)에서 데이터를 읽을 수 있는 기능이 구현되었습니다. 이 간행물에서는 POJ의 목표 중 하나인 표준 입력에서 숫자를 읽고 계승을 재귀적으로 계산하는 작업을 완료합니다.

JVM용으로 컴파일하는 동안 이 놀라운 가상 머신의 다양한 지점의 기능을 자세히 설명할 필요가 있습니다. 따라서 JVM의 내부 기능과 일부 지침(opcode)을 여러 번 자세히 설명합니다.

재귀 계승, 케이크 장식 :-)

프로젝트 초반에 언급했듯이 목표 중 하나는 표준 입력에서 계산할 숫자를 읽어 팩토리얼을 재귀적으로 계산할 수 있도록 하는 것이었습니다. 현재까지 POJ의 구현을 통해 다음과 같은 목표가 가능해졌습니다.

  • Hello world: ANTLR, 파서 및 코드 생성 Java 어셈블리;
  • 를 사용하여 프로젝트의 코드 베이스 생성
  • 덧셈, 뺄셈, 곱셈, 나눗셈 연산자 및 조건문 시작 - if: 연산자 지원 시작 및 조건문 초기 지원
  • Repeat, while 및 for: 반복 구조 지원
  • 파스칼의 함수: 재귀 함수 구현

이제 지금까지 개발된 내용을 검증할 때가 왔습니다. 아래 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿