2110316  Programming Languages
      Principles 3(3-0-6)
    1st semester  2014
    Prabhas Chongstitvatana
    official course description
    
    Principal lecturer: Twittee.  This course is divided into three equal
    parts.  Three parts are taught by three different lecturers.
    
    1) Programming Language concepts, Twittee 
    2) Non-imperative programming language, Vishnu   
    3) Language and implementation, Prabhas
    
    The goal of this course is to make you understand the languages you use. To
    make you appreciate diversity of ideas in programming and prepare you for
    new programming methods and paradigms. Theoretical foundations will be
    presented. You will know properties of language, not just syntax. Moreover,
    you will recognize the cost of presenting an abstract view of machine and
    understand trade-offs in programming language design.  
    
    Each part will be taught separately and independently. It is logical that
    the assessment will also be arranged according to this structure. There is
    no midterm exam (besides whatever assess by the lecturer at that time) and
    the final exam will contain all materials taught in the course.
    Assessment
    each part  20%  by 3  = 60%
    final
    exam            
             40%
    
    the lecture schedule:
    section 1: T, V, P  
    section 2: V, P, T
    section 3: P, T, V
    Language and implementation
    This part concerns a compiler for a programming language. There are two
    aspects of learning this part: theory and practice.  The theory will be
    given in the lectures.  The practice is carried on as homework and
    classwork. To teach effectively I choose to design a toy language and
    implement its compiler. There are two implementation, in C and in
    Javascript. You will be studying actual compilers and modify them.
    
    old lecture  2009  2010 
      2011  2012 
    2013
    Announcement
    11 Sept 2014   Project for section 3 is announced.  Hand-in
    before 4pm 19 Sept 2014.
    23 Sept 2014   Section 2, please do the homework 4 (write a
    grammar for a children story)
    . . .
    Study Plan
    plan for 4 weeks, with one week to spare
    each week has 2 sessions of 1 1/2 hrs. each.
    a homework will be handed out each week.
    one project will be issued on week 3.
    
    workload
    
    one small project
    one in-class exam
    weekly homework, running the code
    Lecture sessions
    1  structure of a compiler      Overview
      of the course   (from Stanford slide)    
           Intro to Compiler
    (ppt)  Supplement: Cross
      compiler (ppt)
           High Level Language  to  Low
    Level Language  to  Processor architecture 
                 
    Demonstrate the actual compiler of this course RZ.   Rz
      compiler on web
    2  lexical analyser      Scanner
    (ppt) 
    --------------------------
    3 
    grammar              
    Context Free Grammar  (ppt)   Example of writing a grammar to specify a
      language
       
    3.1                       
    Recursive programming with List  
    4  parsing               
      Parsing (ppt)   
    top-down parsing   How to compute First
      and Follow set  (by Prof. Kamin at UIUC)
                                   
    LL parser at Wiki
    ----------------------------
    5  actual parser        
    project announcement         
    6  code generator        Code
      Generation    
      Som v2.0 virtual machine   S-code
        recursive evaluator    here is the source
    code in C for an interpreter of Rz parse tree   
      eval3.c
    ---------------------------
    8  actual code generator  How to do code
    generation     Zero Assembler
      
       exam
    -----------------
    9-10 spare  additional topics   
    Assessment for this part
    homework        5% 
    one project      
    5%         
    exam       
          10%   
    total              
    20%
    
    
    Classwork
    Section 2
    
    ...
    
    Homework
    Section 2
    1.  Learn how to write in Rz by reading  Quick
      Start Rz. 
    2.  Download and compiler the compiler used in this class (rz33-1.zip). 
    Use whatever compiler for C that you are familiar with and compile it. Try
    it out to compile some simple program.   For recommended free C
    compiler, see Tools section below.
    3.  Modify the compiler to run only as scanner then modify the scanner
    to accept a new word "system" in the source.  
    
    Here is the steps to modify the compiler to run only as "scanner".
    3.1    Go "main()" in "compile.c"  add the following
    line to call "lex()" (a scanner function) repeatedly.
    
    readinfile(source);
      prolog();
      testlex(); 
      exit(0);
        
      
    3.2    in the same file  delete comments (open up) 
    "testlex()"  (around line 48).
    
    void testlex(void){
          mylex();
          while( tok != tkEOF ){
              printf(" ");
              prtoken(tok);
              mylex();
          }
      }
        
      
    3.3    You also need to open up the "prtoken()" (in
    "prtoken.c") by deleting "PRIVATE" keyword (line 16).
    
    // print token
      void prtoken(int tk){
      . . .
              case tkIDEN: printf("%s",
        tokstring); break;
              case tkNUMBER: printf("%s",
        tokstring); break;
              case tkSTRING:
        printf("%c%s%c",34,tokstring,34); break;
              case tkEOF: printf("eof");
        break;
              }
          }
      }
        
      
    by now, you should have a "scanner" working properly.  Here is what the
    session looks like (assuming your compiler is "rz33.exe").  Run it with
    "console" (called "cmd" in Windows).  It is a black box that accept
    command lines (you interact with computers through "command" from the
    keyboard instead of using mouse and click).
    
    C:\rz33-1\comp\lcc>rz33 fac.txt
       ( n ) { if ( n == 0 ) return 1 ; else return n * fac ( n - 1 ) ; }
      main ( ) { p
      rint ( fac ( 6 ) ) ; }
    
    Notice that the first word has not been displayed properly.  (it should
    show "fac"). Do you know why?
    
    4. Write a grammar to cover this story.  Please make it so that your
    grammar is neither too rigid, i.e. admit only this story, nor too loose,
    i.e. admit any story.  Make your own judgement.
    
    Here the story goes:
    
    Mary has a little lamb.  Its fleece is white as snow. Everywhere that
    Mary went, the lamb is sure to go. One day Mary goes to school. The lamb
    goes to school too.
    
    Project
    . . .
    Reference Text
    -- Aho, Sethi, Ullman, Compilers: Principles, Techniques, and Tools.
    Addison-Wesley, latest edition.
    -- Louden, K.C., Compiler Construction: Principles and Practice. PWS
    Publishing Co., 1997.
    
    The first one is the standard text book on compiler. It has been used in
    more than 100 universities in North America.  It is a bit difficult to
    read as it contains a lot of theory.   The second one (Louden) is
    much easier to read.  I will update some chapter from my textbook from
    time to time as necessary.
    Extra reading
    
    
    Tools
    See
      my Rz language homepage
    the compiler  package with code generator for s-code 
      rz33-1.zip  
    Zero Assembler   source, example and
    executable (including som v2 vm) ( zas.zip )
    
    Rz
      compiler on the web  (by Kamoluk Suksen)
    Recommended free C compiler for Windows lcc-win32
    . (for Windows 7 and 8).  Please also download and install "User
    Manual". You need it to look up the library function of this C.  (for
    OS X you need xcode, also free).  
    How to use the compiler
    Use rz33-1.zip  to compile and run your programs.   Here is
    what a session looks like.  Go to rz33/test directory  (that you
    unzip the package to).  There are two executable files:  
    rz33.exe  and  somv2x.exe.  Try to compile "fac.txt". 
    It is shown here:
    
    // factorial
      
      fac(n){
        if( n == 0 ) return 1;
        else return n * fac(n-1);
      }
      
      main(){
        print(fac(6));
      }
     
        Here is the command line and the output at the screen:
    
    D:\prabhas\bag\rz\rz33\test>rz33 fac.txt
      fac
      main
      (fun main (print (call fac 6 )))
      (fun fac (else (== #1 0 )(return 1 )(return (* #1 (call fac (- #1 1 ))))))
      
      :main
          fun.1
          lit.6
          call.fac
          sys.1
          ret.1
      :fac
          fun.1
          get.1
          lit.0
          ... 
        
    You will get the file "fac.obj" as an output file.  It is an object
    file that is executable under Som VM (a kind of virtual machine similar to
    JVM). You can "run" it under somv2x.
    
    D:\prabhas\bag\rz\rz33\test>somv2x fac.obj
      720
    
    That's it.  Enjoy!
    
    Prabhas Chongstitvatana
    contact address:   prabhas at chula dot ac dot
    th     
    office   room 18-13  Engineering Building 4, floor 18. 
    tel 02-2186982
    research lab:  Intelligent Systems,  floor 20.
    
    Last update  23 Sept 2014