Quale lingua dovrei usare quando insegno un corso di laurea in programmazione per computer?


22

Andare a insegnare agli studenti di livello universitario un corso intitolato Introduzione alla programmazione informatica. Sono un po 'confuso. Nella fisica computazionale gli scienziati usano C / C ++ o Python o Fortran, CUDA ecc ..... questo è il momento di costruire la loro base. Cosa dovrei usare? So che puoi imparare un nuovo linguaggio di programmazione in qualsiasi momento della tua vita, ma che è la scelta più saggia per me per elaborare in seguito tutti i concetti di programmazione di base e i concetti OOP.


9
@ k20: spero che il tuo suggerimento sia stato ironico; altrimenti sarebbe una grave violazione dell'etica accademica.
Christian Clason,

6
@ k20: Tutto ciò è fuori tema, ma la scelta del software basato sui contraccolpi (di qualsiasi tipo) per l'insegnante e non sul contenuto da insegnare è decisamente non etico. (Giusto per chiarire, è il "malloppo" a cui mi oppongo.) Ciò che di solito viene fatto è che le aziende rendono disponibili software a costi significativamente ridotti (o gratuitamente).
Christian Clason,

3
@ k20: Inoltre, tieni presente che la motivazione della società di software non è del tutto altruistica: i tuoi studenti potrebbero ottenere il software gratuitamente ora, ma è anche probabile che debbano acquistare il software qualche tempo dopo nella loro vita (o imparare un nuovo Software).
Wrzlprmft,

3
@ k20 Matlab e Mathematica non sono molto utilizzati per un serio calcolo scientifico. Sono strumenti più esplorativi per provare idee. Se lo scopo del corso è insegnare algoritmi di base, allora questi potrebbero essere adatti (specialmente Matlab), ma se si tratta di una programmazione generale, allora vuoi andare con un linguaggio di programmazione più generale come Python di C ++.
Truman Ellis,

2
MATLAB ha un design (se non fossi diplomatico direi imperfetto :)) che richiede ciò che in altre lingue sono cattive pratiche. Molte altre cose sono semplicemente diverse da qualsiasi altra cosa, quindi "uscire" può essere difficile. Mathematica ha, a mio avviso, un bel design, ma non è niente di simile a qualsiasi altra lingua (tranne forse Lisp, ma non è usata nella scienza), quindi ciò che hai imparato è per lo più inutile per imparare un'altra lingua. OTOH, andare in C <-> Python è molto più semplice.
Davidmh,

Risposte:


32

In primo luogo, se i tuoi studenti universitari sono come i nostri e non avevano alcuna introduzione preliminare ai computer, aspettati di passare un po 'di tempo a insegnare loro come utilizzare le cose di base come usare un editor adeguato (cioè, non MS Word), la riga di comando, ecc.

Penso che la risposta dipenda in qualche modo da dove poni il focus del tuo corso (o cosa ti viene richiesto di insegnare). Ad esempio: quanto sono rilevanti i meccanismi interni del computer? Hai bisogno di lezioni e altre strutture OOP avanzate? Vuoi insegnare loro come produrre programmi efficienti o sei contento se producono programmi di lavoro? Inoltre, non dimenticare che molto probabilmente avrai bisogno di tutor capaci.

Ma ora ho dei vantaggi e degli svantaggi delle lingue. Nota che questo deriva principalmente dalla mia esperienza di fisico computazionale e che alcuni di questi possono dipendere dal campo particolare, dal gruppo di lavoro, dall'università, ecc.

Pitone

In genere raccomando di usare Numpy fin dall'inizio e presumo che sia usato nel seguito.

vantaggi:

  • È facile da imparare e lo è anche leggere il codice di altre persone (ad esempio il codice di esempio, ma anche il codice degli studenti per i tutor).
  • Input e output (che non dovrebbero essere al centro del tuo corso) possono essere completamente coperti da print, Numpy's savetxte loadtxt, e forse sys.argv. Può essere introdotto al volo e non consuma molto tempo di programmazione.
  • Non è necessario occuparsi o è necessario occuparsi solo di dettagli quali la rappresentazione numerica, la gestione della memoria, i tipi di dati. Quindi è veloce da programmare e puoi concentrarti sugli algoritmi reali.
  • Non è un linguaggio compilato. Ciò ha due vantaggi: gli studenti non devono confrontarsi con un compilatore e gli studenti possono testare le cose direttamente nella console senza dover compilare, riavviare ed eseguire nuovamente il programma. Di conseguenza, il debug è più semplice.
  • Ci sono librerie facili da usare per quasi tutto.
  • Non è necessario apprendere ulteriori linguaggi di script come script di shell, Make, Gnuplot e così via - tutto ciò può essere fatto da Python.
  • Ci sono molti buoni tutorial (gratuiti).

