Macho: Programming With Man Pages Anthony Cozzie, Murph Finnicum, Sam King University of Illinois at...

Preview:

Citation preview

Macho: Programming

With Man Pages

Anthony Cozzie, Murph Finnicum, Sam KingUniversity of Illinois at Urbana-Champaign

Programming is hard!

• Extreme Detail• Extreme Precision

Lots of Automated Tools

• Static Analysis– Coverity

• Code Snippet search engines– Prospector, SNIFF, Xsnippet, even Google

• Automated Debuggers– Genetic programming, Delta debugging

Automating Programming

• Computer makes decisions• But it will make mistakes too!• Programmer must go back and check the tool

– not easy• So, how can we do this efficiently?

Macho Architecture

NL parsing Database Stitching Debugger

RawText

RequestedComputation Code Snippets

CandidatePrograms

Runtime Feedback

Solutions

The Trick

NL parsing Database Stitching Debugger

Examples!

• Example is end-to-end: covers many decisions• Easy to understand compared to code

The Example (LS)

Print the names of files in a directory. Sort the names.

Extract Implied Computation

directory -> filesfiles -> namesprint(names)sort(names)

Print the names of files in a directory. Sort names.

Use Programmer’s Labels

public static void main(String[] args) {

....

//first (original) database files = directory.listFiles();

....}

Input to Synthesis: LS1

public static void Ls1(java.lang.String p_directory) { java.io.File tmp = new File(p_directory); java.io.File[] files = tmp.listFiles(); int tmp_0 = files.length; java.lang.String[] tmp_1 = new java.lang.String[tmp_0]; for(int tmp_3 = 0; tmp_3 < files.length; ++tmp_3) { java.io.File tmp_2 = files[tmp_3]; java.lang.String names = tmp_2.getName(); tmp_1[tmp_3] = names; } Arrays.sort(tmp_1); for(int tmp_5 = 0; tmp_5 < tmp_1.length; ++tmp_5) { java.lang.String tmp_4 = tmp_1[tmp_5]; System.out.println(tmp_4); } }

Bugs!

• Prints hidden files• Crashes if the input is not a directory

Synthesized Version of LSpublic static void Ls3(String p_dir) { java.io.File tmp = new File(p_dir); java.io.File[] files = tmp.listFiles(); boolean tmp_3 = tmp.isDirectory(); if(tmp_3) { Arrays.sort(files); for(int tmp_1 = 0; tmp_1 < files.length; ++tmp_1) { java.io.File tmp_0 = files[tmp_1]; java.lang.String names = tmp_0.getName(); boolean tmp_2 = tmp_0.isHidden(); if(!tmp_2)

System.out.println(names); } } else System.out.println(tmp + ""); }

Pure NL Spec

Take the path "/home/zerocool/" If the path is a file, print it. Otherwise get the list of files in the directory. Sort the result alphabetically. Go over the result from the beginning to the end: If the current element's filename does not begin with ".", print it.

Macho

Print the names of files in a directory. Sort the names.

+ simple example

Input Synergy

• NL: moderate information over a large part of the state space

• Examples: very precise information over a tiny part of the state space

• Together: win

Recommended