Perché in alcuni linguaggi di programmazione esiste ancora la distinzione tra maiuscole e minuscole?


44

Non vedo alcun uso per la distinzione tra maiuscole e minuscole in un linguaggio di programmazione, a parte il codice offuscato.

Perché implementarlo in un linguaggio di programmazione?

Aggiornare:

Sembra che qualcuno che conosci abbia fatto una dichiarazione al riguardo .


28
Perché in alcuni linguaggi di programmazione esiste ancora insensibilità al maiuscolo / minuscolo?
Thomas Eding,

1
Anche l'inglese è sensibile al maiuscolo / minuscolo in generale. L'esempio citato comune è polacco e polacco che sono due termini diversi le cui forme scritte differiscono solo nel caso e che hanno pronunce e significati diversi. L'IMO è meglio che il linguaggio di programmazione non sia troppo intelligente in questo senso e permetta ai programmatori stessi di elaborare convenzioni scritte appropriate. Ad esempio, è abbastanza comune scrivere qualcosa come Person person = new Person()nel linguaggio OO in cui il simbolo "persona" è un oggetto temporaneo e "Persona" è un tipo di classe.
Brandin,

Risposte:


113

Mentre la piegatura del case è abbastanza banale in inglese, lo è molto meno in alcune altre lingue. Se un programmatore tedesco usa ßun nome di variabile, cosa considererai l'equivalente in maiuscolo? Cordiali saluti, "ß" è sempre e solo usato in minuscolo. OTOH, "ss" è equivalente - considereresti un compilatore obbligato ad abbinarli? Quando entri in Unicode, ottieni problemi ancora più interessanti, come i personaggi con segni diacritici precomposti rispetto ai diacritici combinati separati. Quindi si arriva ad alcuni script arabi, con tre forme separate di molte lettere, anziché solo due.

Nei secoli bui la maggior parte dei linguaggi di programmazione non distingue tra maiuscole e minuscole per necessità. Ad esempio, Pascal è partito dai mainframe Control Data, che utilizzavano solo sei bit per carattere (64 codici, totale). La maggior parte di tali macchine utilizzava il set di caratteri "CDC Scientific", che conteneva solo caratteri maiuscoli. Potresti passare ad altri set di caratteri, ma la maggior parte aveva caratteri maiuscoli o minuscoli, ma non entrambi - ma utilizzava gli stessi codici per entrambi. Lo stesso valeva per gli antichi codici Baudot e simili considerati agli inizi di COBOL, FORTRAN, BASIC, ecc. Quando l'hardware più capace era ampiamente disponibile, il loro insensibilità al case era così profondamente radicato che cambiarlo era impossibile .

Nel corso del tempo, la reale difficoltà di insensibilità al maiuscolo / minuscolo è diventata più evidente, e i progettisti del linguaggio hanno deciso per lo più ("realizzato" sarebbe probabilmente un termine più accurato) che quando / se le persone vogliono davvero insensibilità al caso, è meglio gestita da strumenti ausiliari che nella lingua stessa.

Almeno IMO, il compilatore dovrebbe prendere l'input esattamente come presentato, non decidere che "hai scritto questo, ma suppongo che tu abbia davvero significato qualcos'altro". Se vuoi che le traduzioni avvengano, è meglio farle separatamente, con strumenti creati per gestirlo bene.


26
+1, avrebbe detto qualcosa di simile, nella mia esperienza la maggior parte delle persone che si lamentano di questo sono le stesse persone che non considerano altre lingue / set di caratteri.
Jeremiah Nunn,

5
Anche la mia grande domanda, se il compilatore inizierà a notare ortografie diverse, dovrebbe permetterti di inserire arbitrariamente caratteri di sottolineatura o altri "separatori di parole"? Forse proverà a "fare quello che ti aspetti" quando si sbaglia l'ortografia di un identificatore? Quanto lontano andrà? (A proposito, Ada consente di sottolineare arbitrariamente i caratteri di sottolineatura all'interno dei numeri per motivi di chiarezza.)
dash-tom-bang

3
@Barry: I due sono praticamente uguali - quasi ogni altra lingua sulla terra richiede caratteri che non sono disponibili in ASCII. Del resto, anche se in qualche modo ci riusciamo, in realtà è piuttosto limitato anche per l'inglese - ad esempio, ti costringe a scrivere "cooperazione" come "cooperazione". Fortunatamente, le macchine da scrivere hanno abituato le persone a tali restrizioni molto prima che arrivassero i computer, al punto che poche persone considerano persino la possibilità di usare tutti i personaggi una volta considerati necessari.
Jerry Coffin,