svantaggi:

  • Non è compilato. Pertanto i programmi Python possono essere drasticamente più lenti rispetto ai programmi compilati in alcuni casi rilevanti per la fisica computazionale. In altri casi, tuttavia, le librerie (specialmente Numpy) possono offrire prestazioni comparabili. Un altro modo per ottenere buone prestazioni con Python è scrivere i frammenti di codice rilevanti in un'altra lingua come C¹. Ovviamente devi imparare questa lingua per questo, ma questo può essere fatto in seguito e il tuo tempo ad imparare Python non è sprecato.
  • È più difficile insegnare dettagli come la rappresentazione numerica, la gestione della memoria, i tipi di dati e le loro insidie, poiché sono piuttosto offuscati.

C / C ++

vantaggi:

  • È compilato e quindi è più facile produrre codice efficiente.
  • Hai a che fare direttamente con la rappresentazione dei numeri, la gestione della memoria, i tipi di dati e quindi è più intuitivo insegnarli: i tuoi studenti si avvicineranno a ciò che sta realmente accadendo nel loro computer.
  • Ci sono librerie per praticamente tutto, ma comprendere e usare una libreria richiede un po 'di lavoro.
  • C'è una quantità rilevante di codice esistente in C / C ++ e quindi gli studenti devono imparare la lingua se vogliono lavorare con questo codice.
  • Se conosci già C / C ++, puoi imparare Python (ad esempio) molto velocemente.

svantaggi:

  • Viene compilato e i tuoi studenti devono occuparsi del compilatore, del preprocessore, delle intestazioni e così via. Saresti sorpreso di quanto gli studenti falliscano in questo passaggio, anche alla fine del semestre.
  • Anche l'apprendimento è più lento e impiega più tempo a produrre codice funzionante.
  • Trattare cose marginali come input e output richiede un po 'di tempo sia nell'insegnamento che nella programmazione. In C ++ esiste una sintassi aggiuntiva per input e output.
  • Dipendenze del compilatore e del sistema operativo.
  • Devi fare i conti con la confusione C / C ++.
  • Leggere il codice di altri, specialmente in C ++, può essere piuttosto difficile a causa della grande quantità di funzioni di sintassi.

I principali vantaggi di C ++ rispetto a C (Classi, modelli) non dovrebbero essere rilevanti per il tuo corso e stanno diventando rilevanti solo per progetti più grandi. Pertanto sceglierei C dei due, poiché è più conciso.

Altri

Alcuni commenti sulle altre lingue:

  • Fortran: questo è ancora usato da molti gruppi e c'è un sacco di codice legacy, ma non puoi aggirare i vecchi standard e le loro enormi limitazioni e insidie ​​(molte persone lavorano ancora con Fortran 77). Inoltre, sarà molto più difficile trovare tutorial, aiuto su Internet e così via.
  • Matlab / Mathematica: tutti i problemi del software proprietario. Considera in particolare che è probabile che i tuoi studenti collaborino con persone che non hanno accesso a questo software e ai problemi che ne conseguono.
  • Cuda: questo è rilevante solo per alcuni problemi, se le prestazioni sono importanti. Inoltre, dopo tutto quello che so, non vuoi imparare a programmare in questo modo.

¹ Qual è il flusso di lavoro standard almeno nel nostro gruppo.


Risposta molto precisa
Afnan Bashir

1
Vorrei anche dire che uno dei bonus non menzionati di Python è che ci sono un certo numero di distribuzioni scientifiche (Anaconda / Enthought / PythonXY / SAGE) che facilitano davvero il processo di portare tutti nella stessa pagina informatica. Inoltre, ancora più interessanti sono gli approcci basati sul web (Wakari e SAGE) che forniscono tutto tramite un browser noto come 0 software installato. Insegnare agli studenti c ++ o Fortran si tradurrà in una perdita di tempo maggiore nel combattere un compilatore rispetto al tempo guadagnato nella velocità del codice.
meawoppl

C'è un incredibile ecosistema in Python per la fisica computazionale. Numpy, scipy per fornire infrastrutture di base, mayavi, tvtk per visualizzazioni. Python è piuttosto maturo nella comunità scientifica informatica. Uso il C ++ in produzione ma non importa quale sia il dolore da usare.
Sai Venkat,

