2013/7/24 Andrés Arana <
and2...@gmail.com>:
> En mi conclusión, es javascript con mejoras sintácticas para cosas que
> hacemos todos los días (+) pero que trae problemas de debugging y profiling
> (-). ¿Qué otras opiniones tienen ustedes?
Una anécdota que tiene algo que ver con esto. Cuando salió golang,
no me gustó el hecho de tener que escribir con mayúscula inicial
los métodos públicos. Me parecía tan anti-estético que me costaba
prestarle atención a los demás aspectos.
Lo común en otros lenguajes es declarar qué funciones se van a
exportar, de modo que si agregás la función foo() y querés que sea
pública, tenés que moverte dentro del archivo al lugar en donde
está esa declaración y agregar 'foo' a la lista. En lua, por
ejemplo, no hace falta esa declaración, sino que el archivo que
contiene el módulo tiene que retornar un objeto, y dentro de ese
objeto puede haber funciones públicas y privadas, entonces sólo
las públicas son accessibles. Para que la función no se exponga,
hay que poner 'local ' antes.
Entonces lo que ocurre es que la solución anti-estética en
realidad es la más eficiente, porque en vez de moverse dentro del
archivo para actualizar una lista, o agregar 'local ' como prefijo
a cada definición, lo único que hay que hacer es comenzar el
identificador con mayúscula. Es una edición local (no hay que
moverse), no hay caracteres extras, y además es muy claro y
explícito.
Todo esto para decir que a veces uno juzga una herramienta por la
pinta que tiene, en vez de juzgar la lógica que la fundamenta y la
estructura interna.
En el caso de CoffeeScript, mi primera impresión fue buena, pero
me duró muy poco (hasta que lo probé, digamos). Está diseñado por
un rubista, casi tratando de escribir JavaScript con Ruby,
entonces es un lenguaje más conciso. Pero hay rubismos que no son
nada buenos, como por ejemplo el hecho de que todas las funciones
retornan la última expresión evaluada. Esto parece práctico, pero
el JavaScript que se genera es más ineficiente para los casos en
los cuales no hace falta retornar nada. También está el problema
del scoping: como en CoffeScript no hay diferencia entre declarar
una variable y asignarle un valor, es posible y tal vez frecuente
el shadowing accidental de variables o funciones globales. El
resultado es que en vez de tener un scope lexico, como JavaScript,
tiene un scope dinámico (más difícil de debuggear). Había una
discusión muy buena al respecto en Reddit, pero no la encuentro.
De todas formas, en este issue queda claro el problema y las
respuestas del autor de CoffeScript son un poco tristes:
https://github.com/jashkenas/coffee-script/issues/712#issuecomment-430673
Como hice poco con CoffeScript, no tengo mucho más para decir.
JavaScript tiene algunos problemas que son difíciles de solucionar
sin romper la compatibilidad, pero en general me parece mejor
lenguaje que CoffeeScript. Lo de la compilación y la dificultad
del debugging son complicaciones extra, que estaría dispuesto a
pagar si las ventajas fueran descomunales, pero en mi caso no le
veo ventajas.