5 de febrero de 2013

Lenguajes

Lo que puede hacer una computadora ¿ depende o no del lenguaje de programación ?
Las dos cosas a la vez.

Para explicar esta idea pongamos una analogía; pensemos qué pasa con la cooperación entre las personas, si depende o no del lenguaje usado (el lenguaje en un sentido general, incluyendo el estilo y el modo, bien podría ser un lenguaje amistoso, formal, ofensivo, etc.. para cualquier idioma), ¿Depende entonces? Vamos a un ejemplo donde el lenguaje es importante, para esto basta ir por la calle y pedir a varias personas mediante insultos que nos digan la hora, y comparar los resultados haciendo similares pedidos de maneras amables y respetuosas. Por otro lado, un ejemplo donde no importa el lenguaje, sería este otro ¿ Se puede convencer a alguien de crear energía, de hacer viajes en el tiempo, o ir más rápido que la luz.. con algún lenguaje? Esas cosas parecen estar fuera de las posibilidades de nuestro lenguaje, porque habría cosas que están fuera de las posibilidades de nuestra realidad.

En el caso de las computadoras y los lenguajes de programación también hay tareas que, si bien las podemos imaginar, No son realizables mediante ningún número de pasos (por ejemplo no se puede resolver el Halting Problem mediante un algoritmo), otras cosas que son independientes del lenguaje son ciertas operaciones básicas, mínimas; todos los lenguajes coinciden en esos límites teóricos, pero no coinciden en los prácticos; ahí está la dependencia con el lenguaje, en la práctica aparecen diferencias, mientras que en algunos lenguajes es muy simple lograr ciertas funcionalidades, esas mismas se hacen muy complejas en otros, dando un ejemplo básico, algunos microprocesadores son capaces de hacer multiplicaciones con una sola instrucción, y otros no, para multiplicar deben usar una secuencia de sumas, en este caso la misma operación se complica, y esta diferencia de complejidad puede crecer arbitrariamente (me refiero a que puede haber problemas que siendo muy simples en un lenguaje pueden llegar a ser impracticables en otro), por lo tanto cada lenguaje tendrá su performance, su belleza, su efectividad en cierto ámbito (tal cual lo tienen las diferentes formas de pedirle la hora a alguien..).

Lo mínimo que podemos hacer, y lo que seguro no podemos, es común a todos los lenguajes, eso no depende de cual, pero lo que "quizás" podemos hacer, eso sí depende del lenguaje usado, incluso depende de poder encontrar ese lenguaje a usar... ese es el futuro abierto.


Gramática y Semántica

La sintaxis y gramática del lenguaje, es decir las palabras aceptadas por el lenguaje y las reglas para combinarlas, son la parte objetiva del lenguaje, todo lo que compila sin "syntax error", pero bien sabemos que eso no significa que el programa vaya a funcionar como queremos, porque la funcionalidad está normalmente afuera de la gramática, es subjetiva, es el significado de lo que hicimos, llamémosle su semántica. Y si bien la semántica (uso) es otra cosa que la gramática (código fuente), está lograda mediante ella, con lo cual quedan íntimamente enlazadas. Vamos a analogías, si hacemos una comida, mediante una serie de pasos, la comida en sí estará afuera de la receta, aunque la receta sea un camino para lograr esa cena. Y con esa burda comparación volvamos al tema, la gramática y la semántica son inseparables, dependen mutuamente, al destruir una la otra desaparece, se influyen mutuamente, sin embargo Ninguna determina unívocamente a la otra, es decir, hay una libertad que está dada por la multiplicidad de formas de producir "lo mismo" externamente; aún así es usual que se quiera elegir entre ellas: "es sólo gramática" (forma) o "es sólo semántica" (contenido), se suelen hacer estas afirmaciones, supongo por alguna limitación cognitiva que nos hace difícil sostener dos ideas contradictorias en la mente, pero es claramente posible, y posiblemente necesario.

