Programming Language Levels: Java

Natural Language Level

The following prompt was entered into Microsoft CoPilot, with no follow up prompts. Note the typo where the word computer should have been computes. This did not cause any problems for the LLM.


    Write a Java Program to output the nth fibonacci number where the user inputs n.
    Include a method called fibonacci(n) which computer the nth fibonacci number
    iteratively.
    

High-Level Language Level

The high level language typically gets compiled to machine language. In java, that machine language is ByteCode, which itself is interpreted by the Java Virtual Machine or compiled to the hardware's machine language at runtime with a Just-In-Time compiler (JIT). CoPilot generated two solutions to this prompt. This one uses long values for the result. The other version, not shown, used BigIntegers allowing it to handle inputs greater than 92.


    
import java.util.Scanner;

public class Fibonacci {

    // Computes the nth Fibonacci number iteratively (0-based: F(0)=0, F(1)=1)
    public static long fibonacci(int n) {
        if (n < 0) {
            throw new IllegalArgumentException("n must be non-negative.");
        }
        if (n == 0) return 0L;
        if (n == 1) return 1L;

        long prev = 0L;  // F(0)
        long curr = 1L;  // F(1)

        for (int i = 2; i <= n; i++) {
            long next = prev + curr;
            prev = curr;
            curr = next;
        }
        return curr;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter n (non-negative integer): ");
        if (!scanner.hasNextInt()) {
            System.out.println("Invalid input. Please enter a non-negative integer.");
            return;
        }

        int n = scanner.nextInt();
        if (n < 0) {
            System.out.println("n must be non-negative.");
            return;
        }
        if (n > 92) {
            System.out.println("Warning: n > 92 will overflow a 64-bit long. Try the BigInteger version below.");
        }

        long result = fibonacci(n);
        System.out.println("F(" + n + ") = " + result);
    }
}


    

Assembly Language Level

Assembly language is a human readable form or machine instructions. A Java class can be disassembled into a type of assembly using the javap command. Unlike traditional compiled languages, there is no assembler in the Java Development Kit.


Compiled from "Fibonacci.java"
public class Fibonacci {
  public Fibonacci();
    Code:
         0: aload_0
         1: invokespecial #8                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 12: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   LFibonacci;

  public static long fibonacci(int);
    Code:
         0: iload_0
         1: ifge          14
         4: new           #16                 // class java/lang/IllegalArgumentException
         7: dup
         8: ldc           #18                 // String n must be non-negative.
        10: invokespecial #20                 // Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/String;)V
        13: athrow
        14: iload_0
        15: ifne          20
        18: lconst_0
        19: lreturn
        20: iload_0
        21: iconst_1
        22: if_icmpne     27
        25: lconst_1
        26: lreturn
        27: lconst_0
        28: lstore_1
        29: lconst_1
        30: lstore_3
        31: iconst_2
        32: istore        5
        34: goto          50
        37: lload_1
        38: lload_3
        39: ladd
        40: lstore        6
        42: lload_3
        43: lstore_1
        44: lload         6
        46: lstore_3
        47: iinc          5, 1
        50: iload         5
        52: iload_0
        53: if_icmple     37
        56: lload_3
        57: lreturn
      LineNumberTable:
        line 16: 0
        line 17: 4
        line 19: 14
        line 20: 20
        line 22: 27
        line 23: 29
        line 25: 31
        line 26: 37
        line 27: 42
        line 28: 44
        line 25: 47
        line 30: 56
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      58     0     n   I
           29      29     1  prev   J
           31      27     3  curr   J
           34      22     5     i   I
           42       5     6  next   J

