2010-09-11 11 views
25

"Estábamos buscando los programadores de C++. Nosotros pudimos arrastrar muchos de ellos aproximadamente hasta la mitad de Lisp".¿Cómo se inspira Java en Lisp?

  • de Guy Steele, co-autor del Java specspec

Fuente: http://www.paulgraham.com/icad.html

Contexto: http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg04045.html

me encontré con la cita anterior otro día. Obtuve muchas características exclusivas de java (sobre C++), como la recolección de basura que inicialmente se encontraron en Lisp. Pero ¿cómo más java arrastró a los programadores de C++ a mitad de camino a lisp?

+4

Si había alguna arrastrando hacia Lisp, desde luego, no se muy lejos. Si es posible, publique un enlace, parece una afirmación extraña y me gustaría verla en contexto. –

+1

Esta pregunta sería más apropiada en http://programmers.stackexchange.com/ –

+0

@Tom en esa discusión, Scott McKay, un antiguo Scheme y Dylan hacker forma el software ITA, dice 'Sí, arrastró a mucha gente hasta la mitad de Lisp '. ¿A qué se están refiriendo todos? Estoy confundido. – Surya

Respuesta

10

Algunos aspectos de Java que lo hacen más "Lisp" que C++ son:

  • recolección de basura
  • tipo fuerte de seguridad
  • reflexión
  • sin preprocesador (pero Common Lisp hace tienen macros!)

EDITAR

Por cierto, cita de Guy Steele proviene de esta lista de correo publicación en 2003:

http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg04045.html

(Google es mi amigo :-))

+0

sin macros tampoco :-( – Anycorn

+0

El preprocesamiento deliberado de omisión y las macros es quizás la mayor mejora más importante para la legibilidad que Java tiene sobre C. Usted _KNOW_ que cuando ve un token de multiplicación (*) _ significa _ multiplicación y no algo tonto definido en una macro –

+1

@missing factor, lisp macros no tiene sentido en el contexto –

24

Tomemos lista de viñetas famosa de Paul Graham y compara:

  • condicionales: Java tiene condicionales. Bueno, C++ también los tenía.

  • A Tipo de función: Java no tiene funciones de primera clase. C++ tampoco los tenía.

  • Recursión: Java admite recursion. C++ lo apoyó también.

  • Escritura dinámica: Java está tipado estáticamente. También lo fue C++.

  • Garbage Collection: Java tiene una recolección de basura. C++ no.

  • Programas compuestos por expresiones: Tanto Java como C++ hacen una distinción entre enunciados y expresiones. Entonces ambos no logran satisfacer este punto.

  • A Tipo de símbolo: Ni Java ni C++ admiten esto como parte del lenguaje. Sin embargo, es muy fácil de implementar.

  • Homoiconicidad: De nuevo, ni Java ni C++ son homocónicos.

  • Todo el idioma existe todo el tiempo: No, de nuevo.

Así que lo único que se puede decir de Java toma más cerca de Lisp en comparación con C++ es la recolección de basura, lo que, en mi opinión, no es un argumento lo suficientemente convincente como para justificar la cita de Steele.

Conclusión: (subjetiva) La cita arriba indicada de Guy Steele es idiota. Período.


Una cita muy reveladora de comp.lang.scheme:

usted está enviando a un grupo Esquema. Por aquí, argumentar que Java es mejor que C++ es como argumentar que los saltamontes saben mejor que la corteza de árbol.
  — Thant Tessman, comp.lang.scheme

:-)

+3

La cita no es tan idiota si la lees en contexto. –

+8

@Stephen C: Sigue siendo una exageración, una gran exageración. "GC hace que el lenguaje Lispy" sea francamente idiota. – missingfaktor

+2

Y su crítica de la lista de viñetas también está desviada. La lista de viñetas se introduce con esta frase: "Cuando se desarrolló por primera vez, Lisp encarnó nueve ideas nuevas". No tiene nada que ver con las características que Java y/o C++ pueden haber recogido o no ... más de 20 años y más de 30 años después. –

3

Hay más de unos pocos idiomas que pueden decir que se están moviendo hacia Lisp. Rígido Java no es uno de ellos.

Tuvo que haber sido una respuesta irónica o quizás estaba bajando de un doblador de 3 días.

+0

-1 - no es educado dar a entender que Guy Steele tiene un problema con el alcohol ... incluso como una broma. –

+6

Ni siquiera insinué que tenga un problema con el alcohol. ¿Nunca has conocido a alguien que se volvió loco durante un fin de semana pero que no era adicto al alcohol? Por favor, no hagas suposiciones sobre lo que quise decir o no quise decir. Estaba siendo extremadamente cortés al no calificar su declaración de completamente idiota y mantenerla irónica. Tendré que recordar que es mucho mejor decir sin rodeos algo idiota cuando es en lugar de utilizar el humor para disculpar a un tipo brillante. – user370731

21

Guy L. Steele es muy conocido en el mundo Lisp (que co-diseñó uno de los dos principales dialectos de Lisp en uso hoy en día) y al parecer fue invitado al grupo de diseño de Java en Sun después de la lengua había sido diseñado para escribir la especificación ya que era conocido por escribir buenas especificaciones para los idiomas existentes.

