La extensión de aplicación C # .NET - construir un lenguaje de programación personalizada o no?

StackOverflow https://stackoverflow.com/questions/1324904

Pregunta

Tengo que construir una interfaz de scripting para mi programa de C # que hace pruebas de nivel de sistema de firmware embebido.

Mi aplicación contiene las bibliotecas de interactuar plenamente con los dispositivos. Hay bibliotecas separadas para iniciar acciones, consiguiendo de salida y el seguimiento de éxito / fracaso. Mi aplicación también cuenta con una interfaz gráfica para la gestión de múltiples dispositivos y la asignación de muchas secuencias de comandos para ejecutar.

Para los probadores (no programadores, pero técnica), lo que necesito para proporcionar una interfaz de programación que les permitirá llegar a diferentes escenarios para la prueba y ejecutarlos. Ellos sólo van a llamar a mis API y luego devolver un resultado a mi programa (pasa / falla y el mensaje).

Un ejemplo muy básico de lo que quiero:

TURN_POWER_ON
TUNE_FREQUENCY frequency
WAIT 5
IF GET_FREQUENCY == frequency
  REPORT_PASS "Successfully tuned to " + frequency
ELSE
  REPORT_FAIL "Failed to tune to " + frequency
ENDIF
TURN_POWER_OFF

Cuando las funciones de información, potencia y frecuencia son proporcionados por mis bibliotecas de C #.

Will algo así como IronRuby o IronPython ser bueno para esto, o debo construir mi propio lenguaje muy básico?

¿El código Ruby / Python causar problemas cuando se trata de incluir un montón de .NET ensamblados compilados? Yo quiero que sea fácil de aprender y de código para los no programadores y programadores por igual.

EDIT:

Gracias por todas las grandes respuestas. Elegí IronPython como la respuesta ya que tenía el mayor apoyo, pero voy a pasar un poco de tiempo con cada uno de IronPython, Boo y IronRuby para ver lo que los probadores preferirían escribir guiones en.

¿Fue útil?

Solución

He oído cosas muy buenas de IronPython para exactamente este tipo de escenario. Sin duda me arriesgo a pasar unas horas en una prueba de concepto rápida, para ver cómo se filtra hacia fuera.

Michael Foord estará feliz lírico sobre el éxito de IronPython en casos similares (más específicamente para él, para hojas de cálculo usuarios conocedores), y su libro cubiertas (IIRC) algunas sugerencias sobre lo aloja de .NET.

Otros consejos

Es posible que desee buscar en Boo , otro lenguaje administrado que se ejecuta en el CLR, y que es especialmente adecuado para construir DSL y hacer que sus aplicaciones de secuencias de comandos.

La tubería de compilación es extensible directamente desde el lenguaje mismo.

Boo Manifiesto es un buen punto de partida si desea obtener más información al respecto .

[ Editar ] se me olvidó mencionar que Ayende Rahien está escribiendo una libro completo sobre el tema: Edificio de dominio de idiomas específicos en Boo

Podría valer la pena considerar PowerShell para este tipo de tarea. Eso puede poner en .Net al igual que cualquiera de los idiomas DLR, y tiene un tipo de lenguaje más natural fragmentación de tareas en su cmdlet (command-let) concepto. Usted tiene que escribir los cmdlets en un lenguaje compilado en v1 - v2 en el que se está implementando a partir de Win7 y trabajando para versiones anteriores en los próximos meses (v2 para Vista / Win2k8 está en el RC ahora), se puede construir los en PowerShell directamente.

Estoy de acuerdo con Marc G, aunque vale la pena mencionar que el concepto general es un langugage de dominio específico. Mientras IronRuby / IronPython no son estrictamente de dominio específico, son con todas las funciones y dejarían que pueda continuar con su aplicación.

Visual Studio cuenta con las herramientas de DSL, y hay la 'M' Gramática cosas que se pueden considerar.

Pero sí, IronPython.

A partir de la DSL que vamos a dar, te recomiendo utilizar pepino con IronRuby.

Con el pepino, los probadores de escribir pruebas que parecen algo así:

Scenario: See all vendors
Given I am logged in as a user in the administrator role
And There are 3 vendors
When I go to the manage vendors page
Then I should see the first 3 vendor names

Es muy fácil de hacer este lenguaje se ajuste a sus necesidades. Sólo Google "Pepino y IronRuby" y encontrará varias guías y entradas de blog para empezar.

Estamos utilizando inmersos ironpython fórmula para fijar el precio de uno de nuestro proyecto. Así es como una muestra real sobre cómo se ve.

E_DOCUMENT_CHECK = DCPAV * ADS_NUM
E_SPECIFIC_TAX = STV
E_RESOURCE_DEV = RDV
E_LP_ISSUANCE = LPIV
E_ANNUAL_FEES = APFCV * SA * SIDES_NUM
E_SERVICE_FEES= MAX(
MINSFV,
E_DOCUMENT_CHECK+E_SPECIFIC_TAX+E_RESOURCE_DEV+E_LP_ISSUANCE+E_ANNUAL_FEES)
TOTAL= E_DOCUMENT_CHECK+E_SPECIFIC_TAX+E_RESOURCE_DEV+E_LP_ISSUANCE+E_ANNUAL_FEES+E_SERVICE_FEES

Es muy sencillo de implementar. La función Max (), por ejemplo, es sólo uno de los método personalizado C # que importamos al motor IronPython y parece natural utilizar en una configuración.

Se podía utilizar C # sí mismo como el lenguaje de script como se describe aquí CrowsProgramming - Tiempo de ejecución de secuencias de comandos en .Net

IronRuby es el más potente para la creación de lenguajes específicos de dominio, porque es la sintaxis es mucho más flexible y tolerante que pitón del (los usuarios van a atornillar el espacio en blanco y se molesta por la obligatoria () para llamar a métodos).

Se puede escribir la secuencia de comandos de ejemplo en IronRuby y que se vería así:

TURN_POWER_ON
TUNE_FREQUENCY frequency
WAIT 5
if GET_FREQUENCY == frequency
  REPORT_PASS "Successfully tuned to " + frequency
else
  REPORT_FAIL "Failed to tune to " + frequency
end
TURN_POWER_OFF

He aquí una muestra de un DSL nuestros probadores están utilizando actualmente para escribir pruebas automáticas contra nuestra interfaz de usuario

window = find_window_on_desktop "OurApplication"
logon_button = window.find "Logon"
logon_button.click

list = window.find "ItemList"
list.should have(0).rows

add_button = window.find "Add new item"
add_button.click
list.should have(1).rows

Sin embargo, en la situación en este momento IronPython es mucho más maduro y tiene mucho mejor rendimiento que IronRuby, por lo que prefieren usar eso.

Me fuertemente recomendaría ir ya sea con IronPython o IronRuby sobre la creación de su propio idioma a medida ... se ahorrará una cantidad inimaginable de esfuerzo (y errores)

La ironía también podría ser un buen candidato aquí. He aquí un ejemplo que crea la animación de la imagen dada sobre la marcha.

Set camera size: 400 by 300 pixels.
Set camera position: 100, 100.
Move 200 pixels right.
Move 100 pixels up.
Move 250 pixels left.
Move 50 pixels down.

El tutorial para la creación de tales DSL está aquí: Escribir su primer dominio específico del lenguaje

Es un viejo tutorial, pero el autor aún mantiene su biblioteca aquí: Github Ironía

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top