nesC (pronunciado "NES-ver") es una basada en componentes , basada en eventos lenguaje de programación utilizado para aplicaciones de generación para el TinyOS plataforma. TinyOS es un entorno operativo diseñado para ejecutarse en dispositivos integrados que se utilizan en redes distribuidas de sensores inalámbricos . nesC está construido como una extensión del lenguaje de programación C con componentes "conectados" entre sí para ejecutar aplicaciones en TinyOS. El nombre nesC es una abreviatura de "sistemas integrados de red C".
Componentes e interfaces
Los programas de nesC se construyen a partir de componentes que se ensamblan ("cableados") para formar programas completos. Los componentes tienen simultaneidad interna en forma de tareas. Los hilos de control pueden pasar a un componente a través de sus interfaces. Estos subprocesos tienen sus raíces en una tarea o en una interrupción de hardware.
Los componentes pueden proporcionar o utilizar interfaces. Las interfaces proporcionadas están destinadas a representar la funcionalidad que el componente proporciona a su usuario, las interfaces utilizadas representan la funcionalidad que el componente necesita para realizar su trabajo.
En nesC, las interfaces son bidireccionales: especifican un conjunto de funciones que debe implementar el proveedor de la interfaz (comandos) y un conjunto que debe implementar el usuario de la interfaz (eventos). Esto permite que una sola interfaz represente una interacción compleja entre componentes (por ejemplo, registro de interés en algún evento, seguido de una devolución de llamada cuando ocurre ese evento). Esto es fundamental porque todos los comandos largos en TinyOS (por ejemplo, enviar paquetes) no son bloqueantes; su finalización se señaliza mediante un evento (envío realizado). Al especificar interfaces, un componente no puede llamar al comando send a menos que proporcione una implementación del evento sendDone. Normalmente, los comandos llaman hacia abajo, es decir, desde los componentes de la aplicación a los más cercanos al hardware, mientras que los eventos llaman hacia arriba. Ciertos eventos primitivos están vinculados a interrupciones de hardware.
Los componentes están vinculados estáticamente entre sí a través de sus interfaces. Esto aumenta la eficiencia del tiempo de ejecución, fomenta un diseño robusto y permite un mejor análisis estático de los programas.