Per fare in modo che un compilatore esegua i controlli del tempo di esecuzione (per trovare avvertenze ed errori che non possono essere trovati in fase di compilazione, inclusa la vettorizzazione del ciclo), inizia ad avvicinarsi pericolosamente al Halting Problem.
Alan Turing proved in 1936 that a general algorithm to solve the halting problem for all possible program-input pairs cannot exist. A key part of the proof was a mathematical definition of a computer and program, which became known as a Turing machine; the halting problem is undecidable over Turing machines. It is one of the first examples of a decision problem.
Considera il seguente programma Java:
public class Halting {
public static void main(String... args) {
while(isCondition()) {
}
}
private static boolean isCondition() {
return true;
}
}
Questo programma non restituisce errori o avvisi dal compilatore. Dovrebbe tracciare attraverso la logica per vedere che è un ciclo infinito. Cosa significa fermare il correttore teorico del tempo di esecuzione per non rimanere bloccato in un loop infinito allo stesso modo? Il compilatore non può rimanere bloccato in un ciclo infinito, non è abbastanza intelligente .
Notate, d'altra parte, che questo ha un errore:
public class Halting {
public static void main(String... args) {
String foo = null;
System.out.println(foo.charAt(0));
}
}
Questo produce l'avviso:
Null pointer access: The variable foo can only be null at this location
Questi controlli sono i migliori che il compilatore possa fare. Ma nota che questo non ha alcun avvertimento, anche se è lo stesso problema:
public class Halting {
public static void main(String... args) {
String foo = getFoo();
System.out.println(foo.charAt(0));
}
private static String getFoo() {
return null;
}
}