Muchas veces se discute si un lenguaje es mejor que otro, se olvida decir mejor en qué o para qué, por ejemplo no se aclara si en la discusión si se comparan también las librerías disponibles, que ya traen aparejada una semántica, en realidad si se tuviera todo eso en cuenta la discusión se tornaría ridícula, supongamos que alguien tome el buscador google y diga "este buscador ejecuta su código finalmente en computadoras, es decir en instrucciones mínimas de microprocesador, por lo tanto, es ese el lenguaje que 'realmente' hace las búsquedas", otra persona al mismo nivel de miopía produce un texto como "hice un script en el lenguaje X que permite usar múltiples buscadores automáticamente, y poner resultados en una lista, por lo tanto X es el mejor lenguaje", en el primer caso vemos que se está omitiendo que el código ejecutable en instrucciones nunca pudo haber sido escrito así directamente por seres humanos, la complejidad requiere para nosotros de las capas de abstracción, no podemos manejarla en crudo, por lo tanto no puede hablarse de que las instrucciones compiladas y después desensambladas sean un lenguaje en sí, (salvo que asignemos el mérito del Quijote ya no al escritor Cervantes, sino a la tinta en sí, porque "de eso está hecho el Quijote"..), por otro lado, en el segundo caso del lenguaje X, se pierde de vista que está haciendo uso del trabajo de muchas personas, y mucho tiempo de evolución, y en definitiva otros lenguajes, y no debería asignarse todo el mérito, porque no lo tiene, muchas veces usan directamente librerías escritas en otros lenguajes, o ideas que no podrían estar ahí, sin los demás lenguajes..

Sería lindo logremos esa humildad, admiración, que muchos pudiéramos pensar sobre este tema como Newton pensó alguna vez sobre sus logros : "Si he podido ver más allá que otros es porque me he apoyado en hombros de gigantes", pero ese tipo de reflexión parece poco popular, casi prohibida. Como suele ocurrir, por razones que no voy a exponer acá, cada vez que aparece una visión o un lenguaje nuevo, hay una tendencia a buscarle ventajas y desventajas, para tratar de eliminar o imponer.

Ahora, pensando en la semántica que hoy existe, y me refiero a los logros computacionales que conocemos, se puede ver que siempre se le puede asignar a esas funciones un nombre, y que estas sean a la vez palabras de otro lenguaje de jerarquía superior, etc, parir una nueva gramática es producto puro de la evolución (como los paradigmas funcional, estructurado, de objetos..), y no es obvio que alguna sea más poderosa "en sí", porque sólo podemos evaluarla mediante la semántica, por otro lado, comparar sólo la sintaxis no aporta mucho. Imaginemos (y no hay que imaginar mucho) que todos los desarrollos de software del mundo, pudieran ser accedidos mediante un hipotético lenguaje Z, y a lo sumo luego de una posible ceremonia de compilación se puedan ejecutar sendos servicios del más alto nivel alcanzado hasta el momento, generando así nuevos desarrollos de aún más alto nivel, Z1, Z2, Z3.., Z++, Z#,...

Obviamente la semántica alcanzada hoy es dependiente de una gramática subyacente, no arbitraria pero sí contingente, es decir hay multiplicidad de opciones para alcanzarla, el secreto es cierto "umbral" de efectividad, que la hace invisible, cuando una funcionalidad logra cierta efectividad aceptable ya no es tan dependiente de la forma, es decir lo que el software hace (semántica) si lo hace eficientemente se libera en mucho de las contingencias gramaticales del lenguaje.

Ya hay servicios a este nivel como para armar lenguajes, procesos y funcionalidades, por un lado todos los frameworks, y lenguajes, por otro los servicios webs, e incluso páginas como ifttt.

Ejemplo en lenguaje Z.

Recipe getRecipe( String searchString )
{
    Google google=Google.getInstance();
    Internet inet=Internet.getInstance();

    return inet.google.find(searchString);
}
int main()
{
    Recipe recipe = getRecipe(" How to time travel "); 
    recipe.follow();

    return 0;
}

El progreso de la semántica siempre va a estar arraigado a muchísimas gramáticas organizadas en capas y con una evolución histórica por detrás, paradójicamente, la visibilidad de esas capas dependerá de que cuán inefectivas sean, es decir, una capa extremadamente efectiva, será por eso mismo extremadamente invisible.