PPT - Anthony Cozzie

advertisement
Macho:
Programming
With Man Pages
Anthony Cozzie, Murph Finnicum, Sam King
University 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
Raw
Text
Requested
Computation
NL parsing
Database
Candidate
Programs
Code Snippets
Stitching
Solutions
Debugger
Runtime Feedback
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
Print the names of
files in a directory.
Sort names.
directory -> files
files -> names
print(names)
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 LS
public 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
Download