Livelli di base:
Diamo un'occhiata alle cose al livello più semplice e più elementare.
Per la matematica, abbiamo:
2 + 3 = 5
L'ho imparato quando ero molto, molto giovane. Posso guardare gli elementi più elementari: due oggetti e tre oggetti. Grande.
Per la programmazione informatica, la maggior parte delle persone tende ad usare un linguaggio di alto livello. Alcune lingue di alto livello possono persino "compilare" in una delle lingue di basso livello più basse, come C. C può quindi essere tradotta in linguaggio Assembly. Il linguaggio assembly viene quindi convertito in codice macchina. Molte persone pensano che la complessità finisca qui, ma non è così: le moderne CPU prendono il codice macchina come istruzioni, ma poi eseguono il "microcodice" per eseguire effettivamente quelle istruzioni.
Ciò significa che, al livello più elementare (gestendo le strutture più semplici), ora abbiamo a che fare con il microcodice, che è incorporato nell'hardware e che la maggior parte dei programmatori non usa nemmeno direttamente, né aggiorna. In realtà, non solo la maggior parte dei programmatori non tocca il microcodice (0 livelli più alti del microcodice), la maggior parte dei programmatori non tocca il codice macchina (1 livello più alto del microcodice), e nemmeno l'Assemblea (2 livelli più alti del microcodice) ( tranne, forse, per un po 'di allenamento formale durante il college). La maggior parte dei programmatori passerà il tempo solo 3 o più livelli in più.
Inoltre, se osserviamo l'Assemblea (che è il livello più basso di quello che normalmente le persone ottengono), ogni singolo passaggio è in genere comprensibile da persone che sono state addestrate e hanno le risorse per interpretarlo. In questo senso, Assembly è molto più semplice di un linguaggio di livello superiore. Tuttavia, Assembly è così semplice che eseguire compiti complessi, o anche compiti mediocri, è molto noioso. Le lingue di livello superiore ci liberano da questo.
In una legge sulla "ingegneria inversa", un giudice ha dichiarato che anche se il codice può teoricamente essere gestito un byte alla volta, i programmi moderni coinvolgono milioni di byte, quindi alcuni tipi di record (come copie del codice) devono essere fatti proprio per tale uno sforzo per essere fattibile. (Pertanto lo sviluppo interno non è stato considerato una violazione della regola generalizzata "non fare copie" della legge sul copyright.) (Probabilmente sto pensando di creare cartucce Sega Genesis non autorizzate, ma potrei pensare a qualcosa di detto durante il caso Game Genie. )
Modernizzazione:
Esegui il codice destinato a 286s? O esegui codice a 64 bit?
La matematica utilizza fondamenti che si estendono indietro per millenni. Con i computer, le persone in genere considerano gli investimenti in qualcosa di vent'anni inutilmente inutili in termini di risorse. Ciò significa che la matematica può essere molto più accuratamente testata.
Standard di strumenti usati:
Mi è stato insegnato (da un amico che aveva una formazione di programmazione informatica più formale di me) che non esiste un compilatore C privo di bug che soddisfi le specifiche C. Questo perché il linguaggio C presuppone sostanzialmente la possibilità di utilizzare una memoria infinita ai fini di uno stack. Ovviamente, un requisito così impossibile doveva essere deviato da quando le persone cercavano di creare compilatori utilizzabili che funzionavano con macchine reali che sono un po 'più limitate in natura.
In pratica, ho scoperto che con JScript in Windows Script Host, sono stato in grado di ottenere molti buoni risultati utilizzando gli oggetti. (Mi piace l'ambiente perché il set di strumenti necessario per provare il nuovo codice è integrato nelle versioni moderne di Microsoft Windows.) Quando si utilizza questo ambiente, ho scoperto che a volte non esiste una documentazione facilmente reperibile su come funziona l'oggetto. Tuttavia, l'utilizzo dell'oggetto è così utile che lo faccio comunque. Quindi quello che farei è scrivere codice, che può essere errato come un nido di calabroni, e farlo in un ambiente piacevolmente sandbox in cui posso vedere gli effetti e conoscere i comportamenti dell'oggetto mentre interagisco con esso.
In altri casi, a volte solo dopo aver capito come si comporta un oggetto, ho scoperto che l'oggetto (in bundle con il sistema operativo) è difettoso e che è un problema noto che Microsoft ha deliberatamente deciso che non verrà risolto .
In tali scenari, faccio affidamento su OpenBSD, creato da programmatori esperti che creano regolarmente nuove versioni nei tempi previsti (due volte l'anno), con un famoso record di sicurezza di "solo due fori remoti" in oltre 10 anni? (Anche loro hanno patch errata per problemi meno gravi.) No, assolutamente. Non mi affido a un prodotto del genere con una qualità così elevata, perché sto lavorando per un'azienda che supporta le aziende che forniscono alle persone macchine che utilizzano Microsoft Windows, quindi questo è ciò su cui il mio codice deve funzionare.
Praticità / usabilità richiedono che io lavori sulle piattaforme che le persone trovano utili, e che è una piattaforma che è notoriamente dannosa per la sicurezza (anche se dai primi giorni del millennio sono stati fatti enormi miglioramenti che i prodotti della stessa azienda erano molto peggio) .
Sommario
Esistono numerosi motivi per cui la programmazione del computer è più soggetta a errori e ciò è accettato dalla comunità degli utenti di computer. In effetti, la maggior parte del codice è scritta in ambienti che non tollerano sforzi senza errori. (Alcune eccezioni, come lo sviluppo di protocolli di sicurezza, potrebbero ricevere un po 'più di impegno in questo senso.) Oltre al pensiero comunemente considerato delle ragioni per cui le aziende non vogliono investire più denaro e mancano scadenze artificiali per rendere felici i clienti, c'è l'impatto di la marcia della tecnologia che afferma semplicemente che se passi troppo tempo, lavorerai su una piattaforma obsoleta perché le cose cambieranno in modo significativo entro un decennio.
Sinceramente, ricordo di essere rimasto sorpreso da quanto fossero brevi alcune funzioni molto utili e popolari, quando ho visto del codice sorgente per strlen e strcpy. Ad esempio, strlen potrebbe essere stato qualcosa del tipo "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}"
Tuttavia, i programmi per computer tipici sono molto più lunghi di così. Inoltre, molte programmazioni moderne useranno altri codici che potrebbero essere testati in modo meno approfondito o addirittura noti per essere buggy. I sistemi di oggi sono molto più elaborati di ciò che si può facilmente pensare, tranne che allontanando a mano gran parte della minutia come "dettagli gestiti da livelli inferiori".
Questa complessità obbligatoria e la certezza di lavorare con sistemi complessi e persino sbagliati, rende la programmazione informatica molto hardware da verificare rispetto a molta matematica in cui le cose tendono a ridursi a livelli molto più semplici.
Quando si scompongono le cose in matematica, si arriva a singoli pezzi che i bambini possono capire. Molte persone si fidano della matematica; almeno l'aritmetica di base (o almeno il conteggio).
Quando interrompi davvero la programmazione per vedere cosa sta succedendo, finisci con le implementazioni rotte di standard e codici rotti che vengono infine eseguiti elettronicamente e che l'implementazione fisica è solo un passo sotto il microcodice che la maggior parte degli scienziati informatici formati da università non osare toccare (se ne sono persino consapevoli).
Ho parlato con alcuni programmatori che sono al college o neolaureati che obiettano apertamente all'idea che il codice privo di bug può essere scritto. Hanno cancellato la possibilità, e sebbene riconoscano che alcuni esempi impressionanti (che sono stato in grado di mostrare) sono alcuni argomenti convincenti, considerano tali campioni come rari casi non rappresentativi e ancora respingono la possibilità di poter contare di avere standard così elevati. (Un atteggiamento molto, molto diverso rispetto alle basi molto più affidabili che vediamo in matematica.)