Mostrando entradas con la etiqueta lenguaje. Mostrar todas las entradas
Mostrando entradas con la etiqueta lenguaje. Mostrar todas las entradas

24 de febrero de 2013

Peaceful General Public License

El Soft es Libre... ¿Y Nosotros?

Las ventajas del software libre están a la vista, las desventajas..no tanto, tenemos mucho por pensar aún; en 2005 había preparado una reflexión sobre este tema en una página de geocities (que no existe más)... fue motivada por una charla en la lista de lugro ( un grupo muy amable dicho sea de paso ), el tema planteado era "el soft es libre..¿y nosotros?", pasaron varios años de esa pregunta pero creo que sigue siendo un tema actual, revivo aquí entonces algunas de esas palabras pensando que todavía tienen algo que decir.


Soft Libre...de Intención?

Libertad sin intención suena algo contradictorio, libre implica expresar intenciones, si se separa el software de las intenciones, no hay más libertad humana ahí, es sólo la libertad para el software en sí mismo. La licencia GPL ofrece libertades  y establece obligaciones. ¿Qué libertades ofrece y cuales son las obligaciones? ¿A quién?
Las "libertades" que ofrece son la de usar/estudiar/modificar/distribuir el software, y las obligaciones que implica, son justamente las que posibilitan esas libertades, es decir, el programador que quiera usar esa licencia o librerías que la usen, está obligado a entregar el código fuente de su algoritmo, es decir la receta de su programa, facilitando así la posibilidad de estudiar el funcionamiento y modificarlo. Esas obligaciones reflejan entonces la más profunda de las motivaciones de la licencia:   propagarse.

Algunos pensamos que la libertad es un concepto elevado, y no alcanzable mediante licencias ni leyes, porque atiende a una idea muy general e inaprensible, por eso a la palabra libertad se la puede (y suele) utilizar de las maneras más diversas: sea para mejorar la vida de las personas, como para justificar guerras, para hacer propagandas de gaseosas light, etc... Defenderla como palabra en sí, sin aclaraciones ni restricciones es defender a todos sus usos abusos, al menos habría que dejar claro cuál libertad se quiere, para quién o qué , hay que notar lo obvio, es una definición subjetiva, y que como otras palabras, ya ha sido adaptada para propiciar obras bellas y crueldades temibles. Es una pena que se le haya puesto ese nombre, pero no creo que sea casual, el software hoy en día es casi un ser vivo en simbiosis con nosotros, y es comprensible que esté yendo hacia una libertad.

En las obras bellas no suelen usarse las armas, y si la GPL no permite cerrar el código con el fin de auto-sostenerse y propagarse ¿Porque no resignar entonces otra libertad con algún fin más humano? ¿Valorar la vida?.

Como el Software Libre no le permite al programador decidir a quién entregar su código fuente una vez liberado, quien utilice la licencia GPL está obligado a perder el control sobre dónde, quién y para qué se utilizará su trabajo, su código fuente, para así dar libertad al software en sí mismo, y supongamos también quizás al usuario.. Se resigna cualquier intención original a cambio de que el código siga siendo abierto.

Podríamos preguntarnos, si el software puede copiarse de todas formas, y la licencia no es más que para declarar intenciones; (porque sabemos que una vez liberado un software, cerrado o abierto, nada se puede hacer con el uso que se le da, incluso un software cerrado podría reutilizarse) aún así, quizás la pregunta es entonces cuáles son esas intenciones nuestras, cuál es nuestra postura en esa declaración, ¿Es para nosotros más importante declarar nuestro apoyo irrestricto a la propagación de un código fuente y auto-sustentar una licencia, que contar nuestras intenciones sobre sustentar la vida y la paz , evitando así "ensuciar" la licencia con cuestiones humanas ?