2
@ dash-tom-bang: sono stati scritti compilatori che hanno cercato di fare cose del genere (ortografia corretta e cosa no). L'esperienza indica che di solito è meglio far funzionare il compilatore più velocemente e produrre messaggi di errore migliori.
Jerry Coffin,

2
@phresnel O "SZ". Buoni argomenti possono essere fatti per entrambi.
Vatine,

114

Perché qualcuno VOGLIA l'insensibilità al caso? In quale scenario è utile poter fare riferimento a una singola variabile come VARIABLEin un posto, Variablein un altro e variablein un terzo? L'insensibilità al caso è esasperante. Preferirei di gran lunga ottenere un errore del compilatore quando scrivo per sbaglio VAriableinvece di Variablelasciare che errori di battitura come quello scivolino nel mio codice.

In conclusione, molti linguaggi di programmazione hanno la distinzione tra maiuscole e minuscole non solo per ragioni storiche / inerziali, ma perché l'insensibilità alle maiuscole è una cattiva idea.


12
Lo stai guardando dentro e fuori. Sì, fare riferimento alla stessa variabile con più ortografie può essere fastidioso, ma non è affatto male come avere due identificatori diversi che si riferiscono a due cose diverse, nello stesso ambito, che differiscono solo nel caso. L'insensibilità alle maiuscole è una buona cosa perché impedisce questo. (Inoltre, impedisce a un semplice refuso di diventare un errore di sintassi; vedere il link nella domanda al post di Jeff sull'argomento.)
Mason Wheeler,

88
Ma voglio che i semplici errori di battitura siano errori di sintassi! Non voglio semplici errori di battitura nel mio codice e voglio che il mio compilatore mi aiuti a trovarli. L'insensibilità alle maiuscole rende più difficile trovarle. L'insensibilità alle maiuscole sembra solo una scusa per la programmazione sciatta.
no,

4
@nohat: sono d'accordo, quando digiti qualcosa di diverso da quello che intendevi digitare, un errore di sintassi è una buona cosa.
Tim Goodman,

13
@Mason Wheeler, ho potuto leggere l'articolo e ho semplicemente non poteva essere più in disaccordo. Ho usato un sacco di linguaggi senza distinzione tra maiuscole e minuscole e sono costantemente esasperato dai refusi.
no,

11
Assolutamente d'accordo con niente - l'insensibilità ai casi è un'idea ridicola - e di solito i fautori provengono da persone che ancora bramano i bei vecchi tempi VB / Basic.
Tim

27

In Java la sensibilità del case NON viene utilizzata per fornire più opzioni nel codice, ma piuttosto per un significato semantico molto chiaro e coerente. ClassesLookLikeThis. objectsLookLikeThis. methodsLookLikeThis (). STATIC_VARIABLES_LOOK_LIKE_THIS. Classes.WithInnerClassesLookLikeThis. NON offre una maggiore libertà: consente di racchiudere alcune informazioni in modo conciso in un linguaggio altrimenti eccessivamente prolisso.

Penso che in linguaggi esplicitamente digitati staticamente con compilatore mucho e supporto IDE, la distinzione tra maiuscole e minuscole sia un ottimo modo per comunicare informazioni (ad es. Java). Con linguaggi come Ruby, l'insensibilità ai casi probabilmente causerebbe ANCORA risultati inaspettati, anche se sarei aperto a provare Ruby senza distinzione tra maiuscole e minuscole.

Penso che la distinzione tra maiuscole e minuscole con un sistema rigoroso non offuschi il codice ma lo renda effettivamente più chiaro. Considera il possibile codice Java:

      joe blah = new hUf();

è abbastanza chiaro, ma per quanto riguarda:

      hUf.WTF();

In Java così com'è, sapresti automaticamente di cosa si tratta. In Java senza distinzione tra maiuscole e minuscole, è ambiguo, quindi dovresti ricorrere a qualche altro meccanismo per differenziare le classi dalle istanze dai pacchetti dai metodi. E QUESTO meccanismo probabilmente ti farebbe vomitare con quanto è brutto :)


2
NOOOO! NON PIÙ INDIETRO !! int package_class_method_var_name? !!
Michael K,

2
@Michael, strano come nessuno sembra notare che il carattere di sottolineatura è una seccatura da digitare.
Dan Rosenstark,

