Bagi mereka yang tidak mengikuti POJ (Pascal pada JVM) ia adalah pengkompil yang mengubah subset daripada Pascal kepada JASM ( Java Assembly) supaya kita boleh menggunakan JVM sebagai persekitaran pelaksanaan.
Dalam siaran terakhir, sokongan untuk baca/bacaln daripada Pascal telah dilaksanakan, fungsi yang membenarkan membaca data daripada input standard (stdin). Dalam penerbitan ini kami akan melengkapkan salah satu objektif POJ: membaca nombor daripada input standard dan mengira faktorial secara rekursif.
Ketika kami sedang menyusun untuk JVM, adalah perlu untuk memperincikan fungsi pelbagai titik mesin maya yang luar biasa ini. Oleh itu, pada pelbagai masa saya memperincikan fungsi dalaman JVM serta beberapa arahannya (opcodes).
Seperti yang dinyatakan pada permulaan projek, salah satu objektif adalah untuk dapat mengira faktorial secara rekursif, membaca nombor yang akan dikira daripada input standard. Pelaksanaan dalam POJ sehingga kini telah membolehkan objektif ini:
Kini masanya telah tiba untuk mengesahkan apa yang telah dibangunkan setakat ini. Yang berkata, daripada program Pascal di bawah:
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 menjana dengan betul pemasangan berikut:
// 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 } }
Di sini kita sampai ke penghujung perjalanan pembelajaran ini dengan projek ini.
Beberapa perkara menarik dalam bidang penyusun boleh diterokai dengan projek ini (seperti pengoptimuman kod yang dijana). Siapa tahu, mungkin dalam masa terdekat kami akan memulakan siri baharu dengan pengoptimuman :-)
Repositori dengan kod dan dokumentasi lengkap projek ada di sini.
Atas ialah kandungan terperinci Ujian kebakaran: faktorial rekursif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!