Así puede ser para unas personas, pero no para otras. Por tanto, ya que hablamos de libertad, llevémosla al terreno de un programador que debe elegir su licencia, y por tanto se puede admitir la diversidad de opciones (cosa que no asegura la libertad pero al menos permite una parte). Lo que podemos proponer es que la GPL sea siempre opcional, y quien no quiera publicar su código tenga siempre la libertad de no publicarlo.
Que cada uno pueda decidir es poner por encima una libertad y un derecho humano a un derecho maquinal, una libertad para bits ( no sé por cuanto tiempo sean más importantes los humanos que las máquinas, pero podemos hacer algo mientras ).
Incluso puede que alguien quiera publicar su código, pero no para cualquier fin, lo cual es un poco paradójico porque al publicar ya dijimos no hay chance de controlar la finalidad del source, sin embargo, aún así se puede declarar una intención, y por ejemplo quien esté interesado en apuntar sus intenciones a la paz, puede publicar con una licencia "Peaceful" GPL en lugar de la GPL.
El software libre es muy importante, tanto como el software privativo. Creo entonces que no debería prohibirse ninguno.
No hay ninguna necesidad de discutir acerca de si hay fines bélicos correctos o incorrectos. Sencillamente hay gente que preferiría usar una PGPL (GPL Pacifica) y puede expresar su intención.

¿Queda claro que: "Por más que pongamos cláusulas, lo pueden igual usar ilegalmente...."? Clarísimo, pero las licencias libres también pueden ser usadas ilegalmente cerrando el código, sin embargo, sus cláusulas siguen ahí! (que obligan a entregar el código fuente)... Esto es porque las cláusulas así como las leyes de un país, no eliminan el delito, sino que representan una postura, una filosofía, un ideal al cual apuntar a que sea parte de la cultura. ¿Cuál es el ideal del software libre, y quién posee esa libertad además del mismo soft? Probablemente hay una comunidad que NO es representada por una GPL o cualquier licencia de soft libre a la que "le da lo mismo" si el código es utilizado para un juego que para matar personas. Y estos comentarios que estoy haciendo son un parche que se sabe poco útil de entrada porque no soluciona el problema, pero su objetivo es otro, es dejar bien clara una postura para invitar a la paz, y no a la indiferencia.

Agregado Pacifista :
"Esta prohibido utilizar el software que cubre esta licencia (source y binario) directa o indirectamente
o como parte de otro software con el objetivo de causar daño a seres humanos, la fabricación de armas o para ser usado en cualquier tipo de aplicaciones bélicas. Al autor de este software No le da lo mismo cualquier aplicación de su trabajo."
Este agregado es para hacer notar que la reutilización del código puede tener la finalidad más insospechada. Y si ya somos lo suficientemente inconscientes como para desarrollar tecnología, podríamos decir al mundo que se puede dar un mal uso, y si se da un mal uso : "No es nuestra intención", que si le dan un mal uso lo tendrán que hacer ilegal, para no ser cómplices porque lo rechazamos desde el origen mismo.
Que por otro lado, es quizás todo lo que podemos hacer...

Es adjuntar una propaganda pacífica, humana. Para que, cuando se reproduce el software, ya que está, se reproduzcan juntas.

Y ¿Qué pasa si se necesitan desarrollar armas para defenderse de "malos", extraterrestres, meteoritos, y otros etcéteras? En tal caso se puede usar soft con otra licencia, o se le puede consultar al autor si lo permite, o cambiar la licencia, o usarlo ilegalmente ¿ o qué tal joderse ? La paz no es gratis.

"Lo preocupante no es la perversidad de los malvados, sino la indiferencia de los buenos" Martin Luther King

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.

26 de junio de 2012

Python primera prensada


En cualquier orden, esta es una primera impresión

Voy a tomar como referencia el lenguaje C por conocerlo, pero no es una comparativa. Dejando de lado que usualmente Python se ejecuta bajo un intérprete, lo primero que me llamó la atención es que las funciones en lugar de definirse entre llaves {}, requieren indentación, (sí, requieren ), supongo esto es para que la legibilidad del código no quede del todo librada al programador y sea parte de la sintaxis, otro detalle inmediato es que no se usa punto y coma al final de las líneas, y que los comentarios de código se escriben anteponiendo #. Aunque incompatibles con C, son lindas cosas, hasta ahí particularidades que no aportan mayor ventaja, veamos algo más, un hola mundo.

Hello World
  • En C
    // Comentario
     int main(void)  
     {  
         printf("hola mundo" );  
         return 0;  
     }   
    
  • En Python
    # Comentario  
    print ("hola mundo") 
    
En ese ejemplo Python luce más simple, pero para ser justos debería compararse con un hola mundo definido en una función main, que esto revelar más detalles del lenguaje, y hecho así ya no parece simple.