2
dipende dalla tua tastiera. Per me (usando una tastiera francese), _ è facile da scrivere, {} sono molto più difficili (usando AltGr per raggiungerli).
PhiLho

6
Ah, quindi la distinzione tra maiuscole e minuscole è la nuova notazione ungherese.
David Thornley,

1
È solo " significato semantico molto chiaro e coerente " se il compilatore lo impone. Ora, un compilatore che richiedeva che i nomi delle classi iniziassero con un carattere maiuscolo e i nomi dei metodi con lettere minuscole potrebbe effettivamente essere una ragione interessante per avere la distinzione tra maiuscole e minuscole.
Ross Patterson,

24

Non penso che sia stato "implementato" tanto quanto "permesso". La distinzione tra maiuscole e minuscole è lo stato predefinito dei confronti di stringhe; è necessario un lavoro extra per l'ingegnere del compilatore per rendere insensibile il maiuscolo / minuscolo del linguaggio, poiché è necessario aggiungere un codice aggiuntivo per eseguire confronti senza distinzione tra maiuscole e minuscole e conservare i nomi dei token originali per errori e segnalazioni di avvisi corretti.

Questo è quasi certamente il motivo per cui è finito in C; volevano creare un linguaggio semplice per il quale era facile implementare un compilatore, a spese dell'usabilità. Per quanto riguarda il motivo per cui è in lingue moderne? Perché è in C, ovviamente, quindi deve essere il modo giusto per farlo! </ modalità sarcasmo>


3
Inoltre, penso agli anni '60 e '70 quando venivano inventati i linguaggi di programmazione, lo spazio e la velocità sono MOLTO importanti. Non possiamo permetterci quelle istruzioni extra e lo spazio per confronti senza distinzione tra maiuscole e minuscole. È più un problema "è così che è sempre stato fatto" nelle lingue moderne. Non c'è motivo per cui nuove lingue (come C #) facciano questo.
Jay,

1
@Jay: Eppure, per qualsiasi motivo, Pascal, che precede C e ha influenzato il suo design, non fa distinzione tra maiuscole e minuscole e si compila ancora più velocemente. ;)
Mason Wheeler,

@Mason: Non pensavo che Pascal influenzasse C ... Ho dovuto cercarlo. Fondamentalmente, vengono tutti da Algol / Fortran! people.mandriva.com/~prigaux/language-study/diagram.png
Jay

1
@Matt: Umm ... da dove lo prendi? Tutte le risorse che ho visto vanno da Pascal al 1970 e da C al 1972.
Mason Wheeler,

16
I bambini in questi giorni. Ai miei tempi, non avevamo lettere minuscole e ci piaceva. 6 bit erano sufficienti. Certo, ora siamo tutti sordi dallo SHOUTING.
KeithB,

23

Se non altro, semplifica l'analisi e consente più combinazioni per i nomi di variabili / classi.

Con l'analisi senza distinzione tra maiuscole e minuscole, ti saresti limitato a dover utilizzare identificatori univoci, poiché "myClass" e "MyClass" sarebbero la stessa cosa. In alternativa, dovresti aggiungere livelli di complessità al tuo parser per assicurarti di poter determinare quale identificatore viene utilizzato in base al contesto.

Prendi in considerazione un caso come questo:

XmlWriter xmlWriter = new XmlWriter();
xmlWriter.Write("blah");

Supponiamo che la classe XmlWriter abbia anche un metodo statico chiamato "Scrivi". Lo stai chiamando sull'istanza o sulla classe, se qui non viene applicata la distinzione tra maiuscole e minuscole?


14
Questa è una cattiva convenzione di denominazione però. Strangolerei qualcuno se writee Writefossi due metodi completamente diversi.
TheLQ

5
Devo essere d'accordo con TheLQ su questo. Mi fa impazzire quando lavoro in una libreria C e vedo dichiarazioni come "HWND hwnd;". Chiunque abusi della distinzione tra maiuscole e minuscole come questa dovrebbe essere eliminato e sparato.
Mason Wheeler,

4
@TheLQ i metodi hanno lo stesso caso. Stavo usando casi diversi nei nomi di classe / variabile come mio esempio.
Adam Lear

6
@Anne Lear, penso che questo sia un cattivo esempio. Con un linguaggio senza distinzione tra maiuscole e minuscole non dovresti preoccuparti di quale metodo chiamare perché avresti già un errore di sintassi nel tentativo di utilizzare un nome di classe per un nome di variabile.
Matt Olenik,