  public static void main(java.lang.String[]);
    Code:
         0: new           #33                 // class java/util/Scanner
         3: dup
         4: getstatic     #35                 // Field java/lang/System.in:Ljava/io/InputStream;
         7: invokespecial #41                 // Method java/util/Scanner."<init>":(Ljava/io/InputStream;)V
        10: astore_1
        11: getstatic     #44                 // Field java/lang/System.out:Ljava/io/PrintStream;
        14: ldc           #48                 // String Enter n (non-negative integer):
        16: invokevirtual #50                 // Method java/io/PrintStream.print:(Ljava/lang/String;)V
        19: aload_1
        20: invokevirtual #55                 // Method java/util/Scanner.hasNextInt:()Z
        23: ifne          35
        26: getstatic     #44                 // Field java/lang/System.out:Ljava/io/PrintStream;
        29: ldc           #59                 // String Invalid input. Please enter a non-negative integer.
        31: invokevirtual #61                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        34: return
        35: aload_1
        36: invokevirtual #64                 // Method java/util/Scanner.nextInt:()I
        39: istore_2
        40: iload_2
        41: ifge          53
        44: getstatic     #44                 // Field java/lang/System.out:Ljava/io/PrintStream;
        47: ldc           #18                 // String n must be non-negative.
        49: invokevirtual #61                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        52: return
        53: iload_2
        54: bipush        92
        56: if_icmple     67
        59: getstatic     #44                 // Field java/lang/System.out:Ljava/io/PrintStream;
        62: ldc           #68                 // String Warning: n > 92 will overflow a 64-bit long. Try the BigInteger version below.
        64: invokevirtual #61                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        67: iload_2
        68: invokestatic  #70                 // Method fibonacci:(I)J
        71: lstore_3
        72: getstatic     #44                 // Field java/lang/System.out:Ljava/io/PrintStream;
        75: iload_2
        76: lload_3
        77: invokedynamic #72,  0             // InvokeDynamic #0:makeConcatWithConstants:(IJ)Ljava/lang/String;
        82: invokevirtual #61                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        85: return
      LineNumberTable:
        line 34: 0
        line 35: 11
        line 36: 19
        line 37: 26
        line 38: 34
        line 41: 35
        line 42: 40
        line 43: 44
        line 44: 52
        line 46: 53
        line 47: 59
        line 50: 67
        line 51: 72
        line 52: 85
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      86     0  args   [Ljava/lang/String;
           11      75     1 scanner   Ljava/util/Scanner;
           40      46     2     n   I
           72      14     3 result   J
}
    

ByteCode Level

Java ByteCode is the machine language of the Java Virtual Machine. It is stored in a binary file. The listing below shows the hexadecimal form of the binary in a typeical format for binary file dumps (created using the program hexdump). The dump shows three columns. The first column is the index of the line in hex. For example, the fourth line consists of 16 bytes starting at address 0x00000030 (48 in decimal). The second column is the actual binary data encoded as hex (digits 0..9,a..f). All Java class files start with the 4 byte value 0xcafebabe. The last column shows the character representation of any bytes which are in the range of ASCII printable characters. Other values are displayed as a period.


|Address |  Data - two hex digits/byte (16 bytes/line)        |Printable Chars |
|00000000|  ca fe ba be 00 00 00 44  00 62 07 00 02 01 00 09  |.......D.b......|
|00000010|  46 69 62 6f 6e 61 63 63  69 07 00 04 01 00 10 6a  |Fibonacci......j|
|00000020|  61 76 61 2f 6c 61 6e 67  2f 4f 62 6a 65 63 74 01  |ava/lang/Object.|
|00000030|  00 06 3c 69 6e 69 74 3e  01 00 03 28 29 56 01 00  |..<init>...()V..|
|00000040|  04 43 6f 64 65 0a 00 03  00 09 0c 00 05 00 06 01  |.Code...........|
|00000050|  00 0f 4c 69 6e 65 4e 75  6d 62 65 72 54 61 62 6c  |..LineNumberTabl|
|00000060|  65 01 00 12 4c 6f 63 61  6c 56 61 72 69 61 62 6c  |e...LocalVariabl|
|00000070|  65 54 61 62 6c 65 01 00  04 74 68 69 73 01 00 0b  |eTable...this...|
|00000080|  4c 46 69 62 6f 6e 61 63  63 69 3b 01 00 09 66 69  |LFibonacci;...fi|
|00000090|  62 6f 6e 61 63 63 69 01  00 04 28 49 29 4a 07 00  |bonacci...(I)J..|
|000000a0|  11 01 00 22 6a 61 76 61  2f 6c 61 6e 67 2f 49 6c  |..."java/lang/Il|
|000000b0|  6c 65 67 61 6c 41 72 67  75 6d 65 6e 74 45 78 63  |legalArgumentExc|
|000000c0|  65 70 74 69 6f 6e 08 00  13 01 00 17 6e 20 6d 75  |eption......n mu|
|000000d0|  73 74 20 62 65 20 6e 6f  6e 2d 6e 65 67 61 74 69  |st be non-negati|
|000000e0|  76 65 2e 0a 00 10 00 15  0c 00 05 00 16 01 00 15  |ve..............|
|000000f0|  28 4c 6a 61 76 61 2f 6c  61 6e 67 2f 53 74 72 69  |(Ljava/lang/Stri|
|00000100|  6e 67 3b 29 56 01 00 01  6e 01 00 01 49 01 00 04  |ng;)V...n...I...|
|00000110|  70 72 65 76 01 00 01 4a  01 00 04 63 75 72 72 01  |prev...J...curr.|
|00000120|  00 01 69 01 00 04 6e 65  78 74 01 00 0d 53 74 61  |..i...next...Sta|
|00000130|  63 6b 4d 61 70 54 61 62  6c 65 01 00 04 6d 61 69  |ckMapTable...mai|
|00000140|  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |n...([Ljava/lang|
|00000150|  2f 53 74 72 69 6e 67 3b  29 56 07 00 22 01 00 11  |/String;)V.."...|
|00000160|  6a 61 76 61 2f 75 74 69  6c 2f 53 63 61 6e 6e 65  |java/util/Scanne|
|00000170|  72 09 00 24 00 26 07 00  25 01 00 10 6a 61 76 61  |r..$.&..%...java|
|00000180|  2f 6c 61 6e 67 2f 53 79  73 74 65 6d 0c 00 27 00  |/lang/System..'.|
|00000190|  28 01 00 02 69 6e 01 00  15 4c 6a 61 76 61 2f 69  |(...in...Ljava/i|
|000001a0|  6f 2f 49 6e 70 75 74 53  74 72 65 61 6d 3b 0a 00  |o/InputStream;..|
|000001b0|  21 00 2a 0c 00 05 00 2b  01 00 18 28 4c 6a 61 76  |!.*....+...(Ljav|
|000001c0|  61 2f 69 6f 2f 49 6e 70  75 74 53 74 72 65 61 6d  |a/io/InputStream|
|000001d0|  3b 29 56 09 00 24 00 2d  0c 00 2e 00 2f 01 00 03  |;)V..$.-..../...|
|000001e0|  6f 75 74 01 00 15 4c 6a  61 76 61 2f 69 6f 2f 50  |out...Ljava/io/P|
|000001f0|  72 69 6e 74 53 74 72 65  61 6d 3b 08 00 31 01 00  |rintStream;..1..|
|00000200|  20 45 6e 74 65 72 20 6e  20 28 6e 6f 6e 2d 6e 65  | Enter n (non-ne|
|00000210|  67 61 74 69 76 65 20 69  6e 74 65 67 65 72 29 3a  |gative integer):|
|00000220|  20 0a 00 33 00 35 07 00  34 01 00 13 6a 61 76 61  | ..3.5..4...java|
|00000230|  2f 69 6f 2f 50 72 69 6e  74 53 74 72 65 61 6d 0c  |/io/PrintStream.|
|00000240|  00 36 00 16 01 00 05 70  72 69 6e 74 0a 00 21 00  |.6.....print..!.|
|00000250|  38 0c 00 39 00 3a 01 00  0a 68 61 73 4e 65 78 74  |8..9.:...hasNext|
|00000260|  49 6e 74 01 00 03 28 29  5a 08 00 3c 01 00 33 49  |Int...()Z..<..3I|
|00000270|  6e 76 61 6c 69 64 20 69  6e 70 75 74 2e 20 50 6c  |nvalid input. Pl|
|00000280|  65 61 73 65 20 65 6e 74  65 72 20 61 20 6e 6f 6e  |ease enter a non|
|00000290|  2d 6e 65 67 61 74 69 76  65 20 69 6e 74 65 67 65  |-negative intege|
|000002a0|  72 2e 0a 00 33 00 3e 0c  00 3f 00 16 01 00 07 70  |r...3.>..?.....p|
|000002b0|  72 69 6e 74 6c 6e 0a 00  21 00 41 0c 00 42 00 43  |rintln..!.A..B.C|
|000002c0|  01 00 07 6e 65 78 74 49  6e 74 01 00 03 28 29 49  |...nextInt...()I|
|000002d0|  08 00 45 01 00 4e 57 61  72 6e 69 6e 67 3a 20 6e  |..E..NWarning: n|
|000002e0|  20 3e 20 39 32 20 77 69  6c 6c 20 6f 76 65 72 66  | > 92 will overf|
|000002f0|  6c 6f 77 20 61 20 36 34  2d 62 69 74 20 6c 6f 6e  |low a 64-bit lon|
|00000300|  67 2e 20 54 72 79 20 74  68 65 20 42 69 67 49 6e  |g. Try the BigIn|
|00000310|  74 65 67 65 72 20 76 65  72 73 69 6f 6e 20 62 65  |teger version be|
|00000320|  6c 6f 77 2e 0a 00 01 00  47 0c 00 0e 00 0f 12 00  |low.....G.......|
|00000330|  00 00 49 0c 00 4a 00 4b  01 00 17 6d 61 6b 65 43  |..I..J.K...makeC|
|00000340|  6f 6e 63 61 74 57 69 74  68 43 6f 6e 73 74 61 6e  |oncatWithConstan|
|00000350|  74 73 01 00 16 28 49 4a  29 4c 6a 61 76 61 2f 6c  |ts...(IJ)Ljava/l|
|00000360|  61 6e 67 2f 53 74 72 69  6e 67 3b 01 00 04 61 72  |ang/String;...ar|
|00000370|  67 73 01 00 13 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |gs...[Ljava/lang|
|00000380|  2f 53 74 72 69 6e 67 3b  01 00 07 73 63 61 6e 6e  |/String;...scann|
|00000390|  65 72 01 00 13 4c 6a 61  76 61 2f 75 74 69 6c 2f  |er...Ljava/util/|
|000003a0|  53 63 61 6e 6e 65 72 3b  01 00 06 72 65 73 75 6c  |Scanner;...resul|
|000003b0|  74 01 00 0a 53 6f 75 72  63 65 46 69 6c 65 01 00  |t...SourceFile..|
|000003c0|  0e 46 69 62 6f 6e 61 63  63 69 2e 6a 61 76 61 01  |.Fibonacci.java.|
|000003d0|  00 10 42 6f 6f 74 73 74  72 61 70 4d 65 74 68 6f  |..BootstrapMetho|
|000003e0|  64 73 0a 00 55 00 57 07  00 56 01 00 24 6a 61 76  |ds..U.W..V..$jav|
|000003f0|  61 2f 6c 61 6e 67 2f 69  6e 76 6f 6b 65 2f 53 74  |a/lang/invoke/St|
|00000400|  72 69 6e 67 43 6f 6e 63  61 74 46 61 63 74 6f 72  |ringConcatFactor|
|00000410|  79 0c 00 4a 00 58 01 00  98 28 4c 6a 61 76 61 2f  |y..J.X...(Ljava/|
|00000420|  6c 61 6e 67 2f 69 6e 76  6f 6b 65 2f 4d 65 74 68  |lang/invoke/Meth|
|00000430|  6f 64 48 61 6e 64 6c 65  73 24 4c 6f 6f 6b 75 70  |odHandles$Lookup|
|00000440|  3b 4c 6a 61 76 61 2f 6c  61 6e 67 2f 53 74 72 69  |;Ljava/lang/Stri|
|00000450|  6e 67 3b 4c 6a 61 76 61  2f 6c 61 6e 67 2f 69 6e  |ng;Ljava/lang/in|
|00000460|  76 6f 6b 65 2f 4d 65 74  68 6f 64 54 79 70 65 3b  |voke/MethodType;|
|00000470|  4c 6a 61 76 61 2f 6c 61  6e 67 2f 53 74 72 69 6e  |Ljava/lang/Strin|
|00000480|  67 3b 5b 4c 6a 61 76 61  2f 6c 61 6e 67 2f 4f 62  |g;[Ljava/lang/Ob|
|00000490|  6a 65 63 74 3b 29 4c 6a  61 76 61 2f 6c 61 6e 67  |ject;)Ljava/lang|
|000004a0|  2f 69 6e 76 6f 6b 65 2f  43 61 6c 6c 53 69 74 65  |/invoke/CallSite|
|000004b0|  3b 0f 06 00 54 08 00 5b  01 00 08 46 28 01 29 20  |;...T..[...F(.) |
|000004c0|  3d 20 01 01 00 0c 49 6e  6e 65 72 43 6c 61 73 73  |= ....InnerClass|
|000004d0|  65 73 07 00 5e 01 00 25  6a 61 76 61 2f 6c 61 6e  |es..^..%java/lan|
|000004e0|  67 2f 69 6e 76 6f 6b 65  2f 4d 65 74 68 6f 64 48  |g/invoke/MethodH|
|000004f0|  61 6e 64 6c 65 73 24 4c  6f 6f 6b 75 70 07 00 60  |andles$Lookup..`|
|00000500|  01 00 1e 6a 61 76 61 2f  6c 61 6e 67 2f 69 6e 76  |...java/lang/inv|
|00000510|  6f 6b 65 2f 4d 65 74 68  6f 64 48 61 6e 64 6c 65  |oke/MethodHandle|
|00000520|  73 01 00 06 4c 6f 6f 6b  75 70 00 21 00 01 00 03  |s...Lookup.!....|
|00000530|  00 00 00 00 00 03 00 01  00 05 00 06 00 01 00 07  |................|
|00000540|  00 00 00 2f 00 01 00 01  00 00 00 05 2a b7 00 08  |.../........*...|
|00000550|  b1 00 00 00 02 00 0a 00  00 00 06 00 01 00 00 00  |................|
|00000560|  0c 00 0b 00 00 00 0c 00  01 00 00 00 05 00 0c 00  |................|
|00000570|  0d 00 00 00 09 00 0e 00  0f 00 01 00 07 00 00 00  |................|
|00000580|  ca 00 04 00 08 00 00 00  3a 1a 9c 00 0d bb 00 10  |........:.......|
|00000590|  59 12 12 b7 00 14 bf 1a  9a 00 05 09 ad 1a 04 a0  |Y...............|
|000005a0|  00 05 0a ad 09 40 0a 42  05 36 05 a7 00 10 1f 21  |.....@.B.6.....!|
|000005b0|  61 37 06 21 40 16 06 42  84 05 01 15 05 1a a4 ff  |a7.!@..B........|
|000005c0|  f0 21 ad 00 00 00 03 00  0a 00 00 00 32 00 0c 00  |.!..........2...|
|000005d0|  00 00 10 00 04 00 11 00  0e 00 13 00 14 00 14 00  |................|
|000005e0|  1b 00 16 00 1d 00 17 00  1f 00 19 00 25 00 1a 00  |............%...|
|000005f0|  2a 00 1b 00 2c 00 1c 00  2f 00 19 00 38 00 1e 00  |*...,.../...8...|
|00000600|  0b 00 00 00 34 00 05 00  00 00 3a 00 17 00 18 00  |....4.....:.....|
|00000610|  00 00 1d 00 1d 00 19 00  1a 00 01 00 1f 00 1b 00  |................|
|00000620|  1b 00 1a 00 03 00 22 00  16 00 1c 00 18 00 05 00  |......".........|
|00000630|  2a 00 05 00 1d 00 1a 00  06 00 1e 00 00 00 0c 00  |*...............|
|00000640|  05 0e 05 06 fe 00 09 04  04 01 0c 00 09 00 1f 00  |................|
|00000650|  20 00 01 00 07 00 00 00  e5 00 04 00 05 00 00 00  | ...............|
|00000660|  56 bb 00 21 59 b2 00 23  b7 00 29 4c b2 00 2c 12  |V..!Y..#..)L..,.|
|00000670|  30 b6 00 32 2b b6 00 37  9a 00 0c b2 00 2c 12 3b  |0..2+..7.....,.;|
|00000680|  b6 00 3d b1 2b b6 00 40  3d 1c 9c 00 0c b2 00 2c  |..=.+..@=......,|
|00000690|  12 12 b6 00 3d b1 1c 10  5c a4 00 0b b2 00 2c 12  |....=...\.....,.|
|000006a0|  44 b6 00 3d 1c b8 00 46  42 b2 00 2c 1c 21 ba 00  |D..=...FB..,.!..|
|000006b0|  48 00 00 b6 00 3d b1 00  00 00 03 00 0a 00 00 00  |H....=..........|
|000006c0|  3a 00 0e 00 00 00 22 00  0b 00 23 00 13 00 24 00  |:....."...#...$.|
|000006d0|  1a 00 25 00 22 00 26 00  23 00 29 00 28 00 2a 00  |..%.".&.#.).(.*.|
|000006e0|  2c 00 2b 00 34 00 2c 00  35 00 2e 00 3b 00 2f 00  |,.+.4.,.5...;./.|
|000006f0|  43 00 32 00 48 00 33 00  55 00 34 00 0b 00 00 00  |C.2.H.3.U.4.....|
|00000700|  2a 00 04 00 00 00 56 00  4c 00 4d 00 00 00 0b 00  |*.....V.L.M.....|
|00000710|  4b 00 4e 00 4f 00 01 00  28 00 2e 00 17 00 18 00  |K.N.O...(.......|
|00000720|  02 00 48 00 0e 00 50 00  1a 00 03 00 1e 00 00 00  |..H...P.........|
|00000730|  0d 00 03 fc 00 23 07 00  21 fc 00 11 01 0d 00 03  |.....#..!.......|
|00000740|  00 51 00 00 00 02 00 52  00 53 00 00 00 08 00 01  |.Q.....R.S......|
|00000750|  00 59 00 01 00 5a 00 5c  00 00 00 0a 00 01 00 5d  |.Y...Z.\.......]|
|00000760|  00 5f 00 61 00 19                                 |._.a..|
|00000766|