Domanda:
Perché FORTRAN è così comunemente usato nella chimica computazionale?
Melanie
2015-02-06 07:58:01 UTC
view on stackexchange narkive permalink

Sto usando Ruby per scrivere script per la ricerca, ma voglio entrare in alcune cose più pesanti per le quali Ruby è troppo lento. Ho notato che ci sono alcune cose scritte in C e C ++, ma c'è una percentuale stranamente grande di software utilizzato nella chimica computazionale che è scritto in FORTRAN (in cui non ho esperienza.)

Perché FORTRAN è utilizzato nella chimica computazionale? Da quello che ho capito, FORTRAN è un po 'antico (vecchia "scheda perforata".) Sono rimasto un po' scioccato nel trovare tutorial scritti abbastanza di recente per FORTRAN.

È una sorta di "questo è come l'abbiamo sempre fatto, "cosa o c'è un aspetto di efficienza in FORTRAN che sto trascurando?

Nota: potrei aver confuso FORTRAN con linguaggi di programmazione successivi con nomi simili.

Perché le persone hanno iniziato a scrivere codice molto tempo fa e Fortran era (ed è ancora) fortemente ottimizzato per la traduzione di formule (ad es.Calcoli).
Tieni presente che il Fortran moderno (95, 2003, 2008) è molto diverso da FORTRAN 66 o 77.
Sì, trascuri qualcosa. 1) Fortran ha una semantica leggermente diversa. Non ha veri puntatori, quindi il compilatore può essere un po 'più liberale nelle ottimizzazioni. 2) c'è molto codice legacy fortran 3) fortran è molto più semplice del C e specialmente dei linguaggi "orientati agli oggetti".
Per alcuni calcoli di array, Fortran è potenzialmente più veloce di C / C ++ a causa del suo [presupposto che i puntatori non si aliasino mai l'un l'altro.] (Http://stackoverflow.com/questions/146159/is-fortran-faster-than-c)
"non proprio scheda perforata"? https://upload.wikimedia.org/wikipedia/commons/5/58/FortranCardPROJ039.agr.jpg
Questa particolare guerra linguistica (http://en.wikipedia.org/wiki/Software_wars) è apparsa un paio di volte su Stackoverflow http://stackoverflow.com/questions/13078736/fortran-vs-c-does-fortran-still- tenere-qualsiasi-vantaggio-nell'analisi-numerica-questi? lq = 1 http://stackoverflow.com/questions/31672/learning-fortran-in-the-modern-era/168565#168565 http: // stackoverflow. com / questions / 953869 / il-ritorno-vale-l'investimento-nell'apprendimento-fortran? lq = 1 http://stackoverflow.com/questions/146159/is-fortran-faster-than-c Afflitto da persone che sono 30 anni fa e pensano che sia ancora scritto FORTRAN come qui.
FORTRAN era una delle poche opzioni disponibili per sviluppare programmi specifici di calcolo. Per quanto riguarda le schede perforate, il formato della colonna (che fa parte della specifica del linguaggio) è stato progettato pensando alle schede perforate.
@DavidZhang È facilmente risolvibile con l'uso della parola chiave limit, aggiunta ben 16 anni fa.
Non dimentichiamo che molti programmatori scientifici sono in realtà programmatori pessimi, ed è molto più facile scrivere qualcosa di ragionevole in Fortran che in C ++.
https://www.quora.com/What-is-the-most-popular-programming-language-used-in-computational-chemistry?share=1
LOL - Ho scritto il mio primo programma nel 1971 in FORTRAN usando schede perforate. Mi chiedo quante persone sappiano come impostare la scheda di controllo per un keypunch. Un altro segno perduto di essere un nerd era sapere come avvolgere un nastro di carta per un lettore di punzonatura telescrivente.
Sei risposte:
#1
+44
Geoff Hutchison
2015-02-06 08:35:30 UTC
view on stackexchange narkive permalink

Non penso che sia più vero.

Alcuni usi di Fortran sono storici (cioè, i primi codici sono stati sviluppati in FORTRAN perché era il miglior linguaggio di programmazione per lo scricchiolio dei numeri negli anni '70 e '80) . Diamine, il nome sta per "traduzione di formule".

Alcuni utilizzi di Fortran sono dovuti alle prestazioni. Il linguaggio è stato progettato per essere:

particolarmente adatto al calcolo numerico e al calcolo scientifico.

Molte volte, trovo che i programmatori di chimica si attengano a Fortran perché sanno e dispongono di basi di codice numeriche altamente ottimizzate.

Penso che il lato delle prestazioni non sia più necessariamente vero quando si utilizzano compilatori C e C ++ moderni e altamente ottimizzati.

Scrivo un molto codice in C e C ++ per le prestazioni e incolla molte cose con Python. So che alcuni programmi quantistici sono scritti esclusivamente o principalmente in C ++. Ecco alcuni esempi open source:

  • Psi4 - Scritto in C ++ e Python
  • MPQC - Scritto in C ++
  • LibInt - Scritto in C ++ per integrali quantistici efficienti.
  • LibXC - Scritto in C con "binding" Fortran per Funzionali di correlazione di scambio DFT

Questa è la mia opinione, ma la mia raccomandazione per prestazioni più veloci in chimica sarebbe Python con un po 'di C o C ++ mescolato.

Trovo che io Sono più efficiente la codifica in Python, in parte a causa del linguaggio, in parte a causa dei molti pacchetti, in parte perché non devo compilare, e questo è tutto importante.

Inoltre, puoi eseguire script Python e funzioni in parallelo, sulla GPU, e persino compilarle, ad es con Numba. Come ho detto, se penso che le prestazioni siano cruciali, scriverò pezzi in C o solitamente C ++ e collegherò a Python secondo necessità.

Sulla base del puro utilizzo, * altamente * consiglio Python per la programmazione scientifica in questo momento. Alcuni pezzi per un progetto recente erano già disponibili come efficienti funzioni NumPy o SciPy. :-)
Sono seriamente venduto su Python. Non ho scritto molto in Python, ma ho trovato molti script davvero utili scritti in esso. Quando si tratta di C o C ++, quale mi consigliate? Ho usato davvero solo Ruby e Perl (e un po 'di Python) e non mi importava davvero di Perl.
Il mio suggerimento per l'apprendimento delle lingue è di avere un progetto dove ne hai bisogno. Recentemente ho imparato a me stesso Python semplicemente ad usare l'elaborazione delle immagini NumPy. Suggerirei di usare Python per un po ', quindi se c'è una parte critica per le prestazioni, prova a riscrivere in C o C ++. Molte guide "impara la lingua X" esistono online e in formato cartaceo.
@GeoffHutchison, * Non * consiglierei mai qualcosa solo per il suo puro utilizzo.
Tuttavia, la maggior parte dei pacchetti QC diffusi sono scritti in fortran.
@Wildcat Ci sono vantaggi in termini di prototipazione più veloce se non è necessario reinventare la ruota.
@permeakra Credo che sia in gran parte dovuto alla storia. Gaussian è stato avviato da Pople negli anni '70. GAMESS è stato avviato in modo simile ben prima che C guadagnasse molta accettazione. I progetti più moderni sono in gran parte misti o C ++.
@permeakra Per quel che vale, so che Pople ha imparato da solo un po 'di C ++ quando ha avviato Q-Chem. Alcuni dei meta-programmazione dei template in progetti come libint sarebbero difficili o impossibili da replicare in Fortran.
@GeoffHutchison C / C ++ ha alcune stranezze nella semantica (in particolare, accesso indiretto utilizzando puntatori e nome array = puntatore), che limita il riordino delle letture e scritture della memoria. Per questo motivo, il codice di fortran può essere ottimizzato molto meglio. Per questo motivo, Fortran è la migliore lingua per lo scricchiolio dei numeri da tutte le lingue diffuse. Nei tempi moderni dell'opencl la lingua host diventa meno importante, quindi diventano disponibili altre opzioni.
@permeakra Sono d'accordo, ma non voglio entrare in un dibattito su quale sia la lingua migliore. Certamente entrambi vengono utilizzati per creare codici chimici altamente performanti e OpenCL e altre funzionalità rendono la scelta della lingua meno importante.
Fortran ha avuto, per anni, array multidimensionali nativi con supporto per compilatori e ottimizzatori. C / C ++, d'altra parte, simula quello con vettori di vettori. Molte persone hanno continuato a utilizzare Fortran per la chimica e altri scopi scientifici proprio per questo motivo.
In realtà Python è un linguaggio di scripting interpretato, il che significa che il tuo codice viene tradotto da un interprete in fase di esecuzione. Quindi c'è un compromesso tra tempo di sviluppo e velocità. Per i calcoli matematici / chimici nessun linguaggio di programmazione può battere c / c ++. Se stai cercando di eseguire codice in parallelo, dovresti imparare a rendere i tuoi programmi multi-thread
Anche se dovrei menzionare che esiste una curva di apprendimento per c / c ++ efficiente ed efficace, ma ti sfido a dimostrare il contrario.
@AlanZ2223 Se il nuovo programma è progettato per essere eseguito su software abilitato per opencl, non c'è molta differenza da quale linguaggio utilizzare opencl. E il C ++ è uno dei peggiori linguaggi esistenti in assoluto.
#2
+30
Wildcat
2015-02-06 15:56:58 UTC
view on stackexchange narkive permalink

Penso che abbia senso fornire una visione un po 'alternativa e chiarire la questione.

FORTRAN vs. Fortran

Prima di tutto, bisogna distinguere il vecchio FORTRAN da il nuovo Fortran, dove, per convenzione, il nome della vecchia lingua è scritto solitamente in maiuscolo. Il vecchio FORTRAN (fino a FORTRAN 77) è effettivamente ancora utilizzato a causa di tonnellate di codice legacy, ma il nuovo Fortran (a partire da Fortran 90) viene utilizzato principalmente perché è un linguaggio molto elegante e semplice ma potente ed efficiente per elaborare i numeri .

DSL e GPL in generale

Nota in particolare che anche il Fortran moderno, a mio parere, è linguaggio specifico del dominio (DSL) e qui sta la sua relativa debolezza rispetto ad alcuni linguaggi generici (GPL) come il citato C ++: Fortran è specializzato per un compito particolare (elaborazione dei numeri) e potrebbe non essere così adatto per alcune attività correlate (ad esempio, analisi automatizzata dei risultati finali, la loro rappresentazione grafica, ecc.)

I linguaggi di uso generale, come C ++, offrono maggiore flessibilità (nelle funzionalità del linguaggio, nelle librerie di terze parti, ecc.) in modo da poter risolvere non solo l'attività principale (elaborazione dei numeri) ma anche l'attività correlata utilizzando la stessa lingua . Se, tuttavia, scegli Fortran per lo scricchiolio dei numeri, spesso devi usare un linguaggio in più (ad esempio Python) per queste attività correlate. Pensaci come se stessi usando due DSL differenti: uno per l'attività principale, un altro per le attività correlate. Naturalmente, potresti anche usare Python insieme a C ++, ma uno sviluppatore C ++ esperto (che dovresti essere se scegli di fare un po 'di scricchiolio in esso) non trarrebbe necessariamente vantaggio dall'usare un altro linguaggio invece del suo bestione C ++.

Fortran vs C ++ in particolare

Tutto questo è in qualche modo soggettivo, ma comunque ecco i miei 5 centesimi. Nel complesso, Fortran è più semplice di C ++, ma (e perché) C ++ è più ricco di funzionalità . Fondamentalmente, perché Fortran è DSL, mentre C ++ è GPL. E come ho detto, questo è soggettivo in una certa misura, e inoltre, la complessità è una delle cose più complesse nell'universo, quindi potremmo iniziare un dibattito su di esso, ma ehi, solo una parola: modelli e la discussione è in principio finito. I modelli rendono C ++ la bestia, ma tutto ha il suo prezzo.

Tieni presente che non ho detto che C ++ è più potente, poiché, a mio parere, "più ricco di funzionalità" non significa sempre " più potente". Dipende prima di tutto da se hai effettivamente bisogno di queste funzionalità aggiuntive in primo luogo o no? Scherzi a parte, hai bisogno del livello di generosità (e metaprogrammazione) che i modelli C ++ forniscono per il calcolo dei numeri? Non necessariamente. E se così fosse, C ++ non sarebbe più potente di Fortran, anche se sarà comunque più ricco di funzionalità.

I modelli non sono l'unica caratteristica di C ++ che Fortran non ha. Eccezioni e libreria standard: sono altre due caratteristiche evidenti che Fortran non ha. Ancora una volta, non è così probabile che trarrai grandi vantaggi da queste funzionalità per lo scricchiolio dei numeri. Ma alcune altre attività potrebbero essere molto utili, quindi C ++ come GPL li include mentre Fortran come DSL per il calcolo dei numeri no. Pensa a Fortran come a un "linguaggio a valigia" solo per lo scricchiolio dei numeri e al C ++ come a un "linguaggio a baule" per tutto.

C'è anche una grande caratteristica del linguaggio Fortran che C ++ non riesce ancora a raggiungere: i moduli. Voglio dire, moduli reali e non un antico meccanismo di preprocessore che mi irrita più di ogni altra cosa.

C ++ ha moduli reali; se non ti piacciono i dettagli di implementazione, usa #pragma una volta.
#3
+17
Jonathon
2015-02-06 08:38:05 UTC
view on stackexchange narkive permalink

FORTRAN aveva un vantaggio quando si trattava di velocità grazie all'ottimizzazione dei compilatori molto migliori, in parte grazie alla sua relativa semplicità. Ora che i compilatori C e C ++ sono quasi alla pari (e occasionalmente migliori), entrano in gioco altri fattori come la programmabilità. Tuttavia, c'è anche molto codice legacy là fuori.

Lavoro in chimica quantistica e molti dei programmi con cui lavoro hanno un mix ma stanno iniziando a incorporare più C ++. Il pacchetto PSI4 combina persino Python e C ++ per ottenere i vantaggi di velocità e usabilità di ciascuno.

Ecco un elenco di vari programmi e dei linguaggi che usano.

  • ORCA - C ++
  • MPQC - C ++
  • PSI4 - C ++, Python
  • PySCF - Python
  • Q-Chem - FORTRAN, C ++
  • CFour / ACES - FORTRAN, recentemente alcuni C ++
  • NWChem - FORTRAN, C
  • GAMESS (USA) e GAMESS (Regno Unito) - FORTRAN
  • Gaussiano - FORTRAN
  • Molpro - FORTRAN
  • Dalton - FORTRAN, alcuni C
  • MRCC - FORTRAN
  • MOLCAS / OpenMOLCAS - FORTRAN
  • DIRAC - FORTRAN
  • ADF - FORTRAN
  • CASINO - FORTRAN
  • COLUMBUS - FORTRAN
  • CP2K - FORTRAN
  • TURBOMOL - FORTRAN

Pacchetti di chimica quantistica

Il codice C / C ++ in Computer Language Benchmarks Il gioco è scritto in un modo molto "hacky". Nessuno lo farà "in produzione" poiché tale codice è quasi impossibile da mantenere. Il C / C ++ mantenibile non avrebbe battuto quello di Fortran.
Purtroppo a volte è vero. Tuttavia, poiché i compilatori di ottimizzazione C e C ++ stanno recuperando terreno, ci sono altre considerazioni come l'usabilità.
@Wildcat Non sono d'accordo; le librerie come Blitz ++ che utilizzano modelli di espressioni non sono né hacky né non mantenibili; sono molto facili da usare e mantenere e battono regolarmente FORTRAN in algebra lineare.
@Alice, prima, non ho detto una parola sulla complessità delle librerie C ++. In secondo luogo, sono davvero molto complessi. Se hai 10 anni di sviluppo C ++, forse potresti capire i modelli di espressione, ma guarda dove sei: è il sito di chimica là fuori.
@Alice: Non ho mai sentito parlare di Blitz ++. Forse va bene, ma è importante anche un'ampia base di utenti.
@Alice: Potete fornire un esempio in cui Blitz ++ batte FORTRAN?
#4
+13
Cort Ammon
2015-02-06 11:30:43 UTC
view on stackexchange narkive permalink

FORTRAN è un linguaggio meno espressivo del C ++ e questo ha permesso ai vecchi compilatori di ottimizzare in modo molto più efficiente. Nei compilatori moderni, c'è poca o nessuna differenza nelle prestazioni. Ci sono solo pochi punti in cui le garanzie di sicurezza più deboli di FORTRAN consentono ottimizzazioni più estreme. Probabilmente non noterai la differenza a meno che non trascorri 6-10 anni a sviluppare FORTRAN.

In generale, è più facile sviluppare i linguaggi più recenti perché sfruttano meglio le capacità di elaborazione moderne. FORTRAN è molto rigoroso nel suo formato perché doveva essere compilato dai computer della metà degli anni '70. Tu dici al computer esattamente cosa fare nella sua lingua, invece di dirgli cosa vuoi fare in un linguaggio più leggibile dall'uomo.

FORTRAN è ancora utilizzato per due ragioni principali che posso scoprire:

  • Alcuni problemi sono abbastanza semplici laddove l'espressività del C ++ viene sprecata, e puoi effettivamente creare un programma più chiaro con FORTRAN più semplice.
  • Molti programmi sono realizzati dalla generazione precedente. FORTRAN era, in passato, semplicemente migliore per il lavoro di calcolo.
È una questione di pura opinione, come sviluppatore che ha sviluppato forse in una dozzina di lingue, non c'è motivo per cui consiglierei FORTRAN a qualsiasi sviluppatore per qualsiasi attività a meno che non ci sia una base di codice FORTRAN legacy con cui interfacciarsi. Le persone semplicemente non stanno più imparando la lingua, il che significa che dovrai mantenere per sempre qualsiasi codice che scrivi. Sarà difficile passare a qualcuno.
@CortAmmon Questo è così lontano dal vero che è intellettualmente disonesto. Il FORTRAN moderno è in uso al CERN sull'LHC per l'amor di Dio, e nemmeno il nuovo codice che utilizza una base legacy; molte cose sono state ampiamente riscritte o scritte da zero. FORTRAN non è neanche lontanamente meno espressivo del C ++, come mostrato dalla miriade di librerie e attività su cui è stato utilizzato. Inoltre, tantissime persone lo stanno ancora imparando; è un linguaggio di programmazione richiesto in alcuni ambienti (principalmente scientifici).
Questo ha ottenuto un voto positivo, che ha richiamato la mia attenzione su di esso.Ho ritenuto che sarebbe stato utile pubblicare un collegamento al [sondaggio sui programmatori StackExchange del 2019] (https://insights.stackoverflow.com/survey/2019#technology).A merito di Alice, potrebbero esserci piccole popolazioni unite che sviluppano FORTRAN, e in quelle popolazioni può essere un linguaggio mantenibile.Ma nella più ampia popolazione di sviluppatori, è così impopolare che non ha nemmeno fatto l'elenco dei linguaggi con cui le persone sviluppano (il più basso nell'elenco era WebAssembly, all'1,1%)
#5
+12
Buttonwood
2017-05-31 18:18:22 UTC
view on stackexchange narkive permalink

Sono incappato in un articolo in J. Appl. Cryst. che è parzialmente correlato alla domanda originale. Confrontando Fortran con altri linguaggi di programmazione nel contesto di algoritmi cristallografici in un framework software riutilizzabile si ottiene questo diagramma condensato:

enter image description here

( doi 10.1107 / S0021889801017824)

Va ​​aggiunto che l'articolo si riferisce a pacchetti software scritti nel vecchio dialetto Fortran 77.

Anche se linguaggi come Python non sono particolarmente veloci (è fondamentalmente interpretato non compilato) questo è fuorviante. Python semplifica l'accesso a librerie compilate altamente ottimizzate per attività di calcolo specifiche. In questo modo puoi combinare la facilità di programmazione e ottenere comunque un'elevata velocità di elaborazione dei numeri. Questa è una delle ragioni della sua crescente popolarità.
#6
+6
Pierpy
2017-04-03 01:39:44 UTC
view on stackexchange narkive permalink

Credo che ci siano due ragioni principali per l'ampio utilizzo di Fortran nella comunità della chimica computazionale. Il primo era per la sua efficienza: FORTRAN significa Formula Translator e il calcolo scientifico / numerico è stato il motivo principale per lo sviluppo di questo codice.

Al giorno d'oggi, Fortran è ancora molto efficiente, tuttavia, alcuni altri linguaggi (C ++ per esempio) sono efficienti quanto Fortran. Ma allora perché codifichiamo ancora in Fortran ?? Fondamentalmente, la maggior parte dei software di struttura elettronica sono scritti in Fortran e nessuno è così pazzo da tradurre milioni di righe. Quindi lo teniamo scritto in Fortran quando aggiungiamo blocchi di codice! D'altra parte, se fosse necessario scrivere un nuovo software, non ci sarebbero ragioni pratiche per scegliere Fortran come lingua. Ad esempio, il recente software MIDAS (Aarhus University) per ottenere funzioni d'onda nucleari è stato completamente scritto in C ++. Personalmente uso Fortran90 come linguaggio e non è rigido come il vecchio FORTRAN77 ... e mi piace! :) In realtà mi sono posto la stessa domanda che hai postato quando ho iniziato il mio dottorato.

+1. Risposta molto buona. Soprattutto perché è stata la tua prima e unica risposta qui. Questa risposta dovrebbe avere molti più voti positivi di quanto ne abbia.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...