Domanda

Scrivo codice C/C++ da quasi vent'anni e conosco Perl, Python, PHP e anche un po' di Java, e sto insegnando da autodidatta JavaScript.Ma non ho mai fatto cose su .NET, VB o C#.Cosa fa esattamente gestito codice significa?

Wikipedia lo descrive semplicemente come

Codice che viene eseguito sotto la gestione di una macchina virtuale

e dice specificamente che Java è (di solito) codice gestito, quindi

  • perché il termine sembra applicarsi solo a C#/.NET?
  • Puoi compilare C# in un .exe che contiene anche la VM o devi comprimerlo e darlo a un altro .exe (a la java)?

In modo simile,

  • è .NET a lingua o a struttura, e cosa significa esattamente "quadro" qui?

OK, questa è più di una domanda, ma per qualcuno che è nel settore da tanto tempo, mi sento piuttosto N00B in questo momento...

È stato utile?

Soluzione

Quando si compila il codice C# in un file con estensione exe, viene compilato nel bytecode Common Intermediate Language (CIL).Ogni volta che esegui un eseguibile CIL, questo viene eseguito sulla macchina virtuale Common Language Runtime (CLR) di Microsoft.Quindi no, non è possibile includere la VM nel file eseguibile .NET.È necessario che il runtime .NET sia installato su tutti i computer client su cui verrà eseguito il programma.

Per rispondere alla tua seconda domanda, .NET è un framework, nel senso che è un insieme di librerie, compilatori e VM che non è specifico del linguaggio.Quindi puoi codificare sul framework .NET in C#, VB, C++ e qualsiasi altro linguaggio che abbia un compilatore .NET.

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

La pagina sopra contiene un elenco di lingue che hanno versioni .NET, nonché collegamenti alle relative pagine.

Altri suggerimenti

Principalmente si riferisce al fatto che tutte le allocazioni di memoria sono "gestite" per te.Se stai utilizzando codice gestito non devi preoccuparti di liberare i tuoi oggetti quando hai finito con loro.Permettere loro semplicemente di uscire dall'ambito significherà che la VM alla fine riconoscerà che non ci sono più riferimenti ad essi e li raccoglierà con Garbage restituendo la memoria al sistema.

Il codice non gestito, d'altro canto, semplicemente "perderà" a meno che non si liberino esplicitamente i puntatori prima di eliminare i riferimenti.

Non penso che tu sia il solo ad essere confuso su cosa sia .Net.Ci sono già altre risposte che dovrebbero coprirti, ma lancerò queste informazioni per gli altri.

Per vedere cosa è "realmente" .Net, vai su c:\Windows\Microsoft.Net\Framework

Lì vedrai le cartelle specifiche per le versioni che hai installato.Vai nella cartella v2.0.xxxxx se lo hai installato, ad esempio.

In quella cartella c'è il framework.Fondamentalmente vedrai un mucchio di file .exe e file .dll.Tutti i file DLL che iniziano con System.*.dll sono essenzialmente il framework .Net.

I file .exe che vedrai in quella cartella sono utilità per sviluppatori e compilatori.Hai menzionato C#.Trova il file csc.exe.Questo è il tuo compilatore C#.

Costruire un programma è davvero semplice.Inserisci il codice seguente in un file hello.cs.

using System;
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello world");
        }
    }

Quindi sulla riga di comando digitare> csc hello.cs

Questo ti genererà un file .exe.Eseguilo e ovviamente sputerà "ciao mondo".

La riga che dice Console.WriteLine() sta chiamando il Framework.Console è un oggetto che risiede nello spazio dei nomi System e WriteLine() è un metodo statico.

Questo è il codice disassemblato per il metodo Console.WriteLine():

[HostProtection(SecurityAction.LinkDemand, UI=true)]
public static void WriteLine(string value)
{
    Out.WriteLine(value);
}

Quando le persone dicono cose del tipo "Devo usare PHP o .Net?" o "Devo usare Python o .Net" inizi a capire che è la cosa sbagliata di cui discutere.Stanno ovviamente confrontando una lingua con un framework.C# è un linguaggio ed è solo uno dei tanti linguaggi che possono essere utilizzati per scrivere codice sulla piattaforma .Net.Lo stesso metodo di Console.WriteLine() può essere richiamato da C#, VB.Net, Pascal, C++, Ruby, Python, F# e qualsiasi altro linguaggio progettato per funzionare sulla piattaforma .Net.