5
@Matt non dovresti programmare senza evidenziare la sintassi. Posso capire senza un IDE, ma codificare in un editor senza evidenziare la sintassi ... perché qualcuno dovrebbe farlo da solo?
Davy8

13

Mi piace la distinzione tra maiuscole e minuscole se non altro per rendere il codice più autocompattante:

this is a CONSTANT
this is a ClassName
this is a methodName
this is a local variablename

In genere programma in Python, ma nei miei giorni in C #, ho trovato molto conveniente nominare le istanze di classe come la classe, ma maiuscole (o cammello) (come hanno detto altri):

Thing thing = new Thing();

L'uso di linguaggi senza distinzione tra maiuscole e minuscole richiede qualche altra convenzione per questo, cioè una sorta di sigillo come:

Thing oThing = new Thing()
Thing instanceOfThing = new Thing()

Che è una "cosa negativa".

Trovo anche conveniente grep (distinzione tra maiuscole e minuscole) per trovare un riferimento a una classe rispetto agli usi di una variabile. Con un linguaggio senza distinzione tra maiuscole e minuscole, questo sarebbe meno facile. Lo stesso vale per la ricerca e la sostituzione.

Infine, come programmatore, quando vedo parole con casi diversi, mi viene in mente che sono cose diverse ... Raramente ho dei bug in cui i casi variabili erano sbagliati, anche in linguaggi dinamici e con script in cui un compilatore avrebbe aiutato.


10

Le persone prestano attenzione alla forma delle parole prima di leggerle effettivamente. La distinzione tra maiuscole e minuscole mantiene la forma di un simbolo coerente nel codice. Concordo anche con quelli sopra che affermano che convenzioni diverse denotano diversi tipi di simboli. La sensibilità al caso e l'insensibilità possono essere entrambe abusate. I programmatori errati genereranno sempre un codice errato ... troveranno un modo.

Prendi la lingua come esempio. Perché iniziamo frasi e nominiamo le cose con le maiuscole ... È anche a causa di Unix?


@JUST I commenti hanno lo scopo di cercare chiarimenti, non di discussioni estese. Se hai una soluzione, lascia una risposta. Se la tua soluzione è già stata pubblicata, ti preghiamo di votarla. Se desideri discutere questa risposta con altri, utilizza la chat . Vedi le FAQ per maggiori informazioni.
Adam Lear

9

Penso che per linguaggi tipicamente statici come C # e Java, in realtà non aggiunge alcun valore. Perché nella maggior parte dei casi, hai un IDE che correggerà automaticamente i disallineamenti del caso per te, quindi alla fine della giornata, se scrivo "VAriable" per errore, il mio IDE lo correggerà automaticamente in " Variabile "per me. Aggiungete a ciò le MyClass myClass;convenzioni di stile e vedrete che la distinzione tra maiuscole e minuscole non è necessariamente una cosa negativa.

Per i linguaggi tipizzati dinamicamente, potrebbe esserci più di un argomento, poiché è più difficile per un IDE indovinare una correzione automatica, ma nel caso dei linguaggi tipizzati dinamicamente, hai già molto di più di cui preoccuparti (in termini di errori di battitura) che l'uso di una convenzione di involucro coerente non aggiungerà ulteriori oneri.

Quindi sì, anche se non esiste una vera ragione per cui le lingue non possano fare distinzione tra maiuscole e minuscole, non c'è nemmeno una vera ragione per cui dovrebbero esserlo.

Quell'articolo di Scott Hanselman su "SignOn" vs "Signon" parlava di confronti tra stringhe e non aveva nulla a che fare con i linguaggi di programmazione. Concordo sul fatto che le stringhe digitate dagli utenti debbano sempre comparare in modo insensibile alle maiuscole e minuscole, ma penso che sia un gioco di ruolo diverso dagli identificatori in un linguaggio di programmazione.


1
+1 per menzionare "IDE che correggerà automaticamente i disallineamenti del caso"
DavRob60

3
Gli IDE sono per WIMP. Programmo con carta e matita, quindi
eseguo

6

