Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    67

    Bagaglio culturale programmatore (Java)

    Salve mi sto appassionando parecchio al linguaggio java.Sto studiando i fondamenti di questo l'ingaggio su un mattone ben fatto utilizzato nelle facoltà di ingegneria. Per ogni argomento faccio esercizi di pratica.
    Lo trovo molto semplice ma allo stesso tempo interessante.
    Volevo chiedervi alcune cose: il bagaglio culturale di un programmatore che materie deve comprendere ovviamente oltre all approfondita conoscenza del linguaggio sul quale vuole cimentarsi? Ho sentito in giro di materie come database.. Basi di dati ecc.. Qualcuno potrebbe darmi qualche informazione in merito facendo qualche esempio relativo alla programmazione in generale e poi specificativamente in java?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    67
    Per esempio penso che sia utile sviluppare conoscenze approfondite anche di linguaggi a basso livello come assembly che lavorano direttamente sull'hardware e danno le massime prestazioni, permettendo di conoscere l architettura del calcolatore.. Che ne pensate? E che mi dite dell'architettura restful client- server?

  3. #3
    È una domanda di non facile risposta, in quanto dipende da cosa ne vorresti fare di questo bagaglio. La prima cosa che ti posso dire e consigliare, dato che ormai sono 10 anni che sono nel settore, non è il linguaggio di programmazione a fare un programmatore ma è il contrario....
    Va bene prendere un linguaggio è impararlo bene ma questo deve solo servire a dare le basi per l'acquisizione di qual si voglia paradigma di programmazione. Purtroppo c'è da dire che il mondo della programmazione è così vasto che è impossibile poter acquisire tutte le conoscenze. comunque se il tuo studio è finalizzato ad un impiego in questo mondo sicuramente ti conviene puntare sulla parte web e mobile che oggi giorno è quella che va per la migliore.
    Per quanto riguarda l'assembly, vi prego smentitemi, ma penso che ormai nessuno programma più in assemembly, almeno su architettura x86, in quanto ormai i compilatori riescono a generare codice assembly ottimizzato per ottenere il massimo delle prestazioni; se ricordo bene nel Kernel di Linux nel 1999 esistevano solo una cinquantina di righe di codice assembly (scritte di pugno da Torwald) che poi sono andate a sparire nelle successive versioni.

    P.S
    Basi dati è sinonimo di Database

  4. #4
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    Per quanto riguarda l'assembly, vi prego smentitemi, ma penso che ormai nessuno programma più in assemembly, almeno su architettura x86, in quanto ormai i compilatori riescono a generare codice assembly ottimizzato per ottenere il massimo delle prestazioni; se ricordo bene nel Kernel di Linux nel 1999 esistevano solo una cinquantina di righe di codice assembly (scritte di pugno da Torwald) che poi sono andate a sparire nelle successive versioni.
    Ce ne sono ben di più, anche se non necessariamente per questioni di prestazioni; diverse cose vanno gestite necessariamente in assembly perché sono troppo specifiche del tal processore per poter essere scritte in C e/o perché in certi punti è necessario il controllo esatto di cosa fa la CPU - che so, i gestori degli interrupt (almeno l'ingresso e il cleanup), il codice per trappare nel kernel (i vari int 80/sysenter per le syscall), il salvataggio/ripristino dei registri CPU al momento dei context switch, la comunicazione con i device, ...

    Sul discorso performance, ci sono due questioni: in primo luogo, è importante capire come funziona una CPU moderna per capire perché certe cose vanno lente e altre veloci. Personalmente, scrivo assembly molto di rado (sostanzialmente per i code golf ), ma ne leggo una discreta quantità nel momento in cui devo fare performance tuning. Anche se le informazioni di debug possono aiutare a "tornare indietro" sui sorgenti, l'unico modo per andare nel dettaglio dell'output di un profiler è vedere gli hit sulle singole istruzioni assembly, ed è essenziale capire perché vanno lente. Non troppo tempo fa ho circa triplicato le prestazioni di un algoritmo riscrivendone il core in modo rimuovere la maggior parte dei branch imprevedibili (che incasinavano il branch predictor, mettendo i bastoni tra le ruote delle pipeline) e spostando l'equilibrio dati salvati/dati calcolati verso il ricalcolare un certo dato ad ogni giro, per evitare cache miss.

    Dall'altro lato, è vero che sul grosso del codice i compilatori fanno meglio (specie perché tengono più o meno presente l'enorme quantità di stato nascosto delle CPU x86 attuali), ma in alcuni punti può essere necessario "sporcarsi le mani", specie se le astrazioni del linguaggio fanno a pugni con il funzionamento della macchina sottostante; questo tipicamente è il caso con set di istruzioni vettorizzati (le varie SSE), che consentono di ottenere prestazioni elevate lavorando in parallelo con gruppi di valori impaccati nello stesso registro, quando tipicamente in codice di alto livello "standard" si scrive codice che va in loop su un elemento alla volta (anche se non è necessariamente vero - vedi librerie come numpy che supportano proprio a livello di interfaccia il lavorare sempre in maniera vettorizzata). Per quanto in ambito compilatori sia particolarmente attiva la ricerca sulla vettorizzazione automatica (e finalmente iniziano a saltare fuori le prime implementazioni effettivamente usabili), per ottenere le prestazioni volute può essere necessario spingersi a scrivere codice talmente ricco di intrinsics che di fatto è assembly con sintassi C (esempio a caso).

    La rilevanza di tutto questo naturalmente dipende dall'ambito in cui andrai a lavorare - diciamo che per scrivere l'applicazione gestionale media in genere non è necessario scendere a livello così basso.

    In ogni caso, ribadisco che secondo me avere un'idea di "cosa sta sotto il cofano" è abbastanza essenziale per essere buoni programmatori: se non sai come è effettivamente implementato un array o una hashtable o una stringa è molto più facile fare stupidaggini che distruggono le performance o scegliere soluzioni che hanno intrinsecamente prestazioni tragiche senza rendersene conto (esempio stupido: ho visto uno svuotare un std::vector togliendo elementi dalla testa - se hai mai usato dei vettori C e ti sei dovuto scrivere a mano il codice che fa la pop_front spostando tutti gli elementi indietro capisci immediatamente che è una barbarità, e fai diventare O(n^2) quello che sarebbe un O(n)).
    A tal proposito, questo articolo è sempre attuale.
    Ultima modifica di MItaly; 21-01-2015 a 11:10
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.