Design: Lisp (o altro linguaggio di scripting) come interfaccia interattiva per C ++?

3

Sto lavorando su un progetto C ++ di medie dimensioni (probabilmente finirò per circa 50k linee) e dovrò fornire un'interfaccia terminale interattiva. Il programma produce dati scientifici come output e l'interfaccia interattiva consente a un ricercatore di modificare una rappresentazione visiva di ciò che verrà calcolato prima di completare effettivamente il calcolo.

Non sono appassionato di programmi interattivi che definiscono il proprio linguaggio poiché sono tutti diversi (che portano a confusione) e se supportano molte funzioni quasi richiedono allo sviluppatore di implementare un interprete di "corretto" parser per sintassi.

Mi piacerebbe anche la possibilità di definire i file di configurazione "intelligenti" usando questo programma (evitando così la necessità di copiarlo esternamente).

Mi sembra che la risposta corretta sia quella di implementare un linguaggio di scripting esistente con una propria libreria di supporto che possa creare callback in C ++. Da quando gioco con Common Lisp di recente ho deciso di provare a farlo usando ECL (follemente eccessivo per i miei scopi) e ho associato le funzioni a Lisp e ho creato un Lisp REPL in grado di eseguire questi callback.

Mentre questo funziona più o meno, questo non sembra essere il caso d'uso per cui ECL è stato progettato, dal momento che devo fare un grande sforzo per estrarre l'input dell'utente in modo sicuro, e io m utilizzando pochissime funzionalità.

Questa non è una richiesta per un suggerimento di libreria (anche se accetterei felicemente anche una risposta), ma una domanda metodologica. I miei utenti non sono eccessivamente abituati a molti linguaggi di programmazione (il dipartimento utilizza principalmente IDL), ed è raro che venga utilizzata qualsiasi altra lingua. Un'implementazione Common Lisp completa sembra un vero e proprio maglio per rompere un dado e la sintassi sarà abbastanza estranea agli utenti (che per molti versi è quello che volevo evitare usando una lingua predefinita).

Sto esaminando il problema della costruzione di un ambiente REPL dalla direzione sbagliata - dovrei invece costruire il mio programma in una libreria e utilizzare un linguaggio interattivo con FFI contro di esso?

In sostanza:

  • Voglio aggiungere un sistema REPL like al mio programma C ++ affinché l'utente possa impostare i suoi dati.
  • Preferirei evitare di definire il mio dialetto / sintassi / linguaggio per questo scopo, invece di usare un interprete già pronto e richiamare semplicemente in C ++
  • Sarebbe bello avere la possibilità di usarlo per i file di configurazione "intelligenti", che hanno una logica al loro interno (flusso di controllo di base e aritmetica).
  • Facile da usare il più possibile per i non programmatori.

Se hai risolto questo problema / hai avuto un dilemma simile in passato sarei interessato a sentire i tuoi pensieri (ho capito che questo è piuttosto un argomento basato sull'opinione pubblica). Grazie!

    
posta Goobley 30.07.2015 - 01:29
fonte

4 risposte

6

In primo luogo, hai un falso dilemma. Se i tuoi utenti non sono programmatori e conoscono solo IDL, qualsiasi altra lingua (personalizzata o esistente) apparirà straniera a loro. Ma ciò non significa che non possano imparare qualcos'altro. In realtà, diresti che questo non è davvero un problema: dovrai scrivere un tutorial e indicarlo alla documentazione e ad altri materiali. Tutte le lingue sottostanti hanno una buona documentazione. Common Lisp è una lingua standardizzata.

Lua

Questo è coperto in un'altra risposta , ma lo raccomanderei comunque. Il linguaggio è fatto per essere incorporato e funziona bene con C ++.

Python

Boost.Python è un modo popolare di integrare codice C ++ e Python. Da quello che ho sentito, sembra che Python e soprattutto NumPy sia anche popolare per il calcolo scientifico.

Chiusura

Anche se non intendi usare Common Lisp, dai un'occhiata a CLASP (video ), che è un'implementazione di Common Lisp per C ++.

A full Common Lisp implementation seems like quite a sledgehammer to crack a nut and the syntax will be quite foreign to the users (which in many ways is what I wanted to avoid by using a pre-defined language).

Lo vedo dall'altra parte: invece di avere un mezzo linguaggio che funziona a malapena (non è diretto alle lingue sopra, ma a quelle personalizzate), un'implementazione Common Lisp completa ti dà un ambiente stabile e maturo. Non so di cosa siano i tuoi dati scientifici, ma il tuo utente potrebbe persino lavorare con Maxima direttamente dal tuo ambiente, che ha una sintassi infisso se vuoi.

Libreria / FFI

Am I looking at the problem of building a REPL-like environment from the wrong direction - should I instead build my program into a library and use an interactive language with FFI against it?

Questo è un modo possibile per farlo, ma onestamente non posso dire quale sia la soluzione migliore per te.

    
risposta data 30.07.2015 - 10:27
fonte
5

I tuoi requisiti descrivono Lua . Lua è progettata per essere incorporabile e funzionare come linguaggio di configurazione dichiarativo.

Altre opzioni che ho visto o utilizzato includono Tcl, Python e JavaScript.

Tutte queste lingue possono essere incorporate a vari livelli di lavoro e tendono ad essere abbastanza facili da usare per i non programmatori (che pensano di poter programmare).

    
risposta data 30.07.2015 - 05:45
fonte
2

Se vuoi davvero escludere alcune persone, usa FORTH.

Ottieni un'interfaccia di controllo interattiva (in notazione polacca inversa, ammettiamolo) E un linguaggio di programmazione (scripting).

In alternativa, puoi recuperare uno dei piccoli pacchetti XLISP o XScheme di David Betz. Come ho sentito, questo è fondamentalmente ciò che Autodesk usava per fare AutoLISP per AutoCAD, qualche decennio fa.

Xerox ha scoperto, su uno dei suoi prodotti di "office automation", che i segretari non avevano alcun problema a imparare a programmare in LISP, a condizione che (Xerox) non la chiamassero "programmazione", ma piuttosto qualcosa come " estensioni "o" personalizzazioni ". Penso che sia stato il dente di leone, ma non citarlo.

    
risposta data 30.07.2015 - 03:47
fonte
2

Potresti incorporare qualche interprete nella tua applicazione. Se ti piace il Lisp come faccio io, dovresti considerare l'incorporamento di GNU guile o librep etc ...

Vedi anche questo & che & che risposte

    
risposta data 30.07.2015 - 07:20
fonte

Leggi altre domande sui tag