2015-04-10 5 views
11

Basierend auf der Fülle von Stackoverflow, habe ich Antworten auf und ab, ob die Tail rekursive Optimierung speziell C# -Code durchgeführt wird. Einige der Fragen erschien überC# -Kompilierung mit Tail rekursive Optimierung?

  1. Speculation der Optimierung in neueren Versionen von .net zu sprechen, die
  2. Bauantrag als x64bit Anwendung freigegeben wurden die Optimierung
  3. Der Wechsel von einem Debug-Build zu erreichen zu einem Release Build in Visual Studio, um die Optimierung zu erreichen
  4. Keine Optimierung überhaupt und dass die Microsoft-Community behauptet hatte, dass sie keine tail rekursive Optimierung für "Sicherheitsprobleme" tun würden (hat das wirklich nicht verstanden)
  5. Es ist passiert ns durch zufällige

So wie von C# 4.0 (Visual Studio 2013/2015) wie kann man den Schwanz rekursive Optimierung sicherzustellen, wenn man es überhaupt gewährleisten kann?

+3

Es fügt diesen Posts normalerweise viel Wert hinzu, wenn du die anderen Fragen und Antworten verlinkt hast, damit wir deinem Zug folgen können Gedanke und Weg, den du genommen hast, um deine Frage zu erreichen. –

+1

Die aktuelle Version von C# ist 5, Version 6 ist in VS 2015-Vorschauen verfügbar. –

+0

@TravisJ Ich wollte versuchen, die anderen Fragen zu verknüpfen, war mir aber nicht sicher, ob ich sie aufspüren könnte. B/c Ich habe sie über einen längeren Zeitraum gesehen. –

Antwort

19

Es gibt verschiedene Ebenen, auf denen die Tail Call-Optimierung unterstützt werden kann. Das JIT ist wirklich verantwortlich für viele der Optimierungen, die passieren. Der C# -Compiler selbst führt nicht einmal das Inlining von Methoden durch, das ist die Verantwortung des JIT-Compilers. Der C# -Compiler könnte das Tailcall IL opcode verwenden, das einen Aufruf als einen End-Aufruf bezeichnet, jedoch glaubt ich, dass keine Version von C# -Compiler das tut. Der JIT-Compiler kann Tail-Call-Optimierungen vornehmen, wann immer er es für richtig hält. Insbesondere glaube ich, dass nur das 64-Bit-JIT dies tut. Diese blog post skizziert eine Reihe von Szenarien, in denen JIT64 die Tail Call-Optimierung nicht verwenden kann. Ich bin sicher, dass sich die Kriterien ändern können, da sie an einer Neuschreibung des JIT-Compilers mit dem Codenamen RyuJIT arbeiten.

Wenn Sie ein kurzes Beispiel für Programm, das diese TCO versuchen kann:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test(1); 
    } 

    private static void Test(int i) 
    { 
     Console.WriteLine(i); 
     Test(i + 1); 
    } 
} 

das Projekt Set Release/x64 (oder AnyCPU w/o bevorzugen 32-Bit) zu bauen und starten, ohne den Debugger angebracht. Das Programm wird für immer laufen. Wenn ich all diese Dinge nicht mache, dann bekomme ich eine Stackoverflow-Ausnahme um 20947.

+1

Zweite Link verweist auf die gleiche wie die erste. Meinst du das? http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/tail-call-improvements-in-net-framework-4.aspx Auch gute Post: http://StackOverflow.com/ Fragen/15864670/generate-tail-call-opcode –

+0

@ Erti-ChrisEelmaa Der Link wurde korrigiert, auf den auch in dem Beitrag, auf den Sie verlinkt sind, verwiesen wird. –

+0

Um sicherzustellen, dass es sogar eine Tail-rekursive Optimierung durch den JIT-Compiler gibt, setzen Sie es auf 64-Bit-Build? Gibt es außerdem irgendwelche unmittelbaren Dinge (Schlüsselwörter, Attribut-Tags), die man hinzufügen könnte, um die Wahrscheinlichkeit der Optimierung zu erhöhen? –