Con la pompa exagerada de siempre NVIDIA
--la mayor productora de tarjetas de aceleración gráfica
del momento (la serie GeForce)-- anunció, el pasado 13 de
Junio, su nuevo lenguaje de programación de alto nivel, el Cg, o
'C para Gráficos' (C for Graphics). Según la nota
de prensa este lenguaje revolucionaría la industría del software
que tenga algo que ver con la presentación o manipulación
de gráficos, sea directa o indirectamente. En principio a los que
más les incumbe esto es a los productores de juegos y a los encargados
de desarrollar software de asistencia para dibujo mecánico, técnico,
animación, edición de vídeo, etcétera.
El nuevo lenguaje cuenta con una cercana
colaboración por parte de personal de Microsoft. Tal y como
lo ponen en la nota: "el Cg presenta a los desarrolladores --de software--
con un nuevo nivel de abstracción, removiéndolos de la necesidad
de programar directamente en el hardware gráfico. La común
y familiar sintáxis tipo lenguaje C permite el rápido desarrollo
de alucinantes sombreados en tiempo real y efectos visuales para plataformas
gráficas, además es compatible con el recientemente anunciado
Lenguaje de Sombreado de Alto Nivel presente en el DirectX 9.0" (traducción
semi-literal de un fragmento de la nota oficial).
En breve, la idea es la siguiente. El lenguaje
de programación C, por ejemplo, permite desarrollar software general
de forma mucho más rápida y eficiente que si tuvieramos que
realizar todo en assembler (lenguaje ensamblador), el lenguaje más
básico humanamente entendible de aquel utilizado por una computadora
o, en general, por un CPU. Pues bien, Cg viene a ser la versión
para procesadores gráficos (los GPU de las tarjetas aceleradoras)
de esta idea.
Analicemos un poco el asunto. Un computador
trabaja con instrucciones escritas en código binario (ceros y unos)
cada CPU tiene una serie de instrucciones básicas codificadas en
hardware, es decir, en/con los transistores que conforman su estructura.
Todavía continua el debate sobre si es mejor tener más instrucciones
o menos codificadas en el hardware, la eterna batalla entre las arquitecturas
RISC (menos instrucciones) y CISC (más instrucciones). Para el ser
humano escribir las instrucciones en ceros y unos sería prácticamente
imposible, por ello existe el lenguaje ensamblador que representa las ordenes
entendidas por un CPU a través de términos cortos más
comprensibles para un ser humano. Por ejemplo: MOV, ADD, PUSH, POP. Cada
instrucción suele tener un par de atributos de salida y entrada
que utilizan los registros del CPU (pequeñas memorias de acceso
rápido), no voy a entrar en mayores detalles porque el artículo
no trata de esto. El caso es que para, por ejemplo, sumar dos números
hay que escribir una serie de líneas de código que incluyen
un montón de factores a tomar en cuenta, no es algo tan simple como
poner a=b+c. Aquí es donde entran en acción los lenguajes
de programación de mediano y alto nivel.
Lenguajes de programación de alto
nivel son el Delphi, Visual Basic o el C++. De nivel intermedio lo es el
C, o mejor el ANSI C. La diferencia entre uno y otro es un pequeño
detalle técnico sobre que tan amigables con el programador son,
versus con el CPU. Un lenguaje como el Delphi es muy sencillo para quien
lo use, pero existe sobrecarga en las instrucciones al momento de compilar
el programa (compilar es convertir las instrucciones humanamente entendibles
en código binario con las instrucciones del CPU). El C, al ser de
nivel intermedio, es menos sencillo para el usuario pero más eficiente
en su compilación, es decir, su código binario (o assembler)
es más rápido. Por otro lado lenguajes de alto nivel suelen
tener restricciones de plataforma (por uno u otro motivo), es decir, ciertas
características en sus instrucciones utilizan capacidades no presentes
en todos los tipos de CPU (no olvidemos que a pesar de todo INTEL no es
el único productor de chips para PC), por ello se dice que el código
resultante no es 100% transportable. La ductilidad del C, y en particular
del ANSI C, le hacen el lenguaje de programación general más
transportable del mercado actual --siempre y cuando tengamos el compilador
apropiado para la plataforma respectiva.
Con lenguajes de mediano y alto nivel ya
es posible escribir a=b+c, el conjunto de instrucciones subyacente en assembler
ya no es de nuestro interés, el código se escribe con mucha
mayor claridad, optimización y velocidad. Quienes hayan programado
alguna vez en assembler entenderán muy bien a que me refiero.
Pues bien, NVIDIA con su Cg piensa promover este tipo de evolución
para los procesadores gráficos de sus tarjetas en particular y de
las de cualquiera en general. En teoría basta encontrar un compilador
compatible con los GPU de otras compañías para crear los
mismos efectos o unos equivalentes.
Para los que estén dudando, el DirectX
es un API --un conjunto de instrucciones predefinidas que devuelven valores
o resultados preestablecidos. Su mayor característica es ser independiente
de la plataforma, es decir, sin importar que tarjeta o equipo tengo el
API hace lo mejor que puede para presentar lo mismo. Sin embargo esta limitado
a trabajar con hardware que le sea compatible, de ahí todos los
problemas con tener controladores al día y compatibles con la última
versión del DirectX al igual que hardware que sea capaz de interpretar
sus instrucciones. Para cualquier efecto, u afin, que el DirectX no tenga
instrucciones hay que utilizar assembler y conocer a fondo las características
del hardware a utilizar, ya de plano esto hace a un software en particular
no tan independiente de la plataforma, a menos que los desarrolladores
inviertan el tiempo necesario en codificar sus efectos para tanto hardware
como sea posible. Por otro lado el DirectX hace uso de instrucciones más
complejas (muchas dependientes del CPU, no así del GPU), por lo
que al momento de crear efectos en tiempo real sufre de mayores retrasos
que una codificación directa en ensamblador, en este tipo de situaciones
los milisegundos valen oro.
Es para llenar el vacío citado al
final del párrafo precedente que NVIDIA saca el Cg. Por otro lado
esta es claramente una estrategia de mercadeo, no hay que olvidar que un
GPU tiene su propio conjunto de instrucciones enfocadas exclusivamente
al procesamiento de imágenes (de hecho de pixeles y polígonos),
en el caso de los chips de NVIDIA las novedades son muchas y no todas llegan
a ser implementadas en DirectX (más bien, en el Direct3D) por el
asunto ese de la independencia del hardware; o sea, con el Cg un programador
va ha poder explotar una gama de efectos, manipulaciones gráficas
(a nivel pixel o polígono) y afines --en tiempo real-- nunca antes
vista, todo codificando de manera simple, familiar, clara y sin tener que
romperse el cerebro aprendiendo los secretos, funciones y características
de las instrucciones en assembler del GPU. Toda una revolución.
Al final resulta que tampoco es pura pompa
la afimación de NVIDIA, ciertamente este lenguaje --si llega a ser
lo suficientemente abierto, estándar y cuenta con el apoyo necesario--
puede llegar a cambiar toda la perspectiva de programar efectos ultra sofisticados
con un control directo del GPU instalado en una PC. Dicho sea de paso que
Cg tiene todo el respaldo de Microsoft y va ha poder ser utilizado
desde las plataformas de programación más conocidas como
el Delphi, Visual Basic o C++ (o el Visual Studio). Por lo pronto, mientras
esperamos por su inclusión en los citados entornos de desarrollo
de software, NVIDIA ya ha sacado un conjunto de herramientas básicas
--un toolkit-- del Cg que viene con un compilador avanzado, librerías
estándar (el conjunto de instrucciones de alto nivel), un presentador
(browser), el formato de archivo CgFX, y una colección predefinida
de efectos, como para ir familiarizándonos con el lenguaje y sus
características.
Artículo basado en información
oficial presentada por NVIDIA. Pueden encontrar más detalles sobre
el Cg en el sitio Web oficial de la compañía: www.NVIDIA.com.