Domanda

Esiste uno strumento che convertirà il codice sorgente in Perl in codice sorgente in C? Qualsiasi piattaforma va bene.

È stato utile?

Soluzione

C'è Perlcc che "traduce" perl in C.

Non è davvero un compilatore perl a C; Il suo output è semplicemente un pacchetto dell'interprete Perl e del bytecode analizzato del programma.

Altri suggerimenti

La risposta canonica a questo è "Perché non tradurre Perl in C?".

La risposta sarà praticamente "no". Perl è un linguaggio estremamente dinamico. C è una lingua per tipi di dati di dimensioni staticamente. Qualsiasi traduzione di Perl a C sarà probabilmente praticamente "eseguire questa chiamata di subroutine per simulare ripetutamente ciò che Perl". E c'è poco punto nella costruzione di un tale traduttore, in quanto è improbabile che esegui Perl molto più velocemente di Perl.

Ho scritto un programma piuttosto grande in Perl che crea PDF basato su query HTML e database che si comportano praticamente come un browser. Il volume del codice sorgente totale è superiore a 1 MB. I programmi valutano HTML, crea query SQL e recupera i dati, cerca immagini sul disco o le scarica dai server HTTP, crea una struttura di documenti, fa tutti i calcoli del layout e, infine, produce un PDF.

Ho dovuto scoprire come accelerare l'operazione in vari modi. Sulla base di ciò, dichiaro che Perl è abbastanza veloce e molti compiti completati in modo rapido e corretto a Perl richiedono molto tempo in C e persino C ++.

Esistono 2 modi per rendere perl lento o consumare la memoria: un gran numero di strutture di dati complesse - hanno bisogno di molta memoria - e un gran numero di calcoli. Sì, il calcolo è davvero molto lento in Perl. Un semplice termine come

$a = $b * $c

richiede molto tempo a Perl, ma molto veloce in qualsiasi lingua compilata. Gli operandi qui possono persino essere numeri interi, non variabili di punti fluttuanti: è lento. Immagino che questo sia il motivo per cui Perl ha un punteggio piuttosto negativo nel concorso di sparatutto linguistico [http://shootout.alioth.debian.org/ lasting( il gioco di benchmark del linguaggio del computer).

Ho trovato il mio programma piuttosto grande: utilizza molti core perl e moduli CPAN aggiuntivi per iniziare rapidamente, nonostante siano stati interpretati.

Funziona molto bene ... fino a quando non si tratta del calcolo delle dimensioni del testo e delle coordinate di layout. Questo è molto tempo che richiede tempo. Dopo aver affermato questo, ho scritto piccoli programmi di test perl solo facendo milioni di calcoli aritmetici e li ho trovati molto lenti.

Inoltre, sto usando e approccio orientato agli oggetti per modellare ogni elemento di layout. Ogni oggetto è rappresentato da un hash - questo è almeno circa 10 kyte per oggetto. Se c'è una grande quantità di dati da stampare, un consumo di memoria di diversi 100 MByte non è insolito per quel programma.

Quindi, ho ancora una buona ragione per spostare la parte calcolando il layout in C, usando le strutture in cui ora ho hash con chiavi fisse e ho aritmetico intero C in cui ora Perl fa un lavoro lento.

Ma tutto il resto è stato fatto e testato rapidamente e funziona così in fretta che non vedo alcun motivo per cambiare. Trovo anche il codice Perl molto più conveniente da scrivere e testare rispetto al codice C. E molti moduli CPAN forniscono soluzioni che non devi allenarti da solo. Molti di loro sono ben testati e documentati.

Dopo questa dicussion piuttosto linghty concludo: se deve essere un programma di riga di comando o di comando, considera Perl. Ma se questo programma deve costruire enormi strutture di dati o molte aritmetiche, considera qualcosa di più veloce. A volte, può essere un programma perl con un modulo scritto in C.

Ci sono traduttori perl a C, ma nessuno è perfetto. Idealmente vorresti un traduttore che sia sia corretto che elegante. Ahimè, non puoi avere entrambi, il codice Perl semplice non è un codice C semplice equivalente, quindi devi avere una traduzione che non sia corretta al 100% o sia complessa come Perl stesso. Ciò ha portato alcuni a credere che non dovresti provare a tradurre Perl. Sarebbe più preciso dire che devi essere chiaro cosa vuoi ottenere dalla traduzione e non aspettarti miracoli.

Il 100% corretto è facile: se il tuo script perl è myperl.pl, allora il programma C void main(){system("perl myperl.pl")} Farà esattamente quello che farà myperl.pl; Questo è piuttosto inutile però. Il perlcc Il compilatore è un po 'più sofisticato, ma non sembra ancora dare molti benefici. Non l'ho notato perlcc essendo più veloce del semplice perl. Inoltre, mentre il codice perl può essere notoriamente difficile da leggere, preferisco print "Hello World\n" alla lunga mostruosità di 700 linee che perlcc lo traduce in. Non ho visto questi programmi produrre qualcosa che avrebbe superato un codice Codice e un codice C scritto. Otoh, se vuoi un compilatore perché non vuoi distribuire il tuo codice sorgente in modo non abbinato, quindi perlcc potrebbe fare miracoli.

Rperl può raggiungere gli accelerazioni, ma è molto limitato in ciò che può tradurre.

Per un esempio di traduttore "elegante ma non corretto", consultare il prototipo perl2c ++. PL. Questo funziona sostituendo (alcuni) perl-ism standard con ISM C ++. C ++ è stato scelto perché è un linguaggio di alto livello come Perl, ma condivide ancora la stessa etica a metallo nudo di C.

Nel caso di un semplice generatore di numeri pseudo-casuali LCG LCG.pl, l'output di perl2c++.pl è un codice C ++ pulito e succinto che esegue dozzine di volte più velocemente del perl originale e non dipende da alcuna libreria perl. Potrebbe essere esteso a cercare tutte le risposte standard a "Come fare X su Perl" e sostituirlo con "Come fare X in C ++". Quindi potrebbe tradurre con successo molti script perl del mondo semplice ma reale e aiutare un essere umano a tradurre software perl non banale in un elegante codice C ++. Ciò sarebbe molto utile se ti ritrovi a scrivere software numerico a Perl che avrebbe dovuto essere scritto in C ++ in primo luogo.

Per il software per il quale Perl è adatto, ma vuoi solo andare un po 'più veloce, l'approccio JIT utilizzato da JavaScript (e alla fine Perl 6) è più promettente.

Il convertitore si chiama A programmatore, e il processo di conversione programmazione. Scherzi a parte, la lingua propria di Perl è così vasta e potente, che chiunque tentasse di scrivere un convertitore guarderebbe in basso a un compito per tutta la vita. Inoltre, l'effetto nel miglioramento delle prestazioni potrebbe non essere un ordine di grandezza, quindi perché preoccuparsi?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top