Spero che aiuti.

-Keith

Viene utilizzato principalmente per descrivere .NET perché è il termine scelto da Microsoft per differenziare .NET da C/C++ e altri linguaggi meno recenti.Microsoft lo ha scelto perché non era un termine solitamente associato a Java e non voleva enfatizzare le somiglianze tra C#/.NET e Java (invece di chiamarlo qualcosa come "codice macchina virtuale" che lo avrebbe reso suona molto più simile a Java).Fondamentalmente, l'uso del "codice gestito" è una terminologia orientata al marketing, piuttosto che alla tecnica.

Nello specifico in .NET e Visual C++ è possibile avere sia codice non gestito che gestito.I termini si riferiscono al modo in cui la memoria viene allocata e "gestita".

Il codice non gestito sarebbe il materiale C++ a cui sei abituato.Allocazione dinamica della memoria e liberazione esplicita della memoria.Il runtime .NET non gestisce la memoria per te, quindi "non gestito".

Il codice gestito invece è gestito dal runtime.Allochi la memoria dove richiesto (dichiarando variabili, non spazio di memoria) e il garbage collector in fase di esecuzione determina quando non è più necessaria e pulisce tutto.Il Garbage Collector sposterà anche la memoria per migliorare l'efficienza.Il runtime "gestisce" tutto per te.

Come accennato in precedenza, è possibile scrivere codice sia gestito che non gestito.

Non gestito:

class Bar : public Foo {
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int * getFubar() { return * fubar; }
}

Gestito:

public ref class Bar :  public Foo
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int ^ getFubar() { return ^ fubar; }
}

Noti l'arbitro?Questo praticamente designa una classe gestita.Tuttavia, diventa molto confusa quando si mescolano i due tipi di codice.Ad esempio, vuoi salvare un puntatore di riferimento, (^) l'equivalente gestito di un puntatore, in un controllo Picture Box all'interno della classe non gestita.Poiché il Garbage Collector può spostare la memoria, la prossima volta che si tenta di dereferenziare la finestra dell'immagine non sarà possibile trovarla.Il runtime non comunica al codice non gestito le modifiche apportate alla memoria.

Pertanto è necessario fissare l'oggetto gestito in memoria per consentire al codice non gestito di tenerne traccia.Poi c'è l'unboxing e tutti i tipi di altre stranezze che ti permettono di mescolare i due.La complessità del codice è enorme!

Ufficialmente, gestito/non gestito potrebbe dipendere dal modo in cui il codice viene eseguito nello stack .NET.Tuttavia, se provieni da un background C++, spero che questo sia un po' più rilevante per te.

Gestito significa che il codice non è compilato in codice nativo e quindi viene eseguito sotto gli auspici di una macchina virtuale.Java compila in un formato intermedio chiamato bytecode, che la Java VM sa come interpretare ed eseguire.Tutti i linguaggi .NET fanno una cosa simile, compilando in IL (linguaggio intermedio) che interpreta il runtime .NET.È un po' confuso perché .NET IL ha estensioni di file .dll e .exe.

Il termine gestito viene generalmente applicato solo a .NET perché Microsoft utilizza il termine.Microsoft in genere non utilizza il termine "macchina virtuale" in riferimento a un ambiente di esecuzione gestito .NET.

Il "bytecode" (IL) di .NET è in qualche modo diverso dal bytecode Java in quanto è stato esplicitamente progettato per essere compilato in codice nativo prima dell'esecuzione nell'ambiente gestito, mentre Java è stato progettato per essere interpretato, ma il concetto di codice indipendente dalla piattaforma è simile.

Il ".NET Framework" è fondamentalmente un enorme insieme di librerie fornite da Microsoft, contenenti migliaia di classi che possono essere utilizzate per sviluppare applicazioni.

Un file .exe C# compilato contiene codice indipendente dalla piattaforma che può essere eseguito in qualsiasi ambiente compatibile con .NET, incluso Mono.Tuttavia, il runtime viene generalmente distribuito separatamente dalle applicazioni che lo utilizzano.