El "medio camino a Lisp" en mi mente no es tanto en la sintaxis del lenguaje Java (que modela C intencionalmente) como en la mentalidad de la JVM. "NO debes preocuparte por la recolección de basura". "No debes preocuparte por los punteros, excepto para los objetos de referencia". Estas cosas parecen naturales hoy en día, pero fueron herejes para algunos cuando salió Java.

Esto especialmente desde que Java fue increíblemente lento hasta Java 1.3, pero eso se debió a que valoraron la corrección más alta que la velocidad de implementación. En la actualidad, la mayoría de las implementaciones de Java son muy rápidas, pero a costa de la memoria.

+0

Sun's 1.1.5 funcionó a un ritmo respetable. Otras variantes llegaron antes. –

+0

@Tom, solo recuerdo que Microsoft JVM corrió en círculos alrededor de Sun JVM hasta que salió HotSpot. –

+1

La JVM de Microsoft fue rápida, pero el JIT Sun prestado fue respetable. Estaba interpretando bytecode que es "increíblemente lento". –

17

El punto principal en la evolución de distancia de C++ hacia Java - desde una perspectiva Lisp - es el uso de la llamada 'memoria administrada':

  • datos etiquetados
  • recolección de basura precisa
  • operaciones de bajo nivel seguras
  • el uso de una máquina virtual con instrucciones específicas del lenguaje
  • carga de código

Este modelo no era inusual en el mundo de Lisp, donde había implementaciones de software y hardware de máquinas virtuales con instrucciones específicas del lenguaje.

Por ejemplo, Interlisp de BBN y Xerox tenían una máquina virtual (en la década de 1970). También hubo estaciones de trabajo Interlisp (1970s-1980s) donde se proporcionó el conjunto de instrucciones en el nivel del procesador (microcodificado). Las instrucciones se verifican en tiempo de ejecución (does + have the right arguments). Esto también es muy similar a lo que usaba un tiempo de ejecución en Smalltalk. Los sistemas Xerox Smalltalk e InterLisp se ejecutaban en el mismo hardware, pero con diferentes microcódigos.

Eso significa que uno puede buscar en un depurador en los datos JVM y el depurador siempre sabe qué tipos primitivos hay. La reflexión puede usarse para obtener información. Esto es similar a cómo se puede mirar en Lisp con un depurador en los objetos. En C++ esto solo es posible cuando hay información de depuración presente, que generalmente solo es el caso durante el desarrollo.

Por lo tanto, la JVM se parece en cierto modo a un 'tiempo de ejecución' típico de Lisp.

Eso es diferente con C++, donde los datos de C++ son bits de bajo nivel (generalmente) y no había 'memoria administrada'.

James Gosling (el "padre" de Java) sabía un poco sobre Lisp desde la implementación de Gosling Emacs en C en Unix a principios de la década de 1980. Su Emacs tenía un dialecto de Lisp extraño para extender el editor: Mocklisp.

Aparte de eso, Java y Lisp son muy diferentes, por lo que 'a mitad de camino' puede no ser el caso, pero ayudó, por ejemplo, a superar la hostilidad contra algo como 'recolección de basura'. Desafortunadamente, especialmente en los primeros tiempos de Java, Java y JVM también estaban sobre promocionados y después de un tiempo los problemas de rendimiento se volvieron obvios. Esa fue una razón para la muerte de las aplicaciones de escritorio que eran lentas (tiempo de inicio lento, tiempo de respuesta lento, ...).

+0

Es cierto. C (y C++) miran la memoria como palabras individuales, varias de las cuales pueden constituir cadenas, estructuras u objetos. Java se ve como memoria como algo en lo que existen objetos y de lo contrario no debería estar interesado. –

4

No creo que Java sea muy Lisp-ish, pero C++ es incluso menos Lisp-ish. Como ejemplo, considere esta invocación a CollectionUtils.filter():

void foo(final int n) { 
    CollectionUtils.filter(collection, new Predicate() { 
     public boolean evaluate(Object input) { return input.equals(n); } 
    }); 
} 

Encuentro este estilo más Lisp-ish que la versión equivalente de C++:

void foo(int n) { 
    // C++ does not have anonymous classes in the Java sense, so 
    // we need a separate definition 
    struct Predicate { 
     // This class does not have access to variables defined 
     // in the enclosing scope, so we need to explicitly pass 
     // whatever we need 
     int n; 
     Predicate(int n) : n(n) { } 

     bool operator()(int x) { return x == n; }  
    }; 

    CollectionUtils::filter(collection, Predicate(n)); 
} 
+0

C++ tiene clases anónimas, se llaman lambdas. – Puppy

+1

@DeadMG: No realmente. Las clases anónimas en Java pueden tener múltiples métodos, a diferencia de las lambdas en C++ 0x que se expanden a clases con operador sobrecargado(). – missingfaktor

+0

+1 como se prometió :) – missingfaktor