In che modo i programmatori si occupano dello sviluppo di software di basso livello in linguaggi di alto livello?

19

Sono un po 'nuovo alla programmazione e il modo migliore per fare questa domanda è con un esempio.

So come fare cose basilari in Java e C #. Cose come una piccola finestra formano l'applicazione o fanno una classe generica. Ho praticamente imparato e non ho ancora provato a fare qualcosa di grande. Ad ogni modo, sono sempre stato curioso di sapere come vanno le cose "sotto il cofano", immagino che tu possa dire.

So che tutto si riduce a 1s e 0s e che i linguaggi di assembly fondamentalmente danno comandi a pattern di 1 e 0, ma sembra che ci sia questo salto da lì a: usare una libreria per questo una libreria per questo. Mi sembra che tutto ciò che C # può fare senza una libreria sia la logica aritmetica e 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 iniziare con una domanda come questa. Grazie.

Quindi la mia domanda è questa:

If someone were going to make a virtual machine or a Playstation emulator, or an operation system, or a driver, or add mp3 support to a media player, or make your own file type, etc... How? I can't see the way that would be done with C# or Java.

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

    
posta fender1901 26.04.2011 - 16:48
fonte

7 risposte

8

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

Per quanto riguarda C # e Java, questi linguaggi vengono compilati in bytecode, che viene eseguito su una macchina virtuale. In realtà puoi visualizzare e apprendere con piacere dal codice byte (ad esempio, vedere come Java si occupa della concatenazione di oggetti String).

Se l'ambiente che stai sviluppando non ospita una di queste VM di livello superiore (spesso a causa dei requisiti di spazio e prestazioni), devi utilizzare una lingua di "livello inferiore".

Credo che C / C ++ regoli ancora il roost nell'area della scrittura di driver di basso livello ecc. come si può modificare la gestione della memoria e le strutture dati all'ennesima potenza.

Al giorno d'oggi l'assemblaggio è piuttosto specializzato, è bene fare almeno un breve corso per apprezzare ciò che accade a quel livello. Quando scrivi un assembly per riempire un registro mentre si sta svuotando, inizi ad apprezzare il tipo di lunghezze a cui ogni livello del linguaggio di programmazione deve andare.

HTH

    
risposta data 26.04.2011 - 17:02
fonte
4

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

Nei linguaggi di livello inferiore come C e C ++, l'API del sistema operativo è direttamente accessibile (in gran parte perché molti 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 funzione ioctl per interfacciarsi direttamente con un dispositivo.

Naturalmente, i linguaggi di livello superiore come Java e C # devono anche parlare con il sistema operativo. Ogni volta che apri un file o leggi da una presa di rete, stai interagendo con il sistema operativo. È solo che Java e C # racchiudono le chiamate di sistema SO di basso livello nelle astrazioni di livello superiore, come un oggetto Socket . 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 è molto diverso da come lo faresti su Windows.

In generale, più la lingua è di livello superiore, minore sarà il controllo sul modo in cui il programma si interfaccia con il sistema operativo. Detto questo, molte cose che puoi dire sono possibili in un linguaggio di livello superiore. Ad esempio, non c'è motivo per cui non si possa scrivere una macchina virtuale in Java o C #.

    
risposta data 26.04.2011 - 20:02
fonte
2

La buona notizia è che può essere eseguito con Java o C #. L'unico problema che devi sapere è come . Fondamentalmente, è necessario conoscere queste piccole cose su Hardware Architecture (non necessario PC, ma Playstation se è quello che si vuole emulare). E temo che tu abbia bisogno di approfondire, come Assembler e Machine Language.
Tutte le ALU, i registri, le MMU e gli elementi potrebbero essere astratti ed emulati con un linguaggio di alto livello. Puoi anche chiamare le funzioni di basso livello per ottenere il supporto hardware (per esempio su PInvoke e JNA).

Tuttavia, dato che sei principiante, non consiglierei di iniziare con un compito così enorme. Ti suggerirei di imparare C / C ++, un po 'di Linux (o altro sistema operativo simile a Unix, cioè FreeBSD), Architettura del computer, quindi Assembler ... Potrebbero volerci alcuni anni, quindi ...
Ciò di cui hai veramente bisogno è la motivazione e la pazienza.

    
risposta data 26.04.2011 - 17:13
fonte
2

Quello che ho fatto è quello che ho imparato da un linguaggio di alto livello (Java), poi mi sono interessato più, come lo sei tu, 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'è all'interno di un'unità logica aritmetica, le cose sono davvero andate a posto.
Penso che dovresti iniziare i tuoi studi con cose come la logica booleana (AND, OR, XOR, ecc.), Quindi inizia a progettare piccole ALU e osserva come la memoria e i registri giocano nelle cose. Dopo questo impara un po 'di linguaggio assembly e poi ti rendi conto di come funziona una compilation. Presto i linguaggi di alto livello sembreranno noiosi! :) Stavo solo scherzando. È bello come tutto cada a posto, e dovrebbe essere divertente da imparare. Una volta che inizi a seguire il percorso della curiosità, raccoglierai le cose in poco tempo.

    
risposta data 26.04.2011 - 17:52
fonte
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 raccoglierai lascerà fuori cose di basso livello. Probabilmente copriranno le funzionalità linguistiche di cui avresti bisogno, ma non le applicheranno nel modo in cui ti incuriosiscono. Allo stesso modo, i libri su materiale di basso livello saranno probabilmente in C, con forse un po 'di linguaggio assembly.

L'apprendimento di C non sarà difficile per un programmatore C #, a parte la manipolazione del puntatore, anche se l'apprendimento delle cose in esso richiederà più tempo. Dato che C è un linguaggio meno espressivo di C #, alcune cose che sai come fare in modo efficiente in C # devono essere fatte in modo molto diverso e spesso più rozzo in C.

Quello che dovresti cercare sono i libri sul materiale di livello inferiore che vuoi imparare. Ci sono libri sul kernel di Linux, per esempio, ma la programmazione a livello di kernel sarà difficile da cogliere senza un po 'di background, quindi prima potresti studiare i fondamentali del sistema operativo.

    
risposta data 26.04.2011 - 20:01
fonte
1

Devi scoprire che è possibile eseguire la funzione di basso livello con la piattaforma / lingua utilizzata o no:

  • memorizzazione di un byte in una variabile,
  • lettura / scrittura di file per byte,
  • impostazione di una matrice di byte, accesso agli elementi,
  • usa le vere caratteristiche procedurali, OOP,
  • accedere allo schermo, alla tastiera, ai socket.

Hm, sembra che scegliere una lingua debba essere casuale.

    
risposta data 26.04.2011 - 22:38
fonte
-2

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

Con solo questi due punti possiamo dire che la programmazione di basso livello è fatta separatamente e non c'è bisogno di 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 è a sua volta scritto in un linguaggio di basso livello (ad esempio, la JVM di java è scritta in C).

La risposta principale della tua domanda è che queste cose non sono state sviluppate usando Java e C # queste cose sono fatte in C e Assembly quindi piuttosto che trovare modi per farlo in Java e C # si dovrebbe baginare l'apprendimento di C e Assembly in quanto sono più grandi tizi di programmazione e sì il grande vantaggio è che il programma scritto a basso livello è piccolo e veloce.

    
risposta data 15.04.2016 - 18:38
fonte

Leggi altre domande sui tag