2010-07-25 4 views
27

Mentre le lingue F # e IronPython sono tecnicamente dissimili, a mio parere c'è una grande sovrapposizione tra i loro potenziali usi. Quando è più applicabile rispetto all'altra?F # vs IronPython: quando si preferisce l'altro?

Finora mi sembra che F # sia computazionalmente più efficiente mentre IronPython eredita una libreria migliore da Python. Sono felice di essere corretto.

C'è una domanda leggermente pertinente is F# to IronPython/IronRuby as C# is to VB.NET? ma la maggior parte delle risposte riguardano i paradigmi linguistici piuttosto che la loro effettiva applicabilità.

Edit: Credo che dovrei aggiungere un po 'più di fondo. Ho una buona esperienza con Python in generale, e ho appena appreso F # dopo alcuni esiti passaggi di programmazione funzionale prima, principalmente in Erlang. Attualmente mi sento in grado di continuare a utilizzare Python o F # in futuro. Vorrei decidere quale usare e dove. Ad esempio:

  1. Python ha strutture dati molto buone come parte della libreria standard. L'altro giorno avevo bisogno di un equivalente del modulo heap di Python e non è disponibile nella libreria standard F # /. Net. Punto per IronPython.
  2. F # può essere utilizzato per creare librerie più convenienti, più facili da accedere da altri linguaggi .Net. Quindi per una biblioteca residente. Preferirei F #.
  3. Sviluppo multipiattaforma. IronPython è migliore qui. F #/Mono è utilizzabile è un set di piattaforme molto più piccolo e la compatibilità con F #/OCaml non è facile da mantenere soprattutto in termini di librerie.
  4. La shell interattiva di IronPython mi sembra più facile di fsi. YMMV.

Quindi la domanda si riduce a: ci sono ragioni, a parte una preferenza di un paradigma ad un altro o qualche squadra o le preferenze aziendali, che renderebbe si sceglie F #, piuttosto che IronPython o viceversa? Supponendo che tu sia altrettanto sicuro di entrambi? O sono esattamente equivalenti per tutti gli scopi pratici?

Edit: Ok ragazzi, sembra che avete giudicato che questo è una domanda stupida, ma downvoting e le risposte. Ma almeno è onesto. Quindi, per favore, solo un suggerimento. È impossibile distinguere tra i due o sto entrando in qualche tabù segreto facendo questa domanda? Se sembra un troll qualcuno mi può informare per favore?

+0

Quale preferisci di più (entro i limiti dei tuoi requisiti funzionali e politici)? –

+4

Non penso che sia una domanda stupida, ma è bizzarra. Sono lingue molto diverse con cui sviluppare, oltre ad essere piuttosto di nicchia, e non mi aspetto che più di un paio di persone sul pianeta, tranne che tu abbia mai dovuto fare questa scelta. Qualcuno che probabilmente ha appena parlato con la lingua con cui erano più familiari. – Kylotan

+0

Se la tua domanda fosse "onesta" avresti riconosciuto il fatto che ho già smentito il tuo primo punto due volte riferendoti alla struttura di dati "Set" incorporata di F #. –

risposta

23

Quindi la domanda si riduce a: sono c'è alcuna ragione, a parte un preferenza di un paradigma all'altro o qualche squadra o le preferenze aziendali, che renderebbe si sceglie F #, piuttosto di IronPython o vice versa? Supponendo di essere altrettanto sicuro di entrambi nello ? O sono esattamente equivalenti per tutti gli scopi pratici?

Come avviene di solito, "dipende da quello che stai facendo" Ma dal momento che lei ha chiesto, cominciare da qui:

Toolset diversità

Nel mio punto di vista, è IronPython essenzialmente lo stesso di C# con una sintassi leggermente diversa - lo so, è una generalizzazione radicale per due lingue con sistemi di tipo completamente dissimili, ma non sono altro che posso dire di un altro imperativo, il linguaggio OO. Che si tratti di C#, o Java, o C++ o Python, si risolvono le lingue usando approssimativamente le stesse tecniche, idiomi, strategie, stile, ecc. Se si è sviluppatori .NET, si è quasi certamente lavorato con C# o VB. NET, e hai già scritto codice in uno stile imperativo per tutto il tempo in cui hai utilizzato le lingue.

