Programmazione di basso livello: cosa c'è in esso per me? [chiuso]

32

Per anni ho considerato di scavare in quelle che considero linguaggi "di basso livello". Per me questo significa C e assemblaggio. Tuttavia non ho ancora avuto tempo per questo, né è mai stato necessario.

Ora, poiché non vedo sorgere nulla, mi sento come se dovessi o pianificare un punto nel tempo in cui studierò l'argomento o abbandonerò per sempre il piano.

La mia posizione

Negli ultimi 4 anni mi sono concentrato su "tecnologie web", che potrebbero cambiare, e io sono uno sviluppatore di applicazioni, che è improbabile che cambi.

Nello sviluppo di applicazioni, penso che l'usabilità sia la cosa più importante. Scrivi applicazioni da "consumare" dagli utenti. Più quelle applicazioni sono utilizzabili, più valore hai prodotto.

Per ottenere una buona usabilità, credo che le seguenti cose siano valide

  • Buon design : funzionalità ben pensate accessibili attraverso un'interfaccia utente ben ponderata.
  • Correttezza : il miglior design non vale nulla, se non implementato correttamente.
  • Flessibilità : un'applicazione A dovrebbe evolversi costantemente, in modo che i suoi utenti non debbano passare a una diversa applicazione B, che ha nuove funzionalità, che A potrebbe implementare. Le applicazioni che affrontano lo stesso problema non dovrebbero differire nelle funzionalità ma in filosofia.
  • Prestazioni : le prestazioni contribuiscono a una buona esperienza utente. Un'applicazione è idealmente sempre reattiva e svolge i suoi compiti in modo ragionevolmente veloce (in base alla loro frequenza). Il valore dell'ottimizzazione delle prestazioni oltre il punto in cui è visibile dall'utente è discutibile.

Penso che la programmazione di basso livello non mi aiuterà in questo, tranne che per le prestazioni. Ma scrivere un'intera app in un linguaggio di basso livello a fini di performance è per me un'ottimizzazione prematura.

La mia domanda

Che cosa potrebbe insegnarmi la programmazione di basso livello, quali altre lingue non mi insegnerebbero? Mi manca qualcosa, o è solo un'abilità, che è di pochissimo uso per lo sviluppo di applicazioni? Per favore, comprendi che non sto mettendo in dubbio il valore di C e dell'assemblaggio. E 'solo che nella mia vita di tutti i giorni, sono abbastanza felice che tutte le complessità di quel mondo siano astratte e gestite per me (principalmente da strati scritti in C / C ++ e assemblaggi stessi). Semplicemente non vedo nessun concetto, potrebbe essere nuovo per me, solo i dettagli con cui dovrei fregarmene la testa. Quindi cosa c'è in esso per me?

La mia conclusione

Grazie a tutti per le loro risposte. Devo dire che nessuno mi ha davvero sorpreso, ma almeno ora sono abbastanza sicuro di abbandonare questa area di interesse fino a quando non ne avremo bisogno. Per quanto ne so, scrivere assembly in questi giorni per processori come sono in uso nelle CPU di oggi non solo è complicato in modo non necessario, ma rischia di comportare prestazioni di runtime inferiori rispetto a una controparte C. Ottimizzare a mano è quasi impossibile a causa di OOE, mentre non si ottengono tutti i tipi di ottimizzazioni che un compilatore può fare automaticamente. Inoltre, il codice è o portatile, perché usa un piccolo sottoinsieme di comandi disponibili, oppure è ottimizzato, ma probabilmente funziona su una sola architettura.
Scrivere C non è più necessario, come nel passato. Se dovessi scrivere un'applicazione in C, utilizzerei le librerie e le strutture testate e consolidate, che mi risparmierebbero nell'implementare le routine di copia delle stringhe, gli algoritmi di ordinamento e altri tipi di roba che servono come esercizio all'università. Il mio codice sarebbe eseguito più velocemente al costo della sicurezza del tipo. Non sono propenso a cercare di migliorare la ruota nel corso del normale sviluppo di app, né a cercare di eseguire il debug osservando i core dump: D
Attualmente sto sperimentando con linguaggi e interpreti, quindi se c'è qualcosa che vorrei pubblicare, suppongo che porterei un concetto di lavoro in C, anche se C ++ potrebbe anche fare il trucco.
Ancora una volta, grazie a tutti per le vostre risposte e la vostra intuizione.

    
posta back2dos 30.11.2010 - 13:12
fonte

