2009-08-15 7 views
5

He estado trabajando en un programa C que realiza bastante manipulación de cadenas, y muy a menudo necesita ser retocado y recompilado para algún tipo de procesamiento de casos especiales. He estado pensando que incorporar el lenguaje de scripting con un buen soporte de manipulación de cadenas podría tener sentido para el proyecto.Lenguaje que se puede insertar con buena compatibilidad con la manipulación de cadenas

¿Qué idioma proporcionaría el mejor soporte de manipulación de cadenas mientras que es fácil de integrar en un programa C?

Para algunos antecedentes adicionales ...

  • rendimiento es bastante importante (sobre todo el tiempo de inicio)
  • Necesidades fácilmente ser compilados en múltiples plataformas (Linux, Solaris, Win32 (idealmente con MinGW), Darwin)
  • necesita ser un lenguaje que todavía van a estar en 5 años

he mirado un poco a Python (quizás peso demasiado pesado?) y Lua (tal vez no se centró en strin g manipulación?) pero realmente no sé lo suficiente sobre ellos o qué otras opciones podrían estar ahí fuera.

Respuesta

0

Perl. Su razón (original) de ser es la manipulación de cadenas.

+0

Pero no es para nada fácil de integrar dentro de un programa C por lo que entiendo. ¿Sabes diferente? –

+0

Nunca lo intenté, personalmente no he usado C/C++ mucho más allá de "Hello World". Sí, conozco al menos un proyecto de código abierto (creo que C++) que sí lo integra, si quieres explorar y ver cómo se hace. –

+0

Sí, ¿cómo se llama? –

3

La gente ha estado incrustando tcl en proyectos más grandes durante lo que parece ser edades. Ha pasado un tiempo desde que tuve que usar tcl para cualquier cosa ...

Una de las cosas que diferencia tcl de otros lenguajes de programación es que todo es una cadena.

Y para su referencia, aquí está el tcl documentation on string functions.

tcl puede ser más fácil de insertar que perl, pero tengo que estar de acuerdo con el razonamiento de @Matthew Scharley. Además, tcl no se conoce exactamente por su rendimiento, pero tal vez eso haya cambiado en los últimos años.

De todos modos, here is the tcl wiki link on embedding tcl in C applications, y una cita relevante de la página: "? ¿Cómo puedo incrustar un intérprete de Tcl en mi existente C (o C++) aplicación"

es una pregunta muy frecuente. Es sencillo, sin duda mucho más fácil que hacer lo mismo con Perl o, en general, Python; además, este tipo de "incrustabilidad" fue uno de los objetivos originales de Tcl, y muchos, muchos proyectos lo hacen. No hay discusiones completas sobre el tema disponible, pero podemos ofrecer una descripción general aquí. (GPR 14-Oct-2002)


Otra alternativa podría ser la de ir con Lua, como usted ha mencionado, al tiempo que amplía con otra biblioteca de cadenas C de su elección (Google se convierte en imagen The Better String Library, por ejemplo) .

Una vez que haya compilado Lua en su aplicación, you can "extend" C functions to Lua's interpreter. O tal vez the built-in string functions son adecuados para usted.

Sin duda tiene algunas opciones.

10

Nunca me he arrepentido de haber usado Lua.

Es muy fácil de integrar en su aplicación. De hecho, ahora normalmente no escribo aplicaciones C, solo escribo C bibliotecas y las controlo desde Lua.

La manipulación del texto no es su mejor característica, pero sin duda es mucho mejor que C solo. Y la biblioteca LPEG hace que la construcción de analizadores sea casi trivialmente fácil, lo que avergüenza a cualquier expresión regular (pero aún tiene un par de sintaxis de tipo regex si usted las prefiere).

+3

En el nicho de lenguaje incrustado, Lua es simplemente perfecto: portabilidad pequeña y perfecta (subconjunto ANSI C estricto C++), sintaxis ordenada y simple, librería estándar mínima pero conveniente, facilidad de extensibilidad (me atrevo a decir que supera a Python allí), y muy buena documentación. Mi experiencia pasada con Lua no había sido más que positiva. Es posible que carezca de capacidades de manipulación de cadenas listas para usar, pero puede proporcionar fácilmente todas las funciones personalizadas que puedan ser necesarias para ese fin (expresiones regulares, etc.). –

+2

+1 para escribir bibliotecas C controladas desde Lua. Eso se ha vuelto cada vez más común para mí también. – RBerteig

+0

No olvide que Lua gana bastantes concursos de referencia, y eso es antes de incorporar un compilador JIT para su bytecode. Y, un JIT también está disponible, vea http://luajit.org/ para los detalles sangrientos. – RBerteig

3

Miramos a Python y Lua para crear scripts para un producto .NET. El objetivo era proporcionar algo de scripability para los usuarios finales. La decisión recayó en Python porque los poderosos preferían cualquier cosa con el soporte de Microsoft para todo lo demás. Mi elección fue por Lua.

1

Algunas personas pueden estar en desacuerdo, pero Sara Goleman ha publicado a great book al extender e incrustar PHP. Que se está convirtiendo en uno de los idiomas más utilizados en ... :)

El soporte PHP String no es tan bueno como dice Perl, pero es muy útil.

¿He mencionado que está escrito en C? </my2cents >

+0

¿Cuáles son las ventajas de utilizar PHP como lenguaje incrustado? Cualquiera de estos suele ser específico del dominio, por lo que la gran popularidad en otros lugares no es un factor importante. Y PHP tiene muchos detractores como un lenguaje en sí mismo. –