Il più grande punto a favore di F # è semplicemente che incoraggia stili di programmazione più funzionali, minimizza le astrazioni attraverso l'ereditarietà OO a favore della composizione di funzioni, l'immutabilità come predefinita invece che come un secondo pensiero e così via. Se si desidera scrivere codice funzionale, è necessario utilizzare un linguaggio funzionale.

Concesso, è possibile scrivere lo stile funzionale in C# e Python, ma le funzionalità vengono innestate come un ripensamento. Python manca di lambdas multilinea e C# è troppo prolisso e occasionalmente buggy per utilizzare lo stile funzionale nei luoghi in cui si desidera utilizzarlo, C# in particolare ha un intero boatload of gotchas per i delegati e l'acquisizione di variabili locali, entrambe le lingue mancano di ottimizzazioni tail-call quasi ovunque tu voglia usarli, il tipo di inferenza di C# è uno scherzo rispetto a F #. Ho provato ad usare C# come linguaggio funzionale con risultati esilaranti male :)

Ora molte persone potrebbero ammettere che i problemi rendono difficile, ma non impossibile da programmare in uno stile funzionale usando C# o Python. Tuttavia, secondo la mia esperienza, non sono le lingue a renderlo impossibile, sono i programmatori della tua squadra.Se hai 10 o 12 persone che scrivono codice in una lingua imperativa, non sarai in grado di applicare uno stile funzionale per molto tempo - le lingue non fanno nulla per scoraggiare lo stile imperativo. E dal momento che i programmatori codificano già in quello stile, questo è ciò che ottieni. A meno che tu non abbia degli appassionati di FP davvero hardcore e un po 'masochisti nella tua squadra, non credo che potrebbe imporre uno stile di programmazione puramente funzionale in un linguaggio imperativo per molto tempo.

L'argomento migliore a favore di F # non è necessariamente la stessa programmazione funzionale, ma la vera diversità del set di strumenti. Ottieni un ROI più grande accoppiando F # e C# (paradigma di programmazione diverso e sistema di tipo simile) rispetto all'accoppiamento di IronPython e C# (stesso paradigma di programmazione e sistema di tipi diversi).

caso di studio di mia azienda

Ok, con questo detto, ho cercato di spingere per F # alla mia azienda. Non entrerò in un'enorme quantità di dettagli su ciò che facciamo, ma essenzialmente il mio team guida gli utenti attraverso il processo di ordinazione di servizi via cavo e telefonici per aziende come Time Warner, ComCast e altri fornitori di servizi via cavo.

È davvero un processo più complesso di quanto sembri. Per cominciare, c'è un complicato motore di regole che determina la disponibilità di prodotti, dipendenze ed esclusioni tra prodotti, ecc. Passiamo al grafico del motore delle regole e ne costruiamo un albero decisionale, quindi passiamo l'albero a un client in modo che possano visualizzalo all'utente e raccogli l'input dell'utente, la GUI della mappa del client torna alla struttura delle nostre decisioni, camminiamo sull'albero e convalidiamo tutto contro il motore delle regole, ecc.

Direi che il 95% del nostro codice è semplicemente la navigazione , manipolando e processando strutture dati ad albero. In questo momento, tutto ciò che scriviamo è C# e il suo tipo di confusione. Per inciso, uno dei punti di forza di F # è la manipolazione degli AST e dell'elaborazione simbolica (vedere un confronto di C# and F# code for processing ASTs), e tutto questo è possibile perché la corrispondenza dei modelli è impressionante.

La corrispondenza di modelli è una vera caratteristica killer, è esattamente ciò che il nostro codice C# deve pulire, ed è per questo che abbiamo bisogno di F #. Non abbiamo alcun uso per IronPython perché non è migliore per l'elaborazione simbolica di C#.

