2010-09-22 18 views
15

Para un proyecto en el que estoy trabajando actualmente, estoy buscando incorporar un motor de scripts en mi código C++ para permitir cierta extensibilidad en el futuro. La aplicación requerirá una buena cantidad de procesamiento de texto y el uso de expresiones regulares dentro de estos scripts.Python vs Lua para el motor de procesamiento de secuencias de comandos/texto incorporado

Sé que Lua es generalmente la industria querida cuando se trata de secuencias de comandos incrustadas, pero también sé que no admite expresiones regulares (al menos de fábrica). Esto me está haciendo inclinarme hacia python para que mi lenguaje se incruste, ya que parece tener el mejor soporte detrás de Lua y aún ofrece poderosas capacidades de expresión regular.

¿Es esta la elección correcta? ¿Debería estar mirando otro idioma? ¿Hay alguna razón por la que debería darle una segunda mirada a Lua?

+4

es Lua, no LUA – Javier

+1

La clave de esta pregunta es equilibrar lo que obtienes frente a los aros que el lenguaje te hará saltar, algo que solo parece estar explícitamente abordado en la respuesta de Roger. –

+1

Lua tiene una coincidencia de patrón fuera de la caja aunque no es POSIX reg exps - http://www.lua.org/pil/20.2.html –

Respuesta

17

si necesita específicamente lo que comúnmente se conoce como 'expresiones regulares' (que no son para nada regulares), entonces tiene dos opciones:

  1. ir con Python. que está incluido expresión regular es bastante similar a Perl y sed/grep
  2. uso Lua y una externa PCRE library

si, por el contrario, necesita alguna buena coincidencia de patrones, puede quedarse con Lua y ya sea:

  1. usan la coincidencia de patrones incluida de Lua, que no están en la tradición grep pero son bastante capaces. La funcionalidad que falta son las alternativas de subpatrón (|)
  2. usan LPEG, que son más más potentes que las expresiones regulares, y generalmente también más rápidas.

Como puedes ver, soy un gran fan de la última. No solo le permite definir patrones muy complejos pero determinísticos, sino que es una herramienta completa de gramática que puede usar para crear un analizador completo. Si lo desea, la gramática se puede describir en una única constante de cadena de varias líneas, con sus propios ganchos definidos para capturar datos y construir sus estructuras.

Lo he utilizado para cortar rápidamente un analizador JSON, una llamada C-árbol, una biblioteca xRuta, etc.

+3

Los patrones incorporados incluyen un truco que PCRE y similares tienen muchos problemas para hacer: emparejamiento equilibrado de paréntesis con '% b()'. Se puede usar cualquier par de caracteres distintos; el elemento coincide con cadenas que comienzan con '(', terminan con ')', y donde '(' y ')' están equilibrados. – RBerteig

+0

Como nunca antes había programado nada más que una simple extensión de World of Warcraft en Lua, ¿puedes hablar sobre las habilidades para diseñar clases y funciones avanzadas? Sé que es compatible con la programación orientada a objetos, pero solo he oído que se usa para aplicaciones bastante simples. Puedo prever que mis desarrolladores lo usen para funciones avanzadas de aprendizaje automático, así como para la comunicación de red. He hecho todo esto en Python sin ningún problema. ¿Es Lua tan directo para estas cosas? –

+1

@Wade Tandy: es un tema muy importante. De hecho, Lua no 'viene con' las instalaciones OOP, pero su sintaxis admite muchos estilos OO diferentes. para la mayoría de los usos, basta con un par de líneas para crear metatars apropiados. pero si necesita una herencia completa basada en clases estática, rápidamente se convierte en un proyecto no trivial en sí mismo. en mi caso, casi nunca he querido un POO basado en clases. la encapsulación y el polimorfismo son las ventajas reales de OOP, y los obtienes casi automáticamente con un poco de disciplina de código – Javier

3

no se olvide el gran padre de todos ellos - TCL

hay un C++ envoltura para tcl que hace que sea muy fácil de incrustar

lo estoy usando en un proyecto actual

en proyecto anterior (C#) Usé lua sobre python. En proyectos anteriores de C#, había usado Python; Elegí lua porque la sintaxis es más normal para el scripter promedio (utilizado para vbscript o javascript). Sin embargo, volveré a cambiar a (iron) python para el próximo proyecto C#; Lua es demasiado oscura

para C++ siempre voy a utilizar a partir de ahora TCL

EDIT: Mi nuevo favorito es jint (.net javascriptt intérprete) v fácil de usar, interfaz agradable. Y nadie puede quejarse sobre el lenguaje dado que js es el lenguaje genial en el momento

+0

+1 para TCL ¡respuesta! – SingleNegationElimination

+0

Tcl fue diseñado desde cero para este tipo de trabajo, y sigue siendo el mejor. ¡Solo puedo suponer que los autores originales de Lua simplemente no habían oído hablar de eso! – Gaius

+0

@Gaius Tcl es, en el mejor de los casos, un lenguaje "estrafalario" y eso es especialmente cierto en versiones anteriores que habrían existido cuando se creó originalmente Lua (principios de los 90). Incluso si hubieran oído hablar de tcl, es posible que simplemente no les haya gustado ... (su extravagancia hizo que fuera objeto de mucho debate por parte de aquellos que preferirían tener un lenguaje más "real") – snogglethorpe

7

Python y C++ integración es ayudado en gran medida con boost.python.Puede encontrar esto mucho más conveniente si los que están familiarizados con su fuente C++ son principalmente los que escriben scripts.

Incluso si los scripters no están familiarizados con su fuente particular, si están más familiarizados con la sintaxis tipo C (C, C++, etc.), deberían encontrar Python más fácil de usar, quizás solo ligeramente, Lua isn no es difícil. Los buenos programadores pueden usar una multitud de idiomas de todos modos, pero no has dado ninguna información sobre tu audiencia.

Lua es mucho más fácil para sandbox que Python, por lo que si debe restringir lo que los scripts pueden hacer (por ejemplo generar procesos adicionales, leer archivos), eso puede descartar Python.

+0

boost.python? Suena interesante. ¿Qué tan bueno es para que no te preocupes por el estado de Python? –

+0

@Charles: ¿Estado de intérprete interno, como el que tiene que preocuparse cuando usa la API C de Python? Todavía no tuve que pensar en eso con boost.python, pero tampoco lo he usado extensamente. –

+0

Derecha y problemas de límite con los administradores de memoria. Las preguntas frecuentes de boost.python dicen que no funciona con varios subprocesos sin un poco de cuidado. –

5

Al haber incorporado Lua en uno de mis proyectos C, sugeriré Lua, ya que es más fácil.

Pero eso depende de lo que tu lenguaje de scripting deba ser capaz de hacer. Lua se elevó al lenguaje de scripting de facto de los juegos. Si necesita capacidades de scripting avanzadas, puede usar Python, pero si es solo para facilitar el scripting, tome Lua. Por lo que he visto, Lua es más fácil de aprender para los recién nacidos, que no están acostumbrados a las secuencias de comandos.

Argumentaría, que Lua es más ligero, si necesita paquetes externos, puede agregarlos, pero el punto es que la parte atómica de Lua es mucho más pequeña que la de Python.

Cuestiones relacionadas