13 risposte

8

La programmazione di basso livello è per i casi d'angolo in cui non è presente immediatamente un requisito sui normali computer desktop. Questo potrebbe essere un collo di bottiglia di velocità, o un collo di bottiglia della memoria o qualcosa di completamente diverso, ed è molto spesso molto interessante vedere cosa può essere fatto alla luce di tali requisiti.

Pensalo come Haikus o Limerick, dove le restrizioni lo rendono interessante.

Per darti un'idea di ciò che è possibile in quello che sembrerebbe impossibile oggi, ecco uno dei migliori hack di sempre. Scacchi in 1 Kb RAM! link

    
risposta data 02.12.2010 - 18:39
fonte
29

Stavo pensando questo recentemente. Al momento mi considero uno sviluppatore C #, il che è perfetto per la mia carriera.

Tuttavia, ogni tanto mi mancano le cose veramente di basso livello (essenzialmente 'sporcarmi le mani' facendo assembler o driver di periferica in C). Mi manca la programmazione. Non mi aspetto di aiutarmi nella mia carriera in maniera massiccia. Se i driver di dispositivo o i sistemi integrati sono la tua passione, allora potrebbe essere di grande aiuto.

Quanto più programma nelle lingue astratte, tanto più mi manca quello che mi ha fatto entrare nei computer in primo luogo: curiosare attorno al computer e vedere quali scosse. Assembler e C sono molto adatti per frugare:)

Usando le lingue più vecchie, penso che sei costretto a fare praticamente tutto da solo. In C # posso fare qualcosa come myArray.SortBy(x=>x.Name) . In nessun modo sarei in grado di farlo in C. Accetto che la lingua farà il miglior assortimento per me. Se dovessi farlo in C, sarei in grado di tornare ai giorni dei miei moduli universitari e rivedere i miei diversi algoritmi di ordinamento e ricerca.

Quindi, penso che i linguaggi di livello inferiore ti aiuterebbero a rivedere tutti i bit dimenticati da tempo che sono stati sottratti. Più di una sfida personale rispetto a una carriera che progredisce.

    
risposta data 30.11.2010 - 13:32
fonte
15

Il mio suggerimento è di giocare con C come una curiosità intellettuale. Non fare investimenti pesanti perché non ne vale la pena.