Sommario

paradigma di programmazione funzionale e pattern matching sono due caratteristiche assassino ti fanno piacere con F # di tutti i giorni. Potrei andare sul modello di threading di F # , sul passaggio di primitive di concorrenza, sul supporto delle monadi, su nuove funzionalità come i pattern attivi e così via, ma sono tutti commenti in grassetto. Per me, le sue due caratteristiche killer che rendono il caso per F # su Python - almeno per i miei progetti.

+0

Ho accettato questa risposta anche se ho ancora alcune domande. Non conosco C# e non ero uno sviluppatore .Net prima di usare F # e IronPython. So che c'è un grande divario tra la programmazione funzionale e quella imperativa, ma le persone tendono a minimizzare la differenza tra digitazione dinamica e tipo di inferenza da un lato e tipizzazione statica dall'altro, il che rende sia F # che IronPython molto più succinti di per esempio Java. Quindi il confronto tra F # e C# non è probabilmente equivalente a un confronto tra F # e Python. –

+0

Python manca di lambdas multilinea, vero. Tuttavia, non ho finora avuto bisogno di usare funzioni multilinea senza nome in F #. Quindi non lo considererei come il problema principale. Molto più problematico per me è il curry e il pipelining, entrambi disponibili direttamente in F #. –

+0

Il Riepilogo è brillante, però. Probabilmente la parte più preziosa. –

1

Quale preferisci di più (entro i limiti dei tuoi requisiti funzionali e politici)? Quale richiede più investimenti iniziali? Quale vuoi mantenere (investimento a lungo termine)? E quale ti aiuterà a risolvere il tuo problema (i) il migliore?

IronPython è, beh, Python. Ciò significa anche che è notevolmente più dinamico - che aggiunge un sovraccarico di runtime - rispetto a F #. Se preferisci Python su F #, e funziona abbastanza veloce per te, allora perché non usarlo? Come hai detto, ha un migliore supporto per la "libreria Python", quindi se puoi sfruttarlo a tuo vantaggio, allora segna IronPython.

D'altra parte, "solo" essere limitati alle librerie .NET (e F # -friendly) non è poi così male per un linguaggio come F #, a patto che le librerie facciano quello che devi fare esistano o può essere emarginato.

Tuttavia, lo standard arriva al paradigma così come le preferenze e l'esperienza degli sviluppatori.

Personalmente evito linguaggi dinamici dove posso :-)

+0

@pst: vedere la mia domanda modificata. So che il paradigma è una grande parte di esso, e ho appreso F # per avere una conversazione funzionale, per così dire. Esiste davvero nessuna differenza, a parte questo? –

4

La più grande differenza tra F # e IronPython è che:

F # è un linguaggio statico

e

IronPython è dinamica .

Mentre a livelli piccoli (ad esempio uno script di 100 righe), i linguaggi dinamici e statici non hanno molta differenza. Quando si tratta di progettazione di software/design di componenti, queste due lingue hanno due diversi modelli di pensiero. Anche il sistema dei tipi in F # è molto più potente di Python.

+4

Sono un po 'curioso di cosa intendi con "Il sistema di tipi in F # è anche molto più potente di Python.". Puoi elaborare? –

+3

I tipi sono un po 'non un problema in Python; EAFP significa che puoi sostanzialmente ignorarli. Questo porta ad un po 'di potente polimorfismo (Vuoi fantastici 'archi'? Solo ereditari, tutto funzionerà ancora!), Ma anche a qualche bug piuttosto sgradevole (oh, volevo moltiplicare due interi, ma oops, uno in realtà è un elenco, e ora aiuto ! La mia lista è davvero grande!). F #, d'altra parte, utilizza il potente sistema di tipi di ML. Ciò significa che risolve i tipi che dovrebbero essere le cose per te e controlla * in fase di compilazione * che tutto sia OK. Questo impedisce molti bug, ma a volte può essere fastidioso. – katrielalex

+0

