Program slicing(en.wikipedia.org)
en.wikipedia.org
Program slicing
https://en.wikipedia.org/wiki/Program_slicing
10 comments
I've kind of wanted to formalize this concept ever since I learned about the Static_single_assignment_form used in compilers for optimisation. Programs may be able to benefit greatly from this in terms of refactoring: it's basically separating concerns (from a mechanical point of view.) Separated concerns can open venues for parallelism!
https://en.wikipedia.org/wiki/Static_single_assignment_form
https://en.wikipedia.org/wiki/Static_single_assignment_form
You might find this interesting: http://www.cs.princeton.edu/~appel/papers/ssafun.pdf
Very nice, thank you for posting this!
Program slicing is especially useful when debugging and reasoning about programs in declarative languages, such as Prolog.
In Prolog, it is natural to think in terms of generalizations and specializations of programs, and you can often explain important program properties such as nontermination and failure by showing relevant fragments of clauses.
See also failure slicing.
In declarative languages, slicing is much more convenient and useful than tracing the execution.
Program slicing is especially useful when debugging and reasoning about programs in declarative languages, such as Prolog.
In Prolog, it is natural to think in terms of generalizations and specializations of programs, and you can often explain important program properties such as nontermination and failure by showing relevant fragments of clauses.
See also failure slicing.
In declarative languages, slicing is much more convenient and useful than tracing the execution.
I would be interested in a source code scanner that tells you how many functions or lines can modify a variable and show a table of variables/counts. This could be helpful on a new small codebase or checking variables in a specific ugly class that always has scope errors so we can tell our bosses it sucks.
Slicing that is sound wrt heaps is often hard, and will contain false positives. Unfortunately in practice developers don't accept fps and get quickly frustrated by these tools unless you are very careful.
I think every program should be sliced like this and not doing so is a programming mistake. Of course, Im talking before bottlenecks optimization.
I think this point may be one of the most important in all programming. Taking the example from the wikipedia article (i.e. https://en.wikipedia.org/wiki/Program_slicing#Example ), I think the correct way to program this is with the sum and product loops separate. The only reason to combine them is if it is a bottleneck as you say. Across a code-base there will be very few places were most time is taken and it is there that these optimizations should occur. Everywhere else it should be separate because that optimizes for code clarity. Always engage in cognitive optimizations first and speed/resource/architecture/etc. optimization second (and even then _only_ if necessary).
Alan Shreve demonstrated a version of this in Go: https://www.youtube.com/watch?v=dSqLt8BgbRQ
This seems like a technique which a lot of programmers use, without ever hearing the name "program slicing" --- I call it "follow the data flow". It's especially useful when reverse-engineering.
Details on one such example here if anyone is interested: http://www0.cs.ucl.ac.uk/staff/w.emmerich/publications/ICSE2...