In che modo i programmatori gestiscono lo sviluppo di software di basso livello in linguaggi di alto livello?


20

Sono un po 'nuovo nella programmazione e il modo migliore in cui posso porre questa domanda è con un esempio.

So come fare le cose di base in Java e C #. Cose come una piccola applicazione per moduli Windows o creare una classe generica. In pratica ho imparato e non ho ancora provato a fare qualcosa di grosso. Ad ogni modo, sono sempre stato curioso di sapere come si fanno le cose "sotto il cofano", immagino che si possa dire.

So che tutto viene ridotto a 1s e 0s e che i linguaggi di assemblaggio in pratica danno comandi ai pattern di 1s e 0s, ma sembra che ci sia questo salto da lì per: usare una libreria per questo una libreria per quello. Mi sembra che tutto ciò che C # possa fare a meno di una libreria sia aritmetica e logica binaria. Per ottenere input o output, usi le librerie, ecc ...

So che questa domanda probabilmente sembra ovvia ad alcuni e so che ho molto da imparare ma non so nemmeno da dove cominciare con una domanda come questa. Grazie.

Quindi la mia domanda è questa:

Se qualcuno stesse per creare una macchina virtuale o un emulatore di Playstation, un sistema operativo o un driver, o aggiungere il supporto mp3 a un lettore multimediale o creare il proprio tipo di file, ecc ... Come? Non riesco a vedere come si farebbe con C # o Java.

In altre parole, se leggessi un libro come Professional C # di WROX o Programming C # di OReilly, saprei come fare queste cose? Oppure devi imparare il linguaggio assembly o qualcosa di più basso livello come C ++?


7
Un trucco per capire cosa sta succedendo "sotto il cofano" è focalizzare e usare i paragrafi per rendere le cose facili da leggere e capire. Si prega di modificare questa domanda per essere più facile da leggere.
S.Lott

1
Dato il tuo interesse, potresti voler prendere una copia del Codice di Charles Petzold: The Hidden Language of Computer Hardware and Software. È una buona lettura amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight

@ S.Lott In soccorso :-)
Martin Wickman,

@Martin Wickman: Anche se ha funzionato molto bene, è stato utile @fender1901 modificare o mettere a fuoco?
S.Lott

1
@Martin Wickman: annullare le modifiche non è il punto. Incoraggiare gli altri a imparare facendo è il mio punto. Chiaramente lo sai già. @ fender1901 deve imparare facendo. La mia domanda è questa: "ha aiutato @ fender1901 a modificare o mettere a fuoco?" Cosa pensi?
S.Lott

Risposte:


9

Domanda interessante! Scoprirai che linguaggi come Java e C # supportano infatti una programmazione di livello abbastanza basso. Ad esempio, guarda alcuni dei codici sorgente I / O in OpenJDK per Java. Vedrai che i metodi di livello superiore sono implementati con tecnologie socket di livello inferiore, array di byte e bit twiddling.

Per quanto riguarda C # e Java, queste lingue si compongono in bytecode, che viene eseguito su una macchina virtuale. Puoi effettivamente vedere e imparare abbastanza felicemente dal bytecode (ad esempio, vedere come Java gestisce il concatenamento di oggetti String).

Se l'ambiente in cui si sta sviluppando non ospita una di queste macchine virtuali di livello superiore (spesso a causa di requisiti di spazio e prestazioni), è necessario utilizzare un linguaggio di "livello inferiore".

Credo che C / C ++ regoli ancora il posatoio nell'area della scrittura di driver a basso livello ecc. In quanto è possibile modificare la gestione della memoria e le strutture dei dati all'ennesima potenza.

Il montaggio è piuttosto specializzato in questi giorni, è bene fare almeno un rapido corso per apprezzare ciò che accade a quel livello. Quando scrivi un assieme per riempire indietro un registro mentre si svuota, inizi ad apprezzare il tipo di lunghezze a cui ogni livello del linguaggio di programmazione deve andare.

HTH