in questi giorni sta diventando più complesso di "statico" vs "dinamico". Praticamente tutte le lingue esistono da qualche parte nel continuum e non all'uno o all'altro estremo. Ad esempio, se l'unica caratteristica del linguaggio dinamico che ti interessa è la digitazione anatra, F # può gestirlo tramite il suo sistema di vincoli di tipo piuttosto ricco. – sblom

4

Le due principali differenze tra F # e ironpython sono:

  1. F # è staticamente tipizzato, mentre ironpython non lo è.
  2. La base di F # è la programmazione funzionale mentre la base di Iron Python è la programmazione orientata agli oggetti. (Con entrambi un buon supporto per altri paradigmi)

Queste sono differenze relativamente importanti e portano direttamente ai principali motivi pratici per preferire l'una sull'altra.

Come hai detto, Iron Python è più lento di F # a causa della mancanza di digitazione statica. Nei benchmark Computer Language, Iron Python è 25x nella mediana e 120 volte più lento nel caso peggiore.Quindi, se le prestazioni di runtime sono una considerazione, è preferibile F #.
http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=ironpy&lang2=fsharp

poiché entrambi sono NET, ciascuna in grado di utilizzare le librerie degli altri con solo un po 'di lavoro. Quindi non vedo questo come un grosso problema, anche se suppongo che sia possibile utilizzare SciPy in IronPython, mentre sarebbe faticoso da F #, e la migliore libreria libera corrispondente per F # non è altrettanto buona.

La programmazione funzionale può essere uno stile molto potente e consente a F # di avere alcune potenti funzionalità come i flussi di lavoro, inclusi i flussi di lavoro asincroni che sono ben supportati dalle librerie F #. È possibile emulare grossolanamente tali cose in Iron Python, ma non funzionerebbe in modo altrettanto fluido, in parte a causa della mancanza di supporto nelle librerie.

L'orientamento degli oggetti è più familiare a molti programmatori e potrebbero preferire Python per questo motivo.

La tipizzazione statica consente inoltre a un IDE di fornire un supporto migliore ai programmatori. Il tipo di ciascuna variabile può essere segnalato al programmatore (passando con il passaggio del mouse in VS) e il feedback sugli errori può essere fornito mentre il codice viene modificato. Come docente universitario posso dire che questo feedback immediato è estremamente utile per i miei studenti mentre stanno imparando F #. Ciò consente loro di gestire programmi più complessi di quanto potrebbero altrimenti.

La digitazione dinamica a volte consente di scrivere programmi piccoli e semplici leggermente più rapidamente. Se questa è l'unica codifica che farai, allora potrebbe essere preferibile Python. Ma, se c'è una possibilità che un programma cresca in qualcosa di più grande, allora preferirei F #.

0

L'interpretazione dinamica di Ironpython brilla in alternativa alla monotona sintassi javascript negli agenti utente del browser client. Il controllo di tipo statico di F # che copre i tipi personalizzati consente a SI o a qualsiasi libreria portatile di tale sistema di misura, in modo che il recupero dei dati di back-end dai cloud possa rimodellarli come informazioni utili in modo più significativo. Mentre come la maggior parte dei linguaggi di programmazione possono essere usati in modo intercambiabile con queste e altre cose, queste citazioni mostrano punti di forza completamente separati dalle due all'interno delle app client. F # svolge un ruolo fondamentale nell'app composita, mentre Ironpython svolge un ruolo all'interno dell'interazione basata sul browser utente-agente.
Il controllo di tipo statico di F # e lambda potrebbero semplificare ASP.net in diverse occasioni orientate agli oggetti più vicine al livello di ASP classico. Ironpython consente l'estensibilità dell'applicazione tramite script modificabili dall'utente e estensioni plug-in di terze parti che sono state popolari non solo con i browser, ma anche con i lettori multimediali, i dream-weaver e altri editor.
Ironpython può essere rielaborato in parti di python e .net dipendenti che prevedono casi d'uso di riusabilità. F # fino ad ora funge da paradigma funzionale del paradigma orientato agli oggetti secondo l'altro .net