Una introducción a los sistemas de tipos de programación

 

 

 


Índice
  1. Conclusión
    1. Otras lecturas

El debate entre lenguajes tipificados fuertemente y dinámicamente continúa. Pero comprender el problema comienza con una escritura débil y lenguajes como C. El péndulo oscilará hacia adelante y hacia atrás muchas veces en los próximos años. La única solución es la flexibilidad. Aprende a trabajar en cada entorno y trabajarás bien con cualquier equipo.

 

La escritura estática es excelente porque te evita problemas. La escritura dinámica es excelente porque te quita el estorbo y te permite realizar tu trabajo más rápido. El debate entre lenguajes de tipado fuerte y dinámico continúa, pero comprender el problema comienza con un tipado débil y lenguajes como C.

C trata todo como un número. Un carácter como ao 7o %es el número del símbolo ASCII que lo representa; "verdadero" y "falso" son solo 1 y 0.

C define variables con tipos como intentero y charcarácter, pero eso solo define cuánta memoria usar. Para acceder a la variable e imprimirla, necesito saber el tipo.

int a = 1;printf("The number is %in", a);char z = 'z';printf("The character is %cn", z);

Cuando ejecuto este programa, muestra esto:

el numero es 1el personaje es z

La printffunción necesita una pista nuestra para saber cómo formatear la variable. Si doy la pista equivocada...

char z = 'z';printf("The character is %in", z);

... entonces me sale esto:

El personaje es 122.

C no sabe si zes un carácter o un número entero; tiene un tipo débil.

La escritura débil es rápida porque no hay gastos generales al recordar los diferentes tipos , pero genera algunos errores desagradables. No hay forma de formatear zsi no conoce su tipo de antemano. Imagínese acceder a una variable y obtener el número 1229799107. La cifra podría ser el resultado de un cálculo matemático (1.229.799.107), el coste de un programa gubernamental (1.200 millones de dólares) o una fecha (sábado 20 de diciembre de 2008). Cuando todo lo que tienes es el número, no hay forma de saber si realmente es el código de las letras de mi nombre: zack.

Hasta ahora, sólo hemos cubierto la escritura débil. A menudo se habla de “débil versus fuerte” y “estático versus dinámico” como sinónimos, pero cada uno de ellos describe una fase diferente del mismo problema. También están politizados y las palabras conllevan un juicio de valor implícito. “Débil versus fuerte” hace que uno de ellos suene mucho mejor que el otro, mientras que “estático versus dinámico” hace que uno suene pesado y el otro emocionante.

 

(Imagen: Cris )

Estos dos términos se usan indistintamente, pero describen la diferencia entre la forma en que un lenguaje define los tipos y cómo los descubre cuando se ejecuta el programa. Por ejemplo:

Débil sin escribir Los lenguajes ensambladores no proporcionan ninguna forma de especificar o verificar tipos. Todo es sólo un número.
Escritura estática débil C le permite definir tipos de objetos como estructuras, pero no hace mucho para imponerlos o recordarlos. C convierte automáticamente entre muchos tipos. C++ y Objective-C van más allá con las definiciones pero aún no aplican los tipos resultantes.
Escritura estática fuerte Java te obliga a definir todos los tipos y los verifica con una máquina virtual.
Escritura dinámica fuerte Python , JavaScript y Ruby infieren dinámicamente los tipos de objetos, en lugar de obligarte a definirlos, y luego aplican esos tipos cuando el programa se ejecuta en el intérprete. Todos los lenguajes escritos dinámicamente necesitan un sistema de escritura sólido en tiempo de ejecución o, de lo contrario, no podrán resolver los tipos de objetos.
Escritura dinámica débil Los tipos inferidos dinámicamente no funcionan en un lenguaje de tipo débil porque no hay ningún tipo para inferir.

Ningún lenguaje de programación se ajusta al 100% a ninguna de estas definiciones.

Java se considera uno de los lenguajes más estáticos, pero implementó una API de reflexión integral que le permite cambiar de clase en tiempo de ejecución, asemejándose así a lenguajes más dinámicos. Esta característica permite que la máquina virtual Java admita lenguajes muy dinámicos como Groovy . Los lenguajes de programación funcionales como Lisp , Erlang y Haskell desdibujan aún más las líneas. Por lo general, cuando la gente discute sobre los méritos de los lenguajes de programación fuertes versus los débiles, en realidad se refieren a los distintos grados de filosofías débiles, fuertes, estáticas y dinámicas en cada lenguaje. ## Lenguajes estáticos débiles: C, C++ y Objective-C Estos próximos lenguajes de programación utilizan un subconjunto de la funcionalidad de C y pautas estrictas para mejorar la naturaleza flexible del lenguaje. C++ y Objective-C se compilan en los mismos bytes que C, pero usan el compilador para restringir el código que puedes escribir. En C++ y Objective-C, nuestro número (1229799107) tiene un significado . Puedo definirlo como una cadena de caracteres y asegurarme de que nadie lo use como moneda o fecha. El compilador impone su uso adecuado. La escritura estática admite objetos con conjuntos de funcionalidades que siempre funcionan de una manera bien definida. Ahora puedo crear un Personobjeto y asegurarme de que la getNamefunción siempre devuelva la cadena del nombre de alguien.

class Person { public: string getName() { return "zack"; }};

Ahora puedo llamar a mi objeto así:

 

Person p;printf("The name is %sn", p.getName().c_str());

La escritura estática contribuye en gran medida a evitar los errores de los lenguajes de tipo débil alagregando más restricciones en el compilador, pero no puede verificar nada cuando el programa se está ejecutando porque un programa C++ u Objective-C es como el código C cuando se ejecuta. Ambos lenguajes también dejan la opción de mezclar código C débilmente tipado con C++ u Objective-C de tipo estático para evitar toda la verificación de tipos. Java va un paso más allá y agrega verificación de tipos cuando el código se ejecuta en una máquina virtual. ## Lenguajes estáticos fuertes: Java C++ ofrece algunas formas más estrictas de usar C; Java se asegura de que los utilices.Java necesita que todo esté definidopara que sepas en todo momento qué tipo de objeto tienes, qué funciones tiene ese objeto y si los estás llamando correctamente. Java también dejó de admitir código C y otras formas de salir del tipado estático. El Personobjeto tiene casi el mismo aspecto en Java:

public class Person { public String getName() { return "zack"; }}

Obtengo el nombre creando un nuevo objeto y llamando a la getNamefunción, así:

public class Main { public static void main (String args[]) { Person person = new Person(); System.out.println("The name is " + person.getName()); }}

Este código crea un nuevo Personobjeto, lo asigna a una variable llamada person, llama a la getNamefunción e imprime el valor. Si intento asignar mi personvariable a un tipo diferente, como un carácter o un número entero, el compilador de Java mostrará un error que indica que estos tipos son incompatibles. Si estuviera llamando a una API separada que había cambiado desde que compilé, entonces el tiempo de ejecución de Java aún encontraría el error de tipo.Java no permite código fuera de una clase.Es una de las principales razones por las que la gente se queja de que Java te obliga a escribir demasiado texto repetitivo. La popularidad de Java y su fuerte adherencia a la tipificación fuerte tuvieron un gran impacto en el panorama de la programación. Los firmes defensores de la mecanografía elogiaron a Java por solucionar las grietas de C++. Pero muchos programadores encontraron que Java era demasiado prescriptivo y rígido. Querían una forma rápida de escribir código sin toda la definición adicional de Java.## Lenguajes dinámicos fuertes: JavaScript, Python, Ruby y muchos más En JavaScript, Idefinir una variable con la palabra clave var, en lugar de un tipo como into char. No sé el tipo de esta variable y no lo necesito hasta que realmente quiera acceder a ella. Puedo definir un objeto en JavaScript con la getNamefunción. SeriesLista.com - Programas de TV, Series, Guía de episodios.

var person = { getName: function() { return 'zack'; }};alert('The name is ' + person.getName());

Ahora tengo un objeto llamado person, y tiene una función llamada getName. Si llamo person.getName(), resultará en zack. Declaré personcomo vary puedo reasignarlo a cualquier cosa.

 

var person = { getName: function() { return 'zack'; }};person = 5;alert('The name is ' + person.getName());

Este código crea una variable nombrada persony la asigna a un objeto con una getPersonfunción, pero luego reasigna esa variable al número 5. Cuando se ejecuta este código, el resultado es TypeError: Object 5 has no method 'getName'. JavaScript dice que el objeto 5no tiene una función llamada getName. En Java, este error aparecería durante la compilación, peroJavaScript te hace esperar el tiempo de ejecución. También puedo cambiar el tipo de objeto según las condiciones del programa.

var person = { getName: function() { return 'zack'; }};if (new Date().getMinutes() 29) { person = 5;}alert('The name is ' + person.getName());

Ahora este código funcionará a las 9:15 pero fallará a las 9:30. Java llamaría a esto un error de tipo, pero está bien en JavaScript. La forma más popular de escritura dinámica se llama "tipificación de pato" porque el código mira el objeto durante el tiempo de ejecución para determinar el tipo, y si camina como un pato y grazna como un pato, entonces debe ser un pato.La escritura pato le permite redefinir cualquier objeto en medio del programa.Puede comenzar como un pato y convertirse en cisne o ganso.

var person = { getName: function() { return 'zack'; }};person['getBirthday'] = function() { return 'July 18th';};alert('The name is ' + person.getName() + ' ' + 'and the birthday is ' + person.getBirthday());

En cualquier momento, puedo cambiar la naturaleza de mi Personobjeto para agregar la nueva getBirthdayfunción o eliminar la funcionalidad existente. Java no permitirá eso porque no se pueden verificar los tipos de objetos cuando siempre están cambiando. Redefinir objetos dinámicamente te da mucho poder, para bien y para mal. C muestra errores cuando se ejecuta el programa. C++, Objective-C y Java utilizan el compilador para detectar errores en el momento de la compilación. JavaScript devuelve esos errores al tiempo de ejecución de la aplicación. Es por eso que los partidarios de la escritura fuerte odian tanto JavaScript: parece un gran paso atrás. ellos siempre estanbuscando alternativas de JavaScript. ## ¿Cual es mejor? Estoy buscando un programa para analizar XML, encontrar un elemento en particular, realizar un cambio y guardar el archivo. En un equipo de programadores de Java, escribí el código en el lenguaje dinámico.Pitón.

import sysimport stringfrom xml.dom.minidom import parsedom = parse(sys.argv[1])for node in dom.getElementsByTagName('property'): attr = node.attributes['name']; if attr.value == 'my value': node.childNodes[0] = dom.createTextNode('my new value');file = open(sys.argv[1], 'w');file.write(dom.toxml('UTF-8'));file.close();

Este programa encuentra cada nodo de propiedad con el nombre my valuey establece el contenido en my new value. Defino las variables dompara mi documento XML, nodepara cada nodo de XML que encuentro y attrpara el atributo. Python ni siquiera requiere la palabra clave vary no sabe que nodetiene childNodeso que attrtiene valuehasta que lo llamo. Para cambiar un archivo XML en Java, escribiría una nueva clase, abriría un flujo de entrada, llamaría al analizador DOM, recorrería el árbol, llamaría a los métodos correctos en los elementos correctos y escribiría el archivo en un flujo de salida. Podría simplificar algunas de esas llamadas con una biblioteca, pero aún tendría la sobrecarga de definir mis tipos estáticos. Toda la definición adicional de objetos y variables fácilmente podría ocupar cien líneas. Python toma 14.El código dinámico es generalmente más corto que el código estático.porque necesita menos descripción de lo que va a hacer el código. Este programa sería más corto en Python que en C++ y más corto en Ruby que en Objective-C. Entonces, ¿cuál es mejor?

 

El programador estático dice: El programador dinámico dice:
"La escritura estática detecta errores en el compilador y te evita problemas". "La escritura estática sólo detecta algunos errores y no puedes confiar en que el compilador haga las pruebas".
"Los lenguajes estáticos son más fáciles de leer porque son más explícitos acerca de lo que hace el código". "Los lenguajes dinámicos son más fáciles de leer porque se escribe menos código".
"Al menos sé que el código se compila". "El hecho de que el código se compile no significa que se ejecute".
"Confío en la escritura estática para asegurarme de que mi equipo escriba un buen código". "El compilador no impide que usted escriba código incorrecto".
"Depurar un objeto desconocido es imposible". "Depurar jerarquías de objetos demasiado complejas es insoportable".
“Los errores del compilador ocurren a media mañana en mi oficina; Los errores de tiempo de ejecución ocurren a medianoche para mis clientes”. "No hay sustituto para las pruebas, y las pruebas unitarias encuentran más problemas de los que el compilador jamás podría encontrar".

La escritura estática hizo que nuestro Personobjeto fuera más fácil de entender. Definimos a Personcon un nombre y acordamos qué campos importaban de antemano. Establecer todo claramente hace que sea Personmás fácil depurar pero más difícil de cambiar.

¿ Qué sucede cuando alguien en nuestra aplicación necesita una segunda dirección de correo electrónico? En un lenguaje estático, necesitaríamos redefinir el objeto para que todos tengan dos direcciones de correo electrónico, aunque la mayoría de las personas no las tengan. Agregue un cumpleaños, un color favorito y algunos elementos más y cada uno Persontendrá el doble de campos de los que necesita.

Los lenguajes dinámicos facilitan mucho este problema. Podemos agregar un segundo campo de correo electrónico a uno Personsin agregarlo a todos. Ahora, cada objeto tiene sólo los campos que necesita. Un lenguaje estático podría manejar esto con un mapa genérico de valores, pero luego estás luchando contra el entorno estático para escribir código dinámico. Los programadores de C pasaron años tirándose de los pelos por errores en las conversiones de tipos, valores corruptos y los terribles errores que surgen de pequeños errores tipográficos. Han sido quemados por una escritura débil y la escritura dinámica parece débil.

Los programadores dinámicos pasaron años dándole vueltas a la rigidez de los lenguajes estáticos y anhelan la libertad de hacer que los lenguajes hagan lo que quieran.

He visto que el código estático se vuelve demasiado complejo y resulta imposible de seguir. Intente depurar un JavaBean empresarial o comprender todos los detalles de los genéricos en Java . He visto código dinámico convertirse en un montículo gigante de espaguetis imposibles de mantener. Mire la gran cantidad de terribles programas JavaScript anteriores a jQuery. Node.js hace algunas cosas increíbles, pero no puedo verlo sin recuerdos traumáticos del horrible JavaScript que he depurado.

Conclusión

No hay una conclusión clara. Los lenguajes escritos dinámicamente son populares ahora. El péndulo oscilará hacia adelante y hacia atrás muchas veces en los próximos años. La única solución es la flexibilidad. Aprende a trabajar en cada entorno y trabajarás bien con cualquier equipo.

Créditos de imagen de la imagen en portada: Alexflx54

Otras lecturas

  • No tengas miedo de la programación funcional
  • Una introducción a JavaScript de pila completa
  • Programación declarativa y la web
  • ¿Qué receta de JavaScript es adecuada para usted?

(al) (ea)

Explora más en

  • Codificación
  • javascript
  • Mejoramiento
  • Esenciales





Tal vez te puede interesar:

  1. ¿Deberían abrirse los enlaces en ventanas nuevas?
  2. 24 excelentes tutoriales de AJAX
  3. 70 técnicas nuevas y útiles de AJAX y JavaScript
  4. Más de 45 excelentes recursos y repositorios de fragmentos de código

Una introducción a los sistemas de tipos de programación

Una introducción a los sistemas de tipos de programación

Índice Conclusión Otras lecturas

programar

es

https://aprendeprogramando.es/static/images/programar-una-introduccion-a-los-sistemas-de-tipos-de-programacion-818-0.jpg

2024-05-20

 

Una introducción a los sistemas de tipos de programación
Una introducción a los sistemas de tipos de programación

Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente

 

 

Top 20