Puoi effettivamente programmare con le lingue intermedie o sono lì solo per esaminare?
fender1901,

Stai chiedendo se puoi scrivere il codice sorgente 'bytecode'?
Martijn Verburg,

Penso. Mi chiedo se puoi semplicemente iniziare a scrivere codice usando bytecode o il proprio come faresti con java o c #?
fender1901

Java o C #, pochissime persone stanno manipolando il bytecode, tuttavia un gruppo più ampio di persone guarda a quale codice byte il loro particolare codice di livello superiore si riduce a
Martijn Verburg,

4

La maggior parte della programmazione "di basso livello" equivale sostanzialmente all'interfaccia diretta con il sistema operativo. Il motivo per cui non ti sembra che esista un modo "ovvio" per farlo è perché, in generale, linguaggi di livello superiore come Java cercano facilità d'uso e portabilità. Il codice che si interfaccia direttamente con il sistema operativo è generalmente molto meno portatile del codice di livello superiore, a meno che non sia racchiuso in un'astrazione.

In linguaggi di livello inferiore come C e C ++, l'API del sistema operativo è direttamente accessibile (in gran parte dovuto al fatto che la maggior parte dei sistemi operativi sono scritti in C, quindi espongono un'API attraverso il linguaggio C). Ad esempio, in C su un sistema UNIX è possibile chiamare la ioctlfunzione per interfacciarsi direttamente con un dispositivo.

Naturalmente, anche i linguaggi di livello superiore come Java e C # devono parlare con il sistema operativo. Ogni volta che apri un file o leggi da un socket di rete, ti stai interfaccia con il sistema operativo. È solo che Java e C # avvolgono le chiamate di sistema di basso livello in astrazioni di livello superiore, come un Socketoggetto. Questo approccio di livello superiore ha il vantaggio che lo stesso codice Java funzionerà su piattaforme diverse. Considerando che, il modo in cui apriresti un socket in C su UNIX è abbastanza diverso dal modo in cui lo faresti su Windows.

In generale, più la lingua è di livello superiore, minore sarà il controllo su come il programma si interfaccia con il sistema operativo. Detto questo, è possibile fare molte cose in un linguaggio di livello superiore. Ad esempio, non c'è motivo per cui non è possibile scrivere una macchina virtuale in Java o C #.


2

La buona notizia è che può essere fatto con Java o C #. L'unico problema che devi sapere è come . Fondamentalmente, devi sapere queste piccole cose carine sull'architettura hardware (non necessario PC, ma Playstation se è quello che vuoi emulare). E temo che avresti bisogno di approfondire, come Assembler e Machine Language.
Tutti gli ALU, i registri, gli MMU e le cose potrebbero essere astratti ed emulati con un linguaggio di alto livello. È anche possibile chiamare funzioni di basso livello per ottenere supporto hardware (ad esempio, informazioni su PInvoke e JNA).

Tuttavia, poiché sei un principiante, non consiglierei di iniziare con un compito così enorme. Ti suggerirei di imparare C / C ++, un po 'su Linux (o su un altro sistema operativo simile a Unix, ad esempio FreeBSD), Computer Architecture, quindi Assembler ... Potrebbero volerci alcuni anni, quindi ...
Quello di cui hai davvero bisogno è motivazione e pazienza.


2

Quello che ho fatto e quello che ho imparato in un linguaggio di alto livello (Java) sono diventati più interessati, come te, a linguaggi e hardware di basso livello. Nel suo stato più primitivo, un computer è l'elettronica. 1 e 0 sono solo cifre per le cariche elettriche (acceso e spento). Una volta che ho iniziato a capire la logica dietro i processori e cosa c'è dentro un'unità di logica aritmetica, le cose sono andate davvero a posto.
Penso che dovresti iniziare i tuoi studicon cose come la logica booleana (AND, OR, XOR, ecc.), quindi inizia a progettare piccoli ALU e guardare come memoria e registri giocano nelle cose. Dopo di che impara un po 'di linguaggio assembly e poi ti renderai conto di come funziona una compilazione. Molto presto le lingue di alto livello sembreranno noiose! :) Stavo solo scherzando. È bello come tutto vada a posto però, e dovrebbe essere divertente da imparare. Una volta che inizi a seguire il percorso della curiosità, raccoglierai le cose in pochissimo tempo.


