se si modernizzasse di spazio ce ne sarebbe abbastanza.
Ma sai com'è, gli standard non si toccano, meglio rimpiangere le vecchie scelte ;-)
Feature che reputo inutile, il codice andrebbe scritto in un linguaggio che tutti dovrebbero comprendere (tipo inglese).
Citazione da: "dsar"Il compound assignment è la seconda caratteristica peggiore del C dopo l'equivalenza expression/statement.Come sopra, non ci trovo nulla di male, idem per la seconda. Poi, se qualcuno le usa a sproposito rendendo il tutto una matassa illeggibile, non penso si possano dare tutte le colpe al linguaggio.
Il compound assignment è la seconda caratteristica peggiore del C dopo l'equivalenza expression/statement.
Visto che tu sei "quello delle citazioni" , te ne propongo una che avevo letto da qualche parte: "UNIX non impedisce all'utente di fare cose molto stupide, perchè gli impedirebbe di fare anche cose molto intelligenti".Se poi era solo una scusa per nascondere i bug e farli sembrare features, questo non posso dirlo! :lol:
CitazioneE così C divenne un linguaggio che piace a tutti perché molto diffuso :-)Può piacere o Deve piacere. Nella tua frase stà meglio la seconda versione. Lo uso (insieme al C++) senza grossi problemi, non trovo tutta 'sta anarchia nella sintassi come molti urlano in giro.Ho usato/userò ancora Python, vari Basic, vari linguaggi di Script; non sono stato tanto li a interrogarmi sui motivi filosofici della sintassi, la usavo e basta (ad esempio: perchè in Python devo terminare la riga di un if con i due punti ":"? il newline non bastava a delimitare?).
E così C divenne un linguaggio che piace a tutti perché molto diffuso :-)
E non dite che è perchè arrivo dal C++ e quindi sono pronto a tutto!
Citazione da: "dsar"se si modernizzasse di spazio ce ne sarebbe abbastanza.Esatto, al giorno d'oggi. Ovviamente quando è stato concepito tutti quei codici erano importanti.Citazione da: "dsar"Ma sai com'è, gli standard non si toccano, meglio rimpiangere le vecchie scelte ;-)Mi sembra anche ovvio; ASCII è perfetto per quello che deve/doveva fare, non puoi prenderlo, modificarlo e chiamarlo ancora ASCII, o ISO 646 (o meglio, modificarlo nei codici di controllo, perchè modifiche locali ad alcuni simboli sono state già fatte, anche se il cosiddetto ASCII è quello primo americano).Modificare lo standard significa rendere inutilizzabili tutte le macchine vecchie che dipendono da tali codici di controllo, e ciò concorderai non è fattibile.Se vuoi migliorare la situazione, attui le opportune modifiche e rilasci un nuovo standard.
Ricordo che l'agenzia spaziale russa dovette rifiutare un software perché documentazione, commenti e nomi di identifier erano in francese e nessuno ci capì nulla. Bene o male chi lavora in questo settore l'inglese lo conosce.Tutti i miei progetti (personali e non) hanno identifier e commenti in inglese.Certo si potrebbe adottare un linguaggio funzionale, formato solo da simboli matematici, universale per tutti! Magari adottare pure la tastiera usata per Algol 60.Io non ho nulla contro un linguaggio universale a simboli, il problema è che viviamo una realtà molto diversa da quella ideale. Se il linguaggio matematico, a partire dalla logica, fosse insegnato dalla scuola elementare, allora lì saremmo talmente abituati che potremmo leggere 200 - 300 pagine di un programma fatto di simboli senza stancarci.Purtroppo la realtà è un'altra. Io studio fisica e per me se una dimostrazione matematica superasse le due pagine la troverei stancante.Un software deve essere espressivo e soprattutto "alla portata di tutti", anche al meno intelligente, probabilmente io potrei far parte di quella categoria, perché il codice scritto da altri non sempre lo capisco ;-)
Chiedo scusa per lo sfogo e per il semi-OT (ora AmigaCori mi apre un nuovo thread sulle responsabilità del programmatore :lol:), ma per tanto tempo e in molti luoghi (non qui) ho visto dare colpe dei programmatori ai linguaggi, che di colpa hanno ben poco.
Ricordo che l'agenzia spaziale russa dovette rifiutare un software perché documentazione, commenti e nomi di identifier erano in francese e nessuno ci capì nulla. Bene o male chi lavora in questo settore l'inglese lo conosce.
Certo si potrebbe adottare un linguaggio funzionale, formato solo da simboli matematici, universale per tutti! Magari adottare pure la tastiera usata per Algol 60.
Un software deve essere espressivo e soprattutto "alla portata di tutti", anche al meno intelligente
perché il codice scritto da altri non sempre lo capisco ;-)
Persino professionisti con anni di esperienza a volte sbagliano. Il che è tutto dire.
Comunque si tratta di una scelta di leggibilità, che riguarda il modo in cui si usano in inglese i : per specificare cosa avviene dopo una frase.
Purtroppo sei già stato contaminato.
Purtroppo anche l'ASCII è stato modificato, a causa dei soliti noti: http://www.appuntidigitali.it/4581/lf-c ... -di-testo/
Citazione da: "dsar"Un software deve essere espressivo e soprattutto "alla portata di tutti", anche al meno intelligenteQuindi scriverlo nella lingua nativa lo può rendere più accessibile.
Citazione da: "cdimauro"Persino professionisti con anni di esperienza a volte sbagliano. Il che è tutto dire.L'unico caso in cui l'equivalenza può portare a errore "grave" è quando si operano assegnazioni all'interno di una condizione, proprio = vs. ==. Fatto sta che la maggior parte se non tutti i compilatori moderni genera un warning quando questo avviene; "professionisti" dovrebbero sempre controllare i warning e viaggiare con -Wall attivo (o persino -Werror) .
CitazioneComunque si tratta di una scelta di leggibilità, che riguarda il modo in cui si usano in inglese i : per specificare cosa avviene dopo una frase.Come dice uno dei commenti a quel post: allora bisognerebbe anche preservare il punto e virgola alla fine di ogni statement.
CitazionePurtroppo anche l'ASCII è stato modificato, a causa dei soliti noti: http://www.appuntidigitali.it/4581/lf-c ... -di-testo/Solo l'interpretazione dei simboli è stata modificata nello standard; il significato sei singoli simboli non è cambiato (che è quello che conta di più ed è quello per cui si discuteva).
Citazione da: "Z80Fan"Però gli identificatori bisogna lo stesso scriverli in lettere, e torniamo al discorso di prima .Se il linguaggio non ti aiuta, una buona scelta degli identifier non aiuta nella leggibilità del software. Vedi Haskell:Codice: [Seleziona]insertBy :: (a -> a -> Ordering) -> a -> [a] -> [a]insertBy _ x [] = [x]insertBy cmp x ys@(y:ys') = case cmp x y of GT -> y : insertBy cmp x ys' _ -> x : ysO ancora peggio:Codice: [Seleziona]trimLookupLo :: Ord k => k -> (k -> Ordering) -> Map k a -> (Maybe (k,a), Map k a)trimLookupLo lo cmphi Tip = (Nothing,Tip)trimLookupLo lo cmphi t@(Bin sx kx x l r) = case compare lo kx of LT -> case cmphi kx of GT -> (lookupAssoc lo t, t) le -> trimLookupLo lo cmphi l GT -> trimLookupLo lo cmphi r EQ -> (Just (kx,x),trim (compare lo) cmphi r)E questi sono casi semplici di algoritmi semplici.I linguaggi funzionali li capisco (anche se non sono abituato alla lettura), ma dopo un po' mi fanno venire il mal di testa.Citazione da: "Z80Fan"L'unico caso in cui l'equivalenza può portare a errore "grave" è quando si operano assegnazioni all'interno di una condizione, proprio = vs. ==. Fatto sta che la maggior parte se non tutti i compilatori moderni genera un warning quando questo avviene; "professionisti" dovrebbero sempre controllare i warning e viaggiare con -Wall attivo (o persino -Werror) .Lasciando perdere l'equivalenza.Un linguaggio che permette (anzi, il K&R lo consiglia per gli esperti!) questo mix tra statement ed expression per copiare una stringa:Codice: [Seleziona]while ((s[i++] = t[j++]) != ' ');non merita di essere chiamato linguaggio.
Però gli identificatori bisogna lo stesso scriverli in lettere, e torniamo al discorso di prima .
insertBy :: (a -> a -> Ordering) -> a -> [a] -> [a]insertBy _ x [] = [x]insertBy cmp x ys@(y:ys') = case cmp x y of GT -> y : insertBy cmp x ys' _ -> x : ys
trimLookupLo :: Ord k => k -> (k -> Ordering) -> Map k a -> (Maybe (k,a), Map k a)trimLookupLo lo cmphi Tip = (Nothing,Tip)trimLookupLo lo cmphi t@(Bin sx kx x l r) = case compare lo kx of LT -> case cmphi kx of GT -> (lookupAssoc lo t, t) le -> trimLookupLo lo cmphi l GT -> trimLookupLo lo cmphi r EQ -> (Just (kx,x),trim (compare lo) cmphi r)
L'unico caso in cui l'equivalenza può portare a errore "grave" è quando si operano assegnazioni all'interno di una condizione, proprio = vs. ==. Fatto sta che la maggior parte se non tutti i compilatori moderni genera un warning quando questo avviene; "professionisti" dovrebbero sempre controllare i warning e viaggiare con -Wall attivo (o persino -Werror) .
while ((s[i++] = t[j++]) != ' ');
Un linguaggio che permette (anzi, il K&R lo consiglia per gli esperti!) questo mix tra statement ed expression per copiare una stringa:Codice: [Seleziona]while ((s[i++] = t[j++]) != ' ');non merita di essere chiamato linguaggio.
while (t[j] != ' '){ s[i] = t[j]; i++; j++;}
Bisogna anche capirle le cose. Il : evidenzia una decisione presa dal programmatore. E' successo un evento che modifica il normale flusso del programma -> eseguo determinate, specifiche, azioni. Ecco perché lo ritrovi negli if, while, def, class, ecc.Il ; si continua a usare pure in Python (sebbene NON sia preferito) per lo stesso motivo per cui in inglese (ma anche in italiano) vogliamo aggiungere qualcos'altro alla STESSA frase (nel caso di Python, frase = riga di codice).Se si usa il whitespace al posto del . (perché avrebbe avuto senso il . e non il ; da usare per delimitare un'istruzione) è perché si ricalca l'uso dello pseudocodice. O, da essere umano, vedila come la lista della spesa / cose da fare, o una ricetta.
ma che incubo :-)Io il C++ lo conosco molto bene quindi OVVIAMENTE so quanto sia cesso
Per hobby invece ho studiato ed apprezzo tantissimo il Delphi, che è un linguaggio (si è anche il nome del linguaggio, da non confondersi con l'Objective-Pascal) meraviglioso :-)
Attualmente invece ho approfondito il Java, perchè sviluppo su Android, e devo dire che mi piace così e così...
Avrei aggiunto alcune caratteristiche come gli iteratori stile C++ (quelli stile Java mi fanno pena al cubo),
for Item in List: print Item
foreach(var Item in List) Console.WriteLine(Item);
e la possibilità di gestire la memoria manualmente con il "delete". Moltissimi programmatori Java sono erroneamente convinti che il Garbage Collector ti salvi il culo dai memory leaks.In realtà, con strutture complesse e intricate, capita molto spesso che alcuni oggetti si portino dietro un grafo di dipendenze con vari reference ad oggetti non più utili.Se non metti a "null" TUTTI i reference di un oggetto, questo rimarrà in memoria ovviamente. Con un bel "delete" esplicito invece risolverei molti problemi di memoria in modo molto più semplice. Potrei anche aumentare le performances dei programmi. Ad esempio su Android odio quando una lista rallenta durante lo scrolling e, guardacaso, nella debug console spunta un messaggio del GC che ha liberato X byte su Y oggetti deallocati... devo decidere IO se e soprattutto "quando" puoi liberare la memoria, punto!
import gcgc.disable()# Do whatever you wantgc.collect()# Do whatever you wantgc.enable()
Poi ci sono altre caratteristiche del java che invece apprezzo, come il meccanismo delle interfacce che risolve in maniera pulita l'inferno dell'ereditarietà multipla del C++
(infatti in C++ usavo la convenzione Java, cioè una sola classe padre + N classi virtuali pure a mo' di interfacce).
Devo studiare meglio la reflection in Java, che è interessante anche se la ritengo una pratica di programmazione pericolosa al pari dei casting selvaggi.
Citazione da: "TheKaneB"In realtà, con strutture complesse e intricate, capita molto spesso che alcuni oggetti si portino dietro un grafo di dipendenze con vari reference ad oggetti non più utili.Se non metti a "null" TUTTI i reference di un oggetto, questo rimarrà in memoria ovviamente. Con un bel "delete" esplicito invece risolverei molti problemi di memoria in modo molto più semplice.Qui non è colpa del GC mica può sapere se ti servono più oppure no.Se non ci fosse il GC sarebbe pure peggio, perché deallocando la classe causi un numero tremendo di memory leak. In assenza bisogna crearsi procedure che traversano tutto l'algoritmo di dati per deallocare la memoria.Io sono per l'accoppiata, in Ada e in alcune versioni di Oberon hai il GC e la possibilità di usare il delete/dispose per alleggerire il lavoro del GC. Anche se nei report ufficiali sconsigliano l'accoppiata, devo ancora investigare sui perché.
In realtà, con strutture complesse e intricate, capita molto spesso che alcuni oggetti si portino dietro un grafo di dipendenze con vari reference ad oggetti non più utili.Se non metti a "null" TUTTI i reference di un oggetto, questo rimarrà in memoria ovviamente. Con un bel "delete" esplicito invece risolverei molti problemi di memoria in modo molto più semplice.
for(Tipo iteratore : insieme){}