LabVIEW ha sido utilizado por millones de ingenieros y científicos para desarrollar sofisticadas aplicaciones de pruebas, medidas y control. Si bien LabVIEW proporciona una variedad de características y herramientas que van desde asistentes interactivos hasta interfaces configurables y definidas por el usuario, se diferencia por su lenguaje de programación gráfico de uso general (conocido como G) junto con un compilador integrado y asociado, un enlazador y herramientas de depuración.
Para comprender mejor el valor añadido de la programación gráfica de LabVIEW, es útil remontarse al primer lenguaje de programación de alto nivel. Al inicio de la edad moderna de la computación a mediados de los 50s, un pequeño grupo en IBM decidió crear una alternativa más práctica para programar la enorme unidad central IBM 704 (una supercomputadora en su época) en lenguaje ensamblador de bajo nivel, el más moderno disponible en aquel entonces. El resultado fue FORTRAN, un lenguaje de programación más legible cuyo propósito era acelerar el proceso de desarrollo.
La comunidad de ingeniería fue, en principio, escéptica de que este nuevo método pudiese superar los programas hechos a mano en lenguaje ensamblador, pero pronto se demostró que los programas generados con FORTRAN se ejecutaban casi tan eficientemente como aquellos escritos en ensamblador. Al mismo tiempo, FORTRAN redujo 20 veces el número de sentencias de programación necesarias, por lo que a menudo es considerado el primer lenguaje de programación del más alto nivel. Como era de esperar, FORTRAN rápidamente ganó aceptación en la comunidad científica y sigue siendo influyente.
Cincuenta años más tarde, hay todavía importantes enseñanzas en esta anécdota. Primero, durante más de 50 años, los ingenieros han buscado formas más fáciles y rápidas de resolver problemas a través de la programación de computadoras. En segundo lugar, los lenguajes de programación elegidos por los ingenieros para traducir sus tareas han tendido a ser de niveles más altos de abstracción. Esto nos ayudan a explicar la inmensa popularidad y la extensa adopción de G desde su aparición en 1986; G representa un lenguaje de programación de extremadamente alto nivel cuyo propósito es aumentar la productividad de sus usuarios ejecutándose a casi la misma velocidad que los lenguajes de programación de niveles inferiores como FORTRAN, C y C++.
LabVIEW es diferente de la mayoría de los otros lenguajes de programación de propósito general en dos formas principales. La primera, la programación G se desarrolla cableando iconos gráficos en un diagrama, el cual se compila directamente al código de máquina de tal manera que los procesadores pueden ejecutarlo. Aunque se representa gráficamente en lugar de texto, G contiene los mismos conceptos de programación que se pueden encontrar en la mayoría de los lenguajes tradicionales. Por ejemplo, G incluye todas las construcciones estándares como tipos de datos, ciclos, manejo de eventos, variables, recursividad y programación orientada a objetos.
Figura 1: Un ciclo While en G se representa por un ciclo gráfico que se ejecuta hasta que se cumple una condición de paro.
El segundo diferenciador principal es que el código G desarrollado en LabVIEW se ejecuta de acuerdo con las reglas del flujo de datos en lugar del enfoque más tradicional (en otras palabras, una serie secuencial de comandos para ser llevados a cabo) que se encuentra en la mayoría de los lenguajes de programación basados en texto como C y C++. Los lenguajes de flujo de datos como G (así como Agilent VEE, Microsoft Visual Programming Language y Apple Quartz Composer) promueven los datos como el concepto principal detrás de cualquier programa. La ejecución de un flujo de datos es dirigida por los datos o es dependiente de los mismos. El flujo de datos entre los nodos del programa, líneas no secuenciales de texto, determina el orden de ejecución.
Esta distinción puede ser menor, pero el impacto es extraordinario ya que presenta rutas de datos entre partes del programa para ser el enfoque principal del desarrollador. Los nodos en un programa de LabVIEW (en otras palabras, funciones y estructuras como ciclos y subrutinas) tienen entradas, procesan datos y generan salidas. Una vez que todas las entradas de los nodos determinados contienen datos válidos, el nodo ejecuta su lógica, produce datos de salida y pasa esos datos al siguiente nodo en la ruta del flujo de datos. Un nodo que recibe datos de otro, se puede ejecutar únicamente después de que el primero completa su ejecución.
Como todo el mundo, los ingenieros y científicos aprenden observando y procesando imágenes sin necesidad de pensamiento consciente. Muchos ingenieros y científicos también pueden caracterizarse como "pensadores visuales", lo que significa que son especialmente expertos en el uso del procesamiento visual para organizar la información. En otras palabras, piensan mejor usando imágenes. Esto se refuerza a menudo en facultades y universidades donde se anima a los estudiantes a modelar soluciones a problemas como diagramas de proceso. Sin embargo, la mayoría de los lenguajes de programación de uso general requieren que usted pase mucho tiempo aprendiendo la sintaxis específica, basada en texto y asociada con ese lenguaje y luego asigne la estructura del lenguaje al problema que se está resolviendo. La programación gráfica con G brinda una experiencia más intuitiva.
El código G suele ser más fácil de entender para los ingenieros y científicos porque están familiarizados con la visualización e incluso el modelado esquemático de procesos y tareas en términos de diagramas de bloques y diagramas de flujo (que también siguen las reglas del flujo de datos). Además, ya que los lenguajes de flujo de datos requieren basar la estructura del programa en el propio flujo, a usted se le anima a pensar en términos del problema que quiere solucionar. Por ejemplo, un programa G típico podría primero adquirir varios canales de datos de temperatura, luego pasar los datos a una función de análisis y, finalmente, escribir los datos analizados en el disco. En general, el flujo de datos y los pasos involucrados en este programa son fáciles de comprender en el diagrama de LabVIEW.
Figura 2: Los datos se originan en la función de adquisición y luego fluyen intuitivamente a las funciones de análisis y almacenamiento a través de cables.
Debido a que el código G gráfico de LabVIEW es fácil de comprender, las tareas de programación comunes, como la depuración, también se vuelven más intuitivas. Por ejemplo, LabVIEW proporciona herramientas de depuración únicas que usted puede usar para observar el movimiento interactivo de los datos a través de los cables de un programa de LabVIEW y ver los valores que pasan de una función a otra (conocido en LabVIEW como resaltado de ejecución).
Figura 3: El resaltado de ejecución brinda una forma intuitiva de entender el orden de la ejecución del código G.
LabVIEW también ofrece características de depuración para G comparables a las que se encuentran en las herramientas de programación tradicionales. Estas funciones, accesibles como parte de la barra de herramientas para un diagrama, incluyen puntas de prueba, puntos de interrupción y paso hacia adelante/atrás/afuera.
Figura 4: La barra de herramientas del diagrama de bloques ofrece acceso a las herramientas de depuración estándares como la ejecución paso a paso.
Con las herramientas de depuración G, usted puede probar los datos en muchas partes del programa simultáneamente, pausar la ejecución y pasar a una subrutina sin programación compleja. Aunque esto es posible en otros lenguajes de programación, es más fácil visualizar el estado del programa y la relación entre las partes paralelas del código (que son comunes en G por su naturaleza gráfica).
Figura 5: Las puntas de prueba son maneras eficientes en LabVIEW de ver los valores moviéndose por los cables de la aplicación, incluso para secciones paralelas del código.
Figura 6: Ver valores de las puntas de prueba en la ventana de visualización, que muestra los valores de las puntas de prueba de la aplicación completa (incluyendo subrutinas).
Una de las características de depuración más común utilizada en LabVIEW es el compilador siempre activo. Mientras usted está desarrollando un programa, el compilador comprueba continuamente los errores y proporciona comentarios semánticos y sintácticos sobre la aplicación. Si existe un error, usted no puede ejecutar el programa; únicamente ve un botón Ejecutar roto en la barra de herramientas.
Figura 7: La flecha de ejecución rota proporciona información inmediata que indica errores sintácticos en el código G.
Al presionar el botón Ejecutar roto, se abre una lista de problemas que se deben resolver. Una vez que haya solucionado estos problemas, el compilador de LabVIEW puede compilar su programa al código de la máquina. Una vez compilado, el rendimiento de los programas G es comparable al de los lenguajes basados en texto más tradicionales como C.
Figura 8: La lista de errores muestra una explicación detallada de cada error de sintaxis en toda la jerarquía de código.
Los lenguajes de flujo de datos como LabVIEW permiten paralelizar automáticamente. A diferencia de los lenguajes secuenciales como C y C ++, los programas gráficos contienen de manera inherente, información sobre qué partes del código deben ejecutarse en paralelo. Por ejemplo, un patrón de diseño G común es el patrón de diseño del productor/consumidor, en el que dos ciclos While separados se ejecutan de forma independiente: el primer ciclo es responsable de producir datos y el segundo ciclo procesa los datos. A pesar de ejecutarse en paralelo (posiblemente a diferentes velocidades), los datos se pasan entre los dos ciclos utilizando colas, que son estructuras de datos estándares en lenguajes de programación de uso general.
Figura 9: El patrón de diseño productor/consumidor de LabVIEW generalmente se usa para aumentar el rendimiento de las aplicaciones que requieren tareas paralelas.
El paralelismo es importante en los programas de computadora porque puede desbloquear ganancias de rendimiento en relación con los programas puramente secuenciales debido a los cambios recientes en el diseño de los procesadores de computadora. Durante más de 40 años, los fabricantes de chips de computadora aumentaron la velocidad del reloj del procesador para aumentar el rendimiento del chip. Hoy en día, sin embargo, aumentar las velocidades de reloj para aumentar el rendimiento ya no es viable debido al consumo de energía y las limitaciones de disipación de calor. Como resultado, los fabricantes de chips han diseñado nuevas arquitecturas con múltiples núcleos de procesamiento en un solo chip.
Para aprovechar el rendimiento disponible en los procesadores multinúcleo, usted debe ser capaz de utilizar multiprocesamiento dentro de sus aplicaciones (en otras palabras, dividir las aplicaciones en secciones discretas que se puedan ejecutar de forma independiente). Si usa lenguajes tradicionales basados en texto, debe crear y administrar hilos explícitamente para implementar paralelismo, un desafío importante para los programadores no expertos.
Por el contrario, la naturaleza paralela del código G hace a que la multitarea y el multiprocesamiento sean fáciles de implementar. El compilador integrado funciona continuamente en segundo plano para identificar secciones paralelas de código. Cada vez que el código G tiene una rama en un cable o una secuencia paralela de nodos en el diagrama, el compilador intenta ejecutar el código en paralelo dentro de un conjunto de hilos que LabVIEW administra automáticamente. En términos informáticos, esto se llama "paralelismo implícito" porque usted no tiene que escribir código específicamente con el propósito de ejecutarlo en paralelo; el lenguaje G se encarga del paralelismo por sí solo.
Más allá del multiprocesamiento en un sistema multinúcleo, G puede proporcionar una ejecución paralela aún mayor al extender la programación gráfica a los arreglos de compuertas programables en campo (FPGA). Los FPGAs son chips de silicio reprogramables que son masivamente paralelos, con cada tarea de procesamiento independiente asignada a una sección dedicada del chip, pero no están limitados por la cantidad de núcleos de procesamiento disponibles. Como resultado, el rendimiento de una parte de la aplicación no se ve afectado negativamente cuando se agrega más procesamiento.
Históricamente, la programación FPGA era una labor para un experto especialmente capacitado con un profundo conocimiento de los lenguajes de diseño de hardware digital. Cada vez más, los ingenieros sin experiencia en FPGA quieren usar hardware personalizado basado en FPGA para rutinas únicas de temporización y disparo, control de ultra alta velocidad, interfaz con protocolos digitales, procesamiento de señal digital (DSP), RF y comunicaciones, y muchas otras aplicaciones que requieren fiabilidad de hardware de alta velocidad, personalización y alto determinismo. G es particularmente adecuado para la programación FPGA porque representa claramente el paralelismo y el flujo de datos y está creciendo rápidamente en popularidad entre los desarrolladores que buscan procesamiento paralelo y ejecución determinística.
Figura 10: El manejo de memoria en LabVIEW es opcional, pero los usuarios avanzados pueden perfilar el uso de memoria para ayudar a identificar partes de la aplicación para optimizar.
Cuando el código G muestra un comportamiento inusual o inesperado que usted no puede resolver fácilmente usando las herramientas de depuración mencionadas anteriormente, puede usar funciones de depuración más avanzadas con el LabVIEW Desktop Execution Trace Toolkit. Este toolkit está diseñado para usuarios más avanzados que quieren realizar análisis dinámico de código para lo siguiente:
Detectar fugas de memoria y referencia
Aislar la fuente de un evento específico o comportamiento no deseado
Monitorear aplicaciones para detectar las áreas donde se puede mejorar el rendimiento
Identificar la última llamada antes de un error
Garantizar que la ejecución de una aplicación sea la misma en dispositivos diferentes
Si bien el código G proporciona una excelente representación del paralelismo y elimina el requisito de que los desarrolladores comprendan y administren la memoria de la computadora, no es necesariamente ideal para cada tarea. En particular, las fórmulas y ecuaciones matemáticas se pueden representar de manera más concisa con texto. Por esa razón, usted puede usar LabVIEW para combinar la programación gráfica con varias formas de programación basada en texto. Al trabajar en LabVIEW, usted puede elegir un enfoque textual, un enfoque gráfico o una combinación de ambos.
Por ejemplo, LabVIEW contiene el concepto del Nodo de Fórmula, que evalúa fórmulas y expresiones matemáticas textuales y similares a C en el diagrama de bloques. Estas fórmulas matemáticas pueden ejecutarse lado a lado e integrarse con el código gráfico de LabVIEW.
Figura 11: El Nodo de Fórmula usa sintaxis similar a C para representar expresiones matemáticas de una forma concisa en formato basado en texto.
LabVIEW y su lenguaje de programación gráfica de flujo de datos proporciona una mejor manera de resolver problemas que las alternativas tradicionales de nivel inferior, y la prueba está en su longevidad. Los diferenciadores clave para la programación en G son el código gráfico intuitivo que usted puede crear y las reglas basadas en datos que rigen su ejecución, que combinados ofrecen una experiencia de programación que expresa los procesos de pensamiento de sus usuarios de una manera más parecida en comparación con otros lenguajes. A pesar de que G es un lenguaje de más alto nivel, usted aún puede lograr un rendimiento comparable al de lenguajes como C debido al compilador de LabVIEW integrado.