2

Mentre puoi fare cose di basso livello con C # o Java (o la maggior parte delle altre lingue), la maggior parte delle persone no. Pertanto, qualsiasi libro ragionevolmente popolare che prenderai su entrambi lascerà fuori roba di basso livello. È probabile che coprano le funzionalità linguistiche di cui avresti bisogno, ma non le applicano nel modo in cui sei curioso. Allo stesso modo, i libri su cose di basso livello saranno probabilmente in C, con forse un po 'di linguaggio assembly.

Imparare C in sé non sarà difficile per un programmatore C #, a parte la manipolazione del puntatore, anche se imparare a fare le cose in esso richiederà più tempo. Poiché C è un linguaggio meno espressivo di C #, alcune cose che sai fare in modo efficiente in C # dovranno essere fatte in un modo molto diverso, e spesso più maldestro, in C.

Quello che dovresti cercare dopo sono i libri sulle cose di livello inferiore che vuoi imparare. Ci sono libri sul kernel Linux, ad esempio, ma la programmazione a livello di kernel sarà difficile da comprendere senza un po 'di background, quindi potresti voler studiare prima i fondamenti del sistema operativo.


Penso che il mio problema più grande in questo momento sia che molti di questi argomenti saranno difficili da comprendere perché non ho il background. Ho bisogno, immagino, di un ponte in quelle aree.
fender1901

@ fender1901: potrebbe essere un problema. Il kernel di Linux fa alcune cose che sembrerebbero davvero strane a qualcuno che non capisce cosa fanno i sistemi operativi. L'emulatore, delle cose che hai menzionato, sarebbe probabilmente il più facile da capire, e ci sono semplici emulatori là fuori, spesso per i primi microcomputer.
David Thornley,

1

È necessario scoprire che è possibile eseguire la funzione di basso livello con la piattaforma / lingua utilizzata o meno:

  • memorizzare un byte in una variabile,
  • leggere / scrivere file per byte,
  • impostazione di una matrice di byte, accesso agli elementi,
  • utilizzare funzionalità procedurali reali, OOP,
  • accesso allo schermo, tastiera, prese.

Hm, sembra che la scelta di una lingua dovrebbe essere casuale.


-2

La domanda ha diverse risposte: 1. Java e C # sono linguaggi di alto livello sviluppati per lo sviluppo di applicazioni su un sistema operativo esistente che gestisce la memoria (ciò consente anche di creare programmi ibridi che possono essere eseguiti su sistemi diversi). 2. Le aree in cui è necessaria la programmazione a basso livello sono lo sviluppo del sistema operativo, lo sviluppo dei driver, lo sviluppo di giochi AAA, ecc. Normalmente la programmazione a basso livello non viene eseguita in Java o C #, ma viene eseguita utilizzando il linguaggio C / C ++ e Assembly.

Con solo questi due punti possiamo dire che la programmazione di basso livello viene eseguita separatamente e non è necessaria una programmazione di basso livello nella programmazione di alto livello. Le parti in cui è necessaria una programmazione bassa come l'I / O sono eseguite dall'interprete che è esso stesso scritto in un linguaggio di basso livello (ad esempio la JVM di java è scritta in C).

La risposta principale alla tua domanda è che queste cose non sono sviluppate usando Java e C #, queste cose sono fatte in C e Assembly, quindi piuttosto che trovare modi per farlo in Java e C # dovresti imparare a imparare C e Assembly in quanto sono i più grandi ragazzi di la programmazione e sì il grande vantaggio è che i programmi scritti a basso livello sono piccoli e veloci.


questo non sembra offrire nulla di sostanziale rispetto ai punti formulati e spiegati nelle precedenti 6 risposte che sono state pubblicate alcuni anni fa
moscerino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.