L'elaborazione delle stringhe è più complessa dell'elaborazione numerica nei linguaggi di programmazione?

0

Ritengo che l'elaborazione delle stringhe sia sempre più complessa dei numeri o dell'elaborazione matematica. I nostri linguaggi di programmazione sono progettati in questo modo che le operazioni matematiche sono piuttosto semplici, mentre le operazioni sulle stringhe includono principalmente alcuni metodi applicati a loro. O ho solo difficoltà con le stringhe.

Nota: qualsiasi esperienza e opinione sono benvenute per avere un'idea del modo in cui le nostre lingue attuali gestiscono diversi tipi di dati.

La matematica in sé è il linguaggio della natura in modo simile Le stringhe sono la nostra formulazione di informazioni.

    
posta Aura 23.04.2015 - 12:31
fonte

5 risposte

8

Riepilogo esecutivo

Escludendo i Big-Integer, le stringhe che hanno più di un carattere sono intrinsecamente più complicate dei numeri perché:

  • sono rappresentati come una lista (o albero poco profondo) di più numeri
  • può essere alfabetizzato
  • ha la distinzione tra maiuscole e minuscole
  • ha segni di punteggiatura, accenti, caratteri e spazi bianchi, che devono essere trattati in modo diverso
  • hanno codifiche di caratteri che aggiungono le loro complessità.
  • potrebbe utilizzare molta memoria (se abbastanza grande)

I Big-Integer potrebbero essere complicati quanto le stringhe ASCII o EBCDIC con maiuscole minuscole (o tutto maiuscole).

Dettagli

Che cos'è una stringa?

Una stringa è un elenco di caratteri. I caratteri sono solo numeri e una codifica di caratteri che fornisce a ciascun personaggio un numero per rappresentarlo. Quindi una stringa è essenzialmente un elenco di numeri.

Che cos'è un numero?

Escludendo alcuni computer per scopi speciali presso le strutture di ricerca, ogni popolare processore ha integrato interi (da 8 a 64 bit) e punti mobili IEEE (32 e 64 bit). I processori popolari hanno istruzioni per fare semplici calcoli matematici: +, -, /, e * su questi vari tipi di ints e float. I linguaggi di programmazione più diffusi hanno una sintassi diretta che viene compilata su questi opcode in modi molto semplici.

Numeri più grandi?

Molte lingue hanno un Big-Integer che memorizza valori più grandi di quelli che si adattano a un intero hardware a 64 bit. Come le stringhe, sono essenzialmente elenchi di numeri. A volte BigInt è implementato come una stringa, ma spero che sia raro oggi. Come le stringhe, i bigint tendono ad essere più difficili da usare rispetto ai semplici numeri supportati da hardware. Puoi riempire la memoria con loro, ecc. Come parte a parte, strumenti come Spire promuovono abilmente gli Integri su BigIntegers a seconda dei casi.

Codifica caratteri

Le stringhe venivano codificate in EBCDIC, ASCII, WinAnsi e una serie di altri formati che uscivano prima di Unicode. Con Unicode, ci sono UTF-8, UTF-16, UTF-32 e altri modi di rappresentare i caratteri come uno o più byte. Alcune codifiche dei caratteri sono compatibili unidirezionali con gli altri, ma la maggior parte non lo sono. ASCII ha solo caratteri a 8 bit, ma una stringa in UTF-8 è in realtà una struttura ad albero poco profonda in cui ogni carattere è composto di 1-4 byte (grazie @ gnasher729). E questa è solo la rappresentazione di un singolo "punto di codice" in byte. I personaggi logici stessi sono a volte composti da più punti di codice (un personaggio base più un accento), quindi hai grapheme cluster per trattare con (grazie @ gnasher729).

Pensieri di separazione

Qualsiasi cosa può essere complicata come vuoi tu. I numeri possono essere positivi, negativi o pari a zero (i punti di galleggiamento IEEE possono anche essere zero negativi). Possono essere pari, dispari, primi, ratios, immaginari, irrazionali, trascendentali, o avere molte altre proprietà che hanno tenuto i teorici dei numeri e hanno messo i teorici impegnati per secoli e continueranno a farlo.

Ma le stringhe di caratteri rappresentano le lingue e hai bisogno di caratteri per renderle, che hanno il loro set di mal di testa (e problemi di licenza). I cinesi i cui antichi nomi di famiglia coinvolgono personaggi che non fanno altrimenti parte del loro alfabeto di circa 10.000 caratteri si stanno arrampicando per includere i loro nomi in Unicode. Ci sono lingue perse e argomenti relativi alla necessità di includere linguaggi inventati come Klingon nei set di caratteri. Penso che quando aggiungi tutto questo, oltre alle espressioni regolari, quindi in generale , le stringhe sono più complicate dei numeri.

Probabilmente per ogni problema di complessità delle stringhe, un grande studente di Matematica potrebbe far apparire varie serie, insiemi, divergenze e altri problemi complessi. Ma penso che tu stia definendo numeri come "interi, float e forse Big-Integer" non come "polinomi, serie e oltre".

    
risposta data 23.04.2015 - 22:13
fonte
4

