Examples of Byte Code


Example 1: Simple execute

Package written in Astarte:

Package exec

Execute
  Let three = 3.
  Let five = "five".
  Writeln[$ three, $ five].
%Execute

%Package

Package in assembler (minimal style):

.package exec
.version 41
@BEGIN-IMPLEMENTATION
%
%           Constants and identifiers
%
@LABEL                   >2
@STRING			 "five"
@LABEL                   >3
@ID                      $
@LABEL                   >4
@ID                      Writeln
%---------------------
@EXECUTE                 2
%
%         Begin static environment setup
%
STD-SPECIES                   Natural
STD-SPECIES		      Char
LIST-SPECIES
FUNCTION-SPECIES
GET-GLOBAL-ID                 3 %[0]  ($ : Natural -> List(Char))
STD-SPECIES		      Char
LIST-SPECIES
STD-SPECIES		      Char
LIST-SPECIES
FUNCTION-SPECIES
GET-GLOBAL-ID                 3 %[1]  ($ : List(Char) -> List(Char))
STD-SPECIES		      Char
LIST-SPECIES
LIST-SPECIES
STD-SPECIES                   ()
FUNCTION-SPECIES
GET-GLOBAL-ID                 4 %[2] (Writln: List(List(Char)) -> ()
%
%        End static environment setup, begin executable code
%
BEGIN-EXECUTABLE              1
SMALL-INT                     3
BIND                          0   (three)
END-TYPE
CONST                         >2  % "five"
BIND                          1   (five)
END-TYPE
FINAL-FETCH                   0   % fetch three
FETCH-GLOBAL                  0   % fetch $ : Natural -> List(Char)
APPLY
FETCH                         1   % fetch five
FETCH-GLOBAL                  1   % fetch $ : List(Char) -> List(Char)
APPLY
NIL
FETCH-GLOBAL                  2   % fetch Writeln
PAIR
PAIR
APPLY
RETURN
END
%---------------------
@END-PACKAGE

Package in assembler (more involved style):

.package exec
.version 41
@BEGIN-IMPLEMENTATION
%
%           Constants and identifiers
%
@LABEL                   >1
@STRING 
"Exec-exec-1"
@LABEL                   >2
@STRING
"five"
@LABEL                   >3
@ID                      $
@LABEL                   >4
@ID                      Writeln
%---------------------
@EXECUTE                 2
%
%           Begin static environment setup
%
STD-SPECIES                   Natural
SPECIES-ONLY                  %[0]
STD-SPECIES                   Char
LIST-SPECIES
STORE-AND-LEAVE-SPECIES       %[0]
SPECIES-ONLY                  %[1]
STD-SPECIES                   Natural
GET-SPECIES                   0
FUNCTION-SPECIES
GET-GLOBAL-ID                 >3 %[2] ($ : Natural -> List(Char))
GET-SPECIES		      0
GET-SPECIES                   0
FUNCTION-SPECIES
GET-GLOBAL-ID                 >3 %[3] ($ : List(Char) -> List(Char))
GET-SPECIES		      0
LIST-SPECIES
STD-SPECIES                   ()
FUNCTION-SPECIES
GET-GLOBAL-ID                 >4 %[4] (Writeln: List(List(Char)) -> ())
%
%           End static environment setup
%
BEGIN-EXECUTABLE              1
LINE                          3   % Begin source line 3
SNAME                         >1
LINE                          4   % Begin source line 4
SMALL-INT                     3
BIND                          0   (three)
GLOBAL-FETCH-SPECIES          0
END-TYPE
LINE                          5    % Begin source line 5
CONST                         >2   %  "five"
BIND                          1   (five)
GLOBAL-FETCH-SPECIES          1
END-TYPE
LINE                          6    % Begin source line 6
FINAL-FETCH                   0
FETCH-GLOBAL                  2
APPLY
FINAL-FETCH                   1
FETCH-GLOBAL                  3
APPLY
NIL
FETCH-GLOBAL                  4
PAIR-TAIL-APPLY               2
RETURN
END
%---------------------
@END-PACKAGE


Example 2: Simple constant definition

Source in Astarte:

Package def

Define frog = "frog".

%Package

Assembler version:

.package def
.version 41
@BEGIN-IMPLEMENTATION
%---------------------
@LABEL                   >1
@ID                      frog
%---------------------
@LABEL                   >2
@STRING                  "frog"
%---------------------
@DEFINE                  >1
%
%        Species List(Char) of thing being defined
%
STD-SPECIES                   Char
LIST-SPECIES
%
%        Static environment is empty
%
BEGIN-GLOBALS                 0
%
%        Computation of thing being defined
%
BEGIN-EXECUTABLE              0
LINE                          3
NAME                          >1
CONST                         >2
RETURN
END
%---------------------
@END-PACKAGE


Example 3: A simple function definition

Source written in Astarte:

Package fundef

Define fun(?x:Integer,?y:Integer) = x + y.

%Package

Assembler version:

.package fundef
.version 41
@BEGIN-IMPLEMENTATION
@LABEL                   >1
@ID                      fun
%---------------------
@DEFINE                  >1
%
%         Species (Integer, Integer) -> Integer of function fun
%
STD-SPECIES                   Integer
STD-SPECIES                   Integer
PAIR-SPECIES
STD-SPECIES                   Integer
FUNCTION-SPECIES
%
%         Empty static environment
%
BEGIN-GLOBALS                 0
%
%         The following code builds the function
%
BEGIN-EXECUTABLE              0
LINE                          3
NAME                          >1
FUNCTION                      :0
STD-SPECIES                   Integer
BEGIN-BODY                    1
NAME                          >1
SPLIT
BIND                          0   (y)
STD-SPECIES                   Integer
END-TYPE
BIND-AND-LEAVE                1   (x)
STD-SPECIES                   Integer
END-TYPE
FETCH                         0
PLUS
LOC-LABEL                     :0
RETURN
END
%---------------------
@END-PACKAGE


Example 4: A conditional

Source in Astarte:

Package conditional

Execute
  If 2 < 3 then
    Writeln["That is right"].
  else
    Writeln["That is wrong"].
  %If
%Execute

%Package

Assembler version:

.package conditional
.version 41
@BEGIN-IMPLEMENTATION
%---------------------
@LABEL                   >1
@STRING                  "Exec-conditional-1"
%---------------------
@LABEL                   >2
@LIST                    1
@STRING
"That is right"
%---------------------
@LABEL                   >3
@LIST                    1
@STRING                  "That is wrong"
%---------------------
@LABEL                   >4
@ID                      Writeln
%---------------------
@EXECUTE                 1
%
%           Static environment setup
%
STD-SPECIES                   Char
LIST-SPECIES
LIST-SPECIES
STD-SPECIES                   ()
FUNCTION-SPECIES
GET-GLOBAL-ID                 >4 %[0]
%
%           Executable code
%
BEGIN-EXECUTABLE              0
LINE                          3
SNAME                         >1
LINE                          4
SMALL-INT                     2
SMALL-INT                     3
LT
GOTO-IF-FALSE                 :0
LINE                          5
CONST                         >2
FETCH-GLOBAL                  0
TAIL-APPLY
RETURN
LOC-LABEL                     :0
LINE                          7
CONST                         >3
FETCH-GLOBAL                  0
TAIL-APPLY
RETURN
END
%---------------------
@END-PACKAGE


Example 5: Lazy concatenation

Source written in Astarte:

Package lazycat

Define lazycat ?x ?y =
  Await then
    If nil? x
      then y
      else head x :: lazycat (tail x) y
    %If
  %Await
%Define

Execute
  Writeln[lazycat "abc" "def"].
%Execute

%Package

Assembler version:

.package lazycat
.version 41
@BEGIN-IMPLEMENTATION
%---------------------
@LABEL                   >1
@ID                      lazycat
%---------------------
@DEFINE                  >1
%
%     Build the species List(x) -> List(x) -> List(x) of lazycat
%
STD-SPECIES-VAR               ANY
STORE-AND-LEAVE-SPECIES       %[0]
LIST-SPECIES
STORE-AND-LEAVE-SPECIES       %[1]
GET-SPECIES                   1
GET-SPECIES                   1
FUNCTION-SPECIES
FUNCTION-SPECIES
%
%       Static environment setup
%
%       This code starts with type List(T) -> List(T) -> List(T)
%       on the type stack, where T is specific to a particular use
%       of lazycat.  Lazycat wants to know T, which it stores at
%       index 0 in the static environment.
%
BEGIN-GLOBALS                 1
UNPAIR-SPECIES
UNPAIR-SPECIES
UNPAIR-SPECIES
POP-SPECIES
SPECIES-ONLY                  %[0]  (Store T at index 0 in the static env)
POP-SPECIES
POP-SPECIES
%
%      Now we have T.  Begin fetching globals. 
%
GLOBAL-FETCH-SPECIES          0      % T
LIST-SPECIES
SPECIES-ONLY                  %[1]   Store List(T) at index 1 in the static env
GLOBAL-FETCH-SPECIES          0
LIST-SPECIES
STORE-AND-LEAVE-SPECIES       %[2]   Store List(T) at index 0 in the type store
GET-SPECIES                   0      % List(T)
GET-SPECIES                   0      % List(T)
FUNCTION-SPECIES
FUNCTION-SPECIES
GET-GLOBAL-ID                 >1 %[2] % Get lazycat: List(T) -> List(T) -> List(T)
				      % (for the recursive call)
%
%            Build function lazycat
%
BEGIN-EXECUTABLE              0
LINE                          3
NAME                          >1
FUNCTION                      :3
GLOBAL-FETCH-SPECIES          0
LIST-SPECIES
STORE-AND-LEAVE-SPECIES       %[0]
GET-SPECIES                   0
FUNCTION-SPECIES
BEGIN-BODY                    1
NAME                          >1
BIND                          0   (x)
GLOBAL-FETCH-SPECIES          1
END-TYPE
FUNCTION                      :2
GLOBAL-FETCH-SPECIES          0
LIST-SPECIES
BEGIN-BODY                    0
NAME                          >1
BIND                          1   (y)
GLOBAL-FETCH-SPECIES          1
END-TYPE
LINE                          4
LAZY                          :1
GLOBAL-FETCH-SPECIES          1
BEGIN-BODY                    0
NAME                          >1
LINE                          5
FETCH                         0
NIL?
GOTO-IF-FALSE                 :0
LINE                          6
FETCH                         1
RETURN
LOC-LABEL                     :0
LINE                          7
FETCH                         0
HEAD
FINAL-FETCH                   1
FINAL-FETCH                   0
TAIL
FETCH-GLOBAL                  2
APPLY
APPLY
PAIR
LOC-LABEL                     :1
LOC-LABEL                     :2
LOC-LABEL                     :3
RETURN
END
%---------------------
@LABEL                   >2
@STRING                  "Exec-lazycat-1"
%---------------------
@LABEL                   >3
@STRING                  "def"
%---------------------
@LABEL                   >4
@STRING                  "abc"
%---------------------
@LABEL                   >5
@ID                      Writeln
%---------------------
@EXECUTE                 1
%
%              Static environment setup
%
STD-SPECIES                   Char
LIST-SPECIES
STORE-AND-LEAVE-SPECIES       %[0]
GET-SPECIES                   0
GET-SPECIES                   0
FUNCTION-SPECIES
FUNCTION-SPECIES
GET-GLOBAL-ID                 >1 %[0] (lazycat: List(Char) -> List(Char) -> List(Char)
STD-SPECIES                   Char
LIST-SPECIES
LIST-SPECIES
STD-SPECIES                   ()
FUNCTION-SPECIES
GET-GLOBAL-ID                 >5 %[1]
%
%              Perform these instructions
%
BEGIN-EXECUTABLE              0
LINE                          12
SNAME                         >2
LINE                          13
CONST                         >3
CONST                         >4
FETCH-GLOBAL                  0
APPLY
APPLY
NIL
FETCH-GLOBAL                  1
PAIR-TAIL-APPLY               1
RETURN
END
%---------------------
@END-PACKAGE


Example 6: Extension

Source written in Astarte:

Package extend1

Extension
  Abstraction MAMMAL.
  Species Kangaroo isKindOf MAMMAL = (List(Char), Integer).
%Extension

%Package

Assembler version:

.package extend1
.version 41
%
@BEGIN-IMPLEMENTATION
%---------------------
@BEGIN-EXTENSION
@LABEL                   >1
@NEW-GENUS               s MAMMAL
@LABEL                   >2
@NEW-SPECIES             Kangaroo
@LABEL                   >3
@IMPORTED-GENUS          EQ
@RELATE                  >2 >3
@RELATE                  >2 >1
@END-EXTENSION
%---------------------
% The following is a definition of a function called kangaroo
% that takes a (List(Char), Natural) pair and produces the
% equivalent Kangaroo value.  No explicit tag is required,
% so all this does is return the identity function idf, defined
% in another package.  This definition cheats because it knows
% that the definition of idf is the same for every species, so
% it fetches the definition of species () -> ().
%---------------------
@LABEL                   >4
@ID                      kangaroo
@LABEL                   >5
@ID                      idf
%---------------------
@DEFINE                  >4
STD-SPECIES                   Char
LIST-SPECIES
STD-SPECIES                   Integer
PAIR-SPECIES
SPECIES-ID                    >2
FUNCTION-SPECIES
BEGIN-GLOBALS                 1
STD-SPECIES                   ()
STD-SPECIES                   ()
FUNCTION-SPECIES
GET-GLOBAL-ID                 >5 %[0]
BEGIN-EXECUTABLE              0
LINE                          5
NAME                          >4
FETCH-GLOBAL                  0
RETURN
END