POJ(JVM의 Pascal)을 따르지 않는 사람들을 위해 하위 집합을 Pascal에서 JASM( Java Assembly)를 통해 JVM을 실행 환경으로 사용할 수 있습니다.
지난 포스트에서는 context(parser에서)와 중첩 문장에 대해 논의했습니다. 이 간행물에서는 Pascal의 read/readln 함수를 사용하여 표준 입력(stdin)에서 데이터를 읽을 수 있도록 하는 데 필요한 변경 사항에 대해 설명합니다. .
JVM용으로 컴파일하는 동안 이 놀라운 가상 머신의 다양한 지점의 기능을 자세히 설명할 필요가 있습니다. 따라서 JVM의 내부 기능과 일부 지침(opcode)을 여러 번 자세히 설명합니다.
표준 입력(stdin)은 프로그램이 입력 데이터를 읽는 스트림입니다. 지금까지 우리는 stdout(표준 출력)만 지원했습니다.
이 commit에서는 JVM이 stdin:
을 처리하는 방법을 이해하기 위해 Java 프로그램이 구현되었습니다.
public class InputData { public static String name; public static int age; public static void main(String[] args) { name = System.console().readLine(); age = Integer.parseInt(System.console().readLine()); System.out.println("You entered string " + name); }
class 파일을 분해하면 아래 어셈블리가 생성됩니다. 관련 없는 스니펫은 생략하고 어셈블리를 발생시킨 원본 스니펫(Java)에는 ";;":
을 삽입했습니다.
1: public class InputData { 2: ;; public static String name; 3: public static name java/lang/String 4: 5: ;; public static int age; 6: public static age I 7: 8: public static main([java/lang/String)V { 9: ;; name = System.console().readLine(); 10: invokestatic java/lang/System.console()java/io/Console 11: invokevirtual java/io/Console.readLine()java/lang/String 12: putstatic InputData.name java/lang/String 13: 14: ;; age = Integer.parseInt(System.console().readLine()); 15: invokestatic java/lang/System.console()java/io/Console 16: invokevirtual java/io/Console.readLine()java/lang/String 17: invokestatic java/lang/Integer.parseInt(java/lang/String)I 18: putstatic InputData.age I 19: 20: ;; System.out.println("You entered string " + name); 21: getstatic java/lang/System.out java/io/PrintStream 22: getstatic InputData.name java/lang/String 23: invokedynamic makeConcatWithConstants(java/lang/String)java/lang/String { invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants(java/lang/invoke/MethodHandles$Lookup, java/lang/String, java/lang/invoke/MethodType, java/lang/String, [java/lang/Object)java/lang/invoke/CallSite ["You entered string "] } 24: 25: invokevirtual java/io/PrintStream.println(java/lang/String)V 26: 27: return } }
이 예에서는 stdin에서 데이터를 읽으려면 System.console().readLine() 명령(11행과 16행)을 사용해야 한다는 것을 식별할 수 있었습니다. ). 그리고 readLine()은 문자열을 반환하므로 숫자를 읽으려면 Integer.parseInt(17행) 함수를 사용하여 변환해야 했습니다.
아래 Pascal 프로그램에서 가져온 내용은 다음과 같습니다.
program NameAndAge; var myname: string; myage: integer; begin write('What is your name? '); readln(myname); write('How old are you? '); readln(myage); writeln; writeln('Hello ', myname); writeln('You are ', myage, ' years old'); end.
POJ는 다음 JASM을 생성하도록 조정되었습니다.
// Code generated by POJ 0.1 public class name_and_age { ;; var myname: string; public static myname java/lang/String ;; var myage: integer; public static myage I ;; procedure main public static main([java/lang/String)V { ;; write('What is your name? '); getstatic java/lang/System.out java/io/PrintStream ldc "What is your name? " invokevirtual java/io/PrintStream.print(java/lang/String)V ;; readln(myname); invokestatic java/lang/System.console()java/io/Console invokevirtual java/io/Console.readLine()java/lang/String putstatic name_and_age.myname java/lang/String ;; write('How old are you? '); getstatic java/lang/System.out java/io/PrintStream ldc "How old are you? " invokevirtual java/io/PrintStream.print(java/lang/String)V ;; readln(myage); 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 name_and_age.myage I ;; writeln; getstatic java/lang/System.out java/io/PrintStream invokevirtual java/io/PrintStream.println()V ;; writeln('Hello ', myname); getstatic java/lang/System.out java/io/PrintStream ldc "Hello " invokevirtual java/io/PrintStream.print(java/lang/String)V getstatic java/lang/System.out java/io/PrintStream getstatic name_and_age.myname 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 ;; writeln('You are ', myage, ' years old'); getstatic java/lang/System.out java/io/PrintStream ldc "You are " invokevirtual java/io/PrintStream.print(java/lang/String)V getstatic java/lang/System.out java/io/PrintStream getstatic name_and_age.myage I invokevirtual java/io/PrintStream.print(I)V getstatic java/lang/System.out java/io/PrintStream ldc " years old" invokevirtual java/io/PrintStream.print(java/lang/String)V getstatic java/lang/System.out java/io/PrintStream invokevirtual java/io/PrintStream.println()V return } }
이 커밋은 POJ 파서에 필요한 변경 사항을 구현합니다.
홍보 전문입니다.
다음 발행물에서는 이 프로젝트의 목표 중 하나인 계승을 재귀적으로 계산하는 작업을 완료할 것입니다.
프로젝트의 전체 코드와 문서가 포함된 저장소가 여기에 있습니다.
위 내용은 표준 입력(stdin)에서 데이터 읽기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!