Junk

Junk is a language developed by Mark Schad in 2009 which uses stacks and queues to execute instructions. Programs are written in the form of instructions which are added to a stack. When the stack runs out of instructions the program has finished running. The instructions come in the form of lists of elements, which are executed one after the other. Whenever an instruction is encountered (denoted by '[' and ']') the instruction is added to the stack. When the program reaches the end of the code it will then execute each instruction in the stack.

Instructions
Instructions are made up of two components. The first component is the id of the instruction, the second component is a list of elements. This list is arbitrary in length and each element is made up of a command and an argument. All commands take a memory address as their argument except for 'push' and 'acc'. Instead of a constant integer, the '@' character may be used as an argument, and will pass the value of the accumulator into the command.

The arithmetic operators take the value in the memory and apply it to the accumulator.

+     Add -     Subtract *     Multiply /     Divide

The comparison operators take the value in memory and compares it to the accumulator. If the comparison is true then execution of the remaining elements continues.

=     Equal ~     Not Equal <     Less Than >     Greater Than

These commands take user input and store it in memory and print memory to the user.

in    Input out   Output out$  Output Char

The value of the accumulator can be set from memory or memory can be set to the accumulator with these commands.

sto   Store ret   Retrieve

The accumulator can be set to a value using the following command or by setting an element to a single integer.

acc   Accumulator

Finally, an instruction can be pushed onto the stack with the following command. The argument is the id of the instruction to push.

push  Push

Execution
The code is read from the source file and the instruction list is parsed. As each new instruction is parsed it is pushed onto the instruction stack. There is a block of memory with 256 addresses initialized to zero. The accumulator is also set to zero. After all of the code has been parsed the program can execute by popping an instruction from the stack and executing it. Repetition can be achieved by having an instruction push itself onto the stack. Comments can be added by simply adding text anywhere in the source that is not surrounded by a '[' or ']' character.

The hello world program in Junk.

[0|ret 0,- 1,sto 0,+ 2,out$ @,ret 0,> 15,push 0] [1|32,sto 8,101,sto 4,72,sto 3] [2|33,sto 14,100,sto 13,108,sto 12,sto 6,sto 5,114,sto 11,111,sto 10,sto 7,87,sto 9] [3|12,sto 0,1,sto 1,3,sto 2,0,sto 15]