mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Добавлен дампер шагов оптимизации
This commit is contained in:
parent
33f1057ebd
commit
deab3beaf8
107
src/main/java/com/annimon/ownlang/utils/OptimizationDumper.java
Normal file
107
src/main/java/com/annimon/ownlang/utils/OptimizationDumper.java
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
package com.annimon.ownlang.utils;
|
||||||
|
|
||||||
|
import com.annimon.ownlang.parser.Lexer;
|
||||||
|
import com.annimon.ownlang.parser.Parser;
|
||||||
|
import com.annimon.ownlang.parser.SourceLoader;
|
||||||
|
import com.annimon.ownlang.parser.ast.Node;
|
||||||
|
import com.annimon.ownlang.parser.optimization.ConstantFolding;
|
||||||
|
import com.annimon.ownlang.parser.optimization.ConstantPropagation;
|
||||||
|
import com.annimon.ownlang.parser.optimization.DeadCodeElimination;
|
||||||
|
import com.annimon.ownlang.parser.optimization.ExpressionSimplification;
|
||||||
|
import com.annimon.ownlang.parser.optimization.InstructionCombining;
|
||||||
|
import com.annimon.ownlang.parser.optimization.Optimizable;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public final class OptimizationDumper {
|
||||||
|
|
||||||
|
private static final Optimizable[] OPTIMIZATIONS = new Optimizable[] {
|
||||||
|
new ConstantFolding(),
|
||||||
|
new ConstantPropagation(),
|
||||||
|
new DeadCodeElimination(),
|
||||||
|
new ExpressionSimplification(),
|
||||||
|
new InstructionCombining()
|
||||||
|
};
|
||||||
|
private static final File WORK_DIR = new File("optimizations");
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
WORK_DIR.mkdir();
|
||||||
|
final String input = (args.length >= 1) ? args[0] : "program.own";
|
||||||
|
final Map<String, String> optimizationSteps = getOptimizationSteps(input);
|
||||||
|
writeStepsToFile(optimizationSteps);
|
||||||
|
writeSummary(optimizationSteps);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, String> getOptimizationSteps(String input) throws IOException {
|
||||||
|
final Map<String, String> result = new LinkedHashMap<>();
|
||||||
|
Node node = Parser.parse(Lexer.tokenize(SourceLoader.readSource(input)));
|
||||||
|
int optimizationPasses = 1;
|
||||||
|
int lastBatchModificationCount;
|
||||||
|
int batchModificationCount = 0;
|
||||||
|
result.put("Source", node.toString());
|
||||||
|
do {
|
||||||
|
lastBatchModificationCount = batchModificationCount;
|
||||||
|
batchModificationCount = 0;
|
||||||
|
for (Optimizable optimization : OPTIMIZATIONS) {
|
||||||
|
final String lastSource = node.toString();
|
||||||
|
node = optimization.optimize(node);
|
||||||
|
final String currentSource = node.toString();
|
||||||
|
if (!lastSource.equals(currentSource)) {
|
||||||
|
final String optName = String.format("%s, %d pass",
|
||||||
|
optimization.getClass().getSimpleName(),
|
||||||
|
optimizationPasses);
|
||||||
|
result.put(optName, node.toString());
|
||||||
|
}
|
||||||
|
batchModificationCount += optimization.optimizationsCount();
|
||||||
|
}
|
||||||
|
optimizationPasses++;
|
||||||
|
} while (lastBatchModificationCount != batchModificationCount);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeStepsToFile(Map<String, String> optimizationSteps) throws IOException {
|
||||||
|
Arrays.stream(WORK_DIR.listFiles((d, name) -> name.endsWith(".txt")))
|
||||||
|
.forEach(File::delete);
|
||||||
|
|
||||||
|
int counter = 1;
|
||||||
|
for (Map.Entry<String, String> entry : optimizationSteps.entrySet()) {
|
||||||
|
final String filename = String.format("file_%d.txt", counter++);
|
||||||
|
final File file = new File(WORK_DIR, filename);
|
||||||
|
writeContent(file, writer -> {
|
||||||
|
writer.append(entry.getKey());
|
||||||
|
writer.append("\n\n");
|
||||||
|
writer.append(entry.getValue());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeSummary(final Map<String, String> optimizationSteps) throws IOException {
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
for (Map.Entry<String, String> entry : optimizationSteps.entrySet()) {
|
||||||
|
sb.append(entry.getKey());
|
||||||
|
sb.append("\n\n");
|
||||||
|
sb.append(entry.getValue());
|
||||||
|
sb.append("\n\n-----------\n\n");
|
||||||
|
}
|
||||||
|
writeContent(new File(WORK_DIR, "summary.txt"),
|
||||||
|
writer -> writer.write(sb.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeContent(File file, ThrowableConsumer<Writer> consumer) throws IOException {
|
||||||
|
try (OutputStream out = new FileOutputStream(file);
|
||||||
|
OutputStreamWriter writer = new OutputStreamWriter(out)) {
|
||||||
|
consumer.accept(writer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ThrowableConsumer<T> {
|
||||||
|
void accept(T t) throws IOException;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user