Obiettivi suggeriti:

  • Aggiorna la tua memoria sulle strutture e algoritmi di dati di base.
    • È solo una cosa buona da sapere, come l'algebra e la geometria.
    • Cerca di fare degli esercizi da manuale del college o programmare puzzle in C
  • Un migliore apprezzamento della gerarchia di memoria (larghezza di banda) , dal Cache della CPU per la latenza della rete transoceanica. Ciò aiuterà le tue capacità di sviluppo delle applicazioni a tutti i livelli.
    • Ancora più importante, è utile conoscere gli scenari in cui un piccolo riarrangiamento poco appariscente del codice di alto livello può risultare in un drammatico miglioramento della velocità .
      • A volte il motivo può essere compreso solo nell'implementazione di basso livello nel contesto della gerarchia della memoria.
      • Non capire la causa naturale di questa possibilità porta a ignoranza , paura e infine a negare , pensando che sia sbagliato per - sviluppatori di livello per attingere a questo tipo di ottimizzazione. In realtà non c'è niente di sbagliato in questo.
  • Apprezza l'estetica dei sistemi software basati su componenti , che consente ai componenti di basso livello sviluppati in C / C ++ / Assembly di essere utilizzati da sistemi di alto livello.
    • L'estetica è esattamente uguale all'usabilità del software:
      • Buon design (potente, facile da usare, ben congegnato)
      • Correttezza
      • Flessibilità (estensioni e nuovi comportamenti attraverso la composizione di parti esistenti, ognuna con uno scopo chiaramente definito)
      • Prestazioni (senza complicare l'usabilità)
    • Anche se non potresti progettare i tuoi componenti di basso livello, la tua comprensione ti aiuterà a valutare e scegliere i componenti validi da utilizzare nei tuoi progetti di alto livello.
  • Infine, apprezza che i componenti di basso livello siano quasi sempre più complicati nelle loro implementazioni , lungi dall'essere concepibili solo guardando all'interfaccia.
    • Il livello basso è sempre complicato. Una buona libreria nasconde la complessità senza diminuire il suo potere.
    • Impara a leggere le "note tecniche" scritte dagli sviluppatori di componenti, che sono suggerimenti per gli utenti di componenti di livello superiore su come utilizzare al meglio i componenti.
risposta data 01.12.2010 - 09:04
fonte
8

se vuoi capire come funziona machine e non solo la macchina virtuale da cui dipende la tua lingua di alto livello, allora Assembly ti insegnerà questo

se non hai motivo di preoccuparti, e la maggior parte dei programmatori in questi giorni non lo fa davvero, allora non preoccuparti.

migliorerà le tue fondamenta, ma probabilmente non migliorerà le tue app web

    
risposta data 30.11.2010 - 15:49
fonte
8

Ogni linguaggio di programmazione cambia un po 'su come si pensa alla programmazione in generale. Un esempio concreto che posso darti è quando ho iniziato a imparare haskell e all'improvviso i bit funzionali di javascript, ruby e python hanno reso tutto molto più sensato. Non avevo mai usato foldl in nessuno dei miei codici, ma dopo haskell lo vedo praticamente ovunque io veda gli array. Quindi è molto probabile che se impari qualche C diventerai molto più consapevole delle caratteristiche relative alle prestazioni di vari costrutti nella tua lingua preferita. Qualche minuto fa stavo ascoltando un discorso sulla scrittura veloce e ottimizzato di javascript e l'oratore ha detto "Se è difficile da fare in C allora sarà molto lento in javascript". Il suo intento è che javascript è un linguaggio interpretato e l'interprete è scritto in C o C ++. Mi è passata per la testa perché ho poca esperienza in C e non ho idea di cosa sia difficile o facile in C.

    
risposta data 30.11.2010 - 21:28
fonte
7

Se non lo fai solo per divertimento, perché i geek amano davvero avere il pieno controllo del loro hardware, potresti almeno avere una sensazione migliore di quanto un programma possa diventare più veloce quando viene scritto in C anziché, ad esempio, Giava. Potresti anche imparare ad apprezzare davvero le funzionalità dei linguaggi di livello superiore, come la garbage collection.

    
risposta data 30.11.2010 - 13:25
fonte
5

Urrà per curiosità!

È molto bello avere qualche nozione su cosa stia realmente succedendo ai livelli più bassi di un sistema complesso, anche se non c'è alcun bisogno logico di sapere per i propri doveri quotidiani. Il modo migliore per ingannare le cose a livello di bit è di creare la tua CPU. Devi pensare agli opcode a livello di linguaggio della macchina, capire perché i set di istruzioni ortogonali sono così buoni, le complicazioni della gestione degli interrupt, i compromessi tra circuiti complessi rispetto al microcodice (ad esempio in unità di moltiplicazione) e oh così tanto altro divertimento!

Ma questo, ovviamente, richiede il know-how dell'elettronica e richiede molto tempo, quindi la cosa migliore da fare è giocare con una CPU a 8 bit in stile antico. I microcontrollori come l'8051 sono ancora in uso diffuso e disponibili per gli hobbisti. Ciò richiede ancora un po 'di know-how nella pastorizia elettronica e nell'illuminazione dei LED senza fumare, e costa $ $$ se non si è già attrezzati per l'elettronica.

La cosa migliore dopo di ciò: giocare in un simulatore di CPU (emulatore? Ottengo mescolati quei termini) - questi esistono per Z80, 6502, 8086 ... tutti i vecchi 8-bitter. Questo può essere il più educativo e divertente per un programmatore di applicazioni che non sa quale parte del saldatore tenere (anche se si impara piuttosto velocemente :) Come il testo viene scritto nella memoria video, come i trucchi del codice assembly aiutano le prestazioni. .. ci sono un sacco di cose divertenti da esplorare a questo livello.

Non sono così sicuro di apprendere C come solo un'altra lingua, senza una certa comprensione iniziale del funzionamento interno della CPU. Sapere come vengono inviati i bit tra i registri della CPU e il modo in cui la memoria ha avuto accesso, aiuta enormemente a ottenere veramente dei puntatori e altri concetti del linguaggio C.

    
risposta data 02.12.2010 - 18:27
fonte
4

In una parola, divertente. Quando giocavo con l'assemblatore (avendo lavorato da VB a C ++, C ecc) era semplicemente fantastico spostare i dati da una parte del processore a un'altra. E 'stata una bella sensazione sapere esattamente cosa stava succedendo all'interno della CPU, senza preoccuparsi di cosa succedeva al di sotto del quale non si sapeva nulla. Inoltre, una grande sensazione di libertà: puoi fare praticamente qualsiasi cosa, perché non ci sono limiti intrinseci che trovi nei linguaggi di livello superiore.

Inoltre, essere in grado di girare intorno a chiunque abbia programmato in qualsiasi altra lingua e andare 'bene, se non sei abbastanza hardcore ...' era un divertimento infantile e infantile.

    
risposta data 30.11.2010 - 16:46
fonte
2

C'è qualche buona ragione per imparare / praticare la programmazione di basso livello. Ho varie risposte a seconda del contesto.

In primo luogo, sto insegnando la programmazione in C (ma anche OCaml e Java), motivare lo studente ad imparare a programmare dal lato difficile è probabilmente la parte più difficile del compito. La migliore argomentazione che ho trovato finora è "comprensione": i linguaggi di livello superiore nascondono molti meccanismi di base e alcune volte non per sempre, ti spingono anche a stare al livello più alto anche quando alcuni trucchi di basso livello potrebbero essere davvero utili ( per le prestazioni, la maggior parte del tempo.) Capire cosa si sta utilizzando può davvero aiutare ad usarlo meglio. La mia esperienza di insegnamento mi dimostra che gli studenti che hanno imparato programmi di programmazione di livello inferiore (e altri non orientati all'utente, tali compilatori) sono più adattabili e apprendono più velocemente nuovi concetti o strumenti di livello superiore.

In secondo luogo, come affermi, le prestazioni sono parte dell'esperienza utente. La maggior parte delle volte, le prestazioni sono viste come una questione di scrittura complessa e vicino al codice della macchina. Questo non è sempre il caso, le prestazioni sono molto più una questione di algoritmi e strutture dati, ma anche di interazione tra algo e dati. Uso un progetto speciale sull'argomento, fondamentalmente si tratta di un semplice percorso di ricerca, ma il vero problema è la dimensione dei dati: il grafico è infinito. L'unico modo per ottenere prestazioni di discesa e adattarsi alla memoria è scrivere un allocatore di memoria dedicato (in realtà due, un allocatore di pool e un allocatore di riciclaggio). Questo è qualcosa che non si può fare nella maggior parte dei linguaggi di livello superiore. Di fatto, la maggior parte delle lingue raccolte con i rifiuti ha problemi di prestazioni e di memoria.

Ci sono probabilmente molti più argomenti come la stabilità (nel senso della storia e della longevità) dei linguaggi di livello inferiore rispetto a quelli "hype" (il fatto che un linguaggio considerato come riferimento futuro per la programmazione possa scomparire in pochi anni è una lunga storia, non si può predire la longevità di una nuova roba, ma questo argomento rimane vero per le lingue più vecchie ...), ovviamente c'è anche una questione di gusti, o il fatto che ciò che può essere fatto nella maggior parte dei linguaggi di alto livello può anche essere fatto in lingue di livello più basso, ma non viceversa (ma considerando che dovremmo codificare tutto solo in assembly ...)

Sono io stesso una trappola in entrambi i mondi (in modo molto diverso), trascorro diversi anni lavorando sul concetto di programmazione teorica, sulla progettazione di sistemi di tipo e sulla dimostrazione, e così facendo ho solo usato e studiato linguaggi di altissimo livello (principalmente uno funzionale, ma anche orientato agli oggetti puri.) Recentemente sono tornato dall'altra parte (principalmente sistema e programmazione del kernel) e mi sono trovato abbastanza a mio agio in questo settore che mi sto divertendo molto! Per me, il prossimo passo è trovare il punto comune: caratteristiche linguistiche di livello superiore per la programmazione di livello inferiore! Quindi, non c'è un linguaggio per questo (forse google per la programmazione del sistema userland) e sto considerando l'idea di costruire la mia lingua, ma questa è un'altra storia.

    
risposta data 28.06.2011 - 22:49
fonte
1

Direi che non c'è molto motivo nel tuo dominio, tuttavia se dovessi fare un calcolo ad alte prestazioni (ad es. giochi, scienze, ecc.) sarebbe giustificato.

    
risposta data 30.11.2010 - 13:33
fonte
1

Penso che al giorno d'oggi i programmi di basso e alto livello possano essere abbastanza separati. Fondamentalmente questo significa che potresti vivere tutta la tua vita professionale senza conoscere C e l'assemblatore senza alcun problema. Detto questo, il linguaggio di programmazione C non può insegnarti molto dalla programmazione e dal punto di vista del design.

Solo per curiosità potresti imparare come funzionano le cose a un livello inferiore. Quando ero all'Università, ad esempio, mi è piaciuto usare gcc per generare codice assembler da C ++. È stato utile comprendere come vengono implementati il polimorfismo e l'eccezione. Ma a parte questo, le uniche cose che puoi imparare da C al giorno d'oggi sono:

1) trucchi di memoria sporchi. C è il modo migliore per capire che non c'è verso il basso nella follia dei programmatori:)

2) GOTO sono effettivamente utilizzati (e utili) per gli errori di rollback

