unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: Nala Ginrut <nalaginrut@gmail.com>
To: Matt Wette <matt.wette@gmail.com>
Cc: Guile User <guile-user@gnu.org>
Subject: Re: progress on my NYACC javascript example complier
Date: Sat, 3 Jun 2017 09:52:40 +0800	[thread overview]
Message-ID: <CAPjoZodDJN4LDx6QzpD0yrNM06kTnMj4NdSGDdCezavH8Nnbjg@mail.gmail.com> (raw)
In-Reply-To: <4959B7EB-6E65-4431-940F-998AE6F60056@gmail.com>

Hi Matt!
Thanks for working on that. It's really cool!

IMO, translate AST to tree-il simply is not enough to implement
spec-compatible front-end for most of real languages. They just looks like
JS/Lua/Python, but not them at all. This conclusion is from my experience
on developing guile-lua-rebirth.

The real implementation needs to do far more than simple translator. But
provide spec-compatible AST is relative easier, then let anyone who
interested in compiler hacking try their luck.

Another common concern is that Guile IR may not suitable for non-FP
languages. But IMO, the CPS is general enough for any turing-complete
language. People may thought SSA is required for imperitive languages, but
I don't think so, actually Appel had a paper to prove SSA is kind of FP
language too. And all these intermediate representations: SSA, CPS, ANF,
sequent-caculus ... are equivalent. The difference is the expressiveness.
Just like the difference between functional and imperitive language.

People may concern that GuileVM is not general enough for any languages.
But it is improvable if we can figure out what is missing in the current VM
implementation. No mention Guile is going for native code generating in the
future.




2017年6月3日 上午7:57,"Matt Wette" <matt.wette@gmail.com>写道:

> I started working on NYACC documentation and that got me on cleaning up
> the example (but very incomplete) javascript example.  This example uses an
> architecture where syntax trees emitted from the parser are in SXML
> format.  From there I use foldts*-values (developed by Andy Wingo) to
> convert to Tree-IL and from there the Guile compiler tower takes over.
> This effort is my sandbox for getting familiar with all tools and
> techniques.  I have no plan to implement everything.
>
> foldts*-values allows me to trap new scope on the way down the tree: I
> push scope levels there and update the symbol table if needed.  On the way
> down I also pick off simple constructs (e.g., constants and identifiers).
> Also, on the way down, I splice in javascript Blocks to track scope of new
> variables introduced by JavaScript variable declarations.  On the way up,
> the trees are converted to Tree-IL.
>
> The top-level variables live in the default module scope, so I can call
> Guile procedures and Guile can make use of top-level functions defined in
> the Javascript.  The following is an example from “JavaScript, The
> Definitive Guide” in which a closure is used to provide a function that has
> a private var to generate incrementing numeric identifiers.  What you see
> below is
> 1) the javascript code
> 2) the output of running this in Guile
> 3) the SXML syntax tree emitted from the parser
> 4) the tree-il syntax tree emitted from the compiler
>
> var uid = (function() { var id = 0; return function () { return id++;
> };})();
> display(uid()); newline();
> display(uid()); newline();
> display(uid()); newline();
> display(uid()); newline();
>
> =>
>
> 0
> 1
> 2
> 3
> #<unspecified>
>
> SXML:
> (Program
>   (SourceElements
>     (VariableStatement
>       (VariableDeclarationList
>         (VariableDeclaration
>           (Identifier "uid")
>           (Initializer
>             (CallExpression
>               (FunctionExpression
>                 (FormalParameterList)
>                 (SourceElements
>                   (VariableStatement
>                     (VariableDeclarationList
>                       (VariableDeclaration
>                         (Identifier "id")
>                         (Initializer
>                           (PrimaryExpression (NumericLiteral "0"))))))
>                   (ReturnStatement
>                     (FunctionExpression
>                       (FormalParameterList)
>                       (SourceElements
>                         (ReturnStatement
>                           (post-inc
>                             (PrimaryExpression (Identifier "id")))))))))
>               (ArgumentList))))))
>     (EmptyStatement)
>     (ExpressionStatement
>       (CallExpression
>         (PrimaryExpression (Identifier "display"))
>         (ArgumentList
>           (CallExpression
>             (PrimaryExpression (Identifier "uid"))
>             (ArgumentList)))))
>     (ExpressionStatement
>       (CallExpression
>         (PrimaryExpression (Identifier "newline"))
>         (ArgumentList)))
>     (EmptyStatement)
>     (ExpressionStatement
>       (CallExpression
>         (PrimaryExpression (Identifier "display"))
>         (ArgumentList
>           (CallExpression
>             (PrimaryExpression (Identifier "uid"))
>             (ArgumentList)))))
>     (ExpressionStatement
>       (CallExpression
>         (PrimaryExpression (Identifier "newline"))
>         (ArgumentList)))
>     (EmptyStatement)
>     (ExpressionStatement
>       (CallExpression
>         (PrimaryExpression (Identifier "display"))
>         (ArgumentList
>           (CallExpression
>             (PrimaryExpression (Identifier "uid"))
>             (ArgumentList)))))
>     (ExpressionStatement
>       (CallExpression
>         (PrimaryExpression (Identifier "newline"))
>         (ArgumentList)))
>     (EmptyStatement)
>     (ExpressionStatement
>       (CallExpression
>         (PrimaryExpression (Identifier "display"))
>         (ArgumentList
>           (CallExpression
>             (PrimaryExpression (Identifier "uid"))
>             (ArgumentList)))))
>     (ExpressionStatement
>       (CallExpression
>         (PrimaryExpression (Identifier "newline"))
>         (ArgumentList)))
>     (EmptyStatement)))
>
>
> tree-il:
>   (begin
>     (begin
>       (define uid
>         (apply (lambda ()
>                  (lambda-case
>                    ((() #f @args #f () (JS~6715))
>                     (prompt
>                       (const return)
>                       (begin
>                         (let (id)
>                           (JS~6716)
>                           ((const 0))
>                           (begin
>                             (lambda ()
>                               (lambda-case
>                                 ((() #f @args #f () (JS~6718))
>                                  (prompt
>                                    (const return)
>                                    (begin
>                                      (let (~ref)
>                                        (JS~6719)
>                                        ((lexical id JS~6716))
>                                        (begin
>                                          (set! (lexical id JS~6716)
>                                            (apply (@@ (nyacc lang
> javascript jslib)
>                                                       js:+)
>                                                   (const 1)
>                                                   (lexical ~ref JS~6719)))
>                                          (lexical ~ref JS~6719))))
>                                    (lambda-case
>                                      (((tag val) #f #f #f () (JS~6720
> JS~6721))
>                                       (lexical val JS~6721))))))))))
>                       (lambda-case
>                         (((tag val) #f #f #f () (JS~6722 JS~6723))
>                          (lexical val JS~6723))))))))))
>     (apply (@@ (guile-user) display)
>            (apply (toplevel uid)))
>     (apply (@@ (guile-user) newline))
>     (apply (@@ (guile-user) display)
>            (apply (toplevel uid)))
>     (apply (@@ (guile-user) newline))
>     (apply (@@ (guile-user) display)
>            (apply (toplevel uid)))
>     (apply (@@ (guile-user) newline))
>     (apply (@@ (guile-user) display)
>            (apply (toplevel uid)))
>     (apply (@@ (guile-user) newline)))
>
>


      reply	other threads:[~2017-06-03  1:52 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-02 23:56 progress on my NYACC javascript example complier Matt Wette
2017-06-03  1:52 ` Nala Ginrut [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAPjoZodDJN4LDx6QzpD0yrNM06kTnMj4NdSGDdCezavH8Nnbjg@mail.gmail.com \
    --to=nalaginrut@gmail.com \
    --cc=guile-user@gnu.org \
    --cc=matt.wette@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).