All --

Before I go changing the Jako compiler, I'd like some feedback. There are 
three files
below. First is fact.jako, the factorial algorithm expressed as a Jako 
subroutine with
some mainline code that calls it. Then comes fact.imc, which I produced by 
hand-
editing the fact.pasm file that jakoc currently produces for fact.jako. 
Finally, the
fact.pasm file that results from running imcc on fact.imc.

You can see the workaround I'm using to allow the programmer to 
intersperse chunks
of code to be executed right now with chunks of code that are subroutine 
defininitions.


#
# fact.jako
#
# Some simple code to print some factorials
#
# Based on fact.pasm originally be Leon Brocard <[EMAIL PROTECTED]> 
2001-09-14.
#
# Copyright (C) 2001 Gregor N. Purdy. All rights reserved.
# This program is free software. It is subject to the same
# license as Perl itself.
#
# $Id: fact.jako,v 1.5 2001/10/19 12:36:16 gregor Exp $
#

const int N = 15;


#
# fact()
#

sub int fact(int n) {
  var int i =  0;
  var int f =  1;

  while(i <= n) {
    i++;
    f *= i;
  }

  return f;
}


#
# MAIN PROGRAM:
#

var int f;

print("Algorithm F1 (The factorial function)\n");
print("    Calculating fact($N) = ...\n");

f= fact(N);

print("    ... = $f\n");







------------------------- snip: fact.imc follows 
-----------------------------------









###############################################################################
# This Parrot assembler file was produced by the Jako compiler.    #
# Initial comments from the source code are reproduced below.    #
###############################################################################

#
# fact.jako
#
# Some simple code to print some factorials
#
# Based on fact.pasm originally be Leon Brocard <[EMAIL PROTECTED]> 
2001-09-14.
#
# Copyright (C) 2001 Gregor N. Purdy. All rights reserved.
# This program is free software. It is subject to the same
# license as Perl itself.
#
# $Id: fact.jako,v 1.5 2001/10/19 12:36:16 gregor Exp $
#

#.sub __main
#                 call _main
#                 end
#.end
                                                    # const int N = 15;
..sub __CODE__0
fact_BEFORE:     goto   fact_AFTER                  #   sub int fact (int 
n) {
..end
..sub _fact
fact_ENTER:      saveall 
                 .param int n
                 .local int i
                 .local int f

                 i = 0
                 f = 1

_W2_WHILE:
_W2_NEXT:        gt       i, n, _W2_LAST            #   _W2: while (i <= 
n) {
_W2_REDO:        inc      i                         #     i++;
                 mul      f, f, i                   #     f = f * i;
_W2_CONT:        branch   _W2_NEXT                  #   }
_W2_LAST:

                 .return f                          #   return f
                 branch   fact_LEAVE 
fact_LEAVE:                                         # }

                 restoreall
                 ret 
fact_AFTER:     goto __CODE__1
..end

..sub __CODE__1
                                                    # var int f;
                 print    "Algorithm F1 (The factorial function)\n" # 
print(...);
                 print    "    Calculating fact("   # print(...);
                 print    15 
                 print    ") = ...\n" 

                 .arg 15
                 call     _fact
                 .result I1

                 print    "    ... = "              # print(...);
                 print    I1 
                 print    "\n" 
                 end
..end




------------------------- snip: fact.pasm follows 
-----------------------------------






__CODE__0:
fact_BEFORE:
                 branch fact_AFTER
                 ret 
_fact:
fact_ENTER:
                 saveall 
                 restore I2
                 set I0, 0
                 set I1, 1
_W2_WHILE:
_W2_NEXT:
                 gt I0, I2, _W2_LAST
_W2_REDO:
                 inc I0
                 mul I1, I1, I0
_W2_CONT:
                 branch _W2_NEXT
_W2_LAST:
                 save I1
                 branch fact_LEAVE
fact_LEAVE:
                 restoreall 
                 ret 
fact_AFTER:
                 branch __CODE__1
                 ret 
__CODE__1:
                 print "Algorithm F1 (The factorial function)\n"
                 print "    Calculating fact("
                 print 15
                 print ") = ...\n"
                 save 15
                 bsr _fact
                 restore I1
                 print "    ... = "
                 print I1
                 print "\n"
                 end 
                 ret 


Reply via email to