Quando una lingua fa distinzione tra maiuscole e minuscole, ne approfitto per riprodurre l'uso del caso convenzionale in matematica e scienze. Ecco un elenco (non esaustivo) di alcune convenzioni di casi:

  • Nella teoria delle probabilità, le flettere minuscole di solito rappresentano una funzione di densità di probabilità (pdf), mentre Fle lettere maiuscole rappresentano la corrispondente funzione di distribuzione cumulativa (cdf).
  • Anche nella teoria della probabilità, le lettere maiuscole indicano variabili casuali Xe le lettere minuscole corrispondenti indicano le loro realizzazioni x, come in $ Pr [X = x] \ leq 0,05 $.
  • Nell'algebra lineare, le lettere maiuscole sono generalmente utilizzate per fare riferimento a matrici mentre le lettere minuscole sono generalmente utilizzate per fare riferimento a numeri, ad esempio $ A = [a_ {ij}] $.
  • I simboli delle unità sono scritti in lettere minuscole (ad es. M per metro) ad eccezione del litro (L) e delle unità derivate dal nome di una persona (W per Watt, Pa per Pascal, N per Newton e così via).
  • I simboli di prefissi che significano un milione o più sono in maiuscolo (M per mega (milioni)), e quelli meno di un milione sono minuscoli (m per milli (millesimi)).

3
Punto valido, ma violeresti le convenzioni di codifica di quasi tutti i linguaggi di programmazione comuni là fuori, che usano la distinzione tra maiuscole e minuscole per i loro scopi ..
Ken Bloom,

3

Ho solo pensato che fosse a causa di Unix e C, ma è un po 'un problema con un pollo e un uovo a cui solo i geezer possono rispondere correttamente.

Uso la logica usata dai polli in "Il coniglietto pasquale sta arrivando in città" quando mi è stato chiesto se venivano prima delle uova. Poiché sull'Arca di Noè c'erano polli, le galline vennero per prime. Pertanto, poiché GCC funziona su Unix, Unix è arrivato per primo, quindi perché Unix si preoccupa così tanto del caso, C e tutte le sue varianti e discendenti, sì, tutto ciò che impone parentesi graffe, si prende cura del caso.

Probabilmente esiste anche un legame tra parentesi graffe e sensibilità del case.


Unix arrivò molti anni prima di GCC, ma il compilatore BCPL originale arrivò prima di Unix e generalmente creò la "sintassi C".
Ross Patterson,

2

Oltre alle eccellenti risposte fornite finora, vorrei sottolineare che la distinzione tra maiuscole e minuscole offre anche "spazi dei nomi" aggiuntivi. Ad esempio, Perl ha alcuni blocchi speciali come BEGINe ENDche vengono eseguiti in tempi diversi rispetto al codice normale (INIZIO in fase di compilazione, FINE dopo che il programma normale è terminato) e avere quelli come maiuscole li fa risaltare, e significa che il minuscolo le varianti non sono parole riservate.

Si può andare ancora oltre e riservare nomi maiuscoli per un uso futuro da parte della lingua, e non arrecare alcun danno ai normali programmatori, che di solito NON VINCONO NEL LORO CODICE.


2

"Case sensitive" è sempre meglio per le persone tecniche per ridurre l'ambiguità. Prendi il nome del file come esempio. Gestire il nome file di Windows è più problematico del nome file Unix perché il nome file in Windows non fa distinzione tra maiuscole e minuscole mentre il nome file in Unix fa distinzione tra maiuscole e minuscole.

Torna alla programmazione. Per nome classe, nome metodo, nome variabile, la maggior parte della lingua non applica la regola di stile di denominazione. A volte, per semplicità, per "riflettere", possiamo semplicemente usare il nome "Case sensitive" per associare ad altre origini dati senza conversione, o gestire il problema con lo stesso nome ma in casi diversi.


Senza senso. Sembra solo ridurre l'ambiguità perché ti aspetti già il comportamento sensibile al maiuscolo / minuscolo.
Ross Patterson,

1

Sono sorpreso da questo sfogo. Ora che nessuno vuole che tu usi un carattere di sottolineatura o un m_nome di campo in C #, ho appena usato il caso cammello e se il nome del campo è uguale al nome di una proprietà pubblica, solo che il nome della proprietà pubblica è il caso Pascal e il campo di fondo è il caso dei cammelli, immagino, "così sia" - questo è ciò che la comunità di programmatori sembra volere. Finora non ha causato alcun problema.


0

Soprattutto alcuni programmatori provengono dai primi giorni di BASIC, dove un nome variabile può contenere solo 2 caratteri.

E così, quando può essere un numero qualsiasi di personaggi, diventano molto felici. E insieme alla distinzione tra maiuscole e minuscole, perché non vogliono preoccuparsi di SomeNameessere accidentalmente uguali SOMENAMEe causare un bug a causa di cose del genere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.