3) impara meglio come funziona l'allocazione della memoria (differenza tra heap e stack chiunque?).

Quindi sostanzialmente la mia tesi è: se hai già finito l'università e non hai ancora bisogno di C, allora non imparare :)

    
risposta data 30.11.2010 - 17:15
fonte
1

Non hai bisogno di capire i linguaggi di basso livello, ma dovresti capire cosa succede sotto le copertine del tuo linguaggio di alto livello scelto. Usare un linguaggio di basso livello ti insegnerà questo, ma non è l'unico modo.

Ecco alcuni esempi di concetti di basso livello che possono avere un impatto su linguaggi di alto livello.

Puntatori:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Stringhe:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

Liste:

Quando usi una lista vs una lista collegata? (Quasi impossibile saperlo senza capire a un livello piuttosto basso di come funziona una lista)

-

È necessario conoscere tutte queste cose? No, ma può avere un impatto e se vuoi essere un maestro di un linguaggio di alto livello devi avere una buona idea del funzionamento interno.

    
risposta data 29.06.2011 - 08:01
fonte
1

What could low level programming teach me, what other languages wouldn't teach me?

In particolare ti insegnerà come funzionano realmente i computer. Non c'è altro modo di imparare questo che attraverso la programmazione di basso livello. Indipendentemente dal tipo di applicazioni che programmi, questo sarà sempre di aiuto. In realtà capirai cosa sta succedendo in profondità sotto tutte quelle cose sul web. E se stai lavorando con Windows, l'intera API è scritta in C, quindi conoscere questa lingua ti permetterà di comunicare direttamente con il sistema operativo, ogni volta che devi utilizzare una funzione che le tue lingue attuali e le loro librerie non hanno.

Ovviamente la programmazione di basso livello ti consentirà di lavorare con cose completamente diverse, come la programmazione embedded e la programmazione in tempo reale dove asm / C / C ++ è un must. Se non sei interessato a questo tipo di applicazioni, non c'è davvero molto bisogno di imparare asm / C / C ++.

Inoltre, imparerai bit e byte. Manipolazioni di bit, esadecimali ecc. Queste cose si possono incontrare di tanto in tanto anche durante la programmazione web / desktop. Gli algoritmi di crittografia sono uno di questi esempi in cui viene utilizzato.

    
risposta data 29.06.2011 - 09:52
fonte

Leggi altre domande sui tag