2009-04-05 5 views
2

Haben Sie schon einmal frustriert, dass Visual Studio bestimmte Watch-Ausdrücke nicht neu bewertet, wenn Sie mit dem Debugger durch Code gehen?Reinheit der Methoden in C#, Bewertung und benutzerdefinierten Compiler?

Ich habe und tut jemand hier kümmert sich um reine Methoden? Methoden ohne Nebenwirkungen? Es gibt so viele großartige Dinge über C#, die ich liebe, aber ich kann keine reinen Funktionen schreiben, das heißt, statische Methoden ohne Nebenwirkungen.

Was wäre, wenn Sie Ihren eigenen C# -Compiler erstellen würden, wo Sie so etwas schreiben könnten.

function int func(readonly SomeRefType a, int x, int y) { return /*...*/; } 

Nicht nur die über eine Freisprechfunktion, ach, ich es nicht eine Methode aufrufen, die Funktion gewährleistet ist keine Nebenwirkungen haben. Das C# -Schlüsselwort readonly könnte hier verwendet werden, um genau das anzugeben, und einen Vertrag für reine Funktionen bereitstellen. Diese Art von Funktionen kann immer evakuiert werden, ohne Nebenwirkungen zu verursachen. Dies ist eine Möglichkeit für Visual Studio, meine Funktionen in der Uhr immer zu bewerten, trotz der fehlerhaften Annahme, dass alle Methodenaufrufe und Benutzeroperatoren Nebenwirkungen haben. Eine Methode, bei der alle Parameter kopierweise sind, kann niemals Nebenwirkungen haben, Visual Studio erkennt dies jedoch nicht.

Ich liebe C++ für das, was Sie zur Kompilierzeit tun können, und ich vermisse diese Dinge in C#, ich denke, C# verdunkelt den Benutzer ein wenig und im Grunde keine bestimmte Ausdruckskraft zuzulassen, Programmierer zu verletzen. Viele Dinge, die tatsächlich beziehen, was Sie zur Kompilierzeit tun können, würde ich gerne mehr Meta-Programme sehen, die Programme sind, die vom Compiler ausgeführt werden, um Ihr ursprüngliches Programm zu kompilieren.

z.B. Während C# Booleans hat und keine Dinge wie if (var a = obj as MyRefType) zulassen, generiert es den entsprechenden Code nicht. Ich habe etwas herumgegrubbelt und bemerkt, wie C# keine passende IL für zellenlose Bedingungen erzeugt, zum Beispiel x > y ? 1 : 0, es gibt eine IL-Anweisung für genau das, was der C# -Compiler nicht benutzt.

Möchten Sie in einem Open-Source-.NET-Compiler eingesetzt werden? Was sieht wie C# aus, ist aber etwas ganz anderes, ausdrucksstarker, flexibler und völlig in Bezug darauf, was man damit anfangen kann?

+0

SpeC# tut es nicht? –

+0

SpeC# fügt nur vor und nach der Prüfung bedingte Prüfungen zur Kompilierzeit hinzu und überprüft die Reinheit der Methoden nicht auf Nebenwirkungen. –

Antwort

3

Nicht wirklich. Wenn ich verschiedene Sprachoptionen wollen habe ich schon bekommen:

  • F # für ein funktionelles gebogen
  • Boo für einen DSL-Helfer mit benutzerdefinierter Kompilation Stufen

Die Chancen für ein „Design von committee“ (oder sogar "design by single amateur language designer") Sprache, die ebenso gut durchdacht ist wie C#, sind ziemlich schlank, IMO.

Wäre es nett, noch ein paar Dinge ausdrücken zu können? Absolut.

Ist es ziemlich praktisch, Hunderttausende von Menschen, die die gleiche Sprache, integrierte Visual Studio-Integration von den Menschen, die es wirklich wissen, usw.? Absolut!

