Skip to content

The Argo's repo: where the ArgoCompiler and the ArgoVM find their home.

Notifications You must be signed in to change notification settings

ModsByMorgue/argo-lang

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Argo

ArgoVM is a stack-based virtual machine similar to JVM.

It runs the file provided by ArgoC (Argo Compiler) which transform the argo-lang into an executable byte-code format.

Instruction Set

OP Usage Function
HLT HLT Terminate the program
NOP NOP Nothing
PSH PSH, value Pushes value on the stack
POP POP Pops value from stack
ADD ADD Pops the last two values from the stack, it sums then push the result
SUB SUB Pops the last two values from the stack, it subtracts then push the result
MUL MUL Pops the last two values from the stack, it multiplies then push the result
DIV DIV Pops the last two values from the stack, it divides then push the results (value and rest)
NEG NEG Pops the last value from the stack, it negate then push the results
SWP SWP Pops the last two values from the stack, it swap them then push the result on the stack
CMP CMP Peeks the last two values from the stack, then set the CMP register to one of these values: (EQUALS, LESSER, GREATER)
JMP JMP, idx Jumps at given instruction index
JEQ JEQ, idx Jumps at given instruction index only if the CMP flag is set to EQUALS
JNE JNE, idx Jumps at given instruction index only if the CMP flag is NOT set to EQUALS
JMG JMG, idx Jumps at given instruction index only if the CMP flag is set to GREATER
JML JML, idx Jumps at given instruction index only if the CMP flag is set to LESSER
JGE JGE, idx Jumps at given instruction index only if the CMP flag is set to EQUALS or GREATER
JLE JLE, idx Jumps at given instruction index only if the CMP flag is set to EQUALS or LESSER
CLL CLL, idx Executes the given routine identifier
RET RET Routine specific instruction, it's used to terminate the current routine flow
PRINT PRINT Peeks the last value from the stack and print it.

Grammar

Basics

Let's see some syntax in action

# sum.argo
#
# Define the main function (entry point)

:main {
    PSH, 5
    PSH, 4
    ADD
    PRINT
    HLT
}

Iteration

You can reproduce any conditional-structure you like with the following instructions

# iterate.argo
#
# function main() {
#   for(var i = 0; i <= 100; ++i) {
#     print(i); 
#   }
# }
#

:main {
  PSH, 1
  PRINT
  PSH, 1
  ADD
  PSH, 100 
  CMP
  POP
  JLE, 2
  HLT
}

Routines

Splitting the code workflow among other calls, arguments should be pushed on stack before calling the function meanwhile the return address is managed automatically.

# The following .argo equals to this code:
# 
# function printer(var x){
#   print(x);
# }
#
# function sum(var a, var b) {
#   return a + b;
# }
#
# function main() {
#   printer(sum(5, 4));
#   return;
# }
#

:main {
    PSH, 5
    PSH, 4 
    CLL, sum 
    HLT
}

:sum {
    ADD
    CLL, printer
    RET
}

:printer {
    PRINT
    RET
}

The workflow

This is how its expected to work at the end of development:

Argonauts (Lang) -> Argo (ASM) -> Bytecode (ArgoCode) -> ArgoVM

Currently there is no Argonauts lang, I'm still working on Argo.

Project

Structure

The current ArgoVM is written in C meanwhile the compiler ArgoC is written using Java, some additionals dev-tools are made in Perl.

src
|
|-- assembler  # The ArgoC  home directory
|-- vm         # The ArgoVM home directory

TODO ...

About

The Argo's repo: where the ArgoCompiler and the ArgoVM find their home.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 56.4%
  • C 40.3%
  • ANTLR 1.9%
  • CMake 1.3%
  • Shell 0.1%