@meawoppl: "Insegnare agli studenti c ++ o Fortran si tradurrà in una perdita di tempo maggiore nella lotta contro un compilatore rispetto al tempo guadagnato nella velocità del codice." - Non è la velocità del codice per gli esercizi del corso che conta (i programmi saranno molto veloci in entrambi i casi, a meno che gli esercizi non siano fatti in modo tale che non lo siano), ma la velocità del codice dei programmi che scriveranno per la vita reale o simili. E ci sono alcune cose che non possono essere fatte in modo efficiente solo in Python.
Wrzlprmft

1
Direi che CUDA è fuori discussione per un corso di uso generale, poiché richiede hardware che non tutti hanno. E se hai solo un laptop senza di esso, non c'è quasi modo di installarne uno.
Davidmh,

22

Nel 2014 avrei detto Python. Nel 2017, credo fermamente che la lingua per insegnare agli studenti universitari sia Julia.

L'insegnamento riguarda sempre un compromesso. Da un lato, vuoi scegliere qualcosa che sia abbastanza semplice da essere facile da capire. Ma in secondo luogo, vuoi insegnare qualcosa che ha una capacità di resistenza, cioè qualcosa che può crescere con te. I linguaggi dinamici comuni (Python / MATLAB / R) rientrano facilmente nella categoria 1 a causa del loro codice di caldaia inesistente e della facilità di apertura di un interprete e di emissione del codice, mentre C / C ++ / Fortran rientrano nella seconda categoria come le lingue con cui sono stati scritti i principali software ad alte prestazioni del mondo di oggi.

Ma ci sono problemi con l'utilizzo di una lingua che non cattura completamente l'altra categoria. Quando si utilizza un linguaggio come Python, si asporta piacevolmente cose come tipi e overflow di interi. Questo è utile per insegnare il primo semestre dell'informatica, ma siccome vuoi approfondire il modo in cui le cose stanno effettivamente funzionando, il linguaggio di Python è troppo lontano dal metal sottostante per essere un buon strumento di insegnamento. Ma C / C ++ / Fortran (o Java ... ho imparato Java prima ...) hanno tutti un costo di avvio così grande che la cosa più difficile da imparare è come ottenere l'installazione e la maincompilazione delle intestazioni , il che distrae dall'imparare effettivamente a programmare .

Entra Julia. Quando usi Julia per la prima volta, puoi sottrarre l'intera idea dei tipi e usarla come MATLAB o Python. Ma se vuoi saperne di più, c'è una "tana del coniglio" di profondità nella lingua. Dato che si tratta in realtà di un livello di astrazione basato su un sistema di tipi + invio multiplo su LLVM, è essenzialmente "un modo semplice per scrivere codice compilato staticamente" (e le funzioni stabili al tipo possono effettivamente essere compilate staticamente). Ciò significa che anche i dettagli di C / C ++ sono accessibili. Puoi imparare a scrivere semplici loop e funzioni senza codice boilerplate e quindi scavare nei puntatori di funzione. Le funzionalità di metaprogrammazione di Julia ti consentono di accedere direttamente all'AST e ci sono macro che mostrano ogni parte della catena di compilazione. Inoltre, come Lisp, è suscettibile di stili di programmazione funzionale. E ha molte capacità di calcolo parallelo. Idee come la digitazione parametrica e la stabilità del tipo sono abbastanza uniche e profonde in Julia.

Se vuoi studiare da solo i linguaggi di programmazione, puoi imparare i passaggi di come funziona la compilazione usando @code_loweredper vedere cos'è l'abbassamento, vedi l'AST digitato con @code_typed, vedi IR LLVM con @code_llvme infine il codice assembly nativo con @code_native. Questo può essere usato per mostrare qual è il costo delle variabili dinamiche ed esattamente come funziona il "boxe variabile", e questo post sul blog mostra come questi strumenti di introspezione possono essere usati per insegnare come possono / non possono verificarsi le ottimizzazioni del compilatore.

Non ci sono solo idee di informatica e ingegneria del software da esplorare, ma anche ricche idee matematiche. Dato che le principali librerie di Julia sono scritte pensando alla tipizzazione generica, è banale creare operatori senza matrice e usare IterativeSolvers.jl per eseguire GMRES utilizzandoli. Puoi usare strumenti di introspezione come @whichper mostrarti esattamente come è stato implementato qualsiasi cosa. Ad esempio, come \funziona?

@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805

