.Net Framework - Verständnisfragen

  • Allgemein

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    .Net Framework - Verständnisfragen

    Hallo,
    ich bin gerade dabei zu lernen, wie das Framework funktioniert. Dazu habe ich ein paar Fragen. Außerdem möchte ich wissen, ob mein jetztiges Wissen richtig ist. Wie ich es verstanden habe:
    Die CLI (Common Language Infrastructure) ist das aller unterste Grundelement. Sie ist dafür zuständig, dass Programmiersprachen reibungslos zusammen arbeiten können (Also wenn ich jetzt mit vb eine Anwendung schreibe und eine C# Klassenbibliothek benutzte? Aber liegen nicht beide Sprachen beim JITten in der Intermediate Language vor? Oder ist damit gemeint, dass auch C++ DLLs benutzt werden können?). Die CLR (Common Language Runtime) ist danach an der Reihe. Auf ihr basieren die BCL (Basic Class Libary), welche die Basis-Assembly beinhaltet (mscorlib.dll). Die BCL beinhaltet also u. a. den Namespace System. Richtig soweit? Was ist eig. die FCL (Framework Class Libary)? In meinem Buch steht:

    Microsoft Visual Basic 2005 - Das Entwicklerbuch schrieb:

    Die FCL fasst alle.NET-Funktionsbereiche unter einem Namen zusammen.

    Was bedeutet das?
    Nungut, weiter gehts mit dem CTS (Common Type System). Es sorgt dafür, dass ich nicht ohne weiteres einen String in einen Integer konvertieren kann (Type Sicherheit). Wieso kann das nicht einfach die IDE machen? Wieso kann die IDE nicht einfach Automatisch konvertieren bzw. Fehler werfen? Außerdem gibt es noch die Execution Engine, die dafür sorgt, dass die Anwendung zum ausführen kommt. Macht dass nicht der JITer? In meinem Buch steht:

    Microsoft Visual Basic 2005 - Das Entwicklerbuch schrieb:

    Aufgabe der Execution Engine ist es, die vergleichsweise neue .NET-Technologie zusammen mit dem Vorgang des Just-in-Time Kompilierens an die Startvorgänge eines herkömmlichen Programms unter Windows anzupassen.

    Sorry, das mit der Execution Engine habe ich überhaupt nicht verstanden...

    Denkt bitte daran, ich bin gerade mal fast 14 Jahre alt, also bitte kein Fachchinesisch :)
    Mfg
    Vincent

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VincentTB“ ()

    VincentTB schrieb:

    Wieso kann die IDE nicht einfach Automatisch konvertieren

    Das ist das, was man im Allgemeinen unter Option Strict Off versteht. Warum das nicht wünschenswert ist, muss ich dir hoffentlich nicht erklären.

    Und zum Rest: die CLR schreibt bestimmte Dinge vor, die eine Programmiersprache beherrschen muss, damit diese reibungslos in IL konvertiert werden können. Sind .Net-Programme erst einmal kompiliert, so kannst du nicht mehr unterscheiden, mit welcher Sprache sie geschrieben wurden. Das ist das Grundprinzip hinter der Sache, dass man sprachenunabhängig ist.
    Und was ist die FCL? Und was macht genau die Execution Engine? Und wieso muss das Framework die Typsicherheit übernehmen, dass drückt doch eher auf die Performance?!

    Artentus schrieb:

    nicht mehr unterscheiden, mit welcher Sprache sie geschrieben wurden.

    Und wozu gibts dann die CLI?

    Noch mal ne Frage:
    Das Kompilieren in die IL übernimmt auch das Framework, oder ist der Kompilierer in der IDE? Das, wovon ich geschrieben habe, ist aber ausschließlich dazu da, die Anwendung in der IL ausführbar zu machen, oder nicht?
    Mfg
    Vincent

    Ich meine jetzt: Der Kompiler, der VB.net zu der IL "konvertiert", ist der im Framework oder ist der bei der IDE dabei. Aber wahrscheinlich bei der IDE, was will ein nicht-Programmierer mit nem Kompiler von VB.Net/C#/...

    Hintergrund war dann: Wieso brauche ich die CLI, wenn sowieso alles IL ist? Für C++ Dlls?

    (Ich meine dann: Das Framework hat nichts mit dem übersetzten von Vb.net zu IL zu tun?!)
    Mfg
    Vincent

    Unter FCL verstehe ich einfach alle Libs, die die Klassen des Frameworks enthalten (z.B. mscorelib.dll).

    Typsicherheit ist imo eines der wichtigsten Qualitätskriterien einer Sprache. Nur mit Typsicherheit kann man bestimmte Verhaltensweisen garantieren.
    Das gegenteil von Typsicherheit ist LateBinding, wie man es z.B. aus PHP kennt, und das führt häufig zu gravierenden Fehlern im Programm (wie Sicherheitslücken). Es ist also besser, dass bei einer falschen Zuweisung ein Fehler geschmissen wird, als dass es irgendwie unvorhergesehen konvertiert wird und dann andere schlimmere Fehler auftreten.

    Jede .Net-Sprache (sei es jetzt VB, C#, J# oder auch F#) besitzt ihren eigenen Compiler. Dieser verwandelt den Code in IL, der immer gleich aussieht (naja fast, wenn man geübt ist, kann man die Kompiler noch voneinander unterscheiden). Dadurch kann man von jeder beliebigen Sprache aus Code aufrufen, der in einer anderen beliebigen Sprache geschrieben wurde. Man könnte sogar ganz einfach eine neue Sprache erfinden, ohne dass die Kompatibilität verloren geht.
    Dieser IL-Code wird dann bei der ersten Ausführung auf dem Zielcomputer vom JIT-Compiler in echten Maschinencode übersetzt, wodurch die Platformunabhängigkeit gewährleistet wird.

    Artentus schrieb:

    Unter FCl verstehe ich einfach alle Lib, die die Klassen des Frameworks enthalten (z.B. mscorelib.dll).

    In meinem Buch steht aber, dass das die BCL ist:

    Microsoft Visual Basic 2005 - Das Entwicklerbuch schrieb:

    Die BCL ist Teil der Common Language Runtime, und sie enthält alle Basisobjekte, die Sie während
    Ihres Entwicklungsalltags ständig benötigen. Sie definiert u. a. alle primitiven Datentypen und implementiert damit das Common Type System(s.u.) in Form von verwendbaren Objekten und Typen,
    von denen sich die meisten im System-Namespace bzw. in der Assembly mscorlib.dll befinden.


    Aber danke für deine Antwort, hat mir schonmal weitergeholfen ;)

    @Manawyrm
    Aber wieso? Was wollen "normale" Leute mit einem Kompiler? Der nimmt doch eig. nur unnötigen Speicherplatz weg. Oder wird der nach dem Kompilieren in die IL noch benötigt?
    Mfg
    Vincent

    Wirklich groß ist der nicht. Außerdem ist Software in der Lage mittlels CodeDom selbst Code zu kompilieren.
    Nen wirklicher Normalnutzer Einsatzzweck fällt mir dafür jetzt auch nicht ein,
    es ist imho aber schon sehr praktisch, einfach an irgendeinem Rechner mal kurz nen kleines Konsolentool hacken zu können :)
    Typedefinitionen sind doch zB. Integer, String, Byte, ...? Was sind Grundklassen? Sind Grundklassen zB. der My-Namespace? Wenn nicht, kann mal jemand ein Beispiel für eine Grundklasse nennen? :)
    Mfg
    Vincent

    Das Common Type System ist das gemeinsame Typensystem aller .NET-Sprachen (ja, ich weiß, die Erklärung ist doof. :D)
    Im Prinzip heißt das, dass es in der BCL (auf Wikipedia steht es genau) Typen gibt, die von allen .NET-Sprachen verwendet werden. Das hat den Vorteil, dass wenn der C#- oder VB-Code hinterher in die CIL kompiliert wird, alle Programme - unabhängig von der Programmiersprache - die gleichen Typen benutzen und somit auch kompatibel zueinander sind. Aus dem Grund kannst du problemlos eine C#-Library in VB.NET verwenden (und nat. auch umgekehrt).

    Wenn du in einem VB-Programm schreibst: Dim a as Integer, dann versteht der Compiler das als Dim a as System.Int32, denn System.Int32 ist der gemeinsame Typ für 32-Bit-Integer.
    In C# heißt dieser int, wird aber am Ende auch als System.Int32 interpretiert. So benutzen beide Sprachen den gleichen Integer-Typen.

    bei Wikipedia steht es eigentlich schon relativ gut erklärt:
    en.wikipedia.org/wiki/Base_Class_Library
    Übrigens:

    Wikipedia.org/FCL schrieb:

    The Framework Class Library (FCL) is a standard library and one of two core components of Microsoft .NET Framework. The FCL is a collection of reusable classes, interfaces and value types. The Base Class Library (BCL) is a part of FCL and provides the most fundamental functionality, which includes classes in namespaces System, System.CodeDom, System.Collections, System.Diagnostics, System.Globalization, System.IO, System.Resources and System.Text.
    Von meinem iPhone gesendet
    Vielleicht hilft das ein Bisschen beim Verständnis:

    Rechts vom Maschinencode bin ich mir etwas unsicher, wie es da aufgebaut ist. Denn die CPU ist ja keine einzelne Einheit, sondern greift eben auch auf den RAM zu.

    Im Bild hab ich ein Beispiel verwendet.
    Wenn man in C# i++; schreibt, oder in VB i += 1, dann erstellen beide Compiler den selben Code.

    Quellcode

    1. ldloc.0 ' ldloc steht für "load local". Dann kommt ein Punkt zum Trennen und die 0 steht für die lokale Variable am Index 0. Der Wert dieser Variable ist jetzt auf dem Stack.
    2. ldc.i4.1 ' ldc steht für "load constant". i4 steht für Integer mit 4 Bytes (mit Vorzeichen). Also ein Int32. In VB wäre das Integer. In C# int. Der Einser am Ende steht für die Konstante 1. Der Wert 1 befindet sich jetzt also (neben der Variable) auf dem Stack.
    3. add.ovf ' Die beiden obersten Werte auf dem Stapel werden addiert. Das ovf am Ende gibt an, dass eine Überlaufprüfung (overflow) durchgeführt werden soll.
    4. stloc.0 ' stloc steht für "store local". Das schreibt den obersten Wert auf dem Stack in die lokale Variable. 0 am Ende gibt an, dass es die lokale Variable am Index 0 ist.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Wenn man in C# i++; schreibt, oder in VB i += 1, dann erstellen beide Compiler den selben Code.

    Ungünstiges Beispiel. Die Funktionen/Prozeduren sind verschieden, erzeugen aber in diesem Kontext den gleichen IL-Code (bis auf den Overflow check).
    Der Inkrement Operator [variable]++ ist eine Funktion und gibt den Wert vor dem Erhöhen zurück.
    Bei ++[variable] ist es der Wert nach dem Erhöhen.
    Der Operator += ist eine Prozedur. Es wird kein Wert zurückgegeben.

    Ich rede nur von C# und VB in anderen Sprachen kann es wieder anders sein.
    @markus.obi: Ja, das hab ich in diesem Fall mal außer Acht gelassen.
    @Artentus: Vorsichtig. + ist eine Funktion (der genannte op_addition). += ist jedoch keine Funktion.
    Wenn += eine Funktion wäre, würde das hier funktionieren:

    VB.NET-Quellcode

    1. Dim A = 1
    2. Dim B = (A += 1)

    X += Y ist nur eine Kurzschreibweise von X = X + Y. (Und hier gilt natürlich: + ist eine Funktion).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ja, genau. Aber wenn + eine Funktion ist, dass ist += auch eine Funktion. Zwar nicht im Sinne von .Net, aber im Sinne vom Prozessor, der kennt nämlich gar kein +=.
    Du kannst Operatoren auf Wertetypen nicht den selben Stellenwert wie einer komplexen funktionalen Struktur zuordnen, das sind lediglich ASM-Befehle.