A rischio di offendere alcuni, sospetto che la parola gestito sia stata usata in modo che potessero usare la parola non gestito invece di compilata.Sebbene gestito possa significare di più, la realtà è che sembra essere utilizzato per distinguere principalmente tra ciò che è praticamente la compilazione just in time (come sostituto di quello che una volta era interpretato o pcode) e il codice compilato nativo.

Oppure, in altre parole, quale preferiresti utilizzare:

a) Codice non gestito che potrebbe causare azioni incontrollabili al sistema.

b) Codice compilato nativo che sia veloce, solido e vicino al sistema operativo.

Naturalmente, in realtà sono la stessa cosa.

Allo stesso modo, .NET è un linguaggio o un framework e cosa significa esattamente "framework" qui?<<

.NET è l'attuale piattaforma software aziendale di Microsoft.Consiste in:

• Un'unica interfaccia universale per accedere alle funzionalità di Windows:

o The .NET Framework Class Library (FCL).
o The FCL provides a rich set of high-level functionality for developers.

• Un unico linguaggio e runtime universale per l'esecuzione di applicazioni .NET:

o Common Language Runtime (CLR) executes Common Intermediate Language (CIL).
o The CLR is God: it runs, controls, and polices everything.

• La scelta di più linguaggi per lo sviluppo di applicazioni .NET:

o Every development language is compiled to CIL, which is run by the CLR.
o C# and VB are the two main development languages.

.NET è una struttura.Il Common Language Runtime (CLR) esegue il codice Microsoft Intermediate Language (MSIL) che viene generato quando viene compilata una soluzione (ovvero, non viene compilato in codice macchina).Non puoi contenere l'API all'interno dell'exe, né vorresti farlo poiché è piuttosto grande.Il vantaggio principale qui è la gestione della memoria (oltre ad alcuni altri vantaggi in termini di sicurezza e forse altri di cui non sono a conoscenza).

Posso rispondere alla domanda quadro..NET è un framework, C#, VB.NET, ecc. sono linguaggi.Fondamentalmente .NET fornisce una piattaforma comune di librerie da chiamare (All the System....dlls) che qualsiasi linguaggio che utilizza .NET può chiamare.Tutti i linguaggi .NET sono compilati in MSIL (Microsoft Intermediate Language, meglio conosciuto solo come IL) che può poi essere eseguito su qualsiasi PC con installato l'apposito framework .NET.

.NET è una struttura.Può essere utilizzato da molti linguaggi (VB.NET, C#, IronPython, boo, ecc.)

.NET viene sempre eseguito come interpretato e no, non è possibile includere la "VM" all'interno del file .exe.Qualsiasi utente che desideri eseguire la tua app .NET deve avere il framework installato.

Può fare riferimento a qualsiasi codice eseguito da una macchina virtuale anziché direttamente dalla CPU.

Penso che questo consenta cose come la raccolta dei rifiuti e il controllo dei limiti dell'array.

Personalmente, penso che la parola "quadro" sia un po' impropria.

.NET è una "piattaforma", costituita da un ambiente di esecuzione (la macchina virtuale CLR) e da un insieme di librerie.È esattamente analogo a Java, Perl o Python (nessuno dei quali viene mai definito "framework").

Nella maggior parte dei casi, la parola "framework" viene utilizzata per progetti come Spring o Struts o QT, che si trovano su una piattaforma (ovvero non forniscono un proprio ambiente di esecuzione) come una libreria.

Ma a differenza di una "biblioteca", un framework cerca di ridefinire le operazioni fondamentali della piattaforma sottostante.(L'inserimento delle dipendenze di Spring sfida la logica di chiamata del costruttore del normale codice Java.L'implementazione di segnali e slot di QT sfida il normale codice C++.)

So di essere solo un bastardo pedante, ma per me .NET non è un framework.È una piattaforma.

Codice gestito: MSIL, IL e codice gestito sono gli stessi. Quando creiamo la nostra applicazione, i file .dll o .exe vengono generati nella cartella Bin. Questi file vengono chiamati codice gestito. Successivamente questi file vengono forniti a CLR per generare nativi codice che sarebbe compreso dal sistema operativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top