python - español - Usos para lenguajes dinámicos
python español (13)
Mi idioma principal en este momento es D, y estoy en el proceso de aprender Python porque es necesario para un curso que estoy tomando. Si bien entiendo por qué los lenguajes dinámicos serían una bocanada de aire fresco para las personas que programan en lenguajes estáticos sin inferencia de tipo o plantillas (las plantillas IMHO son en gran medida tipeo de pato en tiempo de compilación), tengo curiosidad por los beneficios de los lenguajes dinámicos incluso cuando los tienes.
La conclusión es que, si voy a aprender Python, quiero aprenderlo de una manera que realmente cambie mi forma de pensar acerca de la programación, en lugar de solo escribir D en Python. No he usado lenguajes dinámicos ya que era un programador bastante novato y no podía apreciar la flexibilidad que supuestamente ofrecen, y quiero aprender a sacar el máximo provecho de ellos ahora. ¿Qué se puede hacer fácil / elegantemente en un lenguaje interpretado de forma dinámica que es torpe o imposible en un lenguaje estático, incluso con plantillas, polimorfismo, inferencia de tipo estático y, quizás, reflexión de tiempo de ejecución?
Con un lenguaje dinámico es mucho más fácil tener un intérprete de línea de comandos para que pueda probar cosas en la línea de comandos y no tener que preocuparse por un paso de compilación para ver si funcionan.
En los lenguajes dinámicos puede usar valores de manera que sepa que son correctos. En un lenguaje estáticamente tipado, solo puede usar valores de forma que el compilador sepa que son correctos. Necesita todas las cosas que mencionó para recuperar la flexibilidad que le quita el sistema de tipos (no estoy atacando los sistemas de tipo estático, la flexibilidad a menudo se elimina por buenas razones). Esta es una gran complejidad que no tiene que tratar en un lenguaje dinámico si desea usar los valores de una manera que el diseñador de lenguaje no anticipó (por ejemplo, poner valores de diferentes tipos en una tabla hash).
Entonces no es que no puedas hacer estas cosas en un lenguaje estáticamente tipado (si tienes reflejo en el tiempo de ejecución), es simplemente más complicado.
Aquí está Steve Yegge sobre el tema.
Guido van Rossum también se relacionó con esa charla en su opinión sobre Scala .
"Tengo curiosidad por saber cuáles son los beneficios de los lenguajes dinámicos, incluso cuando los tienes".
Comparado con el lenguaje de programación D:
Python es un lenguaje más compacto. Le permite expresar tanto como D pero usa muchos menos conceptos diferentes para lograrlo, menos es más .
Python tiene una potente biblioteca estándar, con baterías incluidas .
No sé si D tiene indicaciones interactivas, pero en Python un shell interactivo como ipython es una parte integrada del proceso de desarrollo.
De hecho, escribí una publicación de blog sobre esto: linky . Pero esa publicación básicamente se puede resumir así:
Te sorprendería la cantidad de carga que te da la idea de no tener que nombrar en el momento de la compilación de qué tipo es tu variable. Por lo tanto, python tiende a ser un lenguaje muy productivo.
Por otro lado, incluso con buenas pruebas unitarias, también te sorprendería qué tipo de errores estúpidos te estás permitiendo hacer.
Ejemplo en Python:
def lengths(sequence):
try:
return sum(len(item) for item in sequence)
except TypeError:
return "Wolf among the sheep!"
>>> lengths(["a", "b", "c", (1, 2, 3)])
6
>>> lengths( ("1", "2", 3) )
''Wolf among the sheep!''
¿Cuánto tiempo crees que esto me llevó a escribir, y cuántos ciclos de compilación ejecutar-depurar?
Si crees que mi ejemplo es trivial, puedo responder que los lenguajes dinámicos simplifican muchas tareas de programación.
El punto es que en un lenguaje dinámico puede implementar la misma funcionalidad mucho más rápido que en uno estático. Por lo tanto, la productividad suele ser mucho mayor.
Las cosas como las plantillas o el polimorfismo en principio le dan mucha flexibilidad, pero debe escribir una gran cantidad de código para que funcione. En un lenguaje dinámico, esta flexibilidad casi se obtiene de forma gratuita.
Así que creo que miras la diferencia de la manera equivocada, la productividad es realmente el punto principal aquí (al igual que la recolección de basura mejora la productividad, pero de lo contrario no te permite hacer cosas nuevas).
En teoría, no hay nada que los lenguajes dinámicos puedan hacer y los lenguajes estáticos no puedan. Las personas inteligentes ponen mucho empeño en crear lenguajes dinámicos muy buenos , lo que lleva a una percepción en el momento en que los lenguajes dinámicos se adelantan mientras que los estáticos necesitan ponerse al día.
Con el tiempo, esto se moverá hacia el otro lado. Ya varios lenguajes estáticos tienen:
Genéricos, que hacen que los tipos estáticos sean menos estúpidos al permitirle seleccionar el tipo correcto cuando se pasan los objetos, lo que evita que el programador tenga que lanzarlo
Escriba inferencia, lo que ahorra tener que perder el tiempo escribiendo cosas que deberían ser obvias
Cierres, que entre otras muchas cosas ayudan a separar el mecanismo de la intención, permitiéndole unir algoritmos complicados de la mayoría de los ingredientes existentes.
Conversiones implícitas, que le permiten simular el "parche del mono" sin los riesgos que conlleva.
Carga de código y acceso programático fácil al compilador, para que los usuarios y terceros puedan guiar su programa. Usar con precaución!
Sintaxis que son más propicias para la creación de lenguajes específicos de dominio dentro de ellos.
... y sin duda más por venir. El movimiento dinámico ha engendrado algunos desarrollos interesantes en el diseño del lenguaje estático, y todos nos beneficiamos de la competencia. Solo espero que más de estas características lleguen a la corriente principal.
Hay un lugar donde no veo el lenguaje dinámico dominante siendo reemplazado, y eso es Javascript en el navegador. Simplemente hay demasiado de un mercado existente para reemplazar, por lo que el énfasis parece estar en hacer que Javascript sea mejor en su lugar.
Encuentro lenguajes dinámicos como Perl y, en menor medida, Python me permite escribir scripts rápidos y sucios para cosas que necesito hacer. El ciclo de ejecución es mucho más corto en los lenguajes dinámicos y, a menudo, se necesita escribir menos código en un lenguaje estático que aumenta mi productividad. Desafortunadamente, esto tiene un costo de mantenimiento, pero eso es una falla de la forma en que escribo programas en idiomas dinámicos, no en los idiomas mismos.
Iba a decir cierres pero encontré este hilo ... (no es que entienda cómo funcionaría en un lenguaje "estático")
Los conceptos relacionados son funciones como objetos de primera clase y procedimientos de orden superior . (por ejemplo, una función que toma una función como entrada y / o devuelve una función como salida)
edit: (para los nitpickers aquí) Me haré eco de un comentario que hice en la publicación de @David Locke. Los lenguajes de interpretación dinámica hacen posible utilizar un programa / proyecto de software existente junto con una pequeña función o clase creada en el momento preciso para explorar algo de forma interactiva. Probablemente el mejor ejemplo sea la función gráfica. Si escribiera un objeto de función gráfica con una función graph(f,xmin,xmax)
, podría usarlo para explorar funciones como x 2 o sin (x) o lo que sea. Hago esto en MATLAB todo el tiempo; se interpreta y tiene funciones anónimas ( @(x) x^2
) que se pueden construir en el indicador del intérprete para pasar a funciones de orden superior (funciones gráficas, operadores derivados, buscadores de raíces, etc.).
Los lenguajes compilados tienden a usarse cuando la eficiencia y la seguridad de tipo son las prioridades. De lo contrario, no puedo pensar en ninguna razón por la que alguien no estaría usando ruby :)
Una gran ventaja del tipado dinámico al usar objetos es que ya no necesita usar jerarquías de clase cuando quiere que varias clases tengan la misma interfaz, eso es más o menos lo que se llama tipado de pato. La herencia incorrecta es muy difícil de corregir después; esto hace que la refacturación a menudo sea más difícil de lo que es en un lenguaje como Python.
Eche un vistazo a este ejemplo de e4x en JavaScript:
var sales = <sales vendor="John">
<item type="peas" price="4" quantity="6"/>
<item type="carrot" price="3" quantity="10"/>
<item type="chips" price="5" quantity="3"/>
</sales>;
alert( sales.item.(@type == "carrot").@quantity );
alert( sales.@vendor );
for each( var price in sales..@price ) {
alert( price );
}
Especialmente, eche un vistazo a la línea:
alert( sales.item.(@type == "carrot").@quantity );
En los lenguajes estáticos típicos, no puede escribir sales.item, ya que no puede saber que ese elemento es propiedad de las ventas hasta el tiempo de ejecución. Esto no está limitado a e4x. Puedes programar con un estilo similar cuando te conectas al escribir clientes SOAP o cualquier otro tipo subyacente que no conozcas hasta el tiempo de ejecución. En un lenguaje estático, normalmente necesitaría ejecutar una herramienta que generará clases de stub o programa de una manera muy detallada. Luego, si algo cambia en un servicio web, necesita volver a generar los resguardos. Eche un vistazo al código DOM de Java:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Foo {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );
return document;
}
}
Definitivamente mucho más detallado que tu código dinámico. Y, por supuesto, no está tipado estáticamente. No hay forma de verificar que haya escrito mal el "autor" como "autor" hasta el tiempo de ejecución. Toda esta verbosidad está esencialmente ahí para permitirte capturar algo que es de naturaleza dinámica en estilo estático.
Creo que este es uno de los puntos fuertes de los lenguajes dinámicos.