Python main
  • #Definiendo main como función
    def main():
        print ('hola mundo')      #1
    if __name__ == '__main__':    #2
        main() 
    
    #1: Notar la indentación (viene a ser equivalente a las llaves de C)
    #2: Aquí el hecho de no tener indentación da por terminada la def anterior
Repetir Strings
  • #Aprovecho a mencionar una singular forma de repetir strings
    print("hola mundo " * 5)
    
    hola mundo hola mundo hola mundo hola mundo hola mundo
Dicho sea de paso, estos ejemplos son para Python 3.x, aclaro esto porque a partir de la versión 3.x print usa paréntesis, es una función, por lo tanto el "hola mundo" de la versión 2.x (sin paréntesis) tan simple que parece, es incompatible.

Python 2.x
  • print "hola mundo"
Python 3.x
  • print ("hola mundo")

Esto evidentemente puede ocacionar problemas con código 'viejo', pero como salvedad digamos que "no es tan importante de donde viene, sino adonde va", y creo que es una mejora uniformizar el llamado a funciones.
Otra cosa, para poder usar ciertos caracteres (por ejemplo tildes) en los comentarios se debe aclarar primero la codificación que se va a usar en el archivo, por ejemplo:
  • #coding: latin-1

Entorno de Desarrollo Integrado (IDE)

Por suerte conseguir una IDE funcional fue relativamente rápido: pyDev.org  (basada en eclipse  que además tiene una versión stand-alone Aptana  y por lo visto funcionan ok).
Hay también un plugin para Netbeans para los que nos gusta esa IDE.

List Comprehension

Esto me gusta, al menos es algo útil, varios lenguajes traen esta característica o alguna similar, las "listas por comprensión" son una forma de procesar y generar listas. A la lista se ingresan, filtran y extraen datos de una forma directa, especificando el qué y sin los detalles de cómo.
Esto podría pensarse en términos más generales como el avance de la abstracción en los lenguajes, (pensemos que hay microcontroladores que ni siquiera tienen una instrucción de multiplicar, y las multiplicaciones se hacen mediante desplazamientos de bits y/o sumas sucesivas), pero todo eso es invisible para el lenguaje, y es solucionado por el compilador, por lo tanto en ese caso básico ya se puede ver cómo un "algoritmo oculto" (lenguaje abstracto) resuelve el cómo especificando sólamente el qué.
Como siempre toda abstracción exige que se pierdan ciertos detalles, y el control sobre esos detalles, y aunque esto aparentemente limita ciertas posibilidades a bajo nivel permitite facilitar otras de mayor nivel que en definitiva son más complejas y tienen un mayor alcance.
Aquí algunos ejemplos que se explican a sí mismos con los resultados
  • #Imprime el elemento 3 
    #Va a imprimir la D (ya que empieza en indice=0 tal como los array de C)
    
    lista = ['A', 'B', 'C', 'D', 'E']
    print( lista[3] )
    
    D
  • #coding: latin-1
    #Ahora vamos a usar 'comprehension' para extraer datos
    #Se obtienen, modifican e imprimen todos los elementos de la lista
    #multiplicando cada valor por 2
    #Observar que la palabra elemento sólo se usa para referenciar el item
    #puede usarse cualquier nombre de variable
    #(abajo está la misma operación mediante for (sin comprehension) )
    listaNumeros = [100, 200, 300, 400, 500] 
    listaCompre= [2*elemento for elemento in listaNumeros]
    print(listaCompre)
    
    listaClasic = []
    for valor in listaNumeros:
        listaClasic.append(2*valor)
        
    print(listaClasic)
    
    [200, 400, 600, 800, 1000]
  • #coding: latin-1
    #Hacemos un poco más complejo el comprehension agregando unos if's
    #Para modificar y seleccionar algunos items de la lista
    #(Notar que la condición la chequea antes de hacer la operación)
    listaNumeros = [1, 2, 3, 4, 5] 
    listaSelecta =[10*valor for valor in listaNumeros if valor>=3]
    print(listaSelecta)
    
    listaDos=['hola', 'cómo', 'va']
    listaFiltrada = [valor for valor in listaDos if valor!='hola']
    print(listaFiltrada)
    
    [30, 40, 50]
    ['cómo', 'va']
Suficiente para una primera impresión