>>>>> "Glen" == Glen Ropella <[email protected]> writes:
Glen> Is there a tool used to parse/analyze/visualize the internal Glen> representations of models? In particular, I'd like to do some Glen> static and dynamic analyses of models just a bit beyond the Glen> profiler. Things like call graphs, complexity, etc. would be Glen> useful and interesting. Are there already tools for such? That would be very cool. I'm pretty sure nothing like that exists. (Unless it's lurking on someone's hard drive and they just haven't been telling us about it.) Glen> I'm also assuming that what comes out of Glen> org.nlogo.headless.Dump.main() -- or org.nlogo.headless.misc.Dump Glen> -- is the closest I can get to the internal representation Glen> without hacking. Is that right? Yes, and note you can call headless.Dump in the command center using `__dump` and `__dump1` (as mentioned at https://github.com/NetLogo/NetLogo/wiki/Unofficial-features). The code dumper includes the output of the bytecode generator -- you probably don't want that level of detail. If you start NetLogo with -Dorg.nlogo.noGenerator=true (`nogen` for short in sbt) you'll get something more manageable, so e.g.: % sbt nogen run observer> ask turtles with [color = red ] [ fd 1 ] print __dump1 Command Center:[]{O---}: [0]_ask:+3 _with _turtles _equal _turtleorlinkvariable:COLOR _constdouble:15.0 [1]_fd1 [2]_done [...] Here what we're seeing is what the NetLogo compiler back end outputs, namely nvm.Procedure objects, where each Procedure contains an array of nvm.Command objects, and each nvm.Command is the root of a tree of nvm.Reporter objects. If you want to do static analysis of NetLogo code, even that representation might be too low-level for you; you might want to work directly with the output of the front end of the compiler, not the back end. The AST (abstract syntax tree) classes output by the front end are defined in https://github.com/NetLogo/NetLogo/blob/5.0.x/src/main/org/nlogo/compiler/AstNode.scala For examples of how different kinds of code end up being represented using these classes, scroll to the bottom of https://github.com/NetLogo/NetLogo/blob/5.0.x/src/test/org/nlogo/compiler/ExpressionParserTests.scala and look for `testStartAndEndPositions10` which uses the same code as the example above. The major difference is that the AST classes preserve the tree structure of the original code, whereas after the back end has run, the structure has been flattened so that commands are no longer nested inside each other. (Reporters are left unflattened.) Glen> (It's not yet clear to me what Glen> the difference is between that Dump and org.nlogo.api.Dump.) api.Dump produces string representations of Logo values. It's what powers primitives like `word`, `print`, and `file-print`: % sbt console [...] scala> import org.nlogo._ import org.nlogo._ scala> val ws = headless.HeadlessWorkspace.newInstance ws: org.nlogo.headless.HeadlessWorkspace = [...] scala> ws.openString(util.Utils.url2String(api.ModelReader.emptyModelPath)) scala> ws.command("crt 100") scala> org.nlogo.api.Dump.logoObject(ws.report("one-of turtles")) res2: String = (turtle 37) -- Seth Tisue | http://tisue.net -- You received this message because you are subscribed to the Google Groups "netlogo-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