1

Python no es pesado en absoluto! Es bastante sencillo de integrar (aquí está el official guide, pero también puedes encontrar muchos tutoriales), muy potente, excelente para el procesamiento de cadenas y un lenguaje agradable y fácil de usar en general. Tiene una gran comunidad de usuarios y una base de apoyo, lo cual es una ventaja.

Python también se ha integrado en una gran cantidad de aplicaciones de la vida real. Un buen ejemplo en el que puedo pensar de inmediato es el juego Civilization IV, la mayoría de los cuales se ejecuta en scripts de Python sobre una API de C++.

3

Hay un buen papel encuesta sobre los méritos relativos de las API de sellado, de varios lenguajes de script:

H. Muhammad and R. Ierusalimschy. C APIs in extension 
and extensible languages. Journal of Universal Computer 
Science, 13(6):839–853, 2007. 

Mirando a la combinación de ambos excelentes manipulación de cadenas y una excelente API de inserción, sugeriría, en orden:

  • Ruby: Excelente soporte de cadenas, incluyendo soporte de sintaxis para regex. API incrustada bien diseñada, muy fácil de usar.
  • Lua: No estoy seguro de cómo es su soporte de cadena, pero se supone que es un gran lenguaje para incrustar.
  • Python: funciones de cuerdas menos fáciles de incrustar, un poco más difíciles de usar que Ruby. Pero tiene Pyrex, por lo que podría ser una forma más fácil de incrustarlo.
  • PHP: Nasty API, desagradable. El SAPI incorporado es realmente un ciudadano de segunda clase, pero funciona. Hay muchas funciones de manipulación de cadenas. Aún así, no lo recomendaría.
  • Perl: desagradable de incrustar (por lo que he oído), el soporte de cadena podría ser mejor.

No puedo hacer ningún comentario sobre TCL, pero he oído que está diseñado para incrustación.

4

Lua se destaca por encima de otras opciones.

... mejor soporte de manipulación de cadenas mientras que es fácil de integrar?

Lua es diseñado para incrustarse en C; la API es clara y fácil de usar; la documentación es excelente

Algunas otras respuestas han denigrado las capacidades de cadena de Lua. Creo que están subestimando a Lua. Las capacidades de cadena de Lua realmente encuentran un punto ideal entre "solo concatenación" y la completa complejidad de las expresiones regulares. La capacidad de formateo de cadenas es muy fuerte, y la acumulación de cadenas a través de "búferes" o tablas es simple y eficiente.

La exploración de cadenas es, en mi opinión, una de las mejores partes del diseño. No tiene "o" patrones, pero de lo contrario le da una gran fracción de lo que obtiene de las expresiones regulares, incluida una función de "captura" muy poderosa y elegante. Por ejemplo, puedo convertir una cadena en hexadecimal mediante la captura de cada personaje y la aplicación de una función a la misma:

s:gsub('.', function(c) return string.format("%02x", string.byte(c)) end) 

O puedo escapar no alfanuméricos, los caracteres no-espaciales en octal:

s:gsub('[^%w%s]', function(c) return string.format([[\%03o]], string.byte(c)) end) 

Algunas de las características que se exhiben aquí:

  • El carácter de escape para la exploración cadena es %, que es diferente del carácter de escape para comillas de cadena, que es \. Esta decisión es brillante y debe ganar un premio por sí mismo :-)

  • Existen varios mecanismos para citar las cadenas literales, incluyendo [[...]] en la que hay personajes tienen que ser escapado. Si quieres generar o unir cadenas con barras invertidas en ellas (como LaTeX, por ejemplo), esto es un regalo del cielo.

Si usted quiere todo el poder de un programa de análisis independiente del contexto, siempre se puede utilizar LPEG, una biblioteca escrita por uno de los diseñadores de Lua.

rendimiento es bastante importante (sobre todo el tiempo de inicio)

Lua constantemente gana premios por rendimiento. El inicio es muy rápido: todo el sistema (incluidos el compilador, la biblioteca, el recolector de basura y el sistema de tiempo de ejecución) se ajusta a 150 KB. Para evitar tiempos de pausa, Lua proporciona una recolección de basura incremental. Ver también la pregunta SO Why is Lua faster than other scripting languages?

Usted puede hacer que el inicio más rápido de la precompilación de las secuencias de comandos, pero nunca he encontrado que es necesario hacer este código — y debido compilado (en contraposición al código fuente) no es portátil, la compilación previa generalmente crea más dolor de cabeza de lo que resuelve.

Necesidades fácilmente ser compilados en múltiples plataformas

Lua compila utilizando pura ANSI C y ni siquiera requiere POSIX. Tengo una versión ejecutándose en mi PalmOS PDA.

Tiene que ser un idioma que seguirá existiendo dentro de 5 años.

Lua existe desde 1993. Además, los dos miembros del equipo que brindan más apoyo son profesores titulares de PUC-Rio. Lua es su sustento. Finalmente, todo el sistema es solo 17,000 líneas de código. Si Rio se cayó del mapa mañana, cualquiera con un buen curso de compilación de pregrado podría elegir el sistema y mantenerlo. Habría muchos voluntarios.

He mirado un poco a Python y Lua, pero realmente no sé lo suficiente sobre ellos

ver que cuestionan Which game scripting language is better to use: Lua or Python?.

Cuestiones relacionadas