View Full Version : Ho bisogno di un po' di chiarezza
GarudaOne
30-04-2011, 17:13
Sono uno studente di IV di ITC corso Mercurio (Programmatori).
A scuola usiamo Visual Basic, versione del 2003... :rolleyes: Non capisco perchè si rifiutino di installare l'ultima versione express che è gratuita:muro: Vabè, questo è un altro discorso, lasciamo perdere, và...
Il punto è questo: dato che credo proprio che noi stiamo programmando in un modo assai obsoleto, ed anche sul libro che ho io, un libro scolastico della Tramontana, noto che il metodo di programmazione, e la sintassi e le parole chiave utilizzate sono abbastanza diverse rispetto a quanto quello che facciamo realmente.
La mia intenzione è quella di sfruttare le prossime vacanze e ricominciare da capo lo studio teorico e pratico sui libri che posseggo, con l'ausilio di internet.
Ovviamente Visual Basic .Net. Credo che sia un buon punto di partenza.
Vorrei dei consigli anche in ottica universitaria: vorrei frequentare la facoltà di ingegneria informatica o ingegneria elettronica (più la prima che la seconda).
So che probabilmente il Visual Basic all'università sarà utilizzato raramente, quindi prima o poi comincierò a dare un'occhiata al linguaggio C. Poi il resto lo farò lì, lì all'università, come Java, C#, C++, ASP.NET, PHP, Python, Cobol e eccetera - ovviamente buona parte sarà da autodidatta. Tanto una volta imparato il concetto di programmazione, il resto sta nell'imparare sintassi e parole chiave di quel determinato, o sbaglio?
Ricapitolando, a breve ricomincierò da capo, dalla teoria e visual basic .NET utilizzando la versione express, e prima dell'università getterò qualche fondamenta per il linguaggio C.
Insomma, quello che mi serverirebbe è fare un po' di chiarezza sulla situazione e ogni consiglio è ben accetto.
Grazie mille!
Non sono un programmatore, anche se ho programmato qualcosa per hobby.
Come molti ho sofferto il passaggio da visual basic 5/6 a visual basic .net.
Ormai tutti i linguaggi orientati ad oggetti sono abbastanza simili, si può fare quasi tutto con tutti, al massimo c'è da scrivere codice in più ma si può.
Scegline uno basta che sia ben documentato, come può essere ormai il visual basic o C#, e poi la cosa migliore per imparare è progettare un qualcosa di utile.
Poi naturalmente ci sono linguaggi consigliati a seconda di applicazioni specifiche; ma qui lascio la parola ad altri più professionisti.
Spesso a scuola fanno fare programmi che definirli inutili è dire poco... tipo il dannato "hello world", o calcola l'area del quadrato.
Poi spero per te che la mia scuola fosse un caso a parte.
Quindi inventati un qualcosa anche semplice all'inizio, ma di pratico; e cerca di svilupparlo.
Per esempio puoi pensare ad una chat. Può sembrare banale, ma ci sono una serie di problematiche da superare, soprattutto per l'utilizzo del socket.
Immagina che stai facendo il lavoro per un'azienda, e quindi immagina cosa quest'azienda può pretendere.
Prova a pensare cosa deve fare questo programma, a prescindere dalla difficoltà che può avere implementare ogni features, e affronta i problemi reali uno ad uno man mano che si presentano, anche se ci volesse 1 mese per ogni minima cavolata.
Pian piano si andrà più spediti nella ricerca delle informazioni.
Il lavoro del programmatore è più un lavoro di ricerca e di copia e incolla, così diceva il mio prof. :D
Non ha tutti i torti.
Spesso si riutilizzano pezzi di codice.
E poi quasi nessuno riesce ad andare lì col programma in mente e buttarlo giù, bisogna studiarci sopra, fare debug su debug e studiare la documentazione che purtroppo non è mai completa.
Spero di non averti detto cose che sapevi già :D
Sono solo dei consigli base.
GarudaOne
30-04-2011, 17:59
Grazie.
Avevo intenzione di continuare con Visual Basic .NET, così da evitare eventuali confusioni tra altri linguaggi a scuola, e poi comprarmi qualche libro per il linguaggio C, come Deitel & Deitel, e qualche altro per il Java.
Alla fine credo che posso stare anche tranquillo se consideriamo che a queste facoltà c'è anche chi proviene dal classico o altre scuole, e di programmazione a scuola non ha mai fatto nulla, se non per hobby nel tempo libero a casa.
Il lavoro del programmatore è più un lavoro di ricerca e di copia e incolla, così diceva il mio prof.
Con il piccolo dettaglio che il copia-incolla, specie se non sai cosa stai facendo, porta ad errori.
Poi un conto è programmare, un altro conto è progettare un software.
Comunque sappiate che potrebbe esserci un motivo se vi fanno calcolare l'area del quadrato prima di imparare ad utilizzare i socket (per inciso da noi si fanno al 3° anno di università).
Inoltre non si può dare per scontato che tutti conoscano già i fondamenti della programmazione, per questo motivo anche all'università i corsi di programmazione iniziano TUTTI con "Hello World".
Chiaramente per chi conosce già le cose può risultare noioso, ma se si segue attentamente si noterà sempre che c'è una nuova cosa da imparare, anche dalle cose ritenute "banali".
Un linguaggio di alto livello poi offre soluzioni a molti problemi, cosa che linguaggi tipo il C non fanno, principalmente perché la libreria di base è molto ridotta.
Se vuoi fare il programmatore è essenziale che almeno una volta vedi come funzionano le cose a basso livello, come si implementa una lista, come funzionano gli algoritmi di ordinamento, e così via...
Comunque i linguaggi di programmazione che vanno per la maggiore nelle università sono Java, C++, C... raramente si usano altri linguaggi.
GarudaOne
30-04-2011, 18:50
Quindi cercherò di dare un impasto di base per il linguaggio C come minimo, che lo trovo abbastanza semplice, da imparare senza grosse difficoltà.
Poi C++ e Java lo farò con calma. Comprerò libri, studierò con calma.
Insomma, non credo di star messo proprio male, anzi... :)
Con il piccolo dettaglio che il copia-incolla, specie se non sai cosa stai facendo, porta ad errori.
Su questo concordo totalmente.
Poi un conto è programmare, un altro conto è progettare un software.
Vero pure questo, anche se a volte tocca a fare tutti e 2.
Comunque sappiate che potrebbe esserci un motivo se vi fanno calcolare l'area del quadrato prima di imparare ad utilizzare i socket (per inciso da noi si fanno al 3° anno di università).
Inoltre non si può dare per scontato che tutti conoscano già i fondamenti della programmazione, per questo motivo anche all'università i corsi di programmazione iniziano TUTTI con "Hello World".
Si capisco che per alcuni si deve partire dai livelli base, ma hello world lo trovo davvero inutile.
Cioè aveva senso prima col turbo C per insegnarti il printf per esempio.
Ma ora su un linguaggio a interfaccia grafica, scrivere sulla console non è così fondamentale; la console ormai la si usa per debug e basta.
Chiaramente per chi conosce già le cose può risultare noioso, ma se si segue attentamente si noterà sempre che c'è una nuova cosa da imparare, anche dalle cose ritenute "banali".
Un linguaggio di alto livello poi offre soluzioni a molti problemi, cosa che linguaggi tipo il C non fanno, principalmente perché la libreria di base è molto ridotta.
Se vuoi fare il programmatore è essenziale che almeno una volta vedi come funzionano le cose a basso livello, come si implementa una lista, come funzionano gli algoritmi di ordinamento, e così via...
Comunque i linguaggi di programmazione che vanno per la maggiore nelle università sono Java, C++, C... raramente si usano altri linguaggi.
Si è vero il linguaggio a basso livello bisognerebbe studiarlo un minimo, anche un minimo di architettura hardware e processore ovviamente.
Se poi è più di un minimo è pure meglio :D
All'università raramente abbiamo avuto a che fare con la programmazione visuale (purtroppo dico io, almeno un corso andrebbe fatto).
"Hello World" costituisce un esempio di programma... serve specialmente a chi non ha mai visto prima come si fa un programma e principalmente serve per prendere confidenza con la sintassi.
L'interfaccia grafica è l'ultima cosa di un programma.
Guarda, io sono uno studente al primo anno di Ingegneria Informatica a Bologna. Ti posso assicurare che linguaggi di programmazione come Visual Basic o Cobol da noi non si usano assolutamente. Viceversa, almeno al primo anno, è tutto C, C# e Java (noi in un solo anno abbiamo 24 crediti di programmazione Java e C). Se ti posso dare un consiglio, se sei già sicuro che la tua scelta universitaria sarà Ingegneria Informatica o Ingegneria Elettronica, invece di studiare il Visual Basic da autodidatta, fossi in te mi preparerei su linguaggi di programmazione hardware, come VHDL o Verilog, che a Ingegneria sono veramente il pane quotidiano. Poi ovviamente dipende da quello che ti piace di più fare, ma io ritengo che un tipo di programmazione più orientato verso i circuiti integrati e le reti dei calcolatori sia molto più utile per un futuro studente di Ingegneria.
Ciao Ciao! :)
Ciao
tu adesso puoi fare un sacco di cose, studiarti il c++, java, c#, iniziare a vedere le interfaccie grafiche etc etc, e se la cosa ti piacerà stai sicuro che l'ultimo anno di ITI lo passerai programmando per i cavoli tuoi e non seguirai, come dovresti, la scuola.
Tutto questo te lo dico per evitarti il mio stesso errore.. Ti consiglio vivamente di studiare bene bene matematica e poi iniziare a vedere qualcosa di C/C++, programmi di base, solo per prendere dimestichezza con la sintassi e gli errori comuni (a cui non sei abituato programmando in VB, ah e senza editor il buon vecchio blocco note o notepad++ o scite ;) )..
Tutto ciò perchè? Beh perchè il primo anno di università ti ammazzeranno di matematica e farai ben poca programmazione, sicuramente con c++ o java, perciò ti consiglio di vederti solo la sintassi e gli errori comuni, per poi andare spedito con programmazione I e II assimilando i concetti :D
Poi ovviamente fai come vuoi, e questa è solo la mia opinione :rolleyes:
Anche io ti consiglio di farti per bene un po' di matematica. Se proprio vuoi buttarti su qualche linguaggio di programmazione invece, vai con Java e C che userai sicuramente all'università.
GarudaOne
01-05-2011, 19:36
La matematica me la studierò, con l'ausilio dei libri scolastici di cui sono in possesso, le numerose video lezioni che si possono trovare sul web e YouTube in genere, e con il famosissimo Alpha Test per prepararmi al test di ammissione.
Considerando che io faccio la ragioneria, di matematica non ne ho fatta molta: al terzo anno solo geometria analitica (retta, circonferenza e parabola), accenno su statistica e probabilità, mentre in quarta matrici, dominio, funzione (disegno completo con tanto di asintoti) e a breve un po' di matematica finanziaria.
Tra l'altro in matematica io non sono mai stato bravo, anzi non ho mai avuto buoni rapporti con questa materia. Ma questo per colpa mia che non ho mai posto la dovuta attenzione alle lezioni e che non sono mai stato continuo nello studio della matematica. Comunque se studio come un normalissimo studente posso andare molto bene, e me ne sono accorto negli ultimi mesi di scuola! Quindi l'anno prossimo farò il serio, anche perchè avrò la maturità.
Ah, dimenticavo di dirvi che non ho mai studiato e mai farò la trigonometria, e i logaritmi la mia classe non li ha mai visti, tuttavia i logaritmi li posso studiare da solo con calma con l'ausilio dei testi che ho e del web.
Quali sono gli altri argomenti matematici che mi consigliate di vedere?
Per quanto riguarda la teoria informatica comincierò anche da zero: dal codice binario, esadecimale, conversioni and so on...
Ora torniamo invece un po' più in topic: continuerò col VB.NET, anche perchè a scuola quello usano, e didatticamente parlando potrei trarne solo vantaggi.
Ho intenzione di imparare subito un altro linguaggio, e penso che sceglierò il linguaggio C, almeno per mettere la base per l'università, come già detto precedentemente. Poi il resto si farà con calma.
Il libro Deitel&Deitel va bene per iniziare da zero con il linguaggio C?
GarudaOne
01-05-2011, 22:04
Grazie mille!
pabloski
03-05-2011, 14:41
C, C++ e Java, questo è il mondo dell'università.
Se poi ti avventuri sulla strada dell'elettronica allora vedrai cose turpi tipo vhdl e verilog.
OT. Una mia curiosità. Ma C# le varie università Italiane non se lo cagano proprio? C'è un motivo razionale nella scelta dei linguaggi o si và in base alla moda del momento?
pabloski
03-05-2011, 15:30
OT. Una mia curiosità. Ma C# le varie università Italiane non se lo cagano proprio? C'è un motivo razionale nella scelta dei linguaggi o si và in base alla moda del momento?
In alcune università lo si studia in corsi a scelta.
C e C++ ovviamente sono un must visto che sono la spina dorsale della programmazione e sono i più usati.
Poi c'è Java perchè nel settore enterprise è il più diffuso in assoluto.
ciao, sono uno studente di informatica. ho fatto liceo scientifico ma mai appreso linguaggi di programmazione, finchè nn sn arrivato all'univ.
primo linguaggio studiato è stato C, molto bello e semplice se scegli un buon libro/guida. Secondo linguaggio studiato è Java, il passaggio da C a Java è stato facile, la sintassi è simile ma cambia il concetto di programmazione ovviamente. Il mio consiglio è iniziare , a prescindere da quelli che sono i linguaggi da te preferiti, con C. Fatteo bene, perdici un po' di tempo ma studialo come si deve. Da lì poi , la strada è ricca di scelte: C++ e Java in primis, anche Phyton è degno di studio.
OT. Una mia curiosità. Ma C# le varie università Italiane non se lo cagano proprio? C'è un motivo razionale nella scelta dei linguaggi o si và in base alla moda del momento?
Beh, una volta, quando inizio l'informatica nelle univerista' italiane, i professori, nuovi e freschi, spiegavano agli studenti le novita' piu' eccitanti.
Object Oriented, C++, qualcuno ci ficcava dentro anche Java.
E poi, nella migliore e tipica involuzione italiana dell'universita', i professori di informatica nei dipartimenti sono rimasti sempre gli stessi. Aggiornamento non ne hanno fatto, e continuano ad insegnare sempre le stesse minestre.
OT. Una mia curiosità. Ma C# le varie università Italiane non se lo cagano proprio? C'è un motivo razionale nella scelta dei linguaggi o si và in base alla moda del momento?
C# non lo filano per l'evidente ragione che il suo apporto all'evoluzione della programmazione è meno cinque virgola tre. Ben diverso fu (molto fu ormai) il caso di Java o di (ancor più fu) Pascal... eh sì, 'mazza come sono vecchio.
Dovrebbero invece iniziare con i c.d. "post-funzionali" (genere Scala o F#) altrimenti dalla frutta - dove siamo - passiamo al dolce e ci avviciniamo al conto.
Mi sorge invece un'altra curiosità storica: qualcuno ha notizia di linguaggi di programmazione sviluppati nello stivale?
Kralizek
03-05-2011, 23:30
andrò controcorrente ma ti dico: continua a "cazzeggiare" con il visual basic che stai usando ora. Inizia solo a sviluppare una mentalità atta a risolvere i problemi.
I fondamenti teorici della programmazione, sia dal punto di vista dei costrutti, del funzionamento in concreto e dell'ingegneria del software, ti verranno inculcati dall'università.
Arrivare al corso di Fondamenti di Informatica smaliziato abbastanza con il concetto di programmazione da non doverti concentrare sul risolvere il problema (perchìe relativamente semplice) ma solo sul linguaggio, sui sui meccanismi e sugli algoritmi "avanzati" (quali ricerca ed ordinamento, per fare un esempio) ti dà un piccolo vantaggio che potrai spendere per gli altri esami.
Io all'epoca feci così. Venivo dallo sviluppo in VB6 (VB4 e VB5 non li considero, ero proprio picciolo) e conoscevo a menadito la mia Bibbia, il libro di Francesco Balena. Certo tante cose mi erano sconosciute, però capivo molto e sapevo bene o male dove mettere le mani.
Quando ho iniziato l'università, il tempo di arrivare alla lezione sui puntatori in C e quel capitoletto sulle stringhe e sulle variabili Variant assunse tutto un altro significato.
Da allora ho sempre fatto così. All'università si faceva sempre C/C++/Java ma solo come appoggio alla teoria. Teoria che io prendevo ed applicavo sistematicamente a VB prima, .NET dopo. E per applicare intendo capire come i concetti teorici si applicano al mondo di .NET e, laddove possibile, usare .NET per realizzare i lavori di fine corso.
Fatto al corso di Database (applicazione VB6 + database Access, obbligatorio per tutti), a quello di Reti (server e client in C, come da traccia, e client compatibile in VB.NET), a quello di Programmazione Distribuita (esercizio su CORBA in Java, arricchito da un'applicazione grafica .NET basata su una libreria per lavorare su CORBA) ed ingegneria del software (la comodità delle Property di .NET rispetto ai metodi get_ e set_ di Java...)
A fine università mi trovavo a conoscere Java come tutti i miei compagni di corso E .NET che mi ero studiato per i fatti miei.
Non male no? ;)
pabloski
04-05-2011, 11:45
Mi sorge invece un'altra curiosità storica: qualcuno ha notizia di linguaggi di programmazione sviluppati nello stivale?
Falcon
E' vero, bravo. Non l'ho mai usato ma l'avevo già sentito, forse proprio per via di una citazione in questo forum.
Pure io l'anno prossimo andrò a fare ing. informatica (SUPSI a Manno in svizzera)
io provengo da un ITIS .. settore informatico, uno scandalo in 3 anni di specializzazione (su 5 perchè il biennio vale niente..) abbiamo fatto POCHISSIMO.
La mia fortuna è stata l'amore per questo campo .. già da piccolo (6 anni) mi sono cimentato, insieme a mio padre, a "programmare" ed usare il pc perciò ho sempre fatto le cose da solo a casa.. se aspettavo la scuola a quest'ora non riuscivo manco ad accendere il pc:doh:
Studiati bene .NET che è un bel framework per sviluppare in windows e puoi fare sia desktop che web (con asp.net). per i linguaggi open source partirei da PHP per il web e magari Java per il desktop, ma li va a gusti
Poteva andarti peggio. fai conto che a scuola di mia sorella, gli stanno facendo fare fisica senza aver fatto trigonometria :asd:
Ormai siamo alla follia, tutto quello che si fa alle superiori va dimenticato. Che merda di paese :asd:
GarudaOne
04-05-2011, 20:12
Anche io non ho mai fatto trigonometria, nè la farò in quinta; me lo ha già detto la mia professoressa.
Kralizek
05-05-2011, 08:06
Poteva andarti peggio. fai conto che a scuola di mia sorella, gli stanno facendo fare fisica senza aver fatto trigonometria :asd:
Ormai siamo alla follia, tutto quello che si fa alle superiori va dimenticato. Che merda di paese :asd:
al PNI é normale... lo feci anche io... il prof di fisica ci diede le formule con seno e coseno dicendo: "vi servono, ma non posso stare tutto il tempo a spiegarvi da dove vengono fuori, lo capirete in quarta"
noi eravamo in prima.
al PNI é normale... lo feci anche io... il prof di fisica ci diede le formule con seno e coseno dicendo: "vi servono, ma non posso stare tutto il tempo a spiegarvi da dove vengono fuori, lo capirete in quarta"
noi eravamo in prima.
Nulla si crea nulla si distrugge... tutto rimane uguale!
Dopo 20 anni e' bello trovare delle certezze :muro:
:cry:
tonio123
05-05-2011, 18:02
OT. Una mia curiosità. Ma C# le varie università Italiane non se lo cagano proprio? C'è un motivo razionale nella scelta dei linguaggi o si và in base alla moda del momento?
Qua a bologna facciamo un corso paralello di java e c#, anche se poi l'esame finale è in java. Praticamente per ogni argomento ci viene presentata l'implementazione java e quella c# più o meno.
Qua a bologna facciamo un corso paralello di java e c#, anche se poi l'esame finale è in java. Praticamente per ogni argomento ci viene presentata l'implementazione java e quella c# più o meno.
Bello.
Basta che poi le sintassi funzionano.
Da noi a scuola, superiori però, il prof ci dava le sintassi sul quaderno. Poi nelle ore di lab le scrivevi e non funzionava una mazza...
GarudaOne
06-05-2011, 10:42
Bello.
Basta che poi le sintassi funzionano.
Da noi a scuola, superiori però, il prof ci dava le sintassi sul quaderno. Poi nelle ore di lab le scrivevi e non funzionava una mazza...
Invece il mio professore non da proprio alcuna codifica.
Ci spiega la teoria, ma poi tutto il resto lo dobbiamo fare noi, dobbiamo essere in grado da soli ad arrivare la soluzione.
Personalmente credo che questo sia giusto.
^TiGeRShArK^
08-05-2011, 23:52
C# non lo filano per l'evidente ragione che il suo apporto all'evoluzione della programmazione è meno cinque virgola tre. Ben diverso fu (molto fu ormai) il caso di Java o di (ancor più fu) Pascal... eh sì, 'mazza come sono vecchio.
Dovrebbero invece iniziare con i c.d. "post-funzionali" (genere Scala o F#) altrimenti dalla frutta - dove siamo - passiamo al dolce e ci avviciniamo al conto.
Mi sorge invece un'altra curiosità storica: qualcuno ha notizia di linguaggi di programmazione sviluppati nello stivale?
c# e' un DECISO passo avanti rispetto a java.
Java e' rimasto all'eta' della pietra dato che le ultime novita' decenti le hanno introdotte con java 5 e ancora non e' uscito java 7 dopo tutto questo tempo.
Dopo essere ritornato a lavorare in java mi e' scesa la depressione pensando che devo scrivere robe del genere:
File path = new File(".");
String[] list = path.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".zip");
}
});
Arrays.sort(list);
for (int i = 0; i < list.length; i++)
System.out.println(list[i]);
mentre in C# basta fare cosi':
Directory.GetFiles(".", "*.zip").OrderBy(n => n).ToList().ForEach(Console.WriteLine);
praticamente e' come spararsi sulle palle facendo il confronto come linguaggio di programmazione puro.
Per fortuna java ha ancora il vantaggio enorme della moltitudine di librerie che supporta, altrimenti col cazzo che sarei tornato a programmare in java.
Waiting for august.
E' facile confondere il linguaggio con la libreria. Sono cose diverse.
Prova ne sia che quello che tu esemplifichi io invece lo scrivo così:
for(FileExt f : new FileExt(".").listFiles(".zip")) {
System.out.println(f);
}
Come noti a parità di linguaggio la libreria può fare una grande differenza.
Dopodichè si può tranquillamente affermare che esistono linguaggi ben più ricchi di caratteristiche di Java - molte delle quali sono in verità modi più concisi di fare le stesse cose perchè parliamo sempre di linguaggi a scopo generale.
Bisogna vedere se sia un bene o un male. E' bene, a parer mio, se fatto come fa Scala, magnificente espressione di cosa possa essere un linguaggio staticamente tipato, in cui esiste una elevata coerenza delle diverse funzioni.
E' un male se è fatto come C#, che è un patchwork orripilante di eccezioni alle regole originali con l'asso di bastoni del preprocessore.
Siccome è difficile che Java possa diventare come Scala senza scadere nel C# è meglio sperare che scrivano qualche nuova libreria (come le nuove api per i file di Java7 ad esempio) e si tengano ben alla larga dalle specifiche del linguaggio.
^TiGeRShArK^
09-05-2011, 07:24
E' facile confondere il linguaggio con la libreria. Sono cose diverse.
Prova ne sia che quello che tu esemplifichi io invece lo scrivo così:
for(FileExt f : new FileExt(".").listFiles(".zip")) {
System.out.println(f);
}
Come noti a parità di linguaggio la libreria può fare una grande differenza.
Dopodichè si può tranquillamente affermare che esistono linguaggi ben più ricchi di caratteristiche di Java - molte delle quali sono in verità modi più concisi di fare le stesse cose perchè parliamo sempre di linguaggi a scopo generale.
Bisogna vedere se sia un bene o un male. E' bene, a parer mio, se fatto come fa Scala, magnificente espressione di cosa possa essere un linguaggio staticamente tipato, in cui esiste una elevata coerenza delle diverse funzioni.
E' un male se è fatto come C#, che è un patchwork orripilante di eccezioni alle regole originali con l'asso di bastoni del preprocessore.
Siccome è difficile che Java possa diventare come Scala senza scadere nel C# è meglio sperare che scrivano qualche nuova libreria (come le nuove api per i file di Java7 ad esempio) e si tengano ben alla larga dalle specifiche del linguaggio.
LINQ e' parte di .NET da anni, non e' una libreria.
Altrimenti devi considerare anche tutte le JFC delle librerie, usando lo stesso concetto.
E la programmazione funzionale non sara' supportata da java fino all'uscita di java 7.
Questi sono FATTI inconfutabili.
E un linguaggio che deve essere giudicato nel 2011 e non ha il benche' minimo supporto alla programmazione funzionale (se non in minima parte con orribili workaround) e' un linguaggio che e' rimasto indietro rispetto alla concorrenza.
(E comunque nel tuo codice non vedo alcun algoritmo di ordinamento)
pabloski
09-05-2011, 11:08
E' bene, a parer mio, se fatto come fa Scala, magnificente espressione di cosa possa essere un linguaggio staticamente tipato, in cui esiste una elevata coerenza delle diverse funzioni.
concordo, è stato come ritornare ai tempi in cui la programmazione era divertente ed erano anni che non mi accadeva
spero che scala si diffonda sempre di più e prenda il posto di java
FATTI
Ovviamente quei fatti sono sensazioni oniriche.
Java, il linguaggio, supporta pienamente la programmazione funzionale. Contrariamente a quanto si pensa non lo fa dalla versione 1.1 (che ha introdotto le classi interne) ma dalla 1.0: perchè è orientato agli oggetti.
Esiste a maggior riprova un'api java che delinea i concetti della programmazione funzionale, functional java.
Dove sta il problema? Il problema è la scomodità perchè non ci sono "eccezioni funzionali" alla sintassi. E fortunatamente non ci saranno neanche in Java 7.
Con questo non sto dicendo che tu deva usare per forza Java, ci mancherebbe. Ma i fatti sono altri.
Circa LINQ, io parlavo di Java non di C#. E' la libreria standard io di Java che ti fa fare quel giro ma una libreria diversa ti permette di ridurre considerevolmente il "rumore di fondo". E senza introdurre eccezioni alle regole del linguaggio. Che è importante per la complessità di un linguaggio - che deriva non dal numero di regole ma dal numero di eccezioni a quelle regole.
cdimauro
09-05-2011, 13:22
C e C++ ovviamente sono un must visto che sono la spina dorsale della programmazione
Come no...
Beh, una volta, quando inizio l'informatica nelle univerista' italiane, i professori, nuovi e freschi, spiegavano agli studenti le novita' piu' eccitanti.
Object Oriented, C++, qualcuno ci ficcava dentro anche Java.
E poi, nella migliore e tipica involuzione italiana dell'universita', i professori di informatica nei dipartimenti sono rimasti sempre gli stessi. Aggiornamento non ne hanno fatto, e continuano ad insegnare sempre le stesse minestre.
Purtroppo tante volte è così. D'altra parte il baronato nell'università continua a regnare.
C# non lo filano per l'evidente ragione che il suo apporto all'evoluzione della programmazione è meno cinque virgola tre. Ben diverso fu (molto fu ormai) il caso di Java o di (ancor più fu) Pascal... eh sì, 'mazza come sono vecchio.
Vabbé, e Java cos'avrebbe portato di concreto?
Dovrebbero invece iniziare con i c.d. "post-funzionali" (genere Scala o F#) altrimenti dalla frutta - dove siamo - passiamo al dolce e ci avviciniamo al conto.
Sei molto cambiato. Prima il "minestrone" non ti piaceva proprio, mentre adesso i linguaggi che mischiano allegramente i paradigmi di programmazione li esalti addirittura. :D
Comunque i linguaggi funzionali non mi piacciono proprio. A livello sintattico, sia chiaro. Troppo simbolismo.
E' facile confondere il linguaggio con la libreria. Sono cose diverse.
Prova ne sia che quello che tu esemplifichi io invece lo scrivo così:
for(FileExt f : new FileExt(".").listFiles(".zip")) {
System.out.println(f);
}
Come noti a parità di linguaggio la libreria può fare una grande differenza.
Dopodichè si può tranquillamente affermare che esistono linguaggi ben più ricchi di caratteristiche di Java - molte delle quali sono in verità modi più concisi di fare le stesse cose perchè parliamo sempre di linguaggi a scopo generale.
Bisogna vedere se sia un bene o un male. E' bene, a parer mio, se fatto come fa Scala, magnificente espressione di cosa possa essere un linguaggio staticamente tipato, in cui esiste una elevata coerenza delle diverse funzioni.
E' un male se è fatto come C#, che è un patchwork orripilante di eccezioni alle regole originali con l'asso di bastoni del preprocessore.
Il preprocessore ce l'ha pure Java, mi pare.
Comunque quali sarebbero queste "regole originali"?
Siccome è difficile che Java possa diventare come Scala senza scadere nel C# è meglio sperare che scrivano qualche nuova libreria (come le nuove api per i file di Java7 ad esempio) e si tengano ben alla larga dalle specifiche del linguaggio.
Difatti Java già da tempo sta diventando la brutta copia di C#. Basti vedere come stanno aggiungendo pezze (queste sì che si possono chiamare così) al linguaggio per cercare disperatamente di star dietro a tutte le innovazioni di C#.
Ma a parte questo, Java è troppo ammanicato col concetto di retrocompatibilità, col risultato che più passa il tempo e più diventa una cloaca che si fa carico di tutto quello che è stato via via aggiunto.
Sono talmente fissati con la retrocompatibilità, che non vogliono nemmeno cambiare l'ISA della virtual machine. Col risultato di vedere pastrocchi come i generic implementati a cazzo di cane, con la type erasure.
Uccidetelo prima che diventi un aborto inguardabile. Almeno resterebbe un buon ricordo, forse...
Comunque attenzione, state confrontando linguaggi diversi, anche se sembrano simili.
Il java è multipiattaforma, C# e altri no.
Anche se è simile al C, il Java deve essere in grado di superare le barriere delle differenze tra le varie piattaforme, e questo può portare a complicare in certi casi, la sintassi.
E in genere non conviene usare il Java se non occorre avere un programma multiplatform.
Poi ovvio se conosci benissimo il Java e meno gli altri, potresti nonostante tutto trovare più semplice scrivere un programma in java.
Comunque secondo me il Turbo C e C++ è roba antica da dimenticare :D
Non è assolutamente necessario impararli per imparare bene per esempio il C#.
È chiaro che chi ha studiato anni fa il C e/o il C++ si può trovare avvantaggiato nel passaggio al C#.
Ma studiare ora il C++ per poi passare al C# mi sembra una cosa insensata.
Non solo non è utile, ma è controproducente, a me si creerebbe una confusione in testa non indifferente :D
pabloski
09-05-2011, 13:57
Come no...
intanto continuano ad essere i più diffusi, i più performanti e i più educativi per chi vuole capire come funziona veramente un calcolatore
sfido chiunque a capire gli internals di un calcolatore partendo dal basic
pabloski
09-05-2011, 14:03
Il java è multipiattaforma, C# e altri no.
tecnicamente c# o meglio .net lo è, salvo poi restare vittima del marketing e delle scelte da "siamo gli Dei dell'informatica" di Redmond
E in genere non conviene usare il Java se non occorre avere un programma multiplatform.
dipende dalle necessità ovviamente e imho la disponibilità di immense quantità di librerie è uno dei punti forti di java
Ma studiare ora il C++ per poi passare al C# mi sembra una cosa insensata.
Non solo non è utile, ma è controproducente, a me si creerebbe una confusione in testa non indifferente :D
il punto è che il c++ lo troverai sempre, prima o poi durante gli studi o durante il lavoro incapperai in qualcosa scritto in c++ o sarai costretto a scrivere qualcosa in c++
poi rimane il fatto che c e c++ sono i modelli da cui partono i vari java, c#, php, javascript, objective-c
la conoscenza almeno del c ti permette di avere un'idea molto chiara di come funzionano le cose sotto il cofano anche dei linguaggi più evoluti e ovviamente ti facilita la comprensione della sintassi e del modus operandi degli altri linguaggi da esso derivati
Vabbé, e Java cos'avrebbe portato di concreto?
Di concreto cos'ha portato? Direi la combinazione delle caratteristiche più facili da usare dei linguaggi precedenti (staticamente tipato come C, orientato agli oggetti con macchina virtuale e garbage collecto come smalltalk) e il supporto sia all'eredità che all'estensione, conditi dalla totale gratuità. Forse i più giovani non si ricordano la guerra degli IDE ma se oggi usate Visual C++ gratuitamente dovete accendere un cero alla memoria di Sun Microsystem e della piattaforma Java.
"Originali" in effetti non ci stava, avrebbe dovuto essere "generali". C# è pieno di eccezioni. I tipi dinamici, gli attributi, i metodi virtuali, gli indicizzatori, i delegati, le strutture e via dicendo. Sono tutti "ma".
Scala mi piace perché non è un minestrone. Sai che io ho questa mia idea stramba dell'orientamento agli oggetti e sebbene dica che scala è post-funzionale, in accordo all'opinione diffusa - segretamente lo considero orientato agli oggetti e in quanto tale funzionale - perché le funzioni non sono valori speciali ma normali istanze di classi.
Java non ha un preprocessore nello stesso senso di C++ o C#, cioè un programma che opera una trasformazione del codice sorgente prima della compilazione, il che rende il codice sorgente più un'indicazione di massima che qualcosa di concreto, ma ha le annotazioni. E' vero che si possono usare le annotazioni per trasformare il codice sorgente prima della compilazione ma è un uso secondario, né più né meno di quanto potrebbe farsi anche senza annotazioni (esistono se non sbaglio dei preprocessori anche per Java). E comunque per me le annotazioni sono stata una stronz... :D ma servivano per i programmatori EE.
Concordo sul fatto che Java, quantomeno a vedere i discorsi che si fanno sui blog, stia lentamente derivando verso C#. Spero che accada il più tardi possibile. In ogni caso mi resta Scala.
Ma forse ci stiamo invischiando nell'ennesima language war?
jappilas
09-05-2011, 16:14
intanto continuano ad essere i più diffusi, i più performanti e i più educativi per chi vuole capire come funziona veramente un calcolatore
sfido chiunque a capire gli internals di un calcolatore partendo dal basicio invece sfido chiunque a dimostrare che a chi parte dal basic la conoscenza degli internals del sistema è necessaria...
se parti(vi) dal basic significa(va) che sta(v)i acquisendo familiarità con la programmazione e formando una mentalità algoritmica (quella che a partire da un problema elabora i passaggi che portano alla soluzione) su un linguaggio concreto ancorchè semplice (quindi didattico), dopo essere passato per lo pseudocodice - praticamente riformulando in un linguaggio interpretabile dalla macchina quella che prima era una routine per il calcolo del fattoriale o la stampa di "ciao mondo", solamente su carta...
capisci anche tu che chi iniziava a programmare dal basic ( adesso per lo stesso motivo si userebbero linguaggi più chiari e semplici, quindi migliori di basic allo stesso scopo per cui basic era usato) non necessitava della conoscenza degli internals, per il semplice motivo di operare a un livello concettuale svariati piani al di sopra di essi...
mentre per chi programma in C sfruttando api di sistema e magari facendo dell' utilizzo corretto ed efficiente di queste il fulcro del design dell' algoritmo del suo programma, differenze e idiosincrasie tra open, close, fopen, fclose, sync, fsync e fllush, di quali chiamare e quando, ecc ecc - quindi quelli che sono gli internals della piattaforma, quantomeno per quel che l' implementazione sottostante inficia la semantica delle api programmatiche - sono aspetti che devono già far parte del suo bagaglio di conoscenze, acquisite in precedenza da manuali, libri, magari corsi universitari in architetture sw
a ciò aggiungi che spesso e volentieri esistono api di sistema riferite a meccanismi (vedi caso, la memoria condivisa) la cui implementazione può essere trasparente praticamente a chiunque, a parte chi li implementa...
perfino nella prospettiva dello sviluppatore di servizi di sistema che girino in userspace (che quindi non abbia titolo a mettervi le mani ma solo ad appoggiarsi alle api ad esso dedicate) il sapere che a basso livello quel meccanismo "esista", può essere solo una curiosità, una conoscenza in più che comunque non è C a dare, ma eventualmente documentazione della piattaforma
se poi anche le chiamate necessarie per sfruttarlo sono trasparentemente incapsulate in una libreria standard, può tranquillamente passare inosservato a chiunque (compreso il programmatore C esperto) non vada a documentarsi proprio su di esso ...
Kralizek
09-05-2011, 16:17
io invece sfido chiunque a dimostrare che a chi parte dal basic la conoscenza degli internals del sistema è necessaria...
se parti(vi) dal basic significa(va) che sta(v)i acquisendo familiarità con la programmazione e formando una mentalità algoritmica (quella che a partire da un problema elabora i passaggi che portano alla soluzione) su un linguaggio concreto ancorchè semplice quindi didattico dopo essere passato per lo pseudocodice - praticamente riformulando in un linguaggio interpretabile dalla macchina quella che prima era una routine per il calcolo del fattoriale o la stampa di "ciao mondo", solamente su carta...
capisci anche tu che chi iniziava a programmare dal basic ( adesso per lo stesso motivo si userebbero linguaggi più chiari e semplici, quindi migliori di basic allo stesso scopo per cui basic era usato) non necessitava della conoscenza degli internals, per il semplice motivo di operare a un livello concettuale svariati piani al di sotto di essi...
mentre chi programma in C sfruttando api di sistema e magari facendo dell' utilizzo corretto ed efficiente di queste il fulcro del design dell' algoritmo del suo programma, è già a conoscenza (acquisita da manuali, libri, magari corsi universitari in architetture sw) delle differenze e idiosincrasie tra open, close, fopen, fclose, sync, fsync e fllush, di quali chiamare e quando, ecc ecc - quindi di quelli che sono gli internals della piattaforma, quantomeno per quel che l' implementazione sottostante inficia la semantica delle api programmatiche
a ciò aggiungi che spessoe volentieri esistono api di sistema riferite a meccanismi (vedi caso, la memoria condivisa) la cui implementazione può essere trasparente praticamente a chiunque, a parte chi li implementa...
perfino nella prospettiva dello sviluppatore di servizi di sistema che girino in userspace (che quindi non abbia titolo a mettervi le mani ma solo ad appoggiarsi alle api ad esso dedicate) il sapere che a basso livello quel meccanismo "esista", può essere solo una curiosità, una conoscenza in più che comunque non è C a dare, ma eventualmente documentazione della piattaforma
se poi anche le chiamate necessarie per sfruttarlo sono trasparentemente incapsulate in una libreria standard, può tranquillamente passare inosservato a chiunque (compreso il programmatore C esperto) non vada a documentarsi proprio su di esso ...
quoto ogni singola parola.
pabloski
09-05-2011, 17:02
io invece sfido chiunque a dimostrare che a chi parte dal basic la conoscenza degli internals del sistema è necessaria...
in pratica un informatico sa impostare algoritmi ma non sa com'è fatto un calcolatore?
se parti(vi) dal basic significa(va) che sta(v)i acquisendo familiarità con la programmazione e formando una mentalità algoritmica (quella che a partire da un problema elabora i passaggi che portano alla soluzione) su un linguaggio concreto ancorchè semplice quindi didattico dopo essere passato per lo pseudocodice - praticamente riformulando in un linguaggio interpretabile dalla macchina quella che prima era una routine per il calcolo del fattoriale o la stampa di "ciao mondo", solamente su carta...
capisci anche tu che chi iniziava a programmare dal basic ( adesso per lo stesso motivo si userebbero linguaggi più chiari e semplici, quindi migliori di basic allo stesso scopo per cui basic era usato) non necessitava della conoscenza degli internals, per il semplice motivo di operare a un livello concettuale svariati piani al di sotto di essi...
ecco appunto, operi ad un livello più alto, totalmente concettuale ma ignori completamente cosa c'è sotto il cofano
certo se nella vita si andrà a buttare fuori gestionale dopo gestionale questo basta, ma per qualsiasi cosa un pò più complessa e/o legata all'hardware ti blocchi
per la cronaca io ho cominciato proprio col basic, il basic v2 del c64, poi il gwbasic del dos, qbasic, quickbasic, pascal e poi il resto
sapevo programmare ma ignoravo totalmente che quel codice che io scrivevo si traduceva anche in comandi inviati alle più svariati subunità presenti nel mio calcolatore, a partire dal pic fino all'alu, gpu, southbridge, ecc...
ignoravo cose come i timings coinvolti nella programmazione delle varie periferiche, ignoravo il fatto che il tutto si traduceva in byte e word inviate ai registri dei vari chip
chi vuol'essere SOLO programmatore magari può ragionare così, chi vuol'essere informatico non può ignorare come funziona la macchina
perfino nella prospettiva dello sviluppatore di servizi di sistema che girino in userspace (che quindi non abbia titolo a mettervi le mani ma solo ad appoggiarsi alle api ad esso dedicate) il sapere che a basso livello quel meccanismo "esista", può essere solo una curiosità, una conoscenza in più che comunque non è C a dare, ma eventualmente documentazione della piattaforma
in generale sapere che un meccanismo esiste non basta perchè in informatica ogni meccanismo non è perfetto ed è frutto di una serie di compromessi
conoscere quei compromessi permette di sviluppare software ottimizzato e questo fa la differenza tra un programmatore qualunque e un drago della programmazione
se poi anche le chiamate necessarie per sfruttarlo sono trasparentemente incapsulate in una libreria standard, può tranquillamente passare inosservato a chiunque (compreso il programmatore C esperto) non vada a documentarsi proprio su di esso ...
tutto ok ma parliamo sempre di gente che andrà ad usare qualcosa che già c'è, così come c'è l'imprenditore che guida la mercedes ma non sa ovviamente un'acca di meccanica
il punto è che noi altri siamo informatici e non possiamo ignorare come funzionano le macchine che programmiamo
non sarebbe bello avere a che fare con un medico che dice "io so solo come si usa il defibrillatore ma poi non ho la più pallida idea di quali effetti induca sul cuore"
birmarco
09-05-2011, 17:33
Sono uno studente di IV di ITC corso Mercurio (Programmatori).
A scuola usiamo Visual Basic, versione del 2003... :rolleyes: Non capisco perchè si rifiutino di installare l'ultima versione express che è gratuita:muro: Vabè, questo è un altro discorso, lasciamo perdere, và...
Il punto è questo: dato che credo proprio che noi stiamo programmando in un modo assai obsoleto, ed anche sul libro che ho io, un libro scolastico della Tramontana, noto che il metodo di programmazione, e la sintassi e le parole chiave utilizzate sono abbastanza diverse rispetto a quanto quello che facciamo realmente.
La mia intenzione è quella di sfruttare le prossime vacanze e ricominciare da capo lo studio teorico e pratico sui libri che posseggo, con l'ausilio di internet.
Ovviamente Visual Basic .Net. Credo che sia un buon punto di partenza.
Vorrei dei consigli anche in ottica universitaria: vorrei frequentare la facoltà di ingegneria informatica o ingegneria elettronica (più la prima che la seconda).
So che probabilmente il Visual Basic all'università sarà utilizzato raramente, quindi prima o poi comincierò a dare un'occhiata al linguaggio C. Poi il resto lo farò lì, lì all'università, come Java, C#, C++, ASP.NET, PHP, Python, Cobol e eccetera - ovviamente buona parte sarà da autodidatta. Tanto una volta imparato il concetto di programmazione, il resto sta nell'imparare sintassi e parole chiave di quel determinato, o sbaglio?
Ricapitolando, a breve ricomincierò da capo, dalla teoria e visual basic .NET utilizzando la versione express, e prima dell'università getterò qualche fondamenta per il linguaggio C.
Insomma, quello che mi serverirebbe è fare un po' di chiarezza sulla situazione e ogni consiglio è ben accetto.
Grazie mille!
Io ti consiglio di studiarti le basi del C++, è piuttosto semplice e iniziare con le applicazioni in console ti aiuta a comprendere gli elementi fondamentali e la logica di base della programmazione. Sono applicazioni al più inutili ma che ti daranno sicuramente il modo di pensare da programmatore. Pensare a 2 cicli for innestati per svolgere anche un'operazione stupida non è una cosa così immediata per chi si è appena affacciato la programmazione. Se hai fatto VB 2003 sicuramente qualcosa avrai già, io ti consiglio cmq di partire con quello ;)
Poi puoi passare a Java, che è "simile" all'apparenza e utilizzarlo sarà più familiare. Così apprendi bene cosa vuol dire programmare ad oggetti.
Poi puoi proseguire con VB.Net oppure C# .Net a seconda di quale preferisci a pelle. Magari il C# dopo Java e C++ ti sarà più familiare. Io invece preferisco il VB :D
L'importate è avere delle basi solide altrimenti non capirai mai cosa stai facendo. Se ti interessa programmare io eviterei ingegneria elettronica. Potresti anche valutare informatica (non ingegeria) ;)
Tieni conto che i linguaggi .net limiteranno le tue aplicazioni in windows ;)
PS. Verifica che per gli studenti della tua scuola sia disponibile Visual Studio Professional 2010 gratuito su MS Dreamspark ;)
Io a scuola superiore (indirizzo informatica) ho fatto praticamente solo pascal per tre anni (i primi due erano "comuni", poi si sceglieva l'indirizzo).
In quinto anno ho fatto anche un pò di C++ (senza arrivare alla programmazione grafica).
Questo mi ha permesso all'università (Sempre informatica) di essere molto agevolato per esami come programmazione, ingegneria del sw, ecc.
Sembra strano dirlo, ma il linguaggio che mi ha preso più degli altri è stato l'assembly... sì, quello dove per fare qualcosa devi fare ottomila MOV.
Per mia sfortuna sono riuscito ad arrivare solo alla creazione dei file, visto che il corso universitario si fermava prima, non ho mai trovato un buon libro e, soprattutto, imparare un linguaggio così richiede un bel pò di tempo che io non ho.
Posso darti una sincera opinione però: Qualsiasi linguaggio deciderai di imparare, non usare editor visuali.
Mi pare ovvio che il programma non è quello che vedi, ma per me meglio farsi sempre tutto con le proprie manine... poi non sò, ditemi pure che perdo solo tempo... :D
Vorrei concordare con chi diceva che C e C++ costituiscono le fondamenta della programmazione, secondo me sono i primi due linguaggi che andrebbero imparati.
Non concordo con chi dice che ormai non sono più in uso: per me è il contrario.
Poi, se con C ti fermi a scrivere nella console...
C#, VB.NET, ASP.NET, e tutto il .NET Framework li farei volentieri sparire dalla circolazione.
Li uso solo per motivi di studio, diciamo però che mi fanno un bel pò ribrezzo.
Ho trovato molto interessanti invece le librerie Qt basate su C++, compilate e multipiattaforma.
Poi ricordati una cosa: il programma non basta "farlo", va anche fatta una adeguata manutenzione e per fare una adeguata manutenzione, devi metterti in condizioni di dividere i compiti di ciascun componente fin dal primo momento.
Tutte cose che, comunque, ti verranno insegnate per bene all'università.
Secondo il mio modesto parere al giorno d'oggi inizierei con linguaggi di più alto livello (ma non troppo), in particolare partendo subito dalla programmazione ad oggetti.
Il candidato ideale IMHO era e rimane ancora Java, principalmente per due motivi:
- gestione della memoria a carico della VM
- linguaggio fortemente tipato (per cui ho una certa preferenza)
E aggiungo anche tra questi il fatto che la sua diffusione è tale per cui vale decisamente la pena impararlo.
La gestione della memoria automatica consente inizialmente di non preoccuparsi con dettagli di basso livello e di concentrarsi solo ed esclusivamente sul problema (cosa secondo me fondamentale per avere una giusta forma-mentis).
Avere un linguaggio tipato poi da un'idea delle problematiche sui tipi, che ci sono nella maggior parte dei linguaggi di programmazione (anche dinamici), e può servire come trampolino di lancio per imparare altri linguaggi.
Iniziare subito con le classi poi rende secondo me il tutto più "concreto". Inoltre ciò dà la possibilità di mostrare la libreria di classi di cui dispone il linguaggio (cosa altrettanto fondamentale per un utilizzo proficuo del linguaggio) e mostrare anche come si realizzano quelle classi.
Una volta approcciato in questo modo, si ha anche la giusta visione per realizzare software in C che sia "orientato agli oggetti" anche senza avere a disposizione gli strumenti per farlo!
Riguardo la questione dell'IDE, può andare bene non usarlo per i primi programmi "Hello World"... ma man mano che vai avanti è necessario (sfido chiunque di voi a rinunciare a feature come l'auto-completamento).
Specie se si vuole introdurre anche qualche cosa sul debugging (di cui nessuno ha parlato e su cui andrebbe speso tempo).
Tutto ciò ovviamente non significa non approcciarsi poi con C/C++, ma secondo me è essenziale prima capire i concetti e poi il codice.
Ciò non toglie che oggi come oggi se dovessi fare un software di una certa complessità andrei senza dubbio su Python.
birmarco
09-05-2011, 18:25
#Post eliminato#
Uno alla volta! :D Ti prendi un buon libro e segui quell'ordine! :)
...
Se leggi bene ho scritto anche "come"...
Io partirei prima dai concetti relativi all'object oriented (Classi, Tipi di accesso, public, private, protected, Metodi e quindi funzioni, Classi Astratte, Ereditarietà) e poi andrei a definire meglio gli altri concetti man mano che questi si presentano.
Una cosa su cui purtroppo si da poco conto, specie all'inizio, sono i vari concetti che si riprendono anche nell'UML, come Aggregazione o Composizione, che spesso generano confusione tra gli studenti alle prime armi (quindi meglio fornire questi concetti, abbastanza semplici dopotutto, subito quando si parla di Classi).
A questo punto farei esempi di applicazioni dei concetti, facendo implementare ad esempio le varie relazioni Studenti-Corsi-Esami e quant'altro applicando tutto ciò che si è visto e anche di più.
Così facendo quando esce la necessità di creare delle collezioni di oggetti introdurrei i concetti di Lista, Vettore e quant'altro, mostrando come anche queste siano fondamentalmente classi (almeno nei linguaggi OO).
Questo dà l'occasione di introdurre i concetti di ciclo e di iteratore.
I template sono una di quelle cose che in C++ è fatta veramente da cani, li farei per ultimo onde generare confusione sulla sintassi.
Questo almeno è quello che farei io se dovessi spiegare a qualcuno i concetti (e ribadisco che escluderei C++ inizialmente, per la sua sintassi orrenda e le implicazioni derivanti dalla gestione della memoria "manuale").
jappilas
09-05-2011, 18:46
in pratica un informatico sa impostare algoritmi ma non sa com'è fatto un calcolatore?si parlava di chi programma in BASIC (che difficilmente si può definire "informatico)", l' informatico (che difficilmente si mette a programmare in BASIC) lo stai tirando fuori ora
informatica o ing. informatica si studia all' università, ma impostare algoritmi non significa essere un informatico, è qualcosa che si impara a scuola (medie o superiori, o anche prima), come il 2+2
moving the goalposts much?
per la cronaca io ho cominciato proprio col basic, il basic v2 del c64, poi il gwbasic del dos, qbasic, quickbasic, pascal e poi il resto
sapevo programmare ma ignoravo totalmente che quel codice che io scrivevo si traduceva anche in comandi inviati alle più svariati subunità presenti nel mio calcolatore, a partire dal pic fino all'alu, gpu, southbridge, ecc...quindi all' epoca quando digitavi i listati basic e pascal, non ti interessava in cosa venissero tradotti internamente e come venissero eseguiti - quel che ti interessava in quel momento era solo che fossero disegnate le righe colorate, si muovesse lo sprite, venisse calcolato il fattoriale o del momento, o che altro...
non c'è niente di male nel non sapere i dettagli del funzionamento di uno strumento che si usa in un dato momento, anzi... però, se ti fosse davvero interessato ti saresti informato già all' epoca e adesso non saresti qui a rinfacciare i tuoi rimpianti
chi vuol'essere SOLO programmatore magari può ragionare così, chi vuol'essere informatico non può ignorare come funziona la macchinaspero non serva ricordarti qual' era il discorso originale, stai virando nel solito flame informatico vs utente (o utonto)
in generale sapere che un meccanismo esiste non basta perchè in informatica ogni meccanismo non è perfetto ed è frutto di una serie di compromessinon hai afferrato il senso di quel discorso - i compromessi non c' entravano nulla, perchè mi riferivo alla separazione tra il creatore di un design e il consumatore di un design e di una api al di là della perfettibilità degli stessi
se io sviluppo un kernel, implemento un meccanismo (mettiamo la shared memory) e lo esporto con una certa api (mettiamo la libreria shmem), un altro programmatore può a quel punto scambiare dati tra la propria ed altre applicazioni o servizi in modo efficiente passando per i metodi della mia api
api che dal momento in cui è resa pubblica, non può più essere modificata - così come l' implementazione sottostante non può essere alterata se ciò implica rompere un comportamento atteso dalle applicazioni sviluppate per quella api
e potrebbe ben limitarsi a sapere dell' esistenza del meccanismo e ad usare la API, per il semplice motivo che comunque (nemmeno qualora fosse un programmatore migliore di me) non potrebbe intervenirvi nemmeno in senso migliorativo
conoscere quei compromessi permette di sviluppare software ottimizzato e questo fa la differenza tra un programmatore qualunque e un drago della programmazioneun drago della programmazione sarebbe anche capace di progettare e implementare un proprio sistema operativo con meccanismi più raffinati
il problema è che un tale sistema avrebbe molto probabilmente un' utenza di un solo elemento (lui stesso) per un certo tempo, quindi per la maggior parte dovrà probabilmente sviluppare per OS scritti da altri, miseri mortali
in quei casi dovrà piegarsi alle loro scelte e convenzioni pur con ogni probabilità non condividendole, e appoggiarsi supinamente alle loro API, pur non gradendone il design
cdimauro
09-05-2011, 20:12
intanto continuano ad essere i più diffusi, i più performanti
Questo non c'entra niente con quello che avevi scritto prima. Non cercare di confondere le acque tirando in ballo altri discorsi.
e i più educativi per chi vuole capire come funziona veramente un calcolatore
Se è questo l'obiettivo, posso suggerirti di studiare un po' di fisica teorica. Da lì in poi potrai, mano a mano, salire di astrazione, e capire meglio come funziona tutto (quindi compreso un calcolatore).
sfido chiunque a capire gli internals di un calcolatore partendo dal basic
Il C non è molto distante dal BASIC da questo punto di vista.
Per maggiori informazioni, dai una rinfrescata a questo (http://www.appuntidigitali.it/12073/linguaggi-astrazione-potenza/) articolo che ho scritto tempo fa.
tecnicamente c# o meglio .net lo è, salvo poi restare vittima del marketing e delle scelte da "siamo gli Dei dell'informatica" di Redmond
Il tuo cieco fanatismo trasuda da tutti i pori.
dipende dalle necessità ovviamente e imho la disponibilità di immense quantità di librerie è uno dei punti forti di java
E' anche il suo punto debole. In particolare mi riferisco alla dotazione standard.
il punto è che il c++ lo troverai sempre, prima o poi durante gli studi o durante il lavoro incapperai in qualcosa scritto in c++ o sarai costretto a scrivere qualcosa in c++
Se è fortunato, magari no. In ogni caso, semmai dovesse avere questa sfortuna, potrà farsi una cultura in quel momento, e non prima (YAGNI).
poi rimane il fatto che c e c++ sono i modelli da cui partono i vari java, c#, php, javascript, objective-c
la conoscenza almeno del c ti permette di avere un'idea molto chiara di come funzionano le cose sotto il cofano anche dei linguaggi più evoluti e ovviamente ti facilita la comprensione della sintassi e del modus operandi degli altri linguaggi da esso derivati
Ma proprio no. C e C++ sono linguaggi per i fatti loro. Se devi imparare un linguaggio come Java, impari quello e basta, senza perdere tempo a studiarti le idiosincrasie dei primi, e soprattutto gli incubi che si portano dietro.
Di concreto cos'ha portato? Direi la combinazione delle caratteristiche più facili da usare dei linguaggi precedenti (staticamente tipato come C, orientato agli oggetti con macchina virtuale e garbage collecto come smalltalk) e il supporto sia all'eredità che all'estensione, conditi dalla totale gratuità.
Forse non ci siamo capiti. Io parlavo di innovazioni portate dal linguaggio. Cioè funzionalità che non erano presenti in altri prima della sua introduzione.
Forse i più giovani non si ricordano la guerra degli IDE ma se oggi usate Visual C++ gratuitamente dovete accendere un cero alla memoria di Sun Microsystem e della piattaforma Java.
Mah. Il mio primo IDE è stato il Turbo Pascal 3.0 della Borland, ma da lì alle motivazioni che hanno portato Microsoft a rilasciare la versione Express (gratuita) di Visual Studio mi son perso qualcosa. :p
"Originali" in effetti non ci stava, avrebbe dovuto essere "generali". C# è pieno di eccezioni. I tipi dinamici, gli attributi, i metodi virtuali, gli indicizzatori, i delegati, le strutture e via dicendo. Sono tutti "ma".
Io capisco che tu hai una visione particolare della questione, ma in tutta onestà mi sfugge quale sarebbe il problema in questo caso.
Cosa intendi per eccezioni (non quelle che conosciamo usualmente ovviamente) e perché rappresenterebbero un problema?
Scala mi piace perché non è un minestrone. Sai che io ho questa mia idea stramba dell'orientamento agli oggetti e sebbene dica che scala è post-funzionale, in accordo all'opinione diffusa - segretamente lo considero orientato agli oggetti e in quanto tale funzionale - perché le funzioni non sono valori speciali ma normali istanze di classi.
Con me, lo sai, trovi una porta spalancata, perché in Python tutto è un'istanza di una classe (anche le classi stesse), e tramite un sapiente utilizzo è possibile "simulare" qualunque paradigma.
Però è un concetto un po' tirato. Ti ricordi quando in passato parlavi di guardare il codice soltanto secondo la prospettiva a oggetti, funzionale, o strutturata? Ed esaltavi questo fatto.
Scala da questo punto di vista ti consente di scrivere codice che è possibile guardare secondo la prospettiva a oggetti, oppure soltanto secondo quella funzionale, o ancora "miscelando" le altre due.
Però adesso Scala va bene...
Java non ha un preprocessore nello stesso senso di C++ o C#, cioè un programma che opera una trasformazione del codice sorgente prima della compilazione, il che rende il codice sorgente più un'indicazione di massima che qualcosa di concreto, ma ha le annotazioni. E' vero che si possono usare le annotazioni per trasformare il codice sorgente prima della compilazione ma è un uso secondario, né più né meno di quanto potrebbe farsi anche senza annotazioni (esistono se non sbaglio dei preprocessori anche per Java). E comunque per me le annotazioni sono stata una stronz... :D ma servivano per i programmatori EE.
OK, però anche con le annotazioni il risultato è proprio quello di compilare o meno in maniera condizionata determinate parti di codice.
Tra l'altro le annotazioni sono diventate la via maestra, a quanto pare, per questo genere di operazioni.
Concordo sul fatto che Java, quantomeno a vedere i discorsi che si fanno sui blog, stia lentamente derivando verso C#. Spero che accada il più tardi possibile. In ogni caso mi resta Scala.
Lo so, lo so. :D
Ma forse ci stiamo invischiando nell'ennesima language war?
Siamo programmatori, no? Il mio linguaggio è sicuramente meglio del tuo. Vedi avatar. :asd:
A parte gli scherzi, da pythonista mi diverto a vedere scannarsi i fratelli / cugini di C & derivati, e non me ne frega più di tanto.
Anche perché per la legge del contrappasso ho goduto troppo con Python e il mio futuro è sostanzialmente rappresentato da C#, Objective-C, Java, e ActionScript. Per cui vale poco "difendere" l'uno o altro, se non per questioni puramente pragmatiche. Insomma, di questi mi piacerà quello che mi renderà più produttivo e con meno mal di testa. Poi della filosofia / ideologia non me ne può fregar di meno, perché il mio linguaggio preferito (al momento) rimane sempre Python, e non c'è speranza, dopo 29 anni di programmazione, che un linguaggio C-like possa piacermi. :fagiano:
in pratica un informatico sa impostare algoritmi ma non sa com'è fatto un calcolatore?
Beh, certo che lo sa: c'è la CPU, la memoria, e le periferiche.
La CPU esegue programmi, usa la memoria per contenerli (assieme ai dati), ed eventualmente si collega con le periferiche per gestire l'input o l'output.
E il tutto... senza bisogno di conoscere il C. :cool:
ecco appunto, operi ad un livello più alto, totalmente concettuale ma ignori completamente cosa c'è sotto il cofano
certo se nella vita si andrà a buttare fuori gestionale dopo gestionale questo basta, ma per qualsiasi cosa un pò più complessa e/o legata all'hardware ti blocchi
Non è la complessità che spaventa. Anzi, più si astrae, e meno spaventa.
Solo per determinate operazioni di basso livello POTREBBE essere un limite, nel caso in cui un linguaggio non abbia costrutti linguistici o funzioni allo scopo.
Ma è cosa che riguarda anche il C. Il mio articolo di cui ti ho fornito il link, commenti inclusi, è piuttosto eloquente sulla questione.
per la cronaca io ho cominciato proprio col basic, il basic v2 del c64, poi il gwbasic del dos, qbasic, quickbasic, pascal e poi il resto
sapevo programmare ma ignoravo totalmente che quel codice che io scrivevo si traduceva anche in comandi inviati alle più svariati subunità presenti nel mio calcolatore, a partire dal pic fino all'alu, gpu, southbridge, ecc...
ignoravo cose come i timings coinvolti nella programmazione delle varie periferiche, ignoravo il fatto che il tutto si traduceva in byte e word inviate ai registri dei vari chip
chi vuol'essere SOLO programmatore magari può ragionare così, chi vuol'essere informatico non può ignorare come funziona la macchina
Purtroppo chi non ha idea di cosa sia l'informatica sei tu, che riduci tutto a questa dicotomia sbagliata.
Vedi, prima parlavi di byte, di word. Ti sei mai chiesto quanto vale una word? 8, 16, 32, ecc. bit?
E' necessario saperlo? No.
L'unico comandamento a cui siamo votati noi informatici, programmatori inclusi (ma ne parlo dopo), è quello di algoritmo. Che non prevede obbligatoriamente la conoscenza di dettagli di basso livello.
L'informatica nasce dalla contrazione di due parole: informazione e automatica. Va da sé si arriva presto al concetto di algoritmo, e da lì a quello di risoluzione di un problema tenendo conto di precisi requisiti.
Tra l'altro in inglese si parla di computer science, e computer scientist. Non ci sono due figure distinte, quali l'informatico e il programmatore, e a buon ragione.
A meno che non entriamo nel gergo popolare, dove per informatico s'intende una persona che s'interessa di informatica. Insomma, anche assemblare un PC.
E' talmente generico come termine, che può rientrarci di tutto. Ed è inutile che dire non c'è alcun vincolo alla conoscenza di dettagli di basso livello.
in generale sapere che un meccanismo esiste non basta perchè in informatica ogni meccanismo non è perfetto ed è frutto di una serie di compromessi
conoscere quei compromessi permette di sviluppare software ottimizzato e questo fa la differenza tra un programmatore qualunque e un drago della programmazione
Al più ciò che hai scritto permette di capire che non hai idea di cosa debba fare un programmatore. Cioè (rullo di tamburi): risolvere problemi.
Parlare di ottimizzazione senza nemmeno sapere se è necessario oppure no, è prematuro, come ha detto il buon Knuth:
Premature optimization is the root of all evil - Donald Knuth
E, manco a dirlo, ottimizzare non è nemmeno sinonimo di basso livello. Un buon programmatore, infatti, prova sempre la via algoritmica se il codice che ha scritto non soddisfa EVENTUALI (lo rimarco) requisiti prestazionali.
Se questo non dovesse andare bene, si passa a un livello più basso.
tutto ok ma parliamo sempre di gente che andrà ad usare qualcosa che già c'è, così come c'è l'imprenditore che guida la mercedes ma non sa ovviamente un'acca di meccanica
il punto è che noi altri siamo informatici e non possiamo ignorare come funzionano le macchine che programmiamo
non sarebbe bello avere a che fare con un medico che dice "io so solo come si usa il defibrillatore ma poi non ho la più pallida idea di quali effetti induca sul cuore"
Con questo metro di paragone (ovviamente errato) non sarebbe nemmeno bello che un programmatore non sappia com'è fatto il compilatore che usa e come ottimizza il codice. Dovrebbe sapere anche com'è fatto il s.o. che usa.
Ecco, io immagino già un povero programmatore che va a spulciarsi i sorgenti del kernel o, peggio ancora, se li va a disassemblare per vedere com'è implementata la fopen. Sia mai che debba utilizzare un defibrillatore senza sapere com'è fatto...
Beh, non basterebbe una vita per avere piena conoscenza di TUTTO.
E siccome è del tutto inutile sapere com'è fatto un defibrillatore, ma saperlo utilizzare invece è fondamentale (e per saperlo usare bisogna anche sapere in quali condizioni e quali effetti ha o potrebbe avere), io penso che sia sufficiente fermarsi a questo livello per svolgere bene il proprio lavoro.
Che poi è quello che ci si aspetta da un buon medico. Altrimenti avrebbe fatto l'ingegnere per progettare quell'apparecchio.
Sennò non facciamo mettere un piede nell'abitacolo ad Alonso se non ha conseguito una laurea in ingegneria meccanica, una in elettronica, e un'altra in informatica (maledetta informatica: la infilano dappertutto ormai)...
Io ti consiglio di studiarti le basi del C++, è piuttosto semplice e iniziare con le applicazioni in console ti aiuta a comprendere gli elementi fondamentali e la logica di base della programmazione.
Che sarebbero? No, perché a questo punto mi sfugge veramente quali sarebbero queste fantomatiche "basi" della programmazione.
C'è qualcuno che è in grado di darmene una definizione oggettiva e incontrovertibile.
Io sono fermo qui: http://it.wikipedia.org/wiki/Algoritmo
Sono applicazioni al più inutili ma che ti daranno sicuramente il modo di pensare da programmatore.
Anche il modo di farsi male. Mai sentito parlare di puntatori non inizializzati o che puntano a zone di memoria non più valide, bug intermittenti, double delete, memory leak?
L'importate è avere delle basi solide altrimenti non capirai mai cosa stai facendo.
Infatti. E' bene cominciare col concetto di dato, di tipo di dato, variabile, condizione, iterazione, ecc.
Tieni conto che i linguaggi .net limiteranno le tue aplicazioni in windows ;)
Ma anche no. C# è uno standard ECMA, ad esempio.
Posso darti una sincera opinione però: Qualsiasi linguaggio deciderai di imparare, non usare editor visuali.
Mi pare ovvio che il programma non è quello che vedi, ma per me meglio farsi sempre tutto con le proprie manine... poi non sò, ditemi pure che perdo solo tempo... :D
Infatti te lo dico: è un gran perdita di tempo. Un buon IDE ti aiuta molto la vita, e usarlo NON t'impedisce di farti del male mettendo le mani su roba di basso livello, se proprio ci tieni a farlo.
Vorrei concordare con chi diceva che C e C++ costituiscono le fondamenta della programmazione, secondo me sono i primi due linguaggi che andrebbero imparati.
E le fondamenta sarebbero?
Non concordo con chi dice che ormai non sono più in uso: per me è il contrario.
Lo sono ancora, purtroppo, e lo saranno per parecchio tempo. Sono troppo radicati per alcuni settori (programmazione di sistema ed embedded).
C#, VB.NET, ASP.NET, e tutto il .NET Framework li farei volentieri sparire dalla circolazione.
Li uso solo per motivi di studio, diciamo però che mi fanno un bel pò ribrezzo.
De gustibus, ma lascia che altri li utilizzino, se piacciono loro.
Ho trovato molto interessanti invece le librerie Qt basate su C++, compilate e multipiattaforma.
Io invece adoro ancora oggi le VCL di Borland, ma debbo dire che con Silverlight mi sto trovando parecchio bene.
Poi ricordati una cosa: il programma non basta "farlo", va anche fatta una adeguata manutenzione e per fare una adeguata manutenzione, devi metterti in condizioni di dividere i compiti di ciascun componente fin dal primo momento.
Tutte cose che, comunque, ti verranno insegnate per bene all'università.
Se sono bravi all'università t'insegneranno che linguaggi come il C non sono il massimo per la manutenibilità, a causa dell'uso spasmodico degli include e dell'uso del preprocessore.
Il concetto di modularità del codice è assente, purtroppo.
Infatti te lo dico: è un gran perdita di tempo. Un buon IDE ti aiuta molto la vita, e usarlo NON t'impedisce di farti del male mettendo le mani su roba di basso livello, se proprio ci tieni a farlo.
Beh io sono sempre aperto ai confronti, e ho usato parecchi editor (da quelli da integrare in eclipse per java a Visual C++ a Visual C#. ecc), posso dirti che non mi è piaciuto più di tanto.
Certo, è una perdita di tempo... ma io non parlerei di perdita, piuttosto di "impiego" di tempo. Anche perchè generare codice pulito è importante e questa è una cosa oggettiva, anche senza arrivare a basso livello :)
E le fondamenta sarebbero?
E' importante partire dalla partenza e non da metà strada.
Almeno questo è il mio punto di vista.
De gustibus, ma lascia che altri li utilizzino, se piacciono loro.
Ma per carità :) penso che si sia capito largamente che la mia era solo una opinione a livello puramente personale.
Da contare anche che programmando in questa maniera non facciamo altro che allargare un monopolio che già così non può essere smontato (altro discorso... non approfondisco)
Se sono bravi all'università t'insegneranno che linguaggi come il C non sono il massimo per la manutenibilità, a causa dell'uso spasmodico degli include e dell'uso del preprocessore.
Ma certo, me lo hanno detto e lo tengo ben presente.
Solo che (e non dico niente di nuovo sicuramente) C è stato progettato per programmare utility a livello di sistema operativo e non certo programmi gestionali come poi è stato (purtroppo) fatto.
Non ho mai parlato di C per fare programmi gestionali, e infatti non dovrebbe essere usato per quello.
Ma dire che C è "sparito" o "sparirà" come sostengono in molti che guardano solo la "facciata" dei programmi (e parlo di gente che è uscita dalle università o che la ha frequentata), per me è un pò un delirio.
In ogni caso sono mie idee, ho sicuramente meno anni di programmazione di te :)
^TiGeRShArK^
09-05-2011, 21:59
Ovviamente quei fatti sono sensazioni oniriche.
Java, il linguaggio, supporta pienamente la programmazione funzionale. Contrariamente a quanto si pensa non lo fa dalla versione 1.1 (che ha introdotto le classi interne) ma dalla 1.0: perchè è orientato agli oggetti.
Esiste a maggior riprova un'api java che delinea i concetti della programmazione funzionale, functional java.
Dove sta il problema? Il problema è la scomodità perchè non ci sono "eccezioni funzionali" alla sintassi. E fortunatamente non ci saranno neanche in Java 7.
Con questo non sto dicendo che tu deva usare per forza Java, ci mancherebbe. Ma i fatti sono altri.
Circa LINQ, io parlavo di Java non di C#. E' la libreria standard io di Java che ti fa fare quel giro ma una libreria diversa ti permette di ridurre considerevolmente il "rumore di fondo". E senza introdurre eccezioni alle regole del linguaggio. Che è importante per la complessità di un linguaggio - che deriva non dal numero di regole ma dal numero di eccezioni a quelle regole.
Ti pare normale che nel 2011 devi scrivere quella merda perche' la libreria base e' limitata dato che segue quella filosofia assurda per cui al posto di avere a disposizione dei delegate o delle lambda function devi crearti un'intera anonymous inner class?
Ti pare normale che nel 2011 se vai a scrivere:
Calendar startDate = Calendar.getInstance();
startDate.set(2011, 3, 31);
System.out.println("" + startDate.get(Calendar.YEAR) + startDate.get(Calendar.MONTH) + startDate.get(Calendar.DAY_OF_MONTH));
ti esce fuori l'1 aprile come data?
Ah, e tra l'altro anche se usi delle librerie esterne come joda hai lo stesso risultato osceno.
A me tutte queste cose sembrano i sintomi di una obsolescenza del linguaggio che stanno disperatamente provando a svecchiare con java 7, ma che ormai non e' ne' carne ne' pesce.
Hanno perso troppo tempo e da market makers si sono ritrovati ad essere inseguitori, e pure molto in difficolta'.
Come dicevo java ad oggi si salva solo per l'ENORME mole di librerie, soprattutto in ambito enterprise, che sono state sviluppate.
A livello di linguaggio puro c'e' MOLTO ma MOLTO di meglio.
...
Sulle caratteristiche uniche a me verrebbe da dire:
l'impossibilità di scrivere un programma senza usare classi,i package come qualificatori dei nomi, l'introduzione di due meccanismi separati per eredità ed estensione, l'introduzione dei primitivi per la gestione della concorrenza nella radice del typesystem, il collegamento dinamico come metodo predefinito per la risoluzione delle invocazioni di metodo (per un linguaggio staticamente tipato), il meccanismo di caricamento delle classi da stream.
Ma non è detto che lo siano veramente perchè non conosco tutti i linguaggi precedenti a java. Sono praticamente certo invece che il linguaggio abbia innovato fortemente nella combinazione di caratteristiche principali, cioè il fatto di essere quello che è: staticamente tipato, concorrente, orientato agli oggetti, con gestione automatica della memoria, interpretato, con estensione singola ed eredità multipla, a collegamento dinamico, riflessivo e con caricamento in esecuzione delle classi.
Sulla prospettiva, non ci capiamo. Colpa mia ma se mi fai l'esegesi dei periodi non mi aiuti :grrr: .
Scala mi piace perchè non [lo considero] un minestrone. Anche se le è.
Ti confermo quindi la mia opinione sul mescolamento delle prospettive: è una pessima idea. Vale anche per Scala: è una tristezza che sia anche funzionale. A me piace perchè è orientato agli oggetti e considero alcune delle sue caratteristiche funzionali addolcimenti sintattici per il suo uso orientato agli oggetti. Le altre sue doti funzionali, ad esempio l'immutabilità o la composizione di funzioni, le vedo come una muffa potrebbe vedere il drago pulisan: più alla larga ci sto, meglio è.
Dunque sì, purtroppo è anche funzionale: ma non è che si possa pretendere la luna.
Annotazioni.
Lo scopo delle annotazioni è quello di marcare elementi del codice a fini analitici. Il sorgente resta sempre uguale. Ad esempio nell'ambiente J2EE le annotazioni sono usate per generare automaticamente i descrittori di dispiegamento che i contenitori usano per fornire i servizi specificati nel codice.
Non introducono la possibilità di cambiare il codice sorgente più di quanto non lo si possa fare con una commento ed un trasformatore ad hoc e sono parte della sintassi del linguaggio.
Il preprocessore è diverso, esiste esattamente allo scopo di cambiare la sintassi del linguaggio. Può darsi che avesse un suo significato nel 1325 a.c. quando un elevamento a potenza era roba da far fumare le caldaie ma è un bel pezzo che abbiamo passato quella fase.
Perchè le eccezioni - alle regole - sono cattive.
E' un dato sperimentale assodato che il ragionamento umano funzioni bene in positivo (nel senso dell'affermazione) e malissimo in negativo (nel senso dell'affermazione di una negazione). Dovreste essere in grado di provarlo con un esemplare umano nella vostra disponibilità ed un sempice test.
Oggetti nascosti, gliene proponente uno alla volta chiedendo di confermare o smentire, alternandole, le affermazioni: "è un [accendino-penna-pacchetto di sigarette-quello che è]" oppure "non è un [accendino-penna-pacchetto di sigarette-quello che non è]".
Se è un umanione comune, le risposte alle forme positive saranno più pronte di quelle alla forme negative.
Nel senso predetto, le eccezioni alle regole sono asserzioni negative. L'eccezione si genera quando due attribuzioni di qualità mutualmente esclusive si riferiscono ad uno stesso elemento.
Nel linguaggio x ci sono variabili che sono staticamente tipate e variabili che sono dinamicamente tipate.
Quindi ho due regole, due affermazioni positive? No, ho una regola e un'eccezione: tutte le variabili sono staticamente tipate salvo quello che sono dichiarate dinamiche (la regola è sempre quella che implica meno attribuzioni).
C'è una sorta di dibattito in corso circa la complessità dei linguaggi che ha visto Java passare dalla parte dei facili a quella dei difficili. I più vecchi se lo ricorderanno: una volta Java era facilissimo, poi è diventato complicatissimo. Il punto intorno al quale si svolge la discussione in corso è esattamente quello delle eccezioni. Chi sostiene ad esempio che Scala sia "più facile" di Java lo fa proprio sottolineando il fatto che pur avendo il primo più regole del secondo ha un numero minore di eccezioni.
Chi invece sostiene che Python sia più facile lo fa per partito preso ma queli sono irrecuperabili :Prrr:
birmarco
09-05-2011, 22:59
in pratica un informatico sa impostare algoritmi ma non sa com'è fatto un calcolatore?
Un informatico SA soprattutto su cosa sta lavorando. Infatti il corso di laurea in informatica inizia proprio con lo studio dei transistor, della loro combinazione nei circuiti logici e di come si costruisce una CPU a partire proprio dai transistor, bit dopo bit. Dal circuito somma alla ALU, ai registri, le memorie, il pipelining, il parallelismo e multicore, i bus, ecc... Partire più in basso di così non si può. Poi si passa all'assembly. Di pari passo viene insegnato il Java o più raramente il C. Ma il tutto lo si conmprende a fondo solo concludendo gli studi sugli elaboratori. E solo dopo tutto questo si passa a studiare algoritmi, database, ecc...
Chi non ha queste basi non può definirsi informatico. Un informatica di quel livello è indicata a chi fa altri lavori, come un matematico che si programma un SW che esegue un algoritmo. Un informatico che si rispetti sa su cosa sta programmando, sa come sfruttare le potenzialità del proprio HW dialogando con esso, se necessario inserendo blocchi di linguaggio macchina in un programa scritto in un linguaggio di alto livello.
Cmq per iniziare come autodidatta consiglio di partire in alto e poi lasciare all'università il compito di scendere nel dettaglio.
A livello di linguaggio puro c'e' MOLTO ma MOLTO di meglio.
Su questo siamo d'accordissimo. D'altronde è in cima al forum il mio suggerimento sul linguaggio che propongo come entry level, e non è Java.
Ritengo assurdo pensare che quel meglio (anche senza i molto) sia C# che è l'agglomerato di tutti i difetti dei linguaggi che l'hanno preceduto.
Mi dicessi F# se ne potrebbe anche parlare ma C# neanche per idea.
Circa la m@#, c'è un'altra divertente coincidenza :D. Io scriverei infatti:
Calendar time = new StringExt("31.3.2011").toDate();
Dubito di avere una semplificazione già sperimentata e infilata nella mia libreria personale per ogni problema tu possa aver incontrato tuttavia è sintomatico il fatto che alcuni "problemi" siano comuni (ti anticipo: non inveire contro swing, input/output, collections e riflessione perchè ho una batteria di precotti, avrei anche qualcosa sui database ma lì potresti effettivamente fregarmi perchè non sono tanto convinto del mio BeanStore, sebbene io lo usi ormai da tempo :D).
La necessità di usare le classi anonime. Eh, lì qualcosa che sa di vecchio c'è. Uno non dovrebbe dire che sia un problema di codice perchè fa tutto l'ide (fun1, fun2, fun3 + tab e netbeans mi piazza la funzione) ma visivamente anche io ne sono un po' inorridito. Ogni tanto cerco di dargli un aspetto diverso, tipo scrivere:
new VFunction1<Integer>() { public void apply(Integer x) {
...codice
}};
Ma è un diverso grado di schifo. Mi piacerebbe poter scrivere:
(x: Integer) => codice
Sì. Mi piacerebbe quello che gli va dietro? Non ne sono tanto sicuro. Il fatto è che quando si inizia ad avere una forma contratta per le funzioni ti arrivano anche le funzioni di ordine superiore.
E quando arrivano quelle allora ti puoi aspettare che capiti questo:
(f: (a1) ⇒ (a2) ⇒ (a3) ⇒ (a4) ⇒ (a5) ⇒ b): (a1, a2, a3, a4, a5) ⇒ b
Aggiungi i generici (che in C# sono molto più complicati di Java, che già è esoterico sull'argomento, pur essendo stati scritti da un genio assoluto - lo possino...) e fai i tuoi conti.
birmarco
09-05-2011, 23:19
Che sarebbero? No, perché a questo punto mi sfugge veramente quali sarebbero queste fantomatiche "basi" della programmazione.
C'è qualcuno che è in grado di darmene una definizione oggettiva e incontrovertibile.
Io sono fermo qui: http://it.wikipedia.org/wiki/Algoritmo
Anche il modo di farsi male. Mai sentito parlare di puntatori non inizializzati o che puntano a zone di memoria non più valide, bug intermittenti, double delete, memory leak?
Infatti. E' bene cominciare col concetto di dato, di tipo di dato, variabile, condizione, iterazione, ecc.
Ma anche no. C# è uno standard ECMA, ad esempio.
Scusa ma iniziare col parlare di algoritmo è un po' troppo base... :rolleyes: credo che chiunque voglia imparare da solo a programmare sappia che lo fa per ottenere qualcosa: da un input ottengo un output tramite una serie di passaggi.
Cmq le "basi" sono la dimestichezza con variabili, tipi, if, for, while e compagnia. Il C++ è abbastanza semplice per poter pasticciare agevolmente con queste cose. Poi ci aggiungi array, puntatori, funzioni e se hai voglia anche la scrittura dei file. In C è davvero tutto molto banale e gli intoppi sono veramente pochi. Un puntatore che punta a zone errate di memoria è colpa del programmatore, ma dividere per 0, ad esempio, lo trovo un errore dello stesso tipo: distrazione. E può accadere in qualsiasi linguaggio... Non ho detto che deve riscrivere Photoshop, deve solo pasticciare con scanf e printf... tutto qui. Anche java è un buon inizio, ma è un linguaggio ad oggetti. IMHO, più difficile da comprendere di semplice programma sequenziale in C++.
Java è comodo per fare il salto da C++ a linguaggi più moderni come il .net. E' "simile" a C ma ti introduce più semplicemente al cuore della programmazione ad oggetti. Poi puoi passare a C# e/o a VB.net. Sono passaggi piuttosto semplici e graduali
In più facendo così ti ritrovi a conoscere 3/4 linguaggi.
Le altre sue doti funzionali, ad esempio l'immutabilità o la composizione di funzioni, le vedo come una muffa potrebbe vedere il drago pulisan: più alla larga ci sto, meglio è.
Ti perdi alcuni tra gli aspetti piu' interessanti della programmazione funzionale.
Il preprocessore è diverso, esiste esattamente allo scopo di cambiare la sintassi del linguaggio. Può darsi che avesse un suo significato nel 1325 a.c. quando un elevamento a potenza era roba da far fumare le caldaie ma è un bel pezzo che abbiamo passato quella fase.
In realta' il cambiare la sintassi del linguaggio ha applicazioni molto piu' interessanti che non calcolare una potenza. Permette ad esempio di implementare una libreria di unit testing completa in 30 righe di codice. Di avere una interfaccia sana per l'interrogazione di database. Di usare costrutti anaforici. Di interfacciarsi a librerire native senza dover sporcarsi le mani col C o il C++
Piu' in generale di implementare tramite il linguaggio stesso delle nuove funzionalita' senza aspettare che lo faccia il vendor, o di reimplementarle in modo corretto.
Poi per carita', uno scampa lo stesso, si scarica lo xUnit di turno, si interfaccia a librerie native con Swig, e si scarica un generatore di codice per non scrivere SQL... finche' e' roba che ha gia' fatto qualcun altro... quando cominci a fare qualcosa di piu' innovativo, o quando magari sei una piccola startup che non puo' scanciare cifre a 5 zeri per un software, le cose cambiano un po'.
Ma meglio ancora, permette di far crescere il linguaggio verso il problema che si deve risolvere invece che maltrattare il problema perche' sia rappresentabile nel linguaggio.
E quando arrivano quelle allora ti puoi aspettare che capiti questo:
(f: (a1) ⇒ (a2) ⇒ (a3) ⇒ (a4) ⇒ (a5) ⇒ b): (a1, a2, a3, a4, a5) ⇒ b
Non capisco il senso di questa affermazione.
Posso scriverti un metodo che prende 10 argomenti, oppure una catena di 30 chiamate a.b().c().d().e().... Aboliamo anche le classi perche' c'e' gente che non sa programmare ? :D
Scusa ma iniziare col parlare di algoritmo è un po' troppo base... :rolleyes: credo che chiunque voglia imparare da solo a programmare sappia che lo fa per ottenere qualcosa: da un input ottengo un output tramite una serie di passaggi.
Cmq le "basi" sono la dimestichezza con variabili, tipi, if, for, while e compagnia. Il C++ è abbastanza semplice per poter pasticciare agevolmente con queste cose. Poi ci aggiungi array, puntatori, funzioni e se hai voglia anche la scrittura dei file. In C è davvero tutto molto banale e gli intoppi sono veramente pochi. Un puntatore che punta a zone errate di memoria è colpa del programmatore, ma dividere per 0, ad esempio, lo trovo un errore dello stesso tipo: distrazione. E può accadere in qualsiasi linguaggio... Non ho detto che deve riscrivere Photoshop, deve solo pasticciare con scanf e printf... tutto qui. Anche java è un buon inizio, ma è un linguaggio ad oggetti. IMHO, più difficile da comprendere di semplice programma sequenziale in C++.
Java è comodo per fare il salto da C++ a linguaggi più moderni come il .net. E' "simile" a C ma ti introduce più semplicemente al cuore della programmazione ad oggetti. Poi puoi passare a C# e/o a VB.net. Sono passaggi piuttosto semplici e graduali
In più facendo così ti ritrovi a conoscere 3/4 linguaggi.
peccato che sia quella la programmazione, i linguaggi vanno e vengono, sono solo delle regole per definire le azioni volute, portare un algoritmo in diversi linguaggi è facile se si hanno chiari i passaggi ed è questo che la scuola deve insegnare non la sintassi ma i concetti, per la sintassi basta la wrox
Non capisco il senso di questa affermazione.
Posso scriverti un metodo che prende 10 argomenti, oppure una catena di 30 chiamate a.b().c().d().e().... Aboliamo anche le classi perche' c'e' gente che non sa programmare ? :D
Premetto che di metodi con dieci e più argomenti ne ho visti e non pochi, sono una vera schifezza, non tanto da leggere perchè sono lineari, quando da invocare. Personalmente abolirei loro e abbollireri chi li scrive.
In effetti è un caso esemplare di abusabilità.
Idem per la concatenazione specilamente quando sia variante. E qui ammetto la debolezza: sono un grande appassionato di:
pippo
.metodo()
.metodo()
.metodo()
.metodo();
Con variante di valico:
pippo
.metodo(argomento
.metodo()
.metodo())
.metodo();
Programmazione compulsiva: lo scrivo, quando l'ho fatto mi dico "che monnezza di codice hai scritto" riscrivo e poi ci ricasco. Non dovrei perchè il problema è lo stesso dei periodi molto lunghi: tanto più si allontana il soggetto tanto più facile è perdere il senso della frase.
La sintassi può essere usato in questi casi per scoraggiare l'abuso. Considera le classi anonime di java: la sintassi è troppo "verbosa" perchè le si possano usare come funzioni di ordine superiore senza che ti venga il magone a guardarle. E per la verità sono troppo verbose anche per essere usate come funzioni singole :D il che scoraggia approcci funzionali.
C'è una libreria, functional java, che ben dimostra il problema: a usarla ti precipitano le cataratte eppure è "funzionalmente" ineccepibile.
Per la sintassi e i preprocessori, giocare con la sintassi del linguaggio è certamente divertente. Quando uscì Java 5 scrissi un tutorial che usava le annotazioni esattamente per quello. Rinnego quell'atto di passione con veemenza :D.
Il linguaggio non è solo strumento di programmazione ma è anche strumento di comunicazione tra programmatori: tipicamente il giovannino che scrive e il pippo che deve manutenere/estendere.
Non è raro che, pur nella rigidità della sintassi, tra i due nascano dissapori: uno che apprezza la concatenazione (io) può non essere benvisto da uno che la detesta (sempre io, è un disturbo bipolare). Se anzichè usare un costruttore con tre argomenti o un produttore faccio la genialata di usare i generici per implementare i numerali di Church coi quali verifico la completezza di una concatenazione di tre metodi, per consentire al compilatore di rigettare quelle parziali, non mi aspetto che mi dicano "che genio": mi aspetto che mi dicano "ma guarda 'sto stronzo". Perchè ho dimostrato di conoscere il linguaggio ma non la programmazione, che è tante cose, tra le quali anche la capacità di comunicare con altri programmatori.
Per questo ritengo la presenza del preprocessore un grossolano errore: non c'è più l'esigenza di performance per cui è nato, restano solo i danni che può fare.
Oooh ma quanto ci mancava il thread sull'imparare a programmare con epiche discussioni sul senso dell'informatica :D
cdimauro
10-05-2011, 06:09
Beh io sono sempre aperto ai confronti, e ho usato parecchi editor (da quelli da integrare in eclipse per java a Visual C++ a Visual C#. ecc), posso dirti che non mi è piaciuto più di tanto.
Certo, è una perdita di tempo... ma io non parlerei di perdita, piuttosto di "impiego" di tempo. Anche perchè generare codice pulito è importante e questa è una cosa oggettiva, anche senza arrivare a basso livello :)
D'accordo, ma anche con gli IDE puoi scrivere codice pulito. Semplicemente lo fai lavorando in maniera più comoda.
E' importante partire dalla partenza e non da metà strada.
Almeno questo è il mio punto di vista.
Sì, ma la partenza sarebbe? Per me è il concetto di algoritmo.
Ma per carità :) penso che si sia capito largamente che la mia era solo una opinione a livello puramente personale.
Da contare anche che programmando in questa maniera non facciamo altro che allargare un monopolio che già così non può essere smontato (altro discorso... non approfondisco)
Infatti meglio non parlare di monopoli & co., primo perché OT e secondo perché mancherebbe la base della discussione (i monopoli non ci sono).
Ma certo, me lo hanno detto e lo tengo ben presente.
Solo che (e non dico niente di nuovo sicuramente) C è stato progettato per programmare utility a livello di sistema operativo e non certo programmi gestionali come poi è stato (purtroppo) fatto.
Non ho mai parlato di C per fare programmi gestionali, e infatti non dovrebbe essere usato per quello.
Ma dire che C è "sparito" o "sparirà" come sostengono in molti che guardano solo la "facciata" dei programmi (e parlo di gente che è uscita dalle università o che la ha frequentata), per me è un pò un delirio.
In ogni caso sono mie idee, ho sicuramente meno anni di programmazione di te :)
Nessuno dice che C è sparito. Viene ancora molto usato nei settori che ho elencato prima. Purtroppo finché non ci sarà un degno sostituto non si potrà fare altrimenti.
Sulle caratteristiche uniche a me verrebbe da dire:
l'impossibilità di scrivere un programma senza usare classi,i package come qualificatori dei nomi, l'introduzione di due meccanismi separati per eredità ed estensione, l'introduzione dei primitivi per la gestione della concorrenza nella radice del typesystem, il collegamento dinamico come metodo predefinito per la risoluzione delle invocazioni di metodo (per un linguaggio staticamente tipato), il meccanismo di caricamento delle classi da stream.
Ma non è detto che lo siano veramente perchè non conosco tutti i linguaggi precedenti a java. Sono praticamente certo invece che il linguaggio abbia innovato fortemente nella combinazione di caratteristiche principali, cioè il fatto di essere quello che è: staticamente tipato, concorrente, orientato agli oggetti, con gestione automatica della memoria, interpretato, con estensione singola ed eredità multipla, a collegamento dinamico, riflessivo e con caricamento in esecuzione delle classi.
Su questo nulla da dire. Quando il mio carissimo prof. Gallo arrivò nel '96 (se non ricordo male) al corso di Elaborazioni delle Immagini presentando Java per realizzare velocemente applet, mi piacque molto nella sua semplicità (non la sintassi ovviamente: è una questione endemica. :asd:).
Comunque nemmeno io conosco tutti i linguaggi e le innovazioni che hanno introdotto. Non mi sento di definire come "innovazioni" la forzatura di alcune caratteristiche. Quindi delle cose che hai elencato salverei quelle che ho evidenziato.
Non ho messo l'ereditarietà multipla tramite le interfacce perché ho il forte dubbio che fosse già stata proposta come modello alternativo alla classica ereditarietà singola e multipla. Da verificare (ho fatto qualche ricerca veloce, ma non ho trovato nulla purtroppo).
Sulla prospettiva, non ci capiamo. Colpa mia ma se mi fai l'esegesi dei periodi non mi aiuti :grrr: .
Scala mi piace perchè non [lo considero] un minestrone. Anche se le è.
Ti confermo quindi la mia opinione sul mescolamento delle prospettive: è una pessima idea. Vale anche per Scala: è una tristezza che sia anche funzionale. A me piace perchè è orientato agli oggetti e considero alcune delle sue caratteristiche funzionali addolcimenti sintattici per il suo uso orientato agli oggetti. Le altre sue doti funzionali, ad esempio l'immutabilità o la composizione di funzioni, le vedo come una muffa potrebbe vedere il drago pulisan: più alla larga ci sto, meglio è.
Dunque sì, purtroppo è anche funzionale: ma non è che si possa pretendere la luna.
Lo so. Per questo ti ho fatto qualche battuta, perché so come la pensi. :p
Comunque l'immutabilità dovrebbe un po' piacerti. Le stringhe in Java sono immutabili, e la trovo un'ottima cosa.
In generale immutabilità e composizione di funzioni sono concetti che mi piacciono, e quando posso utilizzo (la composizione in Python la uso spesso tramite i decoratori di funzione; quelli di classe non ho avuto modo di applicarla perché in produzione abbiamo Python 2.5).
Saranno le mie reminiscenze di Scheme e Prolog, che ho molto apprezzato all'università (non particolarmente la sintassi, al solito, ma i concetti sì). :fagiano:
Annotazioni.
Lo scopo delle annotazioni è quello di marcare elementi del codice a fini analitici. Il sorgente resta sempre uguale. Ad esempio nell'ambiente J2EE le annotazioni sono usate per generare automaticamente i descrittori di dispiegamento che i contenitori usano per fornire i servizi specificati nel codice.
Non introducono la possibilità di cambiare il codice sorgente più di quanto non lo si possa fare con una commento ed un trasformatore ad hoc e sono parte della sintassi del linguaggio.
Beh, s'è trovato un modo anche fare altro, e francamente lo trovo comodo.
Il preprocessore è diverso, esiste esattamente allo scopo di cambiare la sintassi del linguaggio. Può darsi che avesse un suo significato nel 1325 a.c. quando un elevamento a potenza era roba da far fumare le caldaie ma è un bel pezzo che abbiamo passato quella fase.
Personalmente NON adoro il preprocessore, ma purtroppo ottenere build diverse di uno stesso progetto è una necessità che prima o poi viene fuori.
Perchè le eccezioni - alle regole - sono cattive.
E' un dato sperimentale assodato che il ragionamento umano funzioni bene in positivo (nel senso dell'affermazione) e malissimo in negativo (nel senso dell'affermazione di una negazione). Dovreste essere in grado di provarlo con un esemplare umano nella vostra disponibilità ed un sempice test.
Oggetti nascosti, gliene proponente uno alla volta chiedendo di confermare o smentire, alternandole, le affermazioni: "è un [accendino-penna-pacchetto di sigarette-quello che è]" oppure "non è un [accendino-penna-pacchetto di sigarette-quello che non è]".
Se è un umanione comune, le risposte alle forme positive saranno più pronte di quelle alla forme negative.
Nel senso predetto, le eccezioni alle regole sono asserzioni negative. L'eccezione si genera quando due attribuzioni di qualità mutualmente esclusive si riferiscono ad uno stesso elemento.
Nel linguaggio x ci sono variabili che sono staticamente tipate e variabili che sono dinamicamente tipate.
Quindi ho due regole, due affermazioni positive? No, ho una regola e un'eccezione: tutte le variabili sono staticamente tipate salvo quello che sono dichiarate dinamiche (la regola è sempre quella che implica meno attribuzioni).
OK, adesso mi è chiaro il concetto. Grazie per la spiegazione.
C'è una sorta di dibattito in corso circa la complessità dei linguaggi che ha visto Java passare dalla parte dei facili a quella dei difficili. I più vecchi se lo ricorderanno: una volta Java era facilissimo, poi è diventato complicatissimo. Il punto intorno al quale si svolge la discussione in corso è esattamente quello delle eccezioni. Chi sostiene ad esempio che Scala sia "più facile" di Java lo fa proprio sottolineando il fatto che pur avendo il primo più regole del secondo ha un numero minore di eccezioni.
Non ho avuto modo di approfondire Scala (mi sono fermato dopo qualche minuto perché la sintassi è incompatibile col mio DNA), ma su Java la penso come te: dal '96 a oggi lo trovo un altro linguaggio, molto più complicato.
Chi invece sostiene che Python sia più facile lo fa per partito preso ma queli sono irrecuperabili :Prrr:
:cool: Prima o poi anche tu non ne potrai fare a meno. :D
Un informatico SA soprattutto su cosa sta lavorando. Infatti il corso di laurea in informatica inizia proprio con lo studio dei transistor, della loro combinazione nei circuiti logici e di come si costruisce una CPU a partire proprio dai transistor, bit dopo bit. Dal circuito somma alla ALU, ai registri, le memorie, il pipelining, il parallelismo e multicore, i bus, ecc... Partire più in basso di così non si può. Poi si passa all'assembly. Di pari passo viene insegnato il Java o più raramente il C. Ma il tutto lo si conmprende a fondo solo concludendo gli studi sugli elaboratori. E solo dopo tutto questo si passa a studiare algoritmi, database, ecc...
Chi non ha queste basi non può definirsi informatico. Un informatica di quel livello è indicata a chi fa altri lavori, come un matematico che si programma un SW che esegue un algoritmo. Un informatico che si rispetti sa su cosa sta programmando, sa come sfruttare le potenzialità del proprio HW dialogando con esso, se necessario inserendo blocchi di linguaggio macchina in un programa scritto in un linguaggio di alto livello.
Cmq per iniziare come autodidatta consiglio di partire in alto e poi lasciare all'università il compito di scendere nel dettaglio.
Dovresti renderti conto che ciò di cui hai parlato finora attiene più che altro all'ingegneria, in particolare all'elettronica.
Da informatico i miei "padri spirituali" (per modo di dire, visto che sono ateo :D) sono Muhammad ibn Mūsa 'l-Khwārizmī, George Boole, Alan Turing, Kurt Gödel, Alonzo Church, Stephen Kleene, e mi scuso coi matematici / logici che hanno contribuito e di cui non ricordo i nomi.
Scusa ma iniziare col parlare di algoritmo è un po' troppo base... :rolleyes:
Ma non si parlava di "basi" dell'informatica? ;)
credo che chiunque voglia imparare da solo a programmare sappia che lo fa per ottenere qualcosa: da un input ottengo un output tramite una serie di passaggi.
Un algoritmo non è solo quello. Per fortuna. Se ti andassi a leggere la definizione, capiresti il perché.
Cmq le "basi" sono la dimestichezza con variabili, tipi, if, for, while e compagnia.
Parliamo di condizioni (if, switch, ecc.) e iterazione (for, while, do, ecc.) che è meglio, perché sono concetti più generici.
Il C++ è abbastanza semplice per poter pasticciare agevolmente con queste cose. Poi ci aggiungi array, puntatori, funzioni e se hai voglia anche la scrittura dei file. In C è davvero tutto molto banale e gli intoppi sono veramente pochi. Un puntatore che punta a zone errate di memoria è colpa del programmatore, ma dividere per 0, ad esempio, lo trovo un errore dello stesso tipo: distrazione. E può accadere in qualsiasi linguaggio... Non ho detto che deve riscrivere Photoshop, deve solo pasticciare con scanf e printf... tutto qui. Anche java è un buon inizio, ma è un linguaggio ad oggetti. IMHO, più difficile da comprendere di semplice programma sequenziale in C++.
Java è comodo per fare il salto da C++ a linguaggi più moderni come il .net. E' "simile" a C ma ti introduce più semplicemente al cuore della programmazione ad oggetti. Poi puoi passare a C# e/o a VB.net. Sono passaggi piuttosto semplici e graduali
In più facendo così ti ritrovi a conoscere 3/4 linguaggi.
Proprio perché è meglio focalizzarsi sulla risoluzione dei problemi, piuttosto che sui dettagli di basso livello (che NON sono indispensabili per arrivare a una soluzione), meglio iniziare con linguaggi di più alto livello e, soprattutto, che non ti facciano scontrare con certe problematiche astruse.
Hai parlato anche di cose semplici come scanf e printf, ma se dimentichi un & appiccicato al nome della variabile dovresti sapere che succede. Un disastro. E bug di questo tipo sono difficili da scoprire; ti fanno impazzire. Soprattutto sono bug specifici di un linguaggio povero come il C, e che ovviamente altri non hanno.
Non è un caso che per parecchi anni alle scuole sia stato insegnato il BASIC o il Pascal.
Oggi al MIT al corso introduttivo alla programmazione si usa Python.
Bisognerebbe chiedersi il perché di queste scelte.
P.S. Non è corretto affermare che la divisione per zero sia un errore, magari di distrazione. Può essere un comportamento voluto, e il risultato essere più o meno infinito, o un NaN. ;)
Oooh ma quanto ci mancava il thread sull'imparare a programmare con epiche discussioni sul senso dell'informatica :D
Come ho già detto prima, non saremmo programmatori altrimenti. :asd:
sottovento
10-05-2011, 07:18
<CUT>
Insomma, quello che mi serverirebbe è fare un po' di chiarezza sulla situazione e ogni consiglio è ben accetto.
Grazie mille!
Adesso e' chiaro? :D
Se non e' chiaro, ti basta chiedere e ripetiamo tutto....
^TiGeRShArK^
10-05-2011, 07:44
Su questo siamo d'accordissimo. D'altronde è in cima al forum il mio suggerimento sul linguaggio che propongo come entry level, e non è Java.
Ritengo assurdo pensare che quel meglio (anche senza i molto) sia C# che è l'agglomerato di tutti i difetti dei linguaggi che l'hanno preceduto.
Mi dicessi F# se ne potrebbe anche parlare ma C# neanche per idea.
Circa la m@#, c'è un'altra divertente coincidenza :D. Io scriverei infatti:
Calendar time = new StringExt("31.3.2011").toDate();
Dubito di avere una semplificazione già sperimentata e infilata nella mia libreria personale per ogni problema tu possa aver incontrato tuttavia è sintomatico il fatto che alcuni "problemi" siano comuni (ti anticipo: non inveire contro swing, input/output, collections e riflessione perchè ho una batteria di precotti, avrei anche qualcosa sui database ma lì potresti effettivamente fregarmi perchè non sono tanto convinto del mio BeanStore, sebbene io lo usi ormai da tempo :D).
La necessità di usare le classi anonime. Eh, lì qualcosa che sa di vecchio c'è. Uno non dovrebbe dire che sia un problema di codice perchè fa tutto l'ide (fun1, fun2, fun3 + tab e netbeans mi piazza la funzione) ma visivamente anche io ne sono un po' inorridito. Ogni tanto cerco di dargli un aspetto diverso, tipo scrivere:
new VFunction1<Integer>() { public void apply(Integer x) {
...codice
}};
Ma è un diverso grado di schifo. Mi piacerebbe poter scrivere:
(x: Integer) => codice
Sì. Mi piacerebbe quello che gli va dietro? Non ne sono tanto sicuro. Il fatto è che quando si inizia ad avere una forma contratta per le funzioni ti arrivano anche le funzioni di ordine superiore.
E quando arrivano quelle allora ti puoi aspettare che capiti questo:
(f: (a1) ⇒ (a2) ⇒ (a3) ⇒ (a4) ⇒ (a5) ⇒ b): (a1, a2, a3, a4, a5) ⇒ b
Aggiungi i generici (che in C# sono molto più complicati di Java, che già è esoterico sull'argomento, pur essendo stati scritti da un genio assoluto - lo possino...) e fai i tuoi conti.
guarda che anche in quel modo che usi tu se scrivi 31 marzo 2011 nel calendar e poi stampi subito dopo il risultato di ritrovi un bell'1 aprile 2011...
E un bug della madonna del genere in un linguaggio tra i piu' usati e' qualcosa di inconcepibile per me.
Per quanto riguarda le inner class per me i delegate e le lambda function sono un deciso passo avanti.
Ti sembra veramente possibile che ci sia un bug del genere nelle librerie standard?
Cosa c'è scritto nella documentazione di Calendar.MONTH?
Field number for get and set indicating the month. This is a calendar-specific value. The first month of the year in the Gregorian and Julian calendars is JANUARY which is 0; the last depends on the number of months in a year.
E' quindi una data valida quella che hai impostato?
calendar.setLenient(false);
calendar.setTime(2011, 3, 31);
calendar.getTime();
Cosa ti dice adesso calendar?
birmarco
10-05-2011, 11:47
peccato che sia quella la programmazione, i linguaggi vanno e vengono, sono solo delle regole per definire le azioni volute, portare un algoritmo in diversi linguaggi è facile se si hanno chiari i passaggi ed è questo che la scuola deve insegnare non la sintassi ma i concetti, per la sintassi basta la wrox
Si ok, però il concetto di algoritmo è alquanto banale. Il punto è come costruirsi il proprio algoritmo e il modo migliore per farlo è iniziare a scrivere in un qualche linguaggio
Dovresti renderti conto che ciò di cui hai parlato finora attiene più che altro all'ingegneria, in particolare all'elettronica.
Da informatico i miei "padri spirituali" (per modo di dire, visto che sono ateo :D) sono Muhammad ibn Mūsa 'l-Khwārizmī, George Boole, Alan Turing, Kurt Gödel, Alonzo Church, Stephen Kleene, e mi scuso coi matematici / logici che hanno contribuito e di cui non ricordo i nomi.
Ma non si parlava di "basi" dell'informatica? ;)
Un algoritmo non è solo quello. Per fortuna. Se ti andassi a leggere la definizione, capiresti il perché.
Parliamo di condizioni (if, switch, ecc.) e iterazione (for, while, do, ecc.) che è meglio, perché sono concetti più generici.
Proprio perché è meglio focalizzarsi sulla risoluzione dei problemi, piuttosto che sui dettagli di basso livello (che NON sono indispensabili per arrivare a una soluzione), meglio iniziare con linguaggi di più alto livello e, soprattutto, che non ti facciano scontrare con certe problematiche astruse.
Hai parlato anche di cose semplici come scanf e printf, ma se dimentichi un & appiccicato al nome della variabile dovresti sapere che succede. Un disastro. E bug di questo tipo sono difficili da scoprire; ti fanno impazzire. Soprattutto sono bug specifici di un linguaggio povero come il C, e che ovviamente altri non hanno.
Non è un caso che per parecchi anni alle scuole sia stato insegnato il BASIC o il Pascal.
Oggi al MIT al corso introduttivo alla programmazione si usa Python.
Bisognerebbe chiedersi il perché di queste scelte.
P.S. Non è corretto affermare che la divisione per zero sia un errore, magari di distrazione. Può essere un comportamento voluto, e il risultato essere più o meno infinito, o un NaN. ;)
Secondo me (e anche secondo chi ha creato i corsi i informatica :D ) una componente elettronica fa molto bene per capire cosa succede quando si scrive un determinato codice. Per scrivere un programma radicato nel sistema è necessario anche conoscere la macchina su cui si lavora ;)
La & io non la vedrei così negatva, potrebbe essere utile a capire la differenza tra il passaggio parametri per valore e per indirizzo, entrando anche nel concetti di allocazione della memoria che secondo me sono importanti. Si a volte è difficile beccarla una & dimenticata ma se appunto si usa il C++ solo come inizio i programmi scritti saranno al più programmi di massimo 300 linee o giù di lì trovare la & dimenticata non è così difficile. Alla fine in C++ su SW semplici gli errori possono essere
- i ;
- le &
- mancate inizializzazioni
- graffe fuori posto
Altro non mi viene in mente... tra l'altro importando le librerie con un inizio di programma che può anche essere scritto senza capire perchè sia così si può avere un
printf("Hello World");
invece di un
System.out.printf("Hello World");
o peggio
System.out out = new System.out();
out.println("Hello World");
di Java
Molto più semplice da assimilare. E a maggior ragione uno
scanf("%i%i", &b, &b)
lo trovo molto più semplice di utilizzare classi, come ad esempio la Scanner, contenute in Java dove per leggere un valore da console ci vogliono parecchie righe di codice. Occore saper fare un assegnamento con new, e richiamare il metodo corretto. Con C++ basta sapere che si scrive scanf e all'inizio anche non sapere il perchè è così. In C++ la logica leggi dato con scanf, opera e stampa il risultato con printf lo trovo il metodo più semplice per iniziare ;)
E' vero mi sono dimenticato dell'esistenza dei NaN :D
Quando si cerca in tutti i modi di salvare il passato perche' presente e futuro non piacciono piu', e' ora di estinugersi.
E' un peccato però che scanf sia ANSI C, non C++ :D
Sembra una pignoleria ma è importanterrimo concettualmente.
PS: se credi che C++ possa dare solo quegli errori su programmi semplici sei un sognatore :D
A me è capitato qualsiasi cosa, da main non trovato a linking contro librerie sbagliate a errori aritmetici.
Basta avere la giusta dose di sfortuna :asd:
@everyone: che piaccia o no, l'informatica ha due basi opposte e altrettanto importanti. Una è la matematica pura e la logica, l'altra è il "gretto hardware", assembly, C, e tutte quelle robbacce sporche e cattive.
L'unico modo per sapere veramente cosa si sta facendo è conoscerle tutte e due, e basta.
Non esiste che in Python si ignori le architetture HW o al contrario che in C si ignori cos'è un'algoritmo... è solo stupido.
Kralizek
10-05-2011, 12:36
piú che altro...
mio padre quando avevo 8 anni mi mise davanti al QBasic incluso con il dos.
se doveste fare qualcosa del genere con un vostro eventuale pargolo, cosa scegliereste?
sottolineo il "8 anni" :)
cdimauro
10-05-2011, 12:58
Si ok, però il concetto di algoritmo è alquanto banale. Il punto è come costruirsi il proprio algoritmo e il modo migliore per farlo è iniziare a scrivere in un qualche linguaggio
Anni fa per iniziare si utilizzavano pseudocodice e/o diagrammi di flusso.
Secondo me (e anche secondo chi ha creato i corsi i informatica :D ) una componente elettronica fa molto bene per capire cosa succede quando si scrive un determinato codice. Per scrivere un programma radicato nel sistema è necessario anche conoscere la macchina su cui si lavora ;)
Assolutamente no. Dipende, al solito, dai requisiti dell'applicazione, che raramente prevedono la conoscenza di dettagli di basso livello.
In 6 anni e mezzo di utilizzo di Python le applicazioni che ho scritto funzionano praticamente ovunque, da Windows a Linux & co., dagli x86 agli ARM, e ho smanettato perfino con la PSP (c'è un porting non ufficiale).
La & io non la vedrei così negatva, potrebbe essere utile a capire la differenza tra il passaggio parametri per valore e per indirizzo, entrando anche nel concetti di allocazione della memoria che secondo me sono importanti.
Ma anche no. L'importanza è relativa esclusivamente al contesto.
Nel caso di C & compagnia di medio-basso livello è praticamente indispensabile. In altri linguaggi (come Python, appunto), l'allocazione e relativa deallocazione della memoria è del tutto trasparente.
Si a volte è difficile beccarla una & dimenticata ma se appunto si usa il C++ solo come inizio i programmi scritti saranno al più programmi di massimo 300 linee o giù di lì trovare la & dimenticata non è così difficile. Alla fine in C++ su SW semplici gli errori possono essere
- i ;
- le &
- mancate inizializzazioni
- graffe fuori posto
Altro non mi viene in mente...
Forse non hai realizzato applicazioni un po' più complesse, dove gli errori che avevo elencato prima si verificano, eccome. E vedi anche Tommo.
tra l'altro importando le librerie con un inizio di programma che può anche essere scritto senza capire perchè sia così si può avere un
printf("Hello World");
invece di un
System.out.printf("Hello World");
o peggio
System.out out = new System.out();
out.println("Hello World");
di Java
Molto più semplice da assimilare. E a maggior ragione uno
scanf("%i%i", &b, &b)
lo trovo molto più semplice di utilizzare classi, come ad esempio la Scanner, contenute in Java dove per leggere un valore da console ci vogliono parecchie righe di codice. Occore saper fare un assegnamento con new, e richiamare il metodo corretto. Con C++ basta sapere che si scrive scanf e all'inizio anche non sapere il perchè è così. In C++ la logica leggi dato con scanf, opera e stampa il risultato con printf lo trovo il metodo più semplice per iniziare ;)
In Pascal:
WriteLn('Hello, World');
Read(b, b);
Come vedi, niente puntatori e nessuna possibilità di bug allucinanti. Il Pascal, tra l'altro, è più vecchio del C.
E' vero mi sono dimenticato dell'esistenza dei NaN :D
:)
@everyone: che piaccia o no, l'informatica ha due basi opposte e altrettanto importanti. Una è la matematica pura e la logica, l'altra è il "gretto hardware", assembly, C, e tutte quelle robbacce sporche e cattive.
L'unico modo per sapere veramente cosa si sta facendo è conoscerle tutte e due, e basta.
Non esiste che in Python si ignori le architetture HW
Beh, io l'ho fatto e... le mie applicazioni (anche server che tutt'ora girano su architetture a 32 o 64 bit, mono o multicore, e macchine virtuali) funzionano lo stesso. :cool:
o al contrario che in C si ignori cos'è un'algoritmo... è solo stupido.
Che c'entra: il concetto di algoritmo è trasversale. Abbraccia qualunque linguaggio di programmazione.
piú che altro...
mio padre quando avevo 8 anni mi mise davanti al QBasic incluso con il dos.
se doveste fare qualcosa del genere con un vostro eventuale pargolo, cosa scegliereste?
sottolineo il "8 anni" :)
Python + il suo modulo standard turtle (http://docs.python.org/library/turtle.html), oppure PythonTurtle (http://pythonturtle.org/) (un IDE apposito: installi e usi subito).
piú che altro...
mio padre quando avevo 8 anni mi mise davanti al QBasic incluso con il dos.
se doveste fare qualcosa del genere con un vostro eventuale pargolo, cosa scegliereste?
sottolineo il "8 anni" :)
Dove andremo a finire con questi genitori progressisti :rolleyes:
Quattro ceffoni e a letto senza cena, altro che programmazione!
Educazione del fanciullo, dal manuale Costanzo-Endemol:
8 - 12: scuola calcio*/**
12 - 13: pranzo davanti al grande fratello
13 - 16: corso di tronista
16 - 16.15: merenda davanti al grande fratello
16.15 - 18: scuola calcio*/**
18-19: libertà
19-20: cena (privare se colto a leggere libri*** nella fase precedente)
20-21: un'ora di televisione commerciale
21: tre ave maria filippi e poi a letto
*Sostituire con nuoto in caso di fanciulla.
**In alternativa tennis, ambosessi
***Eclusi oggi, gente, chi, novella 2000 e assimilabili
Beh, io l'ho fatto e... le mie applicazioni (anche server che tutt'ora girano su architetture a 32 o 64 bit, mono o multicore, e macchine virtuali) funzionano lo stesso. :cool:
Credo che per uno che scrive un'implementazione della VM di Python i "requisiti macchina" siano ormai assimilati, o no? :D
Di certo hai idea di che cosa succede dietro le quinte e sai usare Python senza stressare i limiti della VM su cui gira, e di conseguenza evitare i limiti della macchina.
Se uno non ha la più pallida idea di che cosa è pesante e che cosa no, non credo possa scrivere un'applicazione server, in nessun linguaggio :read:
pabloski
10-05-2011, 13:39
Un informatico SA soprattutto su cosa sta lavorando. Infatti il corso di laurea in informatica inizia proprio con lo studio dei transistor, della loro combinazione nei circuiti logici e di come si costruisce una CPU a partire proprio dai transistor, bit dopo bit. Dal circuito somma alla ALU, ai registri, le memorie, il pipelining, il parallelismo e multicore, i bus, ecc... Partire più in basso di così non si può. Poi si passa all'assembly. Di pari passo viene insegnato il Java o più raramente il C. Ma il tutto lo si conmprende a fondo solo concludendo gli studi sugli elaboratori. E solo dopo tutto questo si passa a studiare algoritmi, database, ecc...
Chi non ha queste basi non può definirsi informatico. Un informatica di quel livello è indicata a chi fa altri lavori, come un matematico che si programma un SW che esegue un algoritmo. Un informatico che si rispetti sa su cosa sta programmando, sa come sfruttare le potenzialità del proprio HW dialogando con esso, se necessario inserendo blocchi di linguaggio macchina in un programa scritto in un linguaggio di alto livello.
Cmq per iniziare come autodidatta consiglio di partire in alto e poi lasciare all'università il compito di scendere nel dettaglio.
perfettamente d'accordo....all'università ti danno le basi sull'architettura dei calcolatori, ai miei e mi pare di capire anche ai tuoi tempi, ti davano anche basi di elettronica digitale e analogica
l'assembly, il c, ecc.... sono sulla stessa falsariga di quelle nozioni di base, nozioni che piaccia o no è obbligatorio avere per comprendere fino in fondo il funzionamento di questa benedetta macchina che poi andremo a programmare in java, python, basic o come ci pare
rimane però il fatto che la conoscenza delle basi permette di operare anche con linguaggi ad alto livello in maniera più cosciente e di realizzare ottimizzazioni che altrimenti sarebbero incomprensibili e giudicate superflue
voglio dire, c'è gente che in assembly sceglie xor eax,eax invece di mov eax,0 perchè la prima impiega meno cicli di clock e questo è diretta conseguenza di come quelle due istruzioni sono implementate nel processore....conoscerlo ti permette di programmare meglio
logicamente c'è il rovescio della medaglia e cioè la logica, l'algoritmo e quello è più un problema di impostazione mentale che di conoscenza tecnica e in questo caso è necessario sviluppare capacità logico/matematiche
un linguaggio ad alto livello aiuta in questo senso e permette di ragionare in termini algoritmici senza prestare attenzione ai dettagli....personalmente ho cominciato dal basic ( come ho già scritto in un post precedente ) e quindi penso che sia una buona soluzione ma solo ed esclusivamente per farsi le ossa nel pensare da informatico, poi bisognerà volenti o nolenti scontrarsi con la macchina e i suoi dettagli
Alla fine in C++ su SW semplici gli errori possono essere
- i ;
- le &
- mancate inizializzazioni
- graffe fuori posto
Altro non mi viene in mente...
Umh... dipende da quale 20% di C++ conosci...
Secondo te questo pezzo di codice cosa fa? Compila? Se no, perché?
#include <iostream>
struct A { int a; };
int main() {
A var(A());
std::cout << var.a << std::endl;
return 0;
}
protip: Most Vexing Parse.
birmarco
10-05-2011, 14:14
E' un peccato però che scanf sia ANSI C, non C++ :D
Sembra una pignoleria ma è importanterrimo concettualmente.
PS: se credi che C++ possa dare solo quegli errori su programmi semplici sei un sognatore :D
A me è capitato qualsiasi cosa, da main non trovato a linking contro librerie sbagliate a errori aritmetici.
Basta avere la giusta dose di sfortuna :asd:
@everyone: che piaccia o no, l'informatica ha due basi opposte e altrettanto importanti. Una è la matematica pura e la logica, l'altra è il "gretto hardware", assembly, C, e tutte quelle robbacce sporche e cattive.
L'unico modo per sapere veramente cosa si sta facendo è conoscerle tutte e due, e basta.
Non esiste che in Python si ignori le architetture HW o al contrario che in C si ignori cos'è un'algoritmo... è solo stupido.
I problemi possono essere molteplici ma io in C farei:
- Variabili e tipi
- Condizioni e iterazioni
- Funzioni
- Array
- Strutture
- Puntatori e liste con conseguente allocazione e pulitura della memoria
- Scrittura/lettura di file semplici
Sono le cose più semplici e utili a fare dei programmini di base come dei gestionali di un'ipotetica attività, se proprio non ci si vuole fermare all'odiosa area del quadrato. Si può pasticciare un po' con queste cose e al più decidere di andare anche oltre. Di problemi in queste cose direi che ce ne sono pochi, o meglio io non ho mai avuto problemi che non siano stati sviste mie nella scrittura del codice.
Anni fa per iniziare si utilizzavano pseudocodice e/o diagrammi di flusso.
Assolutamente no. Dipende, al solito, dai requisiti dell'applicazione, che raramente prevedono la conoscenza di dettagli di basso livello.
In 6 anni e mezzo di utilizzo di Python le applicazioni che ho scritto funzionano praticamente ovunque, da Windows a Linux & co., dagli x86 agli ARM, e ho smanettato perfino con la PSP (c'è un porting non ufficiale).
Ma anche no. L'importanza è relativa esclusivamente al contesto.
Nel caso di C & compagnia di medio-basso livello è praticamente indispensabile. In altri linguaggi (come Python, appunto), l'allocazione e relativa deallocazione della memoria è del tutto trasparente.
Forse non hai realizzato applicazioni un po' più complesse, dove gli errori che avevo elencato prima si verificano, eccome. E vedi anche Tommo.
In Pascal:
WriteLn('Hello, World');
Read(b, b);
Come vedi, niente puntatori e nessuna possibilità di bug allucinanti. Il Pascal, tra l'altro, è più vecchio del C.
:)
Si certamente dipende da cosa si vorrà andare a programmare. Io penso che la massima aspirazione per un programmatore sia lavorare alla stesura di un sistema operativo o cmq per una grossa SW house dove vengono scritti SW che devono essere ottimizzati al massimo. Il compilatore ha cmq i suoi limiti nell'ottimizzare ;)
In C ho programmato per 3 anni alle superiori facendo davvero decine e decine di applicazioni sulle situazioni ipotetiche più assurde. Cmq il tutto era limitato al C base diciamo (poco più dei punti che ho elencato all'inizio di questo post) quindi di problemi non ne ho mai incontrati.
Quando ho dovuto fare il corso di Java all'università è stato mio in poche ore, giusto il tempo di imparare i concetti della programmazione ad oggetti. E questo grazie a C. Secoli fa mi sono messo ad imparare da solo il VB .Net da un libro che avevo in casa sul Visual Basic 6.0 che tra l'altro non è nemmeno .net. :asd: Ed era un libro per superiori... lascio immaginare :D Ho iniziato dopo aver letto il libro proprio a caso (e mi sto maledicendo) tramite Visual Studio a scrivere e ad imparare proprio così dai suggerimenti dell'autocompletamento. Diciamo che quando ho iniziato ero troppo stupido e volevo subito produrre qualcosa di utile. Ho cercato recentemente di rimettere in piedi una conoscenza adeguata a questo linguaggio che mi piace molto per chiudere i mega buchi che ho lasciato. Devo cmq dire che senza C sarebbe stato tutto molto più duro, imho.
perfettamente d'accordo....all'università ti danno le basi sull'architettura dei calcolatori, ai miei e mi pare di capire anche ai tuoi tempi, ti davano anche basi di elettronica digitale e analogica
l'assembly, il c, ecc.... sono sulla stessa falsariga di quelle nozioni di base, nozioni che piaccia o no è obbligatorio avere per comprendere fino in fondo il funzionamento di questa benedetta macchina che poi andremo a programmare in java, python, basic o come ci pare
rimane però il fatto che la conoscenza delle basi permette di operare anche con linguaggi ad alto livello in maniera più cosciente e di realizzare ottimizzazioni che altrimenti sarebbero incomprensibili e giudicate superflue
voglio dire, c'è gente che in assembly sceglie xor eax,eax invece di mov eax,0 perchè la prima impiega meno cicli di clock e questo è diretta conseguenza di come quelle due istruzioni sono implementate nel processore....conoscerlo ti permette di programmare meglio
logicamente c'è il rovescio della medaglia e cioè la logica, l'algoritmo e quello è più un problema di impostazione mentale che di conoscenza tecnica e in questo caso è necessario sviluppare capacità logico/matematiche
un linguaggio ad alto livello aiuta in questo senso e permette di ragionare in termini algoritmici senza prestare attenzione ai dettagli....personalmente ho cominciato dal basic ( come ho già scritto in un post precedente ) e quindi penso che sia una buona soluzione ma solo ed esclusivamente per farsi le ossa nel pensare da informatico, poi bisognerà volenti o nolenti scontrarsi con la macchina e i suoi dettagli
D'accordissimo su tutto! :D L'analogica però non c'è più :) Io l'ho fatta alle superiori per fortuna (qualcosina)
birmarco
10-05-2011, 14:20
Umh... dipende da quale 20% di C++ conosci...
Secondo te questo pezzo di codice cosa fa? Compila? Se no, perché?
#include <iostream>
struct A { int a; };
int main() {
A var(A());
std::cout << var.a << std::endl;
return 0;
}
protip: Most Vexing Parse.
E' una verifica? :D
iostream credo manchi di un .h, cmq non so cosa significhi la riga che inizia con std quindi e neanche A var(A()) l'ho mai visto, sembra tanto una dichiarazione di tipo A ma quel che viene dopo A non lo so identificare. Cmq questo o è una forma contratta che non ho mai visto oppure fa parte di un C che non è proprio quello base che si insegna per primo. Il mio "imparare il C" non voleva dire impararlo tutto, solo le basi basi per pasticciare sulla logica di programmazione
piú che altro...
mio padre quando avevo 8 anni mi mise davanti al QBasic incluso con il dos.
se doveste fare qualcosa del genere con un vostro eventuale pargolo, cosa scegliereste?
sottolineo il "8 anni" :)
Forse per gli 8 anni e' ancora un po' complicato, ma prova a dare una occhiata a Scratch ( http://scratch.mit.edu/ )
Scusa ma iniziare col parlare di algoritmo è un po' troppo base... :rolleyes: credo che chiunque voglia imparare da solo a programmare sappia che lo fa per ottenere qualcosa: da un input ottengo un output tramite una serie di passaggi.
[..]
Fidati che rivedere il concetto di algoritmo assimilandolo ad una macchina di Turing ti farebbe cambiare idea :asd:
Preferirei far fare ai ragazzi 10 corsi di algebra e logica (che non conoscono) piuttosto che iniziare il corso di laurea in informatica o ingegneria informatica parlando di transistor :muro: .
Volendo passare al lato oscuro (quello del formalismo integralista) per alcuni neanche bisognerebbe introdurre il concetto di ciclo senza aver dato prima il concetto di invariante :asd:
Comunque preferirei che ci si concentrasse sulle tecniche per scrivere codice corretto, introducendo anche delle metodologie di testing (cosa che alla triennale si vede poco, o almeno per me è stato così).
birmarco
10-05-2011, 16:08
Forse per gli 8 anni e' ancora un po' complicato, ma prova a dare una occhiata a Scratch ( http://scratch.mit.edu/ )
Non mi ricordo da quale età si sviluppa la capacità di astrazione ma è sicuramente superiore agli 8 anni. Credo sia molto dura imparare a programmare a quell'età :)
E' una verifica? :D
iostream credo manchi di un .h, cmq non so cosa significhi la riga che inizia con std quindi e neanche A var(A()) l'ho mai visto, sembra tanto una dichiarazione di tipo A ma quel che viene dopo A non lo so identificare. Cmq questo o è una forma contratta che non ho mai visto oppure fa parte di un C che non è proprio quello base che si insegna per primo. Il mio "imparare il C" non voleva dire impararlo tutto, solo le basi basi per pasticciare sulla logica di programmazione
:doh:
Non è C, è C++. std è un namespace, cout è un'istanza statica di una classe e iostream sta bene senza la sua .h :D
Io sinceramente lascerei stare discorsi su come insegnare agli altri se ancora non si è imparato... io smanetto in C/C++ da 6 anni e ancora imparo roba a vagonate.
E' vero che all'inizio i risultati sono più rapidi, ma non ti offendere se ti dico che quello che hai imparato non è nemmeno l'inizio, ed è tutto tranne che utile :asd:
birmarco
10-05-2011, 16:23
Fidati che rivedere il concetto di algoritmo assimilandolo ad una macchina di Turing ti farebbe cambiare idea :asd:
Preferirei far fare ai ragazzi 10 corsi di algebra e logica (che non conoscono) piuttosto che iniziare il corso di laurea in informatica o ingegneria informatica parlando di transistor :muro: .
Volendo passare al lato oscuro (quello del formalismo integralista) per alcuni neanche bisognerebbe introdurre il concetto di ciclo senza aver dato prima il concetto di invariante :asd:
Comunque preferirei che ci si concentrasse sulle tecniche per scrivere codice corretto, introducendo anche delle metodologie di testing (cosa che alla triennale si vede poco, o almeno per me è stato così).
Che odio la macchina di Turing!! :asd: proprio tra le parti che odio di più! :D
perfettamente d'accordo....all'università ti danno le basi sull'architettura dei calcolatori, ai miei e mi pare di capire anche ai tuoi tempi, ti davano anche basi di elettronica digitale e analogica
l'assembly, il c, ecc.... sono sulla stessa falsariga di quelle nozioni di base, nozioni che piaccia o no è obbligatorio avere per comprendere fino in fondo il funzionamento di questa benedetta macchina che poi andremo a programmare in java, python, basic o come ci pare
rimane però il fatto che la conoscenza delle basi permette di operare anche con linguaggi ad alto livello in maniera più cosciente e di realizzare ottimizzazioni che altrimenti sarebbero incomprensibili e giudicate superflue
voglio dire, c'è gente che in assembly sceglie xor eax,eax invece di mov eax,0 perchè la prima impiega meno cicli di clock e questo è diretta conseguenza di come quelle due istruzioni sono implementate nel processore....conoscerlo ti permette di programmare meglio
logicamente c'è il rovescio della medaglia e cioè la logica, l'algoritmo e quello è più un problema di impostazione mentale che di conoscenza tecnica e in questo caso è necessario sviluppare capacità logico/matematiche
un linguaggio ad alto livello aiuta in questo senso e permette di ragionare in termini algoritmici senza prestare attenzione ai dettagli....personalmente ho cominciato dal basic ( come ho già scritto in un post precedente ) e quindi penso che sia una buona soluzione ma solo ed esclusivamente per farsi le ossa nel pensare da informatico, poi bisognerà volenti o nolenti scontrarsi con la macchina e i suoi dettagli
ti posso assicurare che in tutti i livelli di istruzione che ho fatto io mai e poi mai in un corso di programmazione si impara qualcosa di elettronica relativa ad un pc, l'elettronica si studia a latere per ampliare il bagaglio culturale ma conoscere intimamente il funzionamento di una alu, dei registri della memoria ecc ecc non serve una mazza per programmare
nella stragrande maggioranza dei casi un programmatore non se ne fà nulla di conoscere la macchina su cui girerà l'applicazione, vuoi perchè lavora in java o .net oppure lascia fare l'ottimizzazione ai compilatori
l'unico caso in cui è veramente necessario arrivare ad un'ottimizzazione così spinta è se lavori con sistemi embedded i microcontrollori hanno veramente una potenza di calcolo ridicola nella stragrande maggioranza dei casi e, anche con delle belle bestie come i cortex m3 ti scornerai sempre con i limiti di potenza dei micro in quanto i tempi di chiusura degli anelli si riduce sempre di più, in quei casi ottimizzare il codice o direttamente scrivere parti del codice in assembler è fondamentale ma solo in questi casi hai necessità di conoscere l'architettura che è fondamentalmente diversa da un processore da pc
^TiGeRShArK^
10-05-2011, 18:45
Ti sembra veramente possibile che ci sia un bug del genere nelle librerie standard?
Cosa c'è scritto nella documentazione di Calendar.MONTH?
E' quindi una data valida quella che hai impostato?
calendar.setLenient(false);
calendar.setTime(2011, 3, 31);
calendar.getTime();
Cosa ti dice adesso calendar?
quindi anziche' dare un errore ti imposta un giorno a caso, ottimo. :rotfl:
Statisticamente la prossima dovresti azzeccarla ma a questo punto non posso che dirti di dare un'occhiata alla documentazione delle librerie altrimenti facciamo notte.
quindi anziche' dare un errore ti imposta un giorno a caso, ottimo. :rotfl:
Gennaio è zero.. quindi se come mese intendi marzo e scrivi 3, lui intende aprile ma aprile non ha 31 giorni.. quindi la data non è valida.
Intendevi questo PGI-Bis?
wingman87
10-05-2011, 21:14
Gennaio è zero.. quindi se come mese intendi marzo e scrivi 3, lui intende aprile ma aprile non ha 31 giorni.. quindi la data non è valida.
Intendevi questo PGI-Bis?
Non credo. Sulla documentazione dice che per ogni campo (i campi sono giorno, mese e anno), se vai fuori dal range valido, viene impostato il valore minimo per quel campo. Quindi il metodo si comporta come da documentazione.
Calendar non imposta mai date a caso (è una libreria per PC, non può fisicamente farlo). Le regole sono quelle citate - apparentemente qualcuno legge la documentazione.
Nel codice che ho incollato è rilasciata un'eccezione perchè il Calendar è lenient, cioè rilascia un'eccezione quando sia richiesta la data nel caso in cui i valori impostati non siano corretti.
Mulder90
10-05-2011, 22:21
A.A.A cercasi GarudaOne.
Gli amici assicurano che è scappato terrorizzato dopo avere iniziato il topic.
Gli utenti del forum invece assicurano che si è chiarito le idee!!!
Sulla seconda ho molti dubbi! :sofico:
P.P.S: scusate l'intromissione!!!
A.A.A cercasi GarudaOne.
Gli amici assicurano che è scappato terrorizzato dopo avere iniziato il topic.
Gli utenti del forum invece assicurano che si è chiarito le idee!!!
Sulla seconda ho molti dubbi! :sofico:
P.P.S: scusate l'intromissione!!!
Come ho detto sopra, ormai è un classico.
Le discussioni di questo stampo finiscono invariabilmente con tutti che si accapigliano su dettagli avanzatissimi insignificanti esaminati alla luce della meccanica quantistica e del teorema di Godel :asd:
E non so perchè, mi da l'impressione che tutto quello che si dice qua dentro potrebbe essere usato contro chi lo dice, vista la mole di enormità :asd:
La quantità di "ma che ca**o ho scritto" nel leggere i miei vecchi posts in discussioni di questo tipo è sempre altissima.
Ma che dite? :D
Dai tutto può essere utile per chi vuole delle info.
Finchè non fa domande gli fa bene capire contro cosa deve combattere :D
O si appassiona, o capisce che ha sbagliato corso studi :D ... sempre se stà leggendo :stordita: :stordita:
Kralizek
11-05-2011, 08:17
Non mi ricordo da quale età si sviluppa la capacità di astrazione ma è sicuramente superiore agli 8 anni. Credo sia molto dura imparare a programmare a quell'età :)
allora sono un genio! :sofico:
no scherzo, però ad 8/10 anni riuscivo a fare un programmino stupido che facesse un paio di print, un paio di input di interi, li sommasse o ne facesse il prodotto e li ripresentasse in output.
ovviamente roba come cicli ed if/select case mi erano ignoti...
però caxxo, sempre 8 anni avevo :P
btw, ho trovato questo: http://msdn.microsoft.com/en-us/beginner/ff384126.aspx
Si anch'io a 8/10 anni scrivevo qualche riga di codice in basic; ma non sono un genio :D
E dirò di più, imparavo molto più facilmente di ora, senza internet, con un manualetto, senza chiedere a nessuno.
Ora se manca la documentazione non riesco a fare nulla.
La gioventù è sottovalutata :O
Si anch'io a 8/10 anni scrivevo qualche riga di codice in basic; ma non sono un genio :D
E dirò di più, imparavo molto più facilmente di ora, senza internet, con un manualetto, senza chiedere a nessuno.
Ora se manca la documentazione non riesco a fare nulla.
La gioventù è sottovalutata :O
pure io a 8-9 anni mio zio recentemente passato agli ibm mi regalò lo splendido sinclair zx spectrum e fù l'inizio della fine :D :D, ore a ricopiare i sorgenti per far funzionare caccia al sommergibile
mi ricordo che la prima cosa che feci fù stampare una ricetta per mia madre una riga dopo l'altra impuzzando tutta la casa visto che la zx printer quando stampava fumava veramente mentre il primo programma veramente utile lo feci qualche anno dopo per risolvere le equazioni di secondo grado
spectrum che è ancora funzionante e tenuto come una reliquia :D :D
pure io a 8-9 anni mio zio recentemente passato agli ibm mi regalò lo splendido sinclair zx spectrum e fù l'inizio della fine :D :D, ore a ricopiare i sorgenti per far funzionare caccia al sommergibile
mi ricordo che la prima cosa che feci fù stampare una ricetta per mia madre una riga dopo l'altra impuzzando tutta la casa visto che la zx printer quando stampava fumava veramente mentre il primo programma veramente utile lo feci qualche anno dopo per risolvere le equazioni di secondo grado
spectrum che è ancora funzionante e tenuto come una reliquia :D :D
Lo spectrum... quanti bei ricordi... anche io "ho iniziato" così :D.
Il mitico registratore di cassette e le cassettine dal lato blu e arancione (mi sembra uno per spectrum l'altro per commodore).
Dovrei averlo ancora da qualche parte, avevo sia la versione con la tastiera "grossa" che quella piccolina (datami da mio zio), purtroppo però con il tempo hanno cessato di funzionare (dovrei riprovare a dire la verità non ricordo).
Ho ancora il manuale di programmazione :D.
pure io a 8-9 anni mio zio recentemente passato agli ibm mi regalò lo splendido sinclair zx spectrum e fù l'inizio della fine :D :D, ore a ricopiare i sorgenti per far funzionare caccia al sommergibile
mi ricordo che la prima cosa che feci fù stampare una ricetta per mia madre una riga dopo l'altra impuzzando tutta la casa visto che la zx printer quando stampava fumava veramente mentre il primo programma veramente utile lo feci qualche anno dopo per risolvere le equazioni di secondo grado
spectrum che è ancora funzionante e tenuto come una reliquia :D :D
Quoto e rilancio con l'età di 5 Anni e il mitico commodore 64, non programmavo ovvio però mio padre mi introdusse alla mentalità di risoluzione di un problema .. infatti me lo diede e mi disse "Montalo o non ci giochi" dopo 3 giorni avevo completato il cablaggio (2 cavi alla fine ... manco mi ricordo sinceramente penso l'alimentazione e la scart per il monitor)
Io invece ho iniziato a 17 anni. Qualcosa in contrario? :asd:
Kralizek
11-05-2011, 16:58
Io invece ho iniziato a 17 anni. Qualcosa in contrario? :asd:
tranquillo ho gente che si è laureata in ingegneria informatica ed ancora deve iniziare...
banryu79
12-05-2011, 08:40
L'angolo zen:
Il problema non è quando uno comincia, ma quando uno si ferma :O
cdimauro
13-05-2011, 19:04
Ti sembra veramente possibile che ci sia un bug del genere nelle librerie standard?
Cosa c'è scritto nella documentazione di Calendar.MONTH?
Field number for get and set indicating the month. This is a calendar-specific value. The first month of the year in the Gregorian and Julian calendars is JANUARY which is 0; the last depends on the number of months in a year.
Rileggendo il thread m'è caduto l'occhio su questa parte. Da quando il numero di mesi dipende dall'anno? Per caso ci sono i secoli o millenni bisestili, con un mese in più? :D
Credo che per uno che scrive un'implementazione della VM di Python i "requisiti macchina" siano ormai assimilati, o no? :D
Beh, qualcosina diciamo che l'ho imparata. :fagiano:
Di certo hai idea di che cosa succede dietro le quinte e sai usare Python senza stressare i limiti della VM su cui gira, e di conseguenza evitare i limiti della macchina.
Sì, diciamo che ne ho una buona conoscenza e padronanza. Ma qualcosa può sempre sfuggire, visto che non conosco tutto quello che c'è sotto.
Se uno non ha la più pallida idea di che cosa è pesante e che cosa no, non credo possa scrivere un'applicazione server, in nessun linguaggio :read:
Eppure non mi sono posti tanti problemi coi miei server; anzi, non c'ho quasi mai pensato. Soltanto su uno (quello del megaconcorso TIM di qualche anno fa), visto che c'erano milioni di giocatori e decine di milioni di giocate possibili, ho fatto qualche conto spannometricamente.
Il fatto che con gli altri non abbia avuto la stessa cura (non parlo di accortezza), è perché bisogna sempre vedere cosa devono fare. Se ho scritto un server che espone un centinaio di API che per lo più eseguono query (più o meno complesse) su un database, c'è poco da mettersi a fare calcoli sul consumo di memoria e/o di CPU medio o peggiore. E' chiaro che l'applicazione sarà per lo più I/O bound (network + tempo del DB per fornire i dati richiesti).
Nei pochi casi in cui ho fatto caching di alcune tabelle, il numero di elementi era talmente piccolo che nemmeno m'ha sfiorato per la mente di mettermi a calcolare più o meno quanta memoria avrei consumato, dimensione delle strutture di Python alla mano.
E' chiaro che, per scrupolo, ogni tanto ho dato un'occhiata con top per vedere quanta memoria e CPU consumavano i processi dei server, ma ciò ha confermato la cruda realtà... ;)
perfettamente d'accordo....all'università ti danno le basi sull'architettura dei calcolatori, ai miei e mi pare di capire anche ai tuoi tempi, ti davano anche basi di elettronica digitale e analogica
l'assembly, il c, ecc.... sono sulla stessa falsariga di quelle nozioni di base, nozioni che piaccia o no è obbligatorio avere per comprendere fino in fondo il funzionamento di questa benedetta macchina che poi andremo a programmare in java, python, basic o come ci pare
Ma anche no. Ti confondi ancora una volta con Ingegneria (Informatica o Elettronica a indirizzo informatica).
Quando ero iscritto a Scienze dell'Informazione, Architetture degli Elaboratori era una materia completare, quindi a scelta (ovviamente l'ho messa nel mio piano di studi).
Al primo anno c'era la terribile TAMC: Teoria e Applicazioni delle Macchine Calcolatrici (propedeutica per le altre materia di informatica).
Si studiava logica proposizionale, il linguaggio S (una macchina a registri infiniti, concettualmente simile ed equivalente a una macchina di Turing, ma dotata di 3 sole istruzioni), e per buona parte teoria della calcolabilità (la ricorsività, per essere precisi).
Tutta roba da far schifare un ragazzino programmatore sbruffoncello che è convinto di avere il mondo nelle sue mani perché "è un genio della programmazione".
La programmazione l'abbiamo vista soltanto nel laboratorio di TAMC, e si faceva... Pascal.
Eppure dopo l'università la parte teorica che ho studiato è sicuramente quella che ho apprezzato di più, con la quale ho formato meglio le mie capacità di critica e analisi. Roba come teoria della calcolabilità, poi approfondita al terzo anno in Metodi per il Trattamento dell'Informazione, è stata una materia che col senno di poi ho trovato stupenda. Anche se all'epoca c'era gente che avrebbe preferito essere crocifisso piuttosto che affrontare quell'esame abbastanza difficile.
rimane però il fatto che la conoscenza delle basi permette di operare anche con linguaggi ad alto livello in maniera più cosciente e di realizzare ottimizzazioni che altrimenti sarebbero incomprensibili e giudicate superflue
Le basi sono altre, come ho già avuto modo di spiegare. Base != basso livello.
voglio dire, c'è gente che in assembly sceglie xor eax,eax invece di mov eax,0 perchè la prima impiega meno cicli di clock e questo è diretta conseguenza di come quelle due istruzioni sono implementate nel processore....conoscerlo ti permette di programmare meglio
Invece se non lo conosci è meglio, perché ti stai legando a un dettaglio che è legato strettamente a QUELLA particolare implementazione del processore, e che in futuro potrebbe, al contrario, produrre problemi prestazionali.
Perché, ad esempio, la prima istruzione costringe il processore a utilizzare l'ALU per il calcolo, e tra l'altro modifica pure i flag. Questo significa che se c'è un'istruzione che deve utilizzare il risultato e/o i flag, è costretto ad aspettarne il completamento.
La seconda, invece, sarà anche un po' più lunga (ed era questo il motivo per cui si preferiva la prima, in passato. Meno byte -> meno accessi alla memoria per prelevare l'istruzione, e quindi possibilità di eseguirla prima), ma NON richiede l'uso dell'ALU né modifica i flag.
Inoltre, trattandosi di una load, si può applicare il load-forwarding, migliorando le prestazioni. Esempio:
mov eax,0
mov ebx,eax
In un processore superscalare (anche in-order) questa coppia può essere eseguita contemporaneamente, perché il valore 0 viene propagato immediatamente anche al registro EBX. E' come se il codice fosse scritto così:
mov eax,0
mov ebx,0
Se avessimo usato la prima istruzione, invece:
xor eax,eax
mov ebx,eax
Un processore superscalare, ma in-order, avrebbe potuto eseguire soltanto la prima istruzione, e mettere in attesa la seconda finché il risultato della prima non fosse poi stato disponibile.
Ritorna, quindi, la massima di Knuth.
logicamente c'è il rovescio della medaglia e cioè la logica, l'algoritmo e quello è più un problema di impostazione mentale che di conoscenza tecnica e in questo caso è necessario sviluppare capacità logico/matematiche
un linguaggio ad alto livello aiuta in questo senso e permette di ragionare in termini algoritmici senza prestare attenzione ai dettagli....personalmente ho cominciato dal basic ( come ho già scritto in un post precedente ) e quindi penso che sia una buona soluzione ma solo ed esclusivamente per farsi le ossa nel pensare da informatico,
Finalmente ci siamo.
poi bisognerà volenti o nolenti scontrarsi con la macchina e i suoi dettagli
Se e solo se sarà necessario.
I problemi possono essere molteplici ma io in C farei:
- Variabili e tipi
- Condizioni e iterazioni
- Funzioni
- Array
- Strutture
- Puntatori e liste con conseguente allocazione e pulitura della memoria
- Scrittura/lettura di file semplici
Sono le cose più semplici e utili a fare dei programmini di base come dei gestionali di un'ipotetica attività, se proprio non ci si vuole fermare all'odiosa area del quadrato. Si può pasticciare un po' con queste cose e al più decidere di andare anche oltre. Di problemi in queste cose direi che ce ne sono pochi, o meglio io non ho mai avuto problemi che non siano stati sviste mie nella scrittura del codice.
Le sviste sono tipiche dei programmatori, perché sono esseri umani. Il fatto che tu abbia incontrato pochi bug mi lascia presumere che tu abbia lavorato a piccoli progetti.
Con progetti di "spessore" maggiore, diventa più facile commettere errori. E più il linguaggio è di basso livello, più è facile commetterne.
Per questo si preferisce modellare / prototipare con linguaggio di livello molto alto, prima di passare eventualmente il codice finale a un linguaggio di più basso livello.
Si certamente dipende da cosa si vorrà andare a programmare. Io penso che la massima aspirazione per un programmatore sia lavorare alla stesura di un sistema operativo o cmq per una grossa SW house dove vengono scritti SW che devono essere ottimizzati al massimo. Il compilatore ha cmq i suoi limiti nell'ottimizzare ;)
Sulla grossa software house sono d'accordo. E' un sogno comune.
Sul resto non condivido affatto. Per me l'importante è avere la possibilità di apprendere cose nuove, o magari di fare ricerca (cosa alquanto rara, purtroppo, se non a titolo personale).
Che odio la macchina di Turing!! :asd: proprio tra le parti che odio di più! :D
Mah, io l'ho trovato molto bella. Anche se preferivo nettamente il linguaggio S, che è ugualmente scarno (con sole 3 istruzioni), ma è più affine alla normale programmazione.
In ogni caso si tratta di roba che apre la mente come si suol dire.
Il tutto ovviamente IMHO.
pabloski
13-05-2011, 20:25
Ma anche no. Ti confondi ancora una volta con Ingegneria (Informatica o Elettronica a indirizzo informatica).
Quando ero iscritto a Scienze dell'Informazione, Architetture degli Elaboratori era una materia completare, quindi a scelta (ovviamente l'ho messa nel mio piano di studi).
io ho frequentato ingegneria informatica infatti
comunque ti posso garantire, perchè l'ho visto con i miei occhi, almeno a Napoli le facoltà di informatica della Federico II e della Parthenope hanno architettura dei calcolatori come esame obbligatorio
cdimauro
13-05-2011, 20:35
E' possibile, perché i corsi di laurea non sono tutti gli stessi, e in ogni caso possono sempre cambiare nel tempo.
Nel mio caso sono passati quasi 20 anni da quando iniziai il corso, e fino alla fine degli anni '90 era così.
Va da sé che informatica e ingegneria sono corsi molto diversi. Nel primo caso ha perfettamente senso che quell'esame non sia obbligatorio. Nel secondo, non avrebbe senso che non ci fosse. ;)
Kralizek
13-05-2011, 21:24
io ho frequentato ingegneria informatica infatti
comunque ti posso garantire, perchè l'ho visto con i miei occhi, almeno a Napoli le facoltà di informatica della Federico II e della Parthenope hanno architettura dei calcolatori come esame obbligatorio
si ma
Calcolatori I (primo anno, secondo semestre) è una barzelletta
Calcolatori II e "Architettura degli Elaboratori Elettronici" sono alla specialistica.
Se poi stai parlando del vecchio "Fondamenti di Informatica", beh... non è che ci si ammazzi tanto a studiare l'hw, se non fosse per la teoria di Turing e così via.
pabloski
13-05-2011, 22:07
si ma
Calcolatori I (primo anno, secondo semestre) è una barzelletta
Calcolatori II e "Architettura degli Elaboratori Elettronici" sono alla specialistica.
informatica o ingegneria? nel primo caso io ho visto che le dure università che ho citate hanno solo architettura al primo anno della triennale
all'epoca quando andavo io ad ingegneria avevamo calcolatori 1 al terzo anno e il 2 al quarto anno oltre ad elettronica 1 e 2 al terzo e quarto rispettivamente
architettura non c'era proprio
Se poi stai parlando del vecchio "Fondamenti di Informatica", beh... non è che ci si ammazzi tanto a studiare l'hw, se non fosse per la teoria di Turing e così via.
fondamenti di informatica l'ho fatto all'epoca al primo anno, oggi invece lo chiamano programmazione 1 ma è un esame diverso da architettura dei calcolatori che invece è equivalente al vecchio calcolatori 1
Kralizek
15-05-2011, 12:06
informatica o ingegneria? nel primo caso io ho visto che le dure università che ho citate hanno solo architettura al primo anno della triennale
all'epoca quando andavo io ad ingegneria avevamo calcolatori 1 al terzo anno e il 2 al quarto anno oltre ad elettronica 1 e 2 al terzo e quarto rispettivamente
architettura non c'era proprio
fondamenti di informatica l'ho fatto all'epoca al primo anno, oggi invece lo chiamano programmazione 1 ma è un esame diverso da architettura dei calcolatori che invece è equivalente al vecchio calcolatori 1
ingegneria informatica.
per quanto riguarda fondamenti, ora è diviso tra elementi (che introduce alla programmazione ed ai concetti base dell'informatica quali logica booleana, macchina di turing e così via) e programmazione 1 (che tratta algoritmi di ordinamento e programmazione ad oggetti)
ingframin
15-05-2011, 14:22
ingegneria informatica.
per quanto riguarda fondamenti, ora è diviso tra elementi (che introduce alla programmazione ed ai concetti base dell'informatica quali logica booleana, macchina di turing e così via) e programmazione 1 (che tratta algoritmi di ordinamento e programmazione ad oggetti)
Io ho fatto architettura dei calcolatori il primo anno, il secondo calcolatori elettronici e ilprimo di specialistica architetture innovative dei sistemi di elaborazione, erano in comune con quelli di ingegneria informatica.
Non ho seguito tutta la discussione, più o meno mi sono fermato alla parte in cui si bisticciava su quanto serve conoscere la struttura interna di un elaboratore elettronico.
Io penso che dipende molto da cosa c'è da fare, non ha tutti i torti cdmauro quando dice che per molte cose non è strettamente necessario.
Ovviamente il contesto è molto importante: se si scrive software per sistemi embedded guai a non conoscere la struttura dell'hardware che si ha per le mani, si fanno dei casini micidiali!
Ma se fai applicazioni web forse ti importa poco di come calcolare la corrente di sotto-soglia del mosfet...
E poi come ho detto ieri ad un collega l'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli :D
pabloski
15-05-2011, 14:32
E' vero tutto dipende dal contesto. L'autore del thread è stato chiaro a riguardo
"Vorrei dei consigli anche in ottica universitaria: vorrei frequentare la facoltà di ingegneria informatica o ingegneria elettronica (più la prima che la seconda).
So che probabilmente il Visual Basic all'università sarà utilizzato raramente, quindi prima o poi comincierò a dare un'occhiata al linguaggio C."
Ottica universitaria....cioè andrò in un posto dove mi bombarderanno di C e C++, avere un'esperienza pregressa soprattutto col secondo è una manna
Ingegneria informatica o elettronica, dunque massimamente si tratta proprio di programmare a basso livello. Il C è il linguaggio di alto livello da quelle parti :D
Lui studia già informatica alle superiori, usano visual basic, presumo quindi che sappia come ragionare per tradurre una soluzione ad un problema in algoritmi.
L'altro nodo era java, è sbucato perchè all'università ( ai miei tempi non era così ) te lo ritrovi di fronte prima o poi.
Basic per quanto utile per imparare a ragionare da informatico è totalmente inutile vista la sua situazione.
E' vero tutto dipende dal contesto. L'autore del thread è stato chiaro a riguardo
"Vorrei dei consigli anche in ottica universitaria: vorrei frequentare la facoltà di ingegneria informatica o ingegneria elettronica (più la prima che la seconda).
So che probabilmente il Visual Basic all'università sarà utilizzato raramente, quindi prima o poi comincierò a dare un'occhiata al linguaggio C."
Ottica universitaria....cioè andrò in un posto dove mi bombarderanno di C e C++, avere un'esperienza pregressa soprattutto col secondo è una manna
Ingegneria informatica o elettronica, dunque massimamente si tratta proprio di programmare a basso livello. Il C è il linguaggio di alto livello da quelle parti :D
Lui studia già informatica alle superiori, usano visual basic, presumo quindi che sappia come ragionare per tradurre una soluzione ad un problema in algoritmi.
L'altro nodo era java, è sbucato perchè all'università ( ai miei tempi non era così ) te lo ritrovi di fronte prima o poi.
Basic per quanto utile per imparare a ragionare da informatico è totalmente inutile vista la sua situazione.
C'è gente che non lo riesce a fare neanche dopo l'università, inoltre è una cosa che non dipende affatto dal linguaggio ;).
La forma-mentis per fare ciò te la danno all'università, dove è vero che ti danno le basi per conoscere il basso livello, ma la parte più importante (e anche noiosa) dovrebbe essere quella relativa all'ingegneria del software (nel suo complesso), specie ad ingegneria informatica (se orientata allo sviluppo del software).
Ribadisco un concetto poi che non è chiaro ai più.
Conoscere questo o quel linguaggio di programmazione, non implica affatto che la persona che studia sia un (buon) programmatore né tanto meno un ingegnere del software.
Che poi a conti fatti la qualità del software è una cosa che sta a cuore solo in alcuni settori specializzati.
PS: l'università ti da il metodo di studio, e come affrontare determinati argomenti, a prescindere che tu li abbia esplicitamente toccati o meno nel corso della carriera universitaria.
tonio123
15-05-2011, 15:04
E' vero tutto dipende dal contesto. L'autore del thread è stato chiaro a riguardo
"Vorrei dei consigli anche in ottica universitaria: vorrei frequentare la facoltà di ingegneria informatica o ingegneria elettronica (più la prima che la seconda).
So che probabilmente il Visual Basic all'università sarà utilizzato raramente, quindi prima o poi comincierò a dare un'occhiata al linguaggio C."
Ottica universitaria....cioè andrò in un posto dove mi bombarderanno di C e C++, avere un'esperienza pregressa soprattutto col secondo è una manna
Ingegneria informatica o elettronica, dunque massimamente si tratta proprio di programmare a basso livello. Il C è il linguaggio di alto livello da quelle parti :D
Lui studia già informatica alle superiori, usano visual basic, presumo quindi che sappia come ragionare per tradurre una soluzione ad un problema in algoritmi.
L'altro nodo era java, è sbucato perchè all'università ( ai miei tempi non era così ) te lo ritrovi di fronte prima o poi.
Basic per quanto utile per imparare a ragionare da informatico è totalmente inutile vista la sua situazione.
Ti parlo per esperienza personale in quanto sto facendo il primo anno di ingegneria informatica a bologna, la situazione non è proprio come la descrivi tu; anzi il c è abbastanza schifato così come il c++, mentre java e c# sono presi più in considerazione, almeno per i corsi che ho seguito fino ad ora.
Inoltre entrambi i due corsi di programmazione che ho seguito più che ai linguaggi in se erano orientati ad impostare fin da subito un buon modo di programmare in modo da avere codice riusabile e flessibile, cosa che per me è un bene, a scapito di approfondire fino in fondo le caratteristiche proprie di ciascun linguaggio.
Più o meno quello che ci hanno detto fin dal primo giorno è: i linguaggi vanno e vengono, l'importante è acquisire la giusta mentalità per strutturare correttamente un programma.
Ora io sono un novellino paragonato a molti di voi, ma come idea non mi sembra affatto sbagliata.
cdimauro
15-05-2011, 15:06
@WarDuck: infatti la conoscenza dei linguaggi o delle librerie va e viene (chi se li ricorda tutti?), a seconda della contingenza. La forma mentis rimane.
E di questo ringrazio l'università e anche tutti i teoremi che mi ha obbligato a dimostrare.
Lo dico ora, non più da studente, perché quando si è sotto torchio certe cose le si vorrebbe evitare del tutto, e si lanciano strali contro i "maledetti" (alcuni lo sono davvero) docenti.
Una volta fuori li si apprezza meglio.
P.S. Anche per la programmazione embedded stanno prendendo piede linguaggi managed. Perfino di Python esistono delle "pico-machine".
Kralizek
15-05-2011, 20:24
@WarDuck: infatti la conoscenza dei linguaggi o delle librerie va e viene (chi se li ricorda tutti?), a seconda della contingenza. La forma mentis rimane.
E di questo ringrazio l'università e anche tutti i teoremi che mi ha obbligato a dimostrare.
Lo dico ora, non più da studente, perché quando si è sotto torchio certe cose le si vorrebbe evitare del tutto, e si lanciano strali contro i "maledetti" (alcuni lo sono davvero) docenti.
Una volta fuori li si apprezza meglio.
P.S. Anche per la programmazione embedded stanno prendendo piede linguaggi managed. Perfino di Python esistono delle "pico-machine".
pensa che io sono arrivato a benedire i 5 anni di latino
pensa che io sono arrivato a benedire i 5 anni di latino
Io neppure lontanamente. :p
@WarDuck: infatti la conoscenza dei linguaggi o delle librerie va e viene (chi se li ricorda tutti?), a seconda della contingenza. La forma mentis rimane.
E di questo ringrazio l'università e anche tutti i teoremi che mi ha obbligato a dimostrare.
Lo dico ora, non più da studente, perché quando si è sotto torchio certe cose le si vorrebbe evitare del tutto, e si lanciano strali contro i "maledetti" (alcuni lo sono davvero) docenti.
Una volta fuori li si apprezza meglio.
P.S. Anche per la programmazione embedded stanno prendendo piede linguaggi managed. Perfino di Python esistono delle "pico-machine".
quoto, ho ancora gli incubi di Teoria delle informazioni e della trasmissione ma con il senno di poi è stata una manna lavorando con i transceiver e protocolli di comunicazione ma che sudata quell'esame!!!
pure imad mi è stata utilissima ma l'ho capita veramente (soprattutto EKF e ANN) solamente quando mi sono servite a lavoro
mentre riguardo agli embedded li è nuovo il c++ al posto dell'ansi C XD altri linguaggi sono utilizzati praticamente solo a livello sperimentale o poco più, al massimo quello che ho sempre visto è una transcodifica verso il c a partire da un altro linguaggio ( generalmente matlab simulink )
Kralizek
16-05-2011, 13:01
Io neppure lontanamente. :p
quando ti ritrovi a dover imparare una lingua del casso dal nulla ti ricredi, te lo giuro.
(almeno a me l'italiano ha aiutato tantissimo ad imparare lo svedese. almeno dal punto di vista grammatico/sintattico)
DioBrando
17-05-2011, 16:40
io ho frequentato ingegneria informatica infatti
comunque ti posso garantire, perchè l'ho visto con i miei occhi, almeno a Napoli le facoltà di informatica della Federico II e della Parthenope hanno architettura dei calcolatori come esame obbligatorio
che sono 6-12 (nella migliore delle ipotesi e contando un laboratorio) crediti su 180 di triennio.
Tradotto in parole povere: non conta una mazza, altro che basi.
Rispetto all'importanza data all'algoritmica, "forma mentis" ed esami relativi alla programmazione ha valore quanto il 2 di picche quando briscola è quadri.
per quanto riguarda il consiglio...VB.NET è nato sostanzialmente per aiutare la transizione verso il mondo .NET anche per gli sviluppatori con pregresse esperienze VB6.
Nella realtà a parte qualche similitudine semantica ed il nome parzialmente =, si parla di tecnologie totalmente differenti.
Poi il linguaggio è uno strumento: va scelto con cura ed aiuta sì ma non è il nocciolo del problema.
Se ti ritrovi con la sintassi perché ti è familiare allora usalo pure (VB.NET), C lascialo perdere tanto avrai tutto il tempo di complicarti la vita più tardi.
In questo momento mi viene in mente un post geniale dove nonricordochiconsigliava C perché era più didattico e si poteva imparare cosa fossero i segmentation fault.
Punte di genialità difficilmente raggiungibili :asd:
pabloski
17-05-2011, 17:31
che sono 6-12 (nella migliore delle ipotesi e contando un laboratorio) crediti su 180 di triennio.
Tradotto in parole povere: non conta una mazza, altro che basi.
Rispetto all'importanza data all'algoritmica, "forma mentis" ed esami relativi alla programmazione ha valore quanto il 2 di picche quando briscola è quadri.
mica tanto, sono 12 crediti che è il massimo nei corsi di laurea di quel tipo
l'esame di algoritmi ha lo stesso numero di crediti, quindi non mi pare che sia proprio un esame considerato inutile
In questo momento mi viene in mente un post geniale dove nonricordochiconsigliava C perché era più didattico e si poteva imparare cosa fossero i segmentation fault.
Punte di genialità difficilmente raggiungibili :asd:
di sicuro ti espone di più al bare metal e saperne di più non fa mai male
cdimauro
17-05-2011, 17:46
Saperne di più non fa mai male. Esporsi al "bare metal", sì, e che dolore.
http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash1/26599_109055882461856_108756679158443_104323_5849357_n.jpg
:D
@gugo: a me latino e greco avrebbero fatto comodo per studiarmi la bibbia e la patristica senza filtri e manipolazioni, partendo dai documenti originali. Oltre che ovviamente per la miglior conoscenza dell'italiano o di altre lingue neolatine.
@!fazz: sì, a livello industriale non penso che si possa ancora parlare di impiegare (pico)Python per qualche progetto commerciale, ma non si sa mai se i tempi di sviluppo sono particolarmente stringenti.
@gugo: a me latino e greco avrebbero fatto comodo per studiarmi la bibbia e la patristica senza filtri e manipolazioni, partendo dai documenti originali. Oltre che ovviamente per la miglior conoscenza dell'italiano o di altre lingue neolatine.
Col latino del liceo al massimo metti insieme stentatamente due regolette che t'hanno spiegato male, assolutamente non leggi testi latini e meno che meno la bibbia.
Io stavo allo scientifico e l'ho finito sapendone meno che in 4o ginnasio, massimo livello raggiunto "tradurre a spanne i frontoni delle chiese".
Ma d'altra parte l'informatica al liceo fa pena, non vedo perchè il latino dovrebbe essere meglio :asd:
PS Non finirò mai di dire abbastanza male del latino del liceo, nonostante non lo tocchi più da 3 anni :D
cdimauro
17-05-2011, 18:52
Col latino del liceo al massimo metti insieme stentatamente due regolette che t'hanno spiegato male, assolutamente non leggi testi latini e meno che meno la bibbia.
Io stavo allo scientifico e l'ho finito sapendone meno che in 4o ginnasio, massimo livello raggiunto "tradurre a spanne i frontoni delle chiese".
Ma d'altra parte l'informatica al liceo fa pena, non vedo perchè il latino dovrebbe essere meglio :asd:
PS Non finirò mai di dire abbastanza male del latino del liceo, nonostante non lo tocchi più da 3 anni :D
Penso che bisogna avere anche la fortuna di beccare il corso giusto coi professori giusti.
Nel mio caso all'ITIS l'unica pecora nera era il prof. di Elettronica, che mi ha costretto ad andare a lezioni per un paio di mesi al terzo anno (unico caso nella mia vita :muro:).
Per il resto gli insegnanti erano molto bravi. Perfino quella d'italiano, che proveniva dal classico e ci ha fatto comprare una caterva di testi in più; però da lei ho imparato a scrivere meglio e, soprattutto, a esprimere le mie idee (prima un tema era un autentico supplizio).
P.S. Il latino per la patristica. Il greco per la bibbia. Già passare da greco a latino comporta filtri e/o manipolazioni del testo; passare poi all'italiano non può che peggiorare la situazione.
DioBrando
18-05-2011, 00:22
mica tanto, sono 12 crediti che è il massimo nei corsi di laurea di quel tipo
l'esame di algoritmi ha lo stesso numero di crediti, quindi non mi pare che sia proprio un esame considerato inutile
stai prendendo il tuo best case, quando proprio in ASD ti hanno insegnato che dovresti ponderare di solito proprio il caso peggiore (che nel tuo caso significa 6 crediti o peggio un esame non fondamentale e quindi non obbligatorio nel corso di studi).
Ma posto anche che siano 12, ti sfugge il quadro complessivo.
Del livello "macchina" con qualche spruzzata di Assembly ne parli in tutto il quinquennio solo in quel corso, mentre gli algoritmi te li ritrovi in ASD 1, 2 (a seconda di come i vari programmi li vogliano chiamare), Fondamenti di Informatica, Teoria della complessità e sicuramente mi sto dimenticando qualcosa.
Di sviluppo in senso stretto o lato hai le due programmazioni, le due ingegnerie del software, poi hai la parte "matematica" o di calcolo tra analisi, algebra, logica ecc. ecc.
Fatti due conti solo sul numero di crediti e prova a stabilire a cosa sia dato realmente importanza in un corso di Informatica (che sia pura o di stampo ingegneristico cambia poco).
Il mio esame di E-Commerce aveva 9 crediti ed allora il materiale era decisamente più imponente (anche in confronto all'immanenza del tomo Tanenbaum).
Ti dirò di più: ho imparato anche molte più nozioni utili che mi sono servite e servono sul lavoro.
di sicuro ti espone di più al bare metal e saperne di più non fa mai male
dipende sempre a cosa corrisponde quel di più. In linea generale lo studente è visto come un contenitore, come una spugna che assorbe e deve mettere poco in pratica perché tanto poi lo farà nel mondo del lavoro (questo in Italia).
Di sicuro, visto che le parti preponderanti di un corso informatico non sono certo il lato HW ed il sapere nei minimi dettagli cosa si celi dentro ad un pc, mi aspetto che queste informazioni lascino il campo ad altro (anche perché la LTM di una persona ha una capacità di memorizzazione piuttosto piccola).
DioBrando
18-05-2011, 00:34
pensa che io sono arrivato a benedire i 5 anni di latino
Credo di aver sempre avuto una discreta padronanza con le lingue (più che con la matematica :stordita: ) ma mai ringrazierò abbastanza la mia prof d'italiano e latino del triennio.
Seppur abbia odiato tutto il materiale extra che ci dava (ho quaderni pieni di passi di Lucrezio e Seneca) ma a posteriori è servito davvero.
Col latino del liceo al massimo metti insieme stentatamente due regolette che t'hanno spiegato male, assolutamente non leggi testi latini e meno che meno la bibbia.
Io stavo allo scientifico e l'ho finito sapendone meno che in 4o ginnasio, massimo livello raggiunto "tradurre a spanne i frontoni delle chiese".
Ma d'altra parte l'informatica al liceo fa pena, non vedo perchè il latino dovrebbe essere meglio :asd:
PS Non finirò mai di dire abbastanza male del latino del liceo, nonostante non lo tocchi più da 3 anni :D
ti garantisco che dipende molto dalla prof (sia dal metodo sia dalla passione che ci mette).
Con la sperimentazione Brocca ho fatto le stesse ore previste al Classico (5 a settimana solo di latino) ma al di là di quello ruota tutto intorno alla preparazione ed alla voglia del docente.
Con il latino non solo apprezzi la cultura da cui discendiamo e che almeno nel mondo occidentale è stata la culla di tutti i popoli a venire ma ti arricchisci anche dal punto di vista prettamente linguistico.
Se non conosci il significato di una parola puoi provare a desumerlo dalla sua etimologia, ad esempio.
Il rigore della struttura del periodo ti aiuta poi a formulare frasi altrettanto corrette dal punto di vista della sintassi e della semantica italiana e nelle altre lingue neolatine.
Il rigore logico risulta fondamentale, banalmente, nel problem solving.
Chiediti come mai ci sono tanti ingegneri o professionisti nel campo scientifico che hanno fatto il liceo classico ;)
DioBrando
18-05-2011, 00:57
C# non lo filano per l'evidente ragione che il suo apporto all'evoluzione della programmazione è meno cinque virgola tre. Ben diverso fu (molto fu ormai) il caso di Java o di (ancor più fu) Pascal... eh sì, 'mazza come sono vecchio.
Dovrebbero invece iniziare con i c.d. "post-funzionali" (genere Scala o F#) altrimenti dalla frutta - dove siamo - passiamo al dolce e ci avviciniamo al conto.
Mi sorge invece un'altra curiosità storica: qualcuno ha notizia di linguaggi di programmazione sviluppati nello stivale?
No il problema è diverso.
In Italia, circoscriviamo sempre il discorso perché all'estero ribadisco funziona in modo diverso, C# e tutto l'ecosistema .NET viene spesso snobbato semplicemente perché la gente ci vede il marchio Microsoft sopra.
Ed è un peccato, perché con n linguaggi si potrebbe ad esempio far vedere cosa significhi implementare correttamente il pattern MVC del fu Smalltalk (in realtà ni, è l'implementazione del Model2 che dovresti conoscere), si potrebbe insegnare cosa sia un "servizio" senza troppe seghe mentali di circostanza, si potrebbero realizzare interfacce grafiche dignitose ma senza "eccessivi" sbattimenti tecnologici, ecc. ecc.
I talebani dell'OSS (e sì all'Università ce ne sono una discreta quantità) che però incontro ancora non rispondono a due semplici domande:
1) perché Sun-Oracle-Google sono i buoni (e quindi vanno bene nell'entrare come partner tecnologici dell'istitituzione accademica) e MS no?
2) se MS è l'emblema del closed source e quindi, di rimando, qualsiasi prodotto che esca da quella fucina non sia accettabile, C# che è standard ECMA ed un Codeplex come li giustifichiamo ai novizi?
Facciamo che il problema non sta nell'apporto tecnologico dato dalle soluzioni MS, quanto, piuttosto, meramente dall'aspetto politico e politicizzato di un ambito che per definizione, insieme alla politica, è uno dei più stantii e meno ricettivi al cambiamento dell'intera società italiana.
DioBrando
18-05-2011, 01:25
Comunque attenzione, state confrontando linguaggi diversi, anche se sembrano simili.
Il java è multipiattaforma, C# e altri no.
L'implementazione .NET la trovi su Windows, Mac OSX, GNU/Linux, svariati sistemi BSD, iPhone, Android quest'estate e se parliamo di architetture oltre agli x86, ARM, PA-Risc e qualcos'altro sicuramente me lo sto dimenticando.
Quindi i casi sono due: o rivediamo il concetto di "multipiattaforma" e ne cambiamo il significato oppure cambiamo la parola (significante).
Qualunque strada percorriamo, a cascata, la decisione investe tutti la maggiorparte dei linguaggi più usati dal mercato al momento.
tecnicamente c# o meglio .net lo è, salvo poi restare vittima del marketing e delle scelte da "siamo gli Dei dell'informatica" di Redmond
il che vorrebbe dire?
il punto è che il c++ lo troverai sempre, prima o poi durante gli studi o durante il lavoro incapperai in qualcosa scritto in c++ o sarai costretto a scrivere qualcosa in c++
Ma quando mai :)
L'implementazione .NET la trovi su Windows, Mac OSX, GNU/Linux, svariati sistemi BSD, iPhone, Android quest'estate e se parliamo di architetture oltre agli x86, ARM, PA-Risc e qualcos'altro sicuramente me lo sto dimenticando.
Sarebbe interessante citare che Mono di Linux fa quasi schifo, e che MonoTouch e MonoDroid sono in una situazione quantomeno brutta da quando Novell è stata comprata, e le conferme sul loro sviluppo futuro tardano ancora ad arrivare.
In sostanza il supporto vero e produttivo c'è solo su Windows e magari WP7, ma capisco che non è ovvio capire la differenza di valore che corre tra un framework "completo" e uno completo.
PS: io st'odio per MS non l'ho visto, è solo che quello che producono non si presta alla didattica, o che C# non è diffuso come Java nei posti di lavoro. Quando era il caso da noi è sempre stato consigliato VC++ express ad esempio.
OT: secondo me la grammatica, e dunque l'impostazione dello studio liceale del latino, è una cagata pazzesca :D
Semplicemente il cervello non funziona così, quando impara una lingua, e molti studiosi sarebbero d'accordo con me.
La grammatica è una struttura artificiale creata sul linguaggio naturale, e non è un caso che i computer possono implementare grammatiche ma non possono parlare, dato che la grammatica non dice niente a proposito della semantica.
E dovrebbe dimostrarlo il fatto che qualunque prof ti capiti, esci dal liceo che sai fare un discorso in inglese, ma per leggere 5 righe di latino ci metti mezz'ora :asd:
Riassunto: lo studio della struttura del latino è un gioco mentale sterile quanto le parole crociate o Brain Training, che dovrebbe essere diviso nello studio dei classici e della logica, quella vera. /OT
cdimauro
18-05-2011, 05:53
Se Mono è scarso su Linux è anche dovuto al fatto che il mondo FOSS è pieno di talebani integralisti che ripudiano e combattono tutto ciò che made in Microsoft, che, si sa, rappresenta il Male Assoluto.
Anziché prendere una buona tecnologia e farla maturare preferiscono continuare a perdere tempo in miliardi di fork inutili e a farsi del male con C o C++ (che poi manco sono capaci di realizzare un IDE decente per questi linguaggi; ma si sa: bastano vi e emacs ai "veri programmatori").
C# è un eccellente linguaggio, ed estremamente produttivo. Più lo uso e più lo apprezzo.
Peccato che sia C-like: la sintassi mi sta sullo stomaco, ma qui non ci posso fare niente. Con Java ha molte affinità, ma chi afferma che ne è una copia si vede che non se l'è studiato per niente e s'è fermato alle prime similitudini che ha trovato invocando il plagio...
quanto il 2 di picche quando briscola è quadri.
Ma con che carte giochi a briscola?? :fagiano:
@gugo: a me latino e greco avrebbero fatto comodo per studiarmi la bibbia e la patristica senza filtri e manipolazioni, partendo dai documenti originali. Oltre che ovviamente per la miglior conoscenza dell'italiano o di altre lingue neolatine.
Umh... ma il vecchio testamento non è scritto in aramaico (o al massimo in ebraico, dato che la torah è una parte comune), e il nuovo in lingua copta tranne Giovanni che effettivamente è in greco? O mi sbaglio?
Poi ci sono i testi gnostici e lì in effetti in greco ce ne sono di più... ma magari mi sbaglio, sono solo un curioso!
banryu79
18-05-2011, 09:11
Umh... ma il vecchio testamento non è scritto in aramaico (o al massimo in ebraico, dato che la torah è una parte comune), e il nuovo in lingua copta tranne Giovanni che effettivamente è in greco? O mi sbaglio?
Poi ci sono i testi gnostici e lì in effetti in greco ce ne sono di più... ma magari mi sbaglio, sono solo un curioso!
*edit
DioBrando
18-05-2011, 10:09
Sarebbe interessante citare che Mono di Linux fa quasi schifo, e che MonoTouch e MonoDroid sono in una situazione quantomeno brutta da quando Novell è stata comprata, e le conferme sul loro sviluppo futuro tardano ancora ad arrivare.
In sostanza il supporto vero e produttivo c'è solo su Windows e magari WP7, ma capisco che non è ovvio capire la differenza di valore che corre tra un framework "completo" e uno completo.
Sei sicuro di averlo utilizzato di recente?
Io l'ho provato su Mac e fa tutto tranne che schifo.
Miguel de Icaza sta facendo un lavoro eccellente.
Con l'ultima versione c'è il supporto ad MVC3, vengono "shippate" le implementazioni .NET di Ruby e Python.
WPF per loro stessa ammissione è un progetto troppo grosso, ma se pensi al runtime di Silverlight, per il web non c'è che di lamentarsi.
Per quanto riguarda MonoTouch un paio di ragazzi anche del forum lo stanno usando e non si trovano male; poi c'è sempre DotGNU Portable...
PS: io st'odio per MS non l'ho visto, è solo che quello che producono non si presta alla didattica, o che C# non è diffuso come Java nei posti di lavoro. Quando era il caso da noi è sempre stato consigliato VC++ express ad esempio.
Guarda meglio ;)
Per quanto riguarda le scelte dell'Università non sono praticamente mai fatte in funzione del mondo del lavoro.
Java è stato scelto al tempo perché si prestava molto bene per una serie di fattori. E' stato il primo e c'è rimasto.
OT: secondo me la grammatica, e dunque l'impostazione dello studio liceale del latino, è una cagata pazzesca :D
Semplicemente il cervello non funziona così, quando impara una lingua, e molti studiosi sarebbero d'accordo con me.
La grammatica è una struttura artificiale creata sul linguaggio naturale, e non è un caso che i computer possono implementare grammatiche ma non possono parlare, dato che la grammatica non dice niente a proposito della semantica.
E dovrebbe dimostrarlo il fatto che qualunque prof ti capiti, esci dal liceo che sai fare un discorso in inglese, ma per leggere 5 righe di latino ci metti mezz'ora :asd:
Riassunto: lo studio della struttura del latino è un gioco mentale sterile quanto le parole crociate o Brain Training, che dovrebbe essere diviso nello studio dei classici e della logica, quella vera. /OT
no, il livello di astrazione che comporta si estende a praticamente qualsiasi campo dell'attività umana (rifletti solo sull'importanza che la semiotica da qualche anno riveste nel Web).
Tu ti riferisci alla sola lingua latina, io a qualsiasi linguaggio ed alla corrispondente grammatica, il che include anche l'ambito IT.
D'altra parte, poi, il latino è una lingua morta, non può godere delle trasformazioni e semplificazioni che il parlato e la società con tutte le sue evoluzioni possono apportare.
Ed infatti lo scopo per cui viene insegnato è, come ho riportato sopra, tutt'altro.
Ti basti pensare che negli Stati Uniti, in molti college è stato reintrodotto il corso di latino.
Avevo trovato un bell'articolo credo di un paio di anni fa sul tema, dovrei ripescare nei vecchi preferiti.
Ci posso provare ;)
DioBrando
18-05-2011, 10:09
Ma con che carte giochi a briscola?? :fagiano:
con quelle del poker/Ramino :stordita:
DioBrando
18-05-2011, 11:47
"Originali" in effetti non ci stava, avrebbe dovuto essere "generali". C# è pieno di eccezioni. I tipi dinamici, gli attributi, i metodi virtuali, gli indicizzatori, i delegati, le strutture e via dicendo. Sono tutti "ma".
Per i tipi dinamici ti riferisci alla versione 4.0 di C# e la keyword dynamic?
Se sì, nella realtà dei fatti, non l'ho ancora mai visto in produzione, si predilige piuttosto usare il DLR con altri linguaggi e le relative implementazioni .NET.
Ma sbaglio o con Mustang ci sarà un meccanismo simile? (JSR292 per la precisione)
Per quanto riguarda gli attributi, non vedo il problema. E' un metodo molto comodo nell'aggiungere delle annotation al codice e renderlo più "parlante".
E con la reflection accedere a quei metadati in modo abbastanza semplice.
Sui metodi virtuali, le prospettive sono piuttosto differenti.
A me però piace più l'idea di dover rendere esplicito l'uso di virtual per permettere l'override che includerlo di default by design.
Gli indicizzatori...ehr cioè?
I delegate forse ad un purista potranno non piacere ma a differenza dei method pointer di C/C++ sono type-safe e sempre object-oriented.
Evitano la duplicazione del codice e rendono la gestione degli eventi piuttosto semplice e di fatto sono stati anche il primo tassello per la costruzione di LINQ che è uno dei principali motivi per cui si usa C# e .NET.
Quindi, o sono io che non capisco ma dov'è il problema?
Il linguaggio, e prendo il significato più ampio del termine, è uno strumento.
Se mi semplifica la vita (lavorativa e quotidiana) pur non snaturandolo o generando overhead, tanto di guadagnato.
Innovazioni ce ne sono state anche se molti concetti in realtà sono stati recuperati dagli anni '80 e dai linguaggi appunto funzionali.
Ebbè? :)
Una tecnologia se non si evolve è destinata a sparire e se togliamo a Java i grossi progetti legacy messi in piedi anni fa una grossa fetta di utilizzo sparirebbe con sé.
Infatti ritorna spesso il confronto col Cobol.
Non è un caso che a livello di piattaforma prima ancora che di linguaggio si stia lavorando per mantenere il passo dei concorrenti (e non mi riferisco certo solo a C#/.NET).
Il nocciolo della questione, e credo di averlo scritto in tempi non sospetti, ritorna quando c'è una progettualità a monte di determinate scelte oppure si insegue e basta.
Visto il casino esacerbato anche dagli scontri con community ed Oracle a me sembra che questa progettualità manchi.
E fa sorridere come si parli di inner class&co. quando poi vai a vedere le specifiche di Mustang (dynamicinvoke, type inference migliorata...) su cui si sta lavorando e che sono in gran parte la riproposizione proprio di "roba" che in .NET c'è già da anni.
Vogliamo parlare del supporto alle collezioni?
E se poi LINQ e le lambda expression facevano tanto schifo com'è che gli sviluppatori hanno chiesto da anni un meccanismo similare ottenendo però framework che hanno più il sapore di un lavoro maldestro di patchwork? Parlo di Quaere, JaQu, QueryDSL ecc. ecc.
A me sembra una mancanza generale di coerenza e di una prospettiva che dovrebbe essere puramente pragmatica e non dogmatico/religiosa come spesso avviene nel "fantastico" mondo dell'ITC.
cdimauro
18-05-2011, 13:22
Umh... ma il vecchio testamento non è scritto in aramaico (o al massimo in ebraico, dato che la torah è una parte comune),
Sì, è in aramaico.
e il nuovo in lingua copta tranne Giovanni che effettivamente è in greco? O mi sbaglio?
Il nuovo è scritto in greco.
Sono state ritrovate copie in copto (perché in Egitto c'erano e ci sono ancora delle comunità numerose di cristiani) e in altre lingue.
Ci sono ipotesi di un vangelo scritto in aramaico (Matteo, se non ricordo male), ma non è mai stata portata alcuna prova concreto a sostegno.
Poi ci sono i testi gnostici e lì in effetti in greco ce ne sono di più... ma magari mi sbaglio, sono solo un curioso!
No, no, è giusto. Piuttosto ho sbagliato io a non specificare che non m'interessa il vecchio testamento e dunque l'aramaico.
Non m'interessa per due motivi. Primo perché si tratta di libri che sono stati trascritti molto fedelmente dagli ebrei, senza subire variazioni (gli scribi erano estremamente meticolosi e nel corso dei secoli svilupparono anche sistemi di controllo/verifica allo scopo).
Dunque se mi servisse una traduzione "abbastanza fedele" da consultare, mi basterebbe rivolgermi a studiosi ebrei che hanno tutto l'interesse (nonché "maniacalità") nel riportare quei testi nella nostra lingua.
Secondo, e più importante, il vecchio testamento è talmente assurdo e ridicolo nelle storie che riporta, che vincerebbe a mani basse l'oscar del miglior capolavoro fantasy di tutti i tempi, stracciando perfino Tolkien. :D
Infatti alcune volte amo asserire: "non c'è miglior cosa della lettura della bibbia per diventare atei". :cool:
E siccome la bibbia inizia col vecchio testamento. :D
Il nuovo testamento lo trovo interessante perché permea la nostra società e purtroppo bisogna averci a che fare per forza. Dunque conoscerlo consente di poter mettere da parte parecchie frecce per il proprio arco, nel caso di discussioni con qualche credente.
In particolare, considerando che esistono dalle 200mila alle 400mila varianti, è utile capire in che modo i testi più antichi (e in genere più "fedeli") siano stati abilmente manipolati da chi ha costruito e poi imposto l'ortodossia (e, di conseguenza, dichiarato eretici tutte le altre sette cristiane).
E anche queste sono utilissime frecce di cui disporre. :cool:
E anche queste sono utilissime frecce di cui disporre. :cool:
:)
Beh, se lo leggi solo per questo motivo non ti serve a molto il greco: basta la versione italiana.
Il problema è che sui vangeli ci sono scritte delle cose, e l'esegesi le ha trasformate in altre. Prese letteralmente, alcune parti dei vangeli possono sembrare scritte da Aleister Crowley... un paio di esempi:
Giovanni:"Gesù rispose:'Nella vostra legge c'è scritto questo: Io vi ho detto che siete dei'"
Matteo:"Quando pregate, non siate simili agli ipocriti che amano pregare stando ritti nelle sinagoghe e negli angoli delle piazze, per essere visti dagli uomini. [...] Tu invece, quando preghi, entra nella tua camera e, chiusa la porta, prega il Padre tuo nel segreto."
Prova a dire a un cristiano che è un essere divino o che non deve andare in chiesa a pregare la domenica... :D Ed è pieno di questi piccoli tabù, ma i cristiani (e i cattolici in particolare) di solito non leggono i vangeli... :)
Chiudo l'OT, scusate. :stordita:
cdimauro
18-05-2011, 19:20
Chiudo velocemente anch'io l'OT, con qualche precisazione.
Concordo, e infatti con la scusa dell'esegesi ai testi "sacri" si fa dire tutto e il contrario di tutto, in piena "armonia". Si vede che dio ama le contraddizioni. :D
Riguardo alla conoscenza del greco, è fondamentale proprio perché le versioni in italiano, per quanto possano cercare di essere fedeli, a volte non riescono a rendere il vero significato di una parola o frase.
Ad esempio vedi la parola finché in questo (http://www.mariedenazareth.com/8391.0.html?&L=4) contesto, che può assumere due significati diversi.
A mio avviso vale la prima interpretazione, perché mi risulta difficile credere che un marito ebreo non abbia avuto rapporti con la moglie dopo il termine previsto dalla legge mosaica a seguito del parto, e inoltre per gli altri riscontri sui fratelli di Gesù.
Saperne di più non fa mai male. Esporsi al "bare metal", sì, e che dolore.
http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash1/26599_109055882461856_108756679158443_104323_5849357_n.jpg
:D
@gugo: a me latino e greco avrebbero fatto comodo per studiarmi la bibbia e la patristica senza filtri e manipolazioni, partendo dai documenti originali. Oltre che ovviamente per la miglior conoscenza dell'italiano o di altre lingue neolatine.
@!fazz: sì, a livello industriale non penso che si possa ancora parlare di impiegare (pico)Python per qualche progetto commerciale, ma non si sa mai se i tempi di sviluppo sono particolarmente stringenti.
da quel poco che ho visto io se si hanno tempi stringenti non si è in produzione ma in fase di prototipazione e allora si usa spesso direttamente matlab targettato in produzione si ottimizza il tutto al massimo possibile e li si va di c/c++ possibilmente con iar che garantisce le migliori performance del codice se poi in futuro anche i micro si apriranno all'oop o similari meglio i tempi di sviluppo ne avranno benefici ma solo se ti consentiranno l'accesso diretto all'hw ancora fondamentale per le applicazioni embedded
Se Mono è scarso su Linux è anche dovuto al fatto che il mondo FOSS è pieno di talebani integralisti che ripudiano e combattono tutto ciò che made in Microsoft, che, si sa, rappresenta il Male Assoluto.
Anziché prendere una buona tecnologia e farla maturare preferiscono continuare a perdere tempo in miliardi di fork inutili e a farsi del male con C o C++ (che poi manco sono capaci di realizzare un IDE decente per questi linguaggi; ma si sa: bastano vi e emacs ai "veri programmatori").
C# è un eccellente linguaggio, ed estremamente produttivo. Più lo uso e più lo apprezzo.
Peccato che sia C-like: la sintassi mi sta sullo stomaco, ma qui non ci posso fare niente. Con Java ha molte affinità, ma chi afferma che ne è una copia si vede che non se l'è studiato per niente e s'è fermato alle prime similitudini che ha trovato invocando il plagio...
anche io trovo .net e soprattutto c# un ottimo linguaggio, purtroppo non l'ho approfondito più di tanto avendolo usato per poco tempo e neanche in maniera intensiva ma lo apprezzo parecchio e diversamente da te pure la sintassi la trovo spettacolare molto più di java (ovviamente IMHO)
cdimauro
19-05-2011, 18:37
Non ho dubbi: se ti piace la sintassi del C, C# ne è il miglior "figlio".
Riguardo all'accesso diretto all'hardware, si può realizzare con qualunque linguaggio. Basta fornire apposite funzioni (come, ad esempio, si fa con C/C++ per le porte di I/O).
Non ho dubbi: se ti piace la sintassi del C, C# ne è il miglior "figlio".
Riguardo all'accesso diretto all'hardware, si può realizzare con qualunque linguaggio. Basta fornire apposite funzioni (come, ad esempio, si fa con C/C++ per le porte di I/O).
quello sicuramente
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.