Questo mi indica direttamente la definizione di \ . È implementato in Julia, quindi qualcuno che conosce Julia può quindi imparare l'algoritmo e come funziona attraverso l'identificazione dei sottotipi di matrice e la specializzazione quando possibile (ripiegando sull'eliminazione gaussiana). Poiché il codice di Julia è concesso in licenza MIT (e quasi tutti i pacchetti sono autorizzati MIT), gli studenti sono quindi liberi di utilizzare queste idee nel proprio codice (con attribuzione) (quando il codice è concesso in licenza GPL, come nel caso della maggior parte dei pacchetti MATLAB e R, devono stare attenti ai problemi di licenza!).

Poiché il nucleo linguistico è costruito con una comunità open source molto attiva, esiste anche una ricca risorsa sulla storia dello sviluppo del linguaggio: suoi problemi con Github . Comprendere domande sulla lingua come cos'è veramente una trasposizione matriciale? può essere molto illuminante per comprendere questi oggetti matematici in modo più dettagliato.

Ma alla fine, vuoi insegnare ai tuoi studenti come creare. Sfortunatamente, imparare Python o R non significa necessariamente che hai quello che serve per "sviluppare Python / R" poiché la maggior parte dei pacchetti ampiamente usati e ben ottimizzati contengono una notevole quantità di codice C / C ++ / Fortran in ordine per ottenere prestazioni. Pertanto, affinché questi studenti possano contribuire agli ecosistemi scientifici di queste lingue, alla fine dovranno imparare un'altra lingua a un certo punto. Anche se non è del tutto orribile, non è ottimale ora che Julia esiste. Poiché Julia è stabile al tipo, è in grado di raggiungere la velocità di C / Fortran, la maggior parte dei pacchetti nell'ecosistema Julia è puro codice Julia. Imparare Julia significa che uno ha imparato a sviluppare Julia. E poiché Base Julia è anche principalmente codice Julia (solo alcune primitive e il parser non lo è),

Detto questo, ci sono alcuni aspetti negativi nella scelta di Julia. Per uno, è molto più recente di queste altre lingue e quindi è un po 'più scarso in termini di risorse. Dovrai inventare molti strumenti per insegnare da solo o attingere alle risorse sul web che sono elencate sul sito Web di Julia . Inoltre, i dettagli della lingua non sono abbastanza definiti, anche se 1.0 sarà presto disponibile (entro la fine del 2017). Ed è anche molto probabile che tu, potenziale insegnante di un corso a Julia, potresti non avere molta esperienza con la lingua da solo. Tuttavia, questi sono i tipi di problemi che scompaiono nel tempo, mentre i vantaggi di Julia che ho menzionato sopra sono molto più importanti per le lingue stesse.


Mi chiedo se usare una lingua poco usata abbia senso poiché la conoscenza della sintassi sarà probabilmente persa e non è garantito che gli studenti impareranno diverse lingue. Forse sotto questo punto di vista, Python è ancora una buona idea.
Xavier Combelle,

1
Ecco perché non avrei mai detto Julia prima, ma ora che è abbastanza comune potresti anche usarlo.
Chris Rackauckas,

Penso che Julia sia ancora troppo nuova. Nell'industria, gli studenti dovranno conoscere Python, C ++, (ew) MATLAB e R. Penso che sia meglio imparare come seconda o terza lingua, come esperienza arricchente. È improbabile che gli studenti usino di nuovo Julia nel prossimo futuro.
Mateen Ulhaq,

2
Gli studenti dovrebbero imparare le abilità trasferibili, non un modello da copiare e incollare. In tal senso, Python / MATLAB / R si sottrae troppo lontano dal computer per essere un buon strumento di insegnamento oltre la programmazione più semplice, ma C ++ è di livello troppo basso per essere un buon strumento di insegnamento. Certo, se hai una lingua sul lato come in un corso di analisi numerica, fai quello che userai perché il corso non riguarda la programmazione. Ma se si tratta di concetti di programmazione, Julia è praticamente l'unico linguaggio semplice che in realtà ha la maggior parte dei concetti nel suo design.
Chris Rackauckas,

2

Parlando come uno studente non troppo lontano rimosso, e supponendo che tu non stia insegnando nel dipartimento CS, penso che sarebbe un disastro introdurre gli studenti alla programmazione informatica con qualcosa come C, C ++ o Fortran (o dio vietare CUDA), anche se altri hanno sottolineato che probabilmente sono lo status quo nell'informatica scientifica.

Se ti aspetti di insegnare agli studenti informatica scientifica e introdurli alla programmazione nello stesso corso, scommetterei che è troppo da trattare in un semestre a meno che non ti atti a un linguaggio interpretato come matlab o python. Nella mia esperienza, la maggior parte delle lezioni di informatica scientifica a livello universitario sono insegnate in una di quelle due in ogni modo, e Python sta diventando sempre più utile come linguaggio a livello di produzione ogni giorno, quindi ha ancora qualche utilità come abilità pratica ( oltre a insegnare le basi della programmazione, intendo).

Solo i miei due centesimi.


4
Disastro è una parola troppo forte per descrivere l'insegnamento agli studenti C, C ++ o Fortran. Ognuno di questi linguaggi (C, C ++, Fortran o Python) può andare bene per insegnare programmazione e calcolo scientifico a seconda di come lo fai.
Bill Barth,

1
Dalla mia esperienza di una classe del dipartimento CS (C ++) e di una classe per astronomi (Fortran 77), C / C ++ / Fortran non forniscono un aiuto sufficiente rispetto a Python per programmatori completamente nuovi (segfaults vs eccezioni). L'uso di C / C ++ / Fortran implica o imparare come usare un debugger (o usare un IDE), mentre python può essere usato da solo.
James Tocknell,

0

C, C ++ e Fortran (elencati in nessun ordine particolare) sono i tre principali linguaggi di programmazione utilizzati per la matematica / fisica computazionale se si desidera risolvere grossi problemi con i supercomputer. Penso che CUDA sia considerata una libreria utilizzata in combinazione con altre lingue per il calcolo accelerato della GPU. Matlab e Python sono fantastici da imparare per l'esecuzione della diagnostica di output e la creazione di modelli prototipo. Sono anche più facili da imparare e possono essere migliori per un corso in cui si desidera superare algoritmi versi che imparano a programmare.

Quindi, se il tuo corso riguarda esclusivamente la programmazione, sceglierei C ++ o, se questa è la programmazione per la prima volta degli studenti, Python. Entrambe queste lingue hanno un'alta utilità al di fuori del mondo dell'informatica scientifica. Se il corso è incentrato sugli algoritmi di apprendimento per risolvere problemi basati sulla fisica, penso che Matlab sia senza dubbio il vincitore.


0

in breve: tenere conto del fatto che il calcolo scientifico è complicato da solo. Vuoi davvero che il linguaggio di programmazione entri in gioco?

La matematica usa l'astrazione per risolvere problemi che non possono essere risolti dall'intuizione. Pertanto i concetti hanno la tendenza ad essere astratti. Questo è il motivo per cui non è banale capire quali concetti incapsulare. Nell'informatica scientifica i soliti esempi per classi come "Animal" "Vehicle" sono piuttosto inutili. Questo è vero per la programmazione orientata agli oggetti, ma credo che riprodurre concetti astratti su un computer non sia banale anche nella programmazione imperativa.

Questo è il motivo per cui credo che qui ci stiamo occupando di due diversi sforzi: la programmazione, da una parte, e il calcolo scientifico dall'altra. A livello universitario, in cui gli studenti provengono da ambienti eterogenei, potresti finire per insegnare due cose diverse allo stesso tempo.

Se il tuo obiettivo è insegnare il calcolo scientifico, penso che sia abbastanza difficile. Avere una barriera aggiuntiva come linguaggio di programmazione (siamo tutti d'accordo sul fatto che il C ++ richiede formazione) demotiverebbe un buon gruppo di studenti, ecco perché suggerisco di andare con Python.

Se il tuo corso è "Introduzione a SC", credo che Python abbia il miglior rapporto risultato / sforzo.

PS: ora abbiamo dei computer piuttosto buoni, non abbiamo davvero bisogno di cercare efficacia a livello universitario.


Per quanto riguarda il tuo PS: perché le prestazioni non contano solo per gli studenti universitari? A parte il fatto che è facile concepire compiti per studenti in cui le prestazioni contano, non sono quelle attività per le quali apprendono le prestazioni ma la vita reale. Inoltre, la velocità del computer potrebbe essere aumentata, ma anche le nostre aspettative.
Wrzlprmft,

Mi dispiace, sono stato troppo acuto. Permettetemi di riformularlo in "gli studenti possono eseguire grandi applicazioni soddisfacenti con un linguaggio interpretato, prima di approfondire l'ottimizzazione del codice e poi passare a un linguaggio compilato".
Nicola Cavallini,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.