POJ(JVM의 Pascal)을 따르지 않는 사람들을 위해 하위 집합을 Pascal에서 JASM( Java Assembly)를 통해 JVM을 실행 환경으로 사용할 수 있습니다.
지난 게시물에서는 오류 캡처, 문자열 유형에 대한 관계 연산자 지원, Pascal의 프로시저 정의(및 사용) 가능성이 일부 개선되었습니다.
이 간행물에서는 Pascal 함수(함수)에 대한 지원을 다룹니다. 얼마 지나지 않아 프로젝트의 마지막 목표인 표준 입력에서 숫자를 읽고 계승값을 계산하는 작업을 완료할 수 있습니다.
JVM용으로 컴파일하는 동안 이 놀라운 가상 머신의 다양한 지점의 기능을 자세히 설명할 필요가 있습니다. 따라서 JVM의 내부 기능과 일부 지침(opcode)을 여러 번 자세히 설명합니다.
지금까지는 Pascal의 프로시저를 정의하고 호출하는 방법이 있었습니다. 이 PR에서 Pascal의 함수를 정의하고 호출하는 것도 가능합니다.
이 커밋에서는 JVM이 함수 정의 및 호출을 처리하는 방법을 이해하기 위해 Java 프로그램을 구현했습니다. 아래 Java 프로그램에서:
public class FunctionCall { public static void main(String[] args) { System.out.println("Hello from main!"); System.out.println(myMethod()); } static String myMethod() { return "Hello from myMethod!"; } }
클래스를 분해하면 다음과 같은 어셈블리가 생성됩니다.
1: public class FunctionCall { 2: public static main([java/lang/String)V { 3: getstatic java/lang/System.out java/io/PrintStream 4: ldc "Hello from main!" 5: invokevirtual java/io/PrintStream.println(java/lang/String)V 6: 7: getstatic java/lang/System.out java/io/PrintStream 8: invokestatic FunctionCall.myMethod()java/lang/String 9: invokevirtual java/io/PrintStream.println(java/lang/String)V 10: 11: return 12: } 13: 14: static myMethod()java/lang/String { 15: ldc "Hello from myMethod!" 16: 17: areturn 18: } 19: }
이 예를 통해 다음을 확인할 수 있습니다.
아래 Pascal 프로그램에서 가져온 내용은 다음과 같습니다.
program function_call_wo_params; function myfunction : string; begin myfunction := 'Hello from myfunction!'; end; begin writeln('Hello from main!'); writeln(myfunction()); end.
POJ는 다음 JASM을 생성하도록 조정되었습니다.
// Code generated by POJ 0.1 public class function_call_wo_params { ;; function myfunction : string; static myfunction()java/lang/String { ldc "Hello from myfunction!" astore 100 ;; Posição 100 guarda o retorno da função aload 100 ;; Empilha o retorno da função areturn ;; Deixa "Hello from myfunction!" na pilha } ;; procedure principal (main) public static main([java/lang/String)V { ;; writeln('Hello from main!'); getstatic java/lang/System.out java/io/PrintStream ldc "Hello from main!" invokevirtual java/io/PrintStream.print(java/lang/String)V getstatic java/lang/System.out java/io/PrintStream invokevirtual java/io/PrintStream.println()V ;; writeln(myfunction()); getstatic java/lang/System.out java/io/PrintStream invokestatic function_call_wo_params.myfunction()java/lang/String invokevirtual java/io/PrintStream.print(java/lang/String)V getstatic java/lang/System.out java/io/PrintStream invokevirtual java/io/PrintStream.println()V return } }
가장 세심한 사람은 위의 "astore 100"을 보고 다음과 같이 생각했을 것입니다.
이 커밋은 기호 테이블과 파서에서 "함수" 유형에 대한 지원을 구현합니다.
위의 예에서 함수에는 인수가 없습니다. 이 커밋에서는 인수가 있는 함수에 대해 예상되는 결과가 구현되었습니다. 아래의 Pascal 프로그램에서 이를 사용하세요.
program function_call_with_two_params; function addvalues(value1, value2: integer) : integer; begin addvalues := value1 + value2; end; begin writeln('2+4=', addvalues(2, 4)); end.
POJ가 다음 JASM을 올바르게 생성했습니다.
// Code generated by POJ 0.1 public class function_call_with_two_params { ;; function addvalues(value1, value2: integer) : integer; static addvalues(I, I)I { ;; addvalues := value1 + value2; iload 0 iload 1 iadd istore 100 iload 100 ireturn } ;; procedure main public static main([java/lang/String)V { ;; writeln('2+4=', ...); getstatic java/lang/System.out java/io/PrintStream ldc "2+4=" invokevirtual java/io/PrintStream.print(java/lang/String)V getstatic java/lang/System.out java/io/PrintStream ;; aqui código para invocar addvalues(2, 4) sipush 2 sipush 4 invokestatic function_call_with_two_params.addvalues(I, I)I ;; aqui código para invocar writeln com retorno addvalues invokevirtual java/io/PrintStream.print(I)V getstatic java/lang/System.out java/io/PrintStream invokevirtual java/io/PrintStream.println()V return } }
다음 간행물에서는 컨텍스트, 발견된 버그, 중첩 문장, 데이터 입력에 대해 이야기하고 이 프로젝트의 마지막 목표인 계승을 재귀적으로 계산한다는 결론을 내릴 것입니다.
프로젝트의 전체 코드와 문서가 포함된 저장소가 여기에 있습니다.
위 내용은 파스칼 함수 지원의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!