Perché le persone riscrivono alcune librerie in molti linguaggi di programmazione?


13

Ci sono alcune librerie, che sono disponibili nelle loro versioni scritte in molti linguaggi di programmazione diversi, come ad esempio Lucene , che è scritto in Java (come si dice, puro al 100% Java), ma ha anche le sue versioni in C ++, C, Perl , Ruby, Lisp e alcune altre lingue. E sto parlando di implementazioni in questi linguaggi, non solo di interfacce FFI .

Perché la gente lo fa? Vedo una ragione ovvia: la distribuzione e la distribuzione (e probabilmente anche lo sviluppo) sono più facili quando un progetto ha meno dipendenze. Ma c'è qualcos'altro? In quali situazioni ne vale la pena?


4
Può essere molto costoso comunicare attraverso i confini naturali dell'ambiente di esecuzione.

1
@Thor: Eppure alcune lingue / ambienti incoraggiano positivamente l'attraversamento dei confini naturali (C è un esempio comune di questo, ed è un tema forte tra i programmatori Tcl). Ho il sospetto che si riferisca principalmente alla gestione della memoria (e talvolta di altre risorse); non è davvero utile avere due gestori di memoria nello stesso processo, soprattutto se non sono stati progettati per coesistere. Alla fine, suppongo che dipenda da quali ipotesi fai e quali operazioni a loro volta rendono inammissibili ...
Donal Fellows

Risposte:


16

Alcuni motivi per cui l'ho fatto (riscrivo il codice C in Haskell, nel mio caso):

  • implementazione più semplice: una sola catena di build
  • meno dipendenze (per ottenere più adozione)
  • più portatile (ad esempio Windows) se il codice è in una lingua di alto livello
  • aggiungere il supporto per il parallelismo non facilmente realizzabile a basso livello C
  • per rendere il codice un po 'più sicuro con le sue risorse
  • per rendere più affidabile il codice
  • più idiomatico (tipi forti, API più semplice, più riutilizzo)

19

In genere la reimplementazione di una libreria come "nativa" su una particolare piattaforma consente di:

  • Distribuzione e distribuzione più semplici
  • Debug più semplice
  • API più idiomatiche adatte alla tua piattaforma esatta
  • Prestazioni spesso migliori (l'interoperabilità con la piattaforma può essere una seccatura)
  • Risolvere i problemi di progettazione che sono ancora nell'originale per la compatibilità

Ad esempio, ho avviato il progetto Noda Time come porto di Joda Time . Semplicemente non è pratico usare Joda Time direttamente da .NET ... in realtà non è necessario creare una JVM solo per fare calcoli di data e ora, oltre a capire come fare l'interoperabilità tra il due. Una porta automatizzata (come J #) potrebbe essere stata fattibile, ma il risultato finale non sarebbe stato un'API piacevole e idiomatica da usare da C #.


11

Alcune persone lo fanno per aiutare ad imparare una nuova lingua. Prendono una lib con cui avevano familiarità in una lingua precedente, vedono che ce n'è bisogno nella nuova e iniziano a portarla su.

Il porting di qualcosa di familiare è il modo migliore per concentrarsi solo sulle parti linguistiche di una nuova lingua e non preoccuparsi davvero del dominio problematico.

Ha anche l'ulteriore vantaggio di, una volta fatto, non essere buttare via il codice come sarebbero molti progetti di esempio trovati in un libro o tutorial, può effettivamente essere qualcosa che la comunità può usare, aggiungere, refactoring, discutere, ecc.


0

A volte stai sviluppando per una piattaforma in cui lo strumento in cui è stato scritto il software (Java nel caso di Lucene) non è un'opzione. Se si desidera le funzionalità senza dover riprogettare il codice da zero, si esegue il porting del codice.

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.