tutorial - para que sirve c#
Extensión de la aplicación C#.NET: ¿crear un lenguaje de scripting personalizado o no? (8)
Necesito construir una interfaz de scripting para mi programa C # que hace pruebas de nivel del sistema del firmware incorporado.
Mi aplicación contiene bibliotecas para interactuar completamente con los dispositivos. Existen bibliotecas separadas para iniciar acciones, obtener resultados y realizar un seguimiento de éxito / falla. Mi aplicación también tiene una GUI para administrar múltiples dispositivos y asignar muchos scripts para ejecutar.
Para los evaluadores (no programadores, pero técnicos), necesito proporcionar una interfaz de scripting que les permita crear diferentes escenarios para probarlos y ejecutarlos. Simplemente llamarán a mis API y luego devolverán un resultado a mi programa (aprobado / reprobado y 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
Donde las funciones de informe, potencia y frecuencia son proporcionadas por mis bibliotecas C #.
¿Sería bueno algo como IronRuby o IronPython para esto, o debería simplemente construir mi propio lenguaje básico?
¿El código de Ruby / Python se vuelve complicado al tratar de incluir un grupo de ensamblados compilados de .NET? Quiero que sea fácil de aprender y codificar para no programadores y programadores por igual.
EDITAR:
Gracias por todas las buenas respuestas. Elegí IronPython como la respuesta, ya que tenía más soporte, pero pasaré un poco de tiempo con cada uno de IronPython, Boo e IronRuby para ver en qué los probadores preferirían escribir los scripts.
Estoy de acuerdo con Marc G, aunque vale la pena mencionar que el concepto general es un Langugage específico del dominio. Si bien IronRuby / IronPython no son estrictamente específicos de un dominio, tienen todas las funciones y te permitirán continuar con tu implementación.
Visual Studio tiene las herramientas DSL, y está el material ''M'' Grammar que puedes ver.
Pero sí, IronPython.
He escuchado cosas muy buenas sobre IronPython para exactamente este tipo de escenario. Ciertamente me arriesgaría a pasar unas horas con una prueba de concepto rápida, para ver cómo funciona.
Michael Foord será muy optimista sobre el éxito de IronPython en casos similares (más específicamente para él, para usuarios expertos en hojas de cálculo), y en sus portadas de libros (IIRC) algunos consejos sobre cómo alojarlo desde .NET.
Puede valer la pena considerar PowerShell para este tipo de tarea. Puede invocar .Net como cualquiera de los lenguajes de DLR, y tiene un tipo de lenguaje más natural para las tareas en su concepto de cmdlet (command-let). Debe escribir los cmdlets en un lenguaje compilado en v1, en v2 que se está iniciando con Win7 y trabajando para versiones anteriores en los próximos meses (v2 para Vista / Win2k8 ahora está en RC), puede compilarlos en PowerShell directamente.
Desde la DSL que estás buscando, te recomendaría usar CUCUMBER con IronRuby.
Con Cucumber, los probadores escriben pruebas que se ven 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 hacer que este idioma se ajuste a sus necesidades. Simplemente busque en Google "Cucumber and IronRuby" y encontrará varias guías y publicaciones en blogs para que pueda comenzar.
Es posible que desee ver Boo , otro lenguaje administrado que se ejecuta en el CLR, y que es especialmente adecuado para construir DSL y hacer que sus aplicaciones sean programables.
La canalización de compilación es directamente extensible desde el lenguaje en sí.
Leer el Manifiesto de Boo es un buen punto de partida si desea obtener más información al respecto.
[ Editar ] Olvidé mencionar que Ayende Rahien está escribiendo un libro completo sobre el tema: Creación de lenguajes específicos de dominio en Boo
Estamos utilizando Iron Python incorporado para la fórmula de fijación de precios en uno de nuestros proyectos. Así es como una muestra real de 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 realmente sencillo de implementar. La función Max (), por ejemplo, es solo uno de los métodos personalizados de C # que importamos al motor IronPython y parece natural de usar en una configuración de configuración.
Simplemente podría usar C # como el lenguaje de scripting como se describe aquí CrowsProgramming - Runtime Scripting en .Net
IronRuby es el más poderoso para crear lenguajes específicos de dominio, porque su sintaxis es mucho más flexible y tolerante que la de Python (tus usuarios van a atornillar el espacio en blanco y se molestarán por los métodos obligatorios () para llamar).
Podrías escribir tu script de muestra en IronRuby y 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
Aquí hay una muestra de un DSL que nuestros probadores utilizan actualmente para escribir pruebas automatizadas 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, tal como están las cosas ahora, IronPython es mucho más maduro y tiene un rendimiento mucho mejor que IronRuby, por lo que es posible que prefiera usarlo.
Recomiendo ir con IronPython o IronRuby a crear tu propio idioma personalizado ... Ahorrarás una cantidad inimaginable de esfuerzo (y errores)