Für mich sieht "wie C# aus, ist aber etwas ganz anderes" klingt wie ein Problem, keine Lösung.

+0

Warum Pessimismus standardmäßig? F # ist nicht das, was ich vorhatte und Boo sieht einfach komisch aus, dann mag ich Python nicht. Tatsache ist, dass C# irrtümlich Dinge und verbotene Konstrukte eingeführt hat, die für einige Aspekte der Programmierung lebenswichtig sind. –

+0

Wohin gingen benutzerdefinierte Dekonstruktoren für Strukturen? Warum gibt es sogar einen booleschen Typ? In der Praxis ist jeder Nicht-Null-Wert eine wahre Konstante, der boolesche Typ dient im allgemeinen keinem Zweck. Warum kann ich keine Deklarationserklärung in eine if-Anweisung aufnehmen? Diese Dinge ändern, was Sie mit einer Sprache tun können. –

+0

Das ist, was Sie mit C++ bekommen, einige Leute argumentieren, dass das zu viel ist und vielleicht habe ich gerade den Punkt erreicht, wo ich denke, dass C# zu begrenzt ist und deshalb möchte ich meinen eigenen Geschmack meiner Lieblingssprachen, die die .NET Plattform. –

0

Warum sollten Sie einen anderen Compiler schreiben? Sie können zumindest einiges von dem erreichen, was Sie hier beschreiben, indem Sie beispielsweise einen PostSharp-Weber schreiben, um die Methode (umm, function) zur Kompilierzeit zu ändern.

0

Gerade diese einfache Konvention folgen: Wenn es nicht leer ist, kann die Parameter nicht berühren.

1

Wenn Sie wirklich eine Mischung aus Reinheit wollen, aber man kann immer noch mit zwingendem Aspekte der OOP gehen, mit F # gehen. Es ist von Microsoft und es wird produziert und in VS 2010 integriert.

Wenn Sie wirklich eine echte reine funktionale Programmierung wollen, können Sie sicher sein, dass Sie pure Funktionen in Ihren Programmierkonstrukten haben und eindeutig Nebenwirkungen einschließlich IOs unterscheiden, Ausnahmen können Sie mit Haskell gehen.

Für Starter, können Sie herunterladen GHC, eine Open-Source Haskell Compiler von Simon Peyton Jones, ein Forscher von Microsoft. Sie können auch Visual Haskell herunterladen, ein Plugin für VS 2005, das als IDE für Haskell fungiert.

Für weitere Informationen:

1

die Sprache in diesen Tagen Implementierung ist viel mehr als einen Compiler zu implementieren. Ich bin persönlich süchtig nach Resharper, und selbst die begrenzteren Formen der Syntaxhervorhebung, Hinting, Auto-Vervollständigung und In-Editor-Kompilierung, die von Visual Studio angeboten werden, sind ziemlich anspruchsvoll und hilfreich. Alle diese UI-Sachen müssten ebenfalls neu implementiert werden.

Eine gute Fallstudie in diesem Bereich ist die SpeC# Sprache. Anstatt mehr Features in C# zu werfen, hat Microsoft sie stattdessen in eine Bibliothek umgewandelt, die eine Möglichkeit bietet, Ihren Code zu dekorieren und dann nach dem normalen Kompilierungsschritt eine statische Überprüfung durchzuführen. Es wird also an die Sprache angeheftet, die Sie bereits verwenden.

Dies wäre wahrscheinlich der praktischste Weg, anspruchsvollere Prüfung zu .NET-Sprachen hinzuzufügen.

Beachten Sie auch, dass, obwohl die Sprache Compiler IL erzeugt mit scheinbar redundanten Anweisungen, die Sie sehen nicht, was der JIT tut, wenn es mehr optimiertem nativen Code erzeugt.

+0

Ja, das ist die Sache der zeitgenössischen Entwicklung, gute Werkzeuge sind schwer zu bekommen. –

Verwandte Themen