Come parlare a un computer [chiuso]

3

Sono un programmatore principiante autodidatta. Il linguaggio che ho scelto era Objective-C, così da poter scrivere applicazioni e software Apple. Ho imparato a fondo che Objective-C ha una curva di apprendimento ripida, ma mi sono imposto di guardarlo più e più volte finché non ho capito bene.

Sento che sto completando un importante passo, e questo sta diventando molto constrongvole con la sintassi. Ora mentre passo al prossimo grande passo - scoprire cosa è possibile con un linguaggio di programmazione per computer - penso che tutto il software sia appena stato sviluppato all'interno dei confini di:

  • classi
  • loop
  • booleani
  • Istruzioni IF / OR
  • variabili
  • ecc.

È una valutazione vera? Quando penso al software nella mia testa, devo solo imparare a convertire tutto in questo? Giusto?

Scusa se questa domanda sembra divertente, ma sto solo imparando come prendere la lingua e parlare (quello che penso sia) il linguaggio di un computer. C'è un buon libro o tutorial che aiuta a illustrare come "parlare come un computer"?

    
posta SalemSeven 24.03.2012 - 06:30
fonte

2 risposte

18

Fondamentalmente, i computer possono fare solo alcune cose basilari:

  1. Possono eseguire semplici operazioni aritmetiche
  2. Possono eseguire le istruzioni in sequenza
  3. Possono diramarsi verso un'altra istruzione, in base a una condizione
  4. Possono eseguire il ciclo (una variante di ramificazione)
  5. Possono spostare i dati da un luogo a un altro
  6. Possono memorizzare i dati e recuperarli per un uso successivo.

Questo è tutto. Tutto ciò che vedi un computer è solo un'elaborata astrazione su queste semplici operazioni.

I linguaggi di programmazione sono una di quelle astrazioni. Ci permettono di parlare la lingua del computer (tecnicamente, codice macchina), usando un linguaggio simbolico che è più vicino alla lingua che noi umani usiamo per comunicare. I programmi chiamati compilatori traducono i linguaggi di programmazione in codice macchina, in modo che la macchina possa eseguire le nostre istruzioni, proprio come le abbiamo specificate.

Ci sono molti linguaggi di computer diversi, ognuno ottimizzato per un particolare modo di pensare o per risolvere i problemi. Questi modi di pensare sono chiamati paradigmi; molti linguaggi di programmazione supportano più di un paradigma. L'obiettivo C è solo uno di questi linguaggi.

Il modo in cui ogni programmatore di computer viene avviato è individuale quanto le impronte digitali. Se vuoi davvero "ottenere" l'idea dei computer, il mio consiglio è di imparare più di una lingua. Studia altre lingue; vedere come differiscono Guarda come hanno tutti certe cose in comune; anche se potrebbero risolvere un problema in modo diverso, al loro interno si risolvono ancora nelle stesse operazioni fondamentali.

    
risposta data 24.03.2012 - 07:15
fonte
1

Funzioni di prima classe

Un'altra funzionalità utile che un linguaggio di programmazione può avere è funzioni di prima classe. Una funzione di prima classe è una funzione che può essere utilizzata come dati.

In una lingua in cui è possibile trattare le funzioni come dati, è possibile creare variabili che si riferiscono ad esse, passarle come argomenti per le funzioni e restituirle dalle funzioni. Una volta che il caso in cui potresti utilizzare questa è la famosa funzione map .

Diciamo che ho appena ottenuto una stringa da un file o qualcosa e che la stringa contiene una serie di numeri interi separati da spazi. Supponiamo che io usi una funzione di divisione delle stringhe per ottenere un array di stringhe contenenti ciascuno degli interi (sempre come stringhe). Ho accesso a una funzione di libreria per analizzare un intero da una stringa, e voglio usarlo per convertire ciascuna di queste stringhe contenenti numeri interi a valori interi reali. Creo il nuovo array e scrivo un loop per convertire ogni stringa e memorizzare il numero intero risultante nel nuovo array.

Ora dì che voglio prendere una diversa matrice di numeri interi e trovare il valore assoluto di ciascuno e memorizzare i risultati in una nuova matrice. Posso usare un altro ciclo per farlo. Tuttavia, ho questo modello visualizzato nel mio codice: iniziare con un array, eseguire alcune trasformazioni di ogni valore nell'array e memorizzare tutti i risultati in un nuovo array. Potrei semplicemente scrivere il codice per farlo ogni volta, ma c'è un modo per astrarre il processo di creazione del nuovo array, il looping, la trasformazione e l'archiviazione.

Posso scrivere una funzione che accetta come argomenti

  • un array di tipo x
  • una funzione per trasformare in qualche modo oggetti di tipo x in oggetti di tipo y (possibilmente dello stesso tipo di x)

e fargli creare una serie di elementi di tipo y della lunghezza corretta, eseguire il loop sui valori nell'array originale, chiamare l'argomento della funzione per eseguire la trasformazione , archiviare i risultati nella nuova array e restituisce il nuovo array.

Dopo aver scritto questa funzione, map , non devo più scrivere questo codice a mano.

L'obiettivo-C dovrebbe avere dei puntatori di funzione perché ce li ha.

Il modo in cui ho descritto map ha anche sfruttato una sorta di digitazione generica.

Chiusure

Un'altra caratteristica sono le chiusure. Una chiusura è un oggetto funzione che cattura alcune delle variabili esistenti nello scope in cui è stato creato. Cosa significa?

Alcune lingue ti permettono di scrivere letterali di funzioni, funzioni che non hanno (necessariamente) nomi e appaiono semplicemente nel tuo codice senza una speciale dichiarazione separata. Quando scrivi una funzione letterale in un'altra funzione, potrebbero esserci variabili nello stesso ambito della funzione letterale. Ci sono situazioni in cui potresti trovare utile usare quelle variabili all'interno della funzione letterale e farle rimanere con l'oggetto funzione. Tale oggetto funzione sarebbe una chiusura.

Ecco un esempio di codice che ho scritto che crea una chiusura (scritta in Common Lisp):

(defun exponential-change (function constant)
  (lambda (time)
    (* (expt constant time) (funcall function time))))

(Do not ((let (the) parentesi) ti spaventano)). Pensa che sia scritto in questo modo:

function exponential_change (function, constant) {
    return function (time) {
        return exponent(constant, time) * function(time);
    };
}

Ho scritto questo per sintetizzare il suono. Io rappresento un suono in funzione del tempo che restituisce campioni di ampiezza (da -1 a 1). Questa funzione, exponential-change , trasforma un suono aumentando o diminuendo l'ampiezza (in base alla costante) in modo esponenziale. exponential-change crea restituisce una funzione del tempo basata su un'altra funzione del tempo. Il fatto che la nuova funzione tenga traccia di quale funzione debba modificare impedisce ad altri codici di tenere traccia di quel dettaglio.

Le chiusure non solo tengono traccia dei valori delle variabili che catturano ma anche delle variabili stesse. Ciò significa che potresti creare una funzione che modifica quelle variabili.

    
risposta data 09.05.2012 - 04:55
fonte

Leggi altre domande sui tag