Usando la terminología adecuada: ¿Método?

Aug 12, 2015

En esta serie de artículos mi intención es revisar por qué los programadores usamos cierta terminología, ciertas palabras, algunas de las cuales considero inadecuadas.
En este caso quiero hablar sobre la palabra método (method en inglés).

Antes que nada…

¿Qué es un método?

Cualquier programador sabe que un objeto [1] tiene estado y comportamiento. El estado se almacena en campos (fields en inglés) y el comportamiento se logra a través de métodos.
Un método (en el contexto de la programación) es una secuencia de instrucciones, es parte de un objeto o clase. [2]

Pero…

¿Por qué “método”?

¿Qué diferencia hay entre un método y un procedimiento?
Un procedimiento es una secuencia de instrucciones. [2]

¿La única diferencia consiste en que un método debe pertenecer a una clase mientras en que un procedimiento no se aclara nada con respecto a clases? (De hecho el término “procedimiento” es usado desde mucho antes de la existencia del término “clase”).

Resumiendo, un método es un procedimiento que es miembro de una clase.
Entonces, tenemos procedimientos que son miembros y procedimientos libres (fuera de una clase).

Me sigo preguntando, …

¿Por qué usamos el término “método” y no “procedimiento”?

Mi hipótesis es que con el establecimiento de Java como uno de los lenguajes de programación más populares, también se produjo la popularización de su terminología. A partir de ese momento, otros lenguajes y programadores adoptan la terminología popularizada por Java y se vuelve más frecuente su uso que la terminología tradicional.

Quiero ahora hacer una búsqueda a través de la historia de los lenguajes de programación para entender por qué comenzamos a llamar “método” a los “procedimientos”. Voy a ir desde tiempos más modernos a tiempos más remotos…

Java

En Java, no existen los procedimientos libres, todos los procedimientos deben ser miembro de una clase, estos procedimientos miembro efectivamente se llaman métodos.

Según la especificación de Java 8 [3]:

La especificación de Java describe la relación entre un método y una clase, aunque no establece cuál es la definición de la palabra “método”.

Más allá de la definición, en la especificación no vamos a encontrar por qué los diseñadores del lenguaje decidieron llamar “método” a los procedimientos, así que debemos ir más atrás.

Java hereda la mayor parte de su sintaxis (no así su semántica) y terminología de C++.

C++

C++ nace, a finales de la década de 1970, como un súper-conjunto del lenguaje de programación C con el agregado tecnología de objetos.

Por lo tanto, en C++ tenemos procedimientos miembros y libres, denominados member y non-member functions.

Según el estándar de C++ [4]:

O sea, en C++ no se usa la palabra “método”. Puede que algunos programadores C++ usen la palabra “método” debido a que el término es muy popular hoy día; pero, tanto el estándar C++ como los programadores más cercanos al riñón del lenguaje no lo utilizan.

Entonces… ¿Cuál es el término correcto para designar el código que modela el comportamiento de los objetos? ¿Es “método”? ¿Es “procedimiento”? ¿Qué lenguaje usa la terminología más adecuada?

Para ello debo ir aún más atrás.
C++ hereda su “parte” de objetos del lenguaje de programación Simula.

Simula

Simula es considerado el primer lenguaje de programación orientado a objetos. Es un lenguaje de tipado estático basado en ALGOL 60.

Simula permite que los procedimientos sean declarados dentro de una clase y también fuera de ella. A los primeros los denomina local procedures y a los últimos non-local procedures. [5]

Entonces, si C++ y Simula no hacen mención a algo llamado “método”, ¿De dónde saca Java esa palabra? ¿Es una invención de los diseñadores del lenguaje? ¿La copia de algún otro lenguaje?

La respuesta es…

Smalltalk

Smalltalk es un lenguaje de programación orientado a objetos, inspirado en Simula (en parte), que fue desarrollado durante la década de 1970 y vio la luz a principios de los 80’s. A diferencia de Simula, Smalltalk es un lenguaje de tipado dinámico.

Smalltalk incorpora los conceptos de mensajes y métodos.

Según el estándar de Smalltalk [6]:

Como no pude encontrar referencias anteriores a Smalltalk sobre algún otro lenguaje que utilice la palabra “método”, le consulté a Paul McJones, miembro del Software Preservation Group y coautor de Elements of Programming. Considero a Paul una eminencia en lo que respecta a historia de la computación y en particular los lenguajes de programación.

Fernando: … Do you know any programming language, before Smalltalk, that use the word “method”? …

Paul: You ask a very interesting question. I think you are correct that the word “method” was first used in that sense by the Smalltalk community. I looked through some early documents, such as the Smalltalk-72 Instruction Manual, and I don’t see “method” being used yet… Dan Ingalls’s 1978 POPL paper on Smalltalk-76 is the earliest paper I’ve found so far that uses method in the sense you are interested in…

Paul cree, al igual que yo, que la palabra “método” fue usada por primera vez por la comunidad de programadores Smalltalk. Además me indica que estuvo revisando viejos manuales y en el manual de Smalltalk-72 [7] no se hace mención sobre “método”, pero sí es mencionado en un paper de 1978 que habla sobre Smalltalk-76. [8]