Penso che ci siano due aspetti a questo proposito, e la tua domanda non era del tutto chiara in quale direzione si desidera prendere.

Le operazioni di stringa dal punto di vista del programmatore possono essere facili a seconda della lingua. Perl, ad esempio, ha espressioni regolari e altre operazioni sulle stringhe inserite nella lingua. È banale trasformare o cercare stringhe. Altri linguaggi come C richiedono chiamate di libreria standard che sono scomode da usare.

Sotto le copertine, le operazioni con le stringhe sono necessariamente più complesse delle operazioni numeriche. Le CPU hanno istruzioni integrate per la matematica intera. Cosa significa questo nel contesto di una stringa? Modifica delle stringhe: concatenazione, troncamento, ecc. Questo non può essere fatto nel contesto di una singola istruzione o registro della CPU, rendendo l'implementazione più complessa.

Inoltre, quale codifica utilizza la stringa? Mentre gli interi hanno semantica abbastanza standard (lo stesso vale per numeri in virgola mobile ), le stringhe hanno molte codifiche (normalmente una forma di Unicode o una codepage ANSI). Il codice che opera su stringhe Unicode deve necessariamente essere più complesso del codice che opera sui numeri. Come si concatena una stringa UCS-2 con una stringa UTF-8? Confrontali? Queste operazioni sono possibili, ma ora sono coinvolti più passaggi: decodificare per ottenere il punto di codice Unicode, quindi confrontare o concatenare i punti di codice. Quando si crea una nuova stringa in tal caso, qual è la nuova codifica?

    
risposta data 23.04.2015 - 15:07
fonte
1

Secondo me, usiamo i numeri, non li elaboriamo. Se stai facendo qualche tipo di analisi numerica (che faccio spesso) in qualsiasi lingua, ad esempio utilizzerai i numeri come input per le formule. Questo ovviamente non è necessariamente sempre vero, ma solitamente vero.

Le stringhe sono "elaborate" di più.

Ad esempio, non si crea uno script per mettere i numeri in minuscolo, o separarli in parole o eliminare determinate parti. Almeno, non è così comune.

Quindi, direi che non è un problema linguistico. È solo che i numeri e le stringhe hanno usi diversi e sono usati in un modo diverso. I miei due centesimi.

Inoltre, vorrei porre l'accento su ciò che penso sia generalmente vero, ma non sempre. Ci devono essere persone che "elaborano" i numeri nel modo in cui la maggior parte delle persone fa le stringhe, ma non è così comune.

    
risposta data 23.04.2015 - 15:09
fonte
1

È giù alla memoria: una variabile intera, ad esempio, occuperà un determinato numero di byte e non aumenterà o diminuirà. Una variabile di 4 byte rimane così e viene copiata nel sistema così com'è, Questo significa che il passaggio di una funzione a copia direttamente il valore.

Le stringhe, tuttavia, occupano un numero variabile di byte e questo li rende fondamentalmente diversi dai tipi semplicemente primitivi come int. Se copi una stringa in una funzione, stai davvero copiando un riferimento all'inizio della stringa piuttosto che sull'intera stringa stessa. (alcuni linguaggi di programmazione quindi mascherano questo per far apparire il funzionamento sulla stringa come la modifica di un intero, ad esempio le modifiche apportate all'interno della funzione vengono perse quando la funzione esiste)

Questo problema di memoria mostra anche come stabilire se una variabile non è assegnata - una stringa può essere nullo, ad esempio, mentre dovresti usare un tipo speciale per rappresentare un numero nullable (in C # per esempio), mostrando le crepe in qualsiasi sistema che tenta di manipolare stringhe e inthe lo stesso.

Un altro aspetto è comunque la complessità delle stringhe - gli interi non hanno funzionalità di sostituzione, suddivisione o ritaglio per nominarne solo 3, quindi le stringhe sono semplicemente più complesse per loro natura.

Infine, sono presenti le codifiche: come viene presentata una stringa e quale è il significato di ciascun carattere in base al sistema o alla codifica utilizzata.

Quindi sì, le stringhe sono solo diverse dai tipi primitivi. È proprio come stanno le cose.

    
risposta data 23.04.2015 - 15:17
fonte
1

Ciò dipende chiaramente dal linguaggio di programmazione.

Ad esempio, quando si utilizza un linguaggio incentrato sull'elaborazione numerica (come Fortran), o quando si usa un linguaggio come C dove "String" non è un tipo di dati inbuild, o almeno non implementato come apparentemente e senza un operatore concat come "+" o "&" e garbage collection (come in Pascal), quindi l'elaborazione delle stringhe può "sentirsi" più complessa dell'elaborazione numerica.

Tuttavia, anche in lingue antiche come Basic o in linguaggi moderni come C ++, C # o Java, dove le stringhe sono o un tipo di dati di base, o fornite come se fosse una, l'elaborazione delle stringhe è IMHO non più complessa di quella di qualsiasi altra tipo di dati di base. E questo è ancora più vero oggi per linguaggi di scripting come Perl o Python, che ti forniscono una potente collezione di strumenti e funzioni per le stringhe, che rendono molto semplice l'elaborazione delle stringhe, una volta appresi quegli strumenti.

    
risposta data 23.04.2015 - 14:29
fonte