O sea, estoy casi seguro que la comunidad Smalltalk acuñó el término, pero no lo hizo desde el principio sino a medida que el lenguaje fue evolucionando.

Otros lenguajes

Quiero aquí analizar otros lenguajes que también soportan tecnología de objetos para verificar como nomenclan a sus procedimientos.

Eiffel

Eiffel es un lenguaje que nace a mediados de 1980 y, al igual que C++, es heredero directo de Simula.

En Eiffel todo miembro de una clase se lo llama feature. Al estado se lo denomina attributes y al comportamiento routines. A su vez, las routines se dividen en functions y procedures dependiendo si retornan o no un resultado. [9]

En Eiffel todas las routines son miembros de una clase, no se permite la existencia de procedimientos libres.

Python

El lenguaje de programación Python admite tanto procedimientos libres como procedimientos miembros. Los denomina functions y methods respectivamente. [10]

Python me llamó la atención porque es creado unos años antes que Java; la primera implementación de Python es de 1989 [11] mientras que la primera de Java es de 1995 [12].
Pareciera que este hecho rompe mi conjetura de que Java fue el impulsor de la palabra “método”.

Si bien la primera implementación de Java sale a la luz en 1995, en tan solo unos años, en 1998, ya era unos de los lenguajes más populares. En cambio Python tuvo un camino bastante más lento hacia su popularización, recién comenzó a ser popular por los años 2003/2004. [13]
Por lo que mi conjetura todavía sigue siendo válida, el impulsor de “método” fue Java y no Python.

Volviendo a Python, la palabra “método” es mencionada en las versiones recientes (3.4.3 y 2.7.10) de la documentación del lenguaje. Entonces dudé sobre si Python utiliza “método” desde sus orígenes o si fue mutando su terminología con el tiempo, sobre todo con la popularización de Java.
Gracias a que los muchachos de python.org hacen un excelente trabajo manteniendo las versiones históricas de la documentación, pude verificar que la palabra “método” es utilizada desde la versión 0.9.1 [14] (salvo que la documentación haya sido alterada con el tiempo, pero confiemos en que no sea así).

O sea, Python es el primer lenguaje, después de Smalltalk, en usar la palabra “método”. Al menos de los lenguajes que he podido verificar.

Al igual que me lo pregunto con Java, ¿Por qué Python usa método y no algún otro término más común para esa época?.

Nadie mejor que el creador del lenguaje, Guido van Rossum para iluminarme. Me tomé el atrevimiento de escribirle un correo electrónico; Guido fue muy amable en responderme y permitir que lo cite en este artículo:

Fernando: Why did you use “method” instead of any other word? Have you taken from Smalltalk? Or,… from any other programming language?

Guido: Good question. I don’t recall, but it’s likely that I was somehow influenced by Smalltalk, or people around me who were influenced by Smalltalk. I definitely opened a big book about Smalltalk to learn about byte code, and I also recall we had a Smalltalk implementation that we sometimes played with (some things that were wrong with that influenced some of my philosophy for Python).

Guido no recuerda bien, pero admite haber sido influenciado por Smalltalk en aquella época.

C#

C# es un lenguaje de programación que nace siendo muy similar a Java (casi idéntico) con algunas reminiscencias de C++. Luego, con los años el lenguaje formó su propia identidad.

C# copia en su gran mayoría la terminología de Java. Una de las palabras que copia es “método”.

Según el estándar C# [15]:

A diferencia de Java, el estándar C# sí define el significado de la palabra “método”.

Al ser un lenguaje muy usado, especialmente por seguidores de la “filosofía” Microsoft, C# también ha contribuido a la popularización del término.

Objective-C

Objective-C es un lenguaje desarrollado a principios de los 1980’s. Al igual que C++, nace como un súper-conjunto de C al que se le agrega tecnología de objetos.
A diferencia de C++, el modelo de objetos de Objective-C está basado en Smalltalk y no en Simula.

Objective-C cuenta con el concepto de mensajes y también el de método. [16]

Lenguajes anteriores a Smalltalk

He buscado en manuales, estándares y documentación de lenguajes de programación anteriores a Smalltalk, no relacionados con orientación a objetos, pero sí muy reconocidos por su influencia sobre los demás lenguajes de programación.
Específicamente los lenguajes son: Fortran, Algol y C. En la documentación de ninguno de ellos se hace mención a la palabra “método”. En cambio usan términos como routine, subroutine, procedure o function [17].

Otras fuentes

Para mejorar mi investigación he hecho una búsqueda en la bibliografía (sobre programación en general) que tengo a mi disposición, textos que considero clásicos.

En ninguna de las 3.456 páginas de estos 5 libros he encontrado la palabra “método” haciendo referencia a un “procedimiento”. Obviamente la palabra “método” aparece en varias oportunidades, pero no en el sentido que estoy buscando.

Pendientes

  1. Leer documentación/manuales originales sobre los siguientes lenguajes de programación:
    • Lisp
    • Scheme
    • Ada
    • Modula-2
    • Common Lisp
  2. Buscar en algunos textos clásicos:

  3. Enviar mi consulta a los siguientes diseñadores de lenguajes de programación:

    • Alan Kay
    • Dan Ingalls
    • Dick Gabriel
    • James Gosling
    • Anders Hejlsberg

He tratado de contactar a alguno de ellos, pero no he recibido respuesta aún.

Conclusiones

La palabra “método” ha sido introducida al mundo de la programación por el lenguaje Smalltalk. Al ser un lenguaje prácticamente no usado en la industria, la palabra no era muy conocida allá por los 80’s y principios de los 90’s.

Quizás fue un error de los diseñadores de Smalltalk el no haber utilizado nomenclatura existente, o quizás no fue un error, ya que Smalltalk introdujo un modelo de objetos distinto al de Simula y ese cambio quizás ameritó un cambio de nombres. Es muy difícil de determinar si fue una decisión equivocada o no.

Java y Python adoptan terminología de Smalltalk en su vocabulario. No encuentro un vínculo muy fuerte entre Smalltalk y Java/Python que justifique el uso del término, esto me hace pensar en que el uso de “método” es un error en estos lenguajes. Aunque, como dije antes, es muy difícil de juzgar si la decisión de usar cierta nomenclatura es errónea.

C++, Objective-C y Eiffel utilizan terminología similar a sus predecesores, puede que con algunas variaciones, que pueden ser mínimas o necesarias para adaptarse a cambios introducidos por los lenguajes.

Algunos lenguajes, como C#, copian características de Java, pero también copian el “error” de incorporar “método” a su terminología.

La palabra “método” se infiltra en el vocabulario de los programadores.
Ya no hay vuelta atrás ;)

Usted use el término que más le guste, yo me voy a seguir usando procedimiento o función (siempre y cuando recuerde que no me gusta la palabra “método”).


Agradecimientos

Un agradecimiento especial para Paul McJones y Guido van Rossum por responder amablemente a mis preguntas y por brindarme información trascendental.
También quiero agradecer a Mario dal Lago y Javier Velilla por revisar el artículo y sugerir correcciones.


Notas / Referencias

[1] Aquí nos referimos a la definición de “objeto” en el contexto de la Programación Orientada a Objetos:
      Object-Oriented Software Construction (2nd Ed) by Bertrand Meyer [1997, page 1198]
Que difiere de la definición de “objeto” dada en:
      Elements of Programming by Stepanov and McJones [2009, page 4]
Esta última definición es la preferida por el autor del blog, en caso de que no se aclare a cuál de las dos definiciones se hace referencia, el lector debe asumir que se está hablando de la definición dada por Stepanov.

[2] Definición simplificada, para una definición más detallada referirse a:
      Object-Oriented Software Construction (2nd Ed) by Bertrand Meyer [1997, page 174]

[3] The Java Language Specification (Java SE 8 Edition), Chapter 8 [pages 191, 192]

[4] ISO International Standard ISO/IEC 14882:2014(E) – Programming Language C++, current working draft (at Aug, 2015), sections: 9.3 [class.mfct] and 8.3.5 [dcl.fct]

[5] Hay muy poca bibliografía disponible acerca del lenguaje, pero aquí pueden encontrar un excelente trabajo de recopilación de viejos manuales.

[6] ANSI Smalltalk Standard v1.9 199712 NCITS X3J20 draft, Section 3.1 [page 9]

[7] Smalltalk-72 Instruction Manual by Adele Goldberg and Alan Kay [page 44]

[8] The Smalltalk-76 Programming System. Design and Implementation

[9] Se especifica en:
      Object-Oriented Software Construction (2nd Ed) by Bertrand Meyer [1997, pages 174, 175]
y en:
      Standard ECMA-367. Eiffel: Analysis, Design and Programming Language. 2nd edition (June 2006), Section 8.5.10 [page 38]

[10] Python 2.7.10 Documentation

[11] A Brief Timeline of Python

[12] The History of Java Technology

[13] Sobre la popularización de los lenguajes, una de las fuentes en las que me baso es Tiobe Index. Aunque tengo ciertas dudas sobre el método de medición de Tiobe, hoy en día es lo mejor que tenemos.
La otra fuente es mi memoria. No recuerdo a Python como un lenguaje popular en los 90’s.
Yo creo que Python comienza a popularizarse con el boom de los lenguajes dinámicos a comienzo de los 2000’s y tiene un empuje aún mayor con la creación del framework web Django.

[14] Repositorio de viejas versiones de Python

[15] Standard ECMA-334. C# Language Specification. 4th edition (June 2006), Section 8.7.3 [page 34]

[16] Objective-C no cuenta ni con un estándar ni una especificación. Lo más “formal” que encontré fue una página web:
      Programming With ObjectiveC
Kimberley Hagan me escribió para compartir un recurso que cree que puede ser valioso para programadores Objective-C, así que aquí dejo el enlace por si quieren pegarle una mirada:
      Objective-C: Guide and Resources

[17] Para documentación sobre FORTRAN, ALGOL y C: ISO/IEC JTC1/SC22/WG14 - The international standardization working group for the programming language C.