programming-languages lisp ocaml

programming languages - ¿Qué aprender? Lisp o OCaml o...?



programming-languages (16)

Ya tengo algunos idiomas en mi haber (en un orden aproximado de experiencia): Python, C, C ++, PHP, Javascript, Haskell, Java, MIPS, ensamblador x86. Pero han pasado casi 2 años desde que aprendí uno nuevo, y estoy empezando a tener la picazón. Tengo algunos criterios:

  1. Debe (repetir: debe) tener una implementación gratuita de Linux
  2. Debería ser diferente de los idiomas que ya conozco. En otras palabras, debería tener características que me hagan pensar en resolver problemas de una manera nueva.
  3. Debería tener algún potencial de uso práctico. No tiene que ser el próximo Java, pero esto excluye a Brainf * y Shakespeare :) Realmente no me importa la cantidad de anuncios de trabajo que tenga, pero las aplicaciones y bibliotecas del mundo real son una ventaja.
  4. Debería tener al menos suficiente material de aprendizaje gratuito para que empiece a usarlo.

Estaba pensando en Lisp (¿CL? ¿Otra cosa?) O OCaml. Ya tengo alguna experiencia con lenguajes funcionales con Haskell (sí, sé que Lisp / OCaml es multi-paradigma). No soy un experto, p. Ej., Partes del código de Real World Haskell aún puede retorcer mi cerebro, pero entiendo los conceptos básicos y algunos avanzados (functores, mónadas).

¿Cuál elegir? ¿Algún otro idioma que haya pasado por alto? Además, ¿podría incluir algunos enlaces útiles a buenos libros / tutoriales, etc.?


¡Echa un vistazo a Smalltalk! Ya sea Cincom VWST o Smalltalk / X - no se moleste con Squeak ya que la interfaz es terrible). VAST también es bueno, pero en realidad solo está centrado en Windows. Y no se preocupe por los escépticos que desprecian el desprecio en Smalltalk, ya que no lo están utilizando y están atascados en la multitud de lenguajes de edición y ejecución-depuración y múltiples bibliotecas vinculadas de distribución. :-)

¿Por qué estos Smalltalks? Bueno, se completan con un excelente IDE, herramientas de GUI integradas, el mejor depurador que verás, ayuda en línea y es totalmente independiente del sistema operativo subyacente. Por ejemplo, una programación ST / X que se ejecuta en Linux puede transferirse (código fuente) a Windows ST / X y debería ejecutarse.

ST / X es gratis, con solo unas restricciones de licencia muy pequeñas. Cincom ofrece una versión gratuita de NC (no comercial) que NO está restringida. Utilizo ST / X como prefiero el aspecto y comportamiento predeterminados que ofrece. Sus interfaces IDE son muy similares.

Los lenguajes sin herramientas IDE y GUI solo están perdiendo el tiempo, ya que el mundo es realmente GUI, sin importar cuán excelente sea el lenguaje subyacente. Por ejemplo, Ruby es genial, pero sin herramientas IDE o GUI fáciles es realmente frustrante.

Smalltalk no es fácil de entender y no es perfecto (¿qué idioma es?) Pero es muy satisfactorio de aprender y usar. Y ahora que el hardware y los sistemas operativos finalmente han alcanzado las necesidades de Smalltalks. muy eficiente.


Al igual que usted, tengo más de una docena de idiomas en mi haber. Mientras buscaba algo para jugar para escribir un compilador cruzado, me encontré con ML y mi familia. Muchas muy buenas ideas allí, y me han enseñado a escribir código, es una forma muy diferente; por ejemplo, mi JavaScript ahora tiene una inclinación decididamente funcional.

Después de jugar con OCaml en Windows un tiempo (y frustrarme con los problemas de estabilidad), me encontré con F #, un descendiente de OCaml. Los dos son bastante similares (pueden compilarse mucho código), pero OCaml aparentemente tiene un sistema macro (P4) y clases de tipo realmente buenos (para escribir operadores "fuertemente tipados" contra tipos genéricos), mientras que F # tiene excelente soporte para operaciones asíncronas y paralelas, mónadas, unidades de medida para tipos numéricos, así como una sintaxis OO más limpia y una integración IDE impresionante (VS2008 y se lanzará de inmediato con VS2010). Actualmente prefiero F #, ya que tengo acceso a todo el tiempo de ejecución de .NET y a un montón de bibliotecas de terceros. De hecho, escribo la mayor parte de mi código de uso único y de utilidad en F # ahora; Para mí, generalmente es mucho más productivo que C ++, JavaScript, C #, PowerShell o cualquier otra cosa.

F # funciona bastante bien bajo Mono en Linux, y tiene un buen número de seguidores allí. El compilador y el tiempo de ejecución serán de fuente abierta una vez que estén estables (lanzados con VS2010), y los desarrolladores consideran que el soporte de Mono es una prioridad suficiente para que se lo considere seriamente para uso que no sea de Microsoft.


C # tiene una implementación gratuita en Linux bajo el proyecto Mono , y podría decirse que es una habilidad muy comercial a menos que seas completamente anti-Microsoft.

Mi libro favorito de C # es Pro C # 2008 y la plataforma .NET 3.5, cuarta edición.

Si realmente quieres lo exótico, F # es un lenguaje de estilo OCaml que se ejecuta en la plataforma .NET y mono, y está recibiendo mucha atención en estos días.

http://msdn.microsoft.com/en-us/fsharp/default.aspx

Libros para F #:
http://www.amazon.com/s/ref=nb_ss_gw?url=search-alias%3Daps&field-keywords=f%23


De las sugerencias que he visto hasta ahora, me gustan Lisp (ver Secko) y Smalltalk (ver brett), ya que ambas te darán otra vista de los idiomas. Prólogo aún más.

Otro idioma que es diferente es Erlang: aún no he tenido la oportunidad de aprenderlo, pero maneja la concurrencia de una manera diferente. El mejor enlace que te puedo dar es Erlang .

En términos de recomendaciones, Lisp es bueno porque se usa actualmente y porque es muy antiguo. Los demás tendrá que mirar las fuentes y ver cuál es la que más apela.


Intenta con FORTRAN, entonces? Escuché que todavía es usado activamente por las comunidades científicas y matemáticas, y además debería ser lo suficientemente diferente como para ser un desafío de aprendizaje.

Compiladores
http://gcc.gnu.org/wiki/GFortranBinaries
http://www.g95.org/
http://www.fortran.com/compilers.html
http://www.thefreecountry.com/compilers/fortran.shtml

IDEs:
http://www.eclipse.org/photran/
http://force.lepsch.com/ (solo FORTRAN 77)

Tutoriales:
Introducción a Modern FORTRAN: http://www-uxsup.csx.cam.ac.uk/courses/Fortran/
Tutorial de FORTRAN 90: http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/fortran.html

También puede aprender Visual Basic.NET, en caso de que alguna vez se vea obligado a mantener eso. Evidentemente mono tiene una implementación de Linux que funciona: http://www.mono-project.com/Visual_Basic


Lisp es un gran HLL, tiene todo lo que otros idiomas carecen. En mi opinión, este es un lenguaje muy bueno que puede "satisfacer" las necesidades de cualquier programador.

Perl también es un HLL como Lisp, es interesante y divertido al mismo tiempo. Deriva de C para que puedas recogerlo a medida que avanzas. Puede ser difícil a veces y algunas personas tienden a perderse mientras aprenden, pero vale la pena saberlo.

Ambos idiomas están libres de uso y vienen con Linux.

Campo de golf

Lisp: si Lisp es tan bueno , una introducción y un tutorial para Common Lisp

Perl: PERL - Extracción práctica y lenguaje de informes

Libros

On Lisp - Gran libro de Paul Graham sobre el lenguaje Lisp. Es gratis y puedes descargarlo here .


Ni Lisp ni OCaml están muy lejos de lo que ya sabes. Aquí hay cuatro sugerencias elegidas en parte por interés intrínseco y en parte por estirar sus horizontes.

  • Un lenguaje de programación lógico, probablemente prólogo. No he encontrado buenos materiales en línea, pero el libro The Art of Prolog de Sterling and Shapiro es excelente. El libro de texto más básico de Clocksin y Mellish también es bueno. El principal punto de interés es la programación con relaciones, no funciones .

  • Un lenguaje puro orientado a objetos , ya sea Smalltalk o Self . Si solo ha utilizado lenguajes híbridos orientados a objetos, se sorprenderá de lo hermosa que puede ser la pura orientación a objetos. He vinculado a la implementación Smalltalk de Smalltalk. Personalmente recomendaría aprender Smalltalk antes de abordar el Yo; Hay una comunidad muy grande y activa y el software está bien desarrollado. El self se apoya en los hombros de Smalltalk y es un diseño aún más inspirador, pero la comunidad es mucho más pequeña. Para aquellos que tienen acceso a la biblioteca digital de ACM, recomiendo la excelente charla de Dave Ungar en HOPL-III ; El papel también es bastante bueno.

  • El lenguaje de programación de Icon tiene dos grandes cosas a su favor; un modelo de evaluación poderoso e inusual con retroceso implícito, y un modelo de procesamiento de cadenas extensible por el usuario que supera todas las expresiones regulares . Lamento decir que Icon nunca ha seguido el ritmo de los tiempos, y de todas mis recomendaciones es lo menos práctico. De hecho me temo que el lenguaje sea moribundo. Pero estirará tu mente casi tanto como Haskell, y en direcciones totalmente diferentes. El icono sigue siendo muy útil para tareas de procesamiento de cadenas de tamaño modesto.

    Puede leer sobre el procesamiento de cadenas de iconos en un artículo de Ralph Griswold de Computer Journal .

  • El lenguaje de programación Lua es mi última y menos radical sugerencia. Su interés no radica tanto en características o paradigmas del lenguaje novedoso sino en la ingeniería superior del lenguaje y su implementación . Lua ocupa una serie de nichos, incluidos scripting, juegos, procesamiento de cadenas y programación funcional ligera. Pero su principal punto de interés es su perfecta integración con C , y para obtener todos los beneficios, debe vincular una biblioteca de C con Lua.

    El sitio web de HOPL-III también contiene una excelente charla y artículo sobre Lua.


Podrías probar Tcl. Era lo suficientemente diferente como para provocar una reacción adversa en mi cerebro, así que realmente no puedo decirte cómo lo encontré diferente, pero se han escrito muchas cosas buenas (tal vez menos en la actualidad que antes).


Prólogo puede ser lo que buscas.

Editar

El primer comentarista tiene razón, mi respuesta fue bastante breve y no muy útil, así que:

Mi implementación preferida es SWI-Prolog. Aprendí personalmente de la Programación de Prólogos para Inteligencia Artificial. Su estilo es bastante claro y contiene muchos ejemplos, pero no tengo ningún otro libro sobre programación lógica (es una vergüenza, en serio), así que no tengo ninguna base para la comparación.


Scala ha sido muy bueno para hacerme ver la programación desde una nueva perspectiva. Todavía no lo he usado para nada parecido a un trabajo, pero sigue afectando la forma en que escribo el código en otros idiomas, no solo en Java, sino en PHP. Recientemente escribí un analizador simple para un plugin de WordPress, y el código es mucho más funcional e inmutable de lo que hubiera sido hace seis meses, y mejor por ello, a pesar de la falta de cumplimiento en PHP.

El único otro idioma que ha afectado la forma en que trabajo tan dramáticamente es Perl, casi una década antes. Perl ha contribuido mucho a la forma en que pseudo-código, incluso si nunca toco el idioma en sí.

Muchas personas comparan los aspectos funcionales de Scala con Haskell. Incluso puedes imaginar que saber que Haskell significa que ya sabes todo lo que Scala podría enseñarte, pero no lo creo. La forma en que Scala combina OO y la función hace que parezca que realmente es la forma más verdadera de ambos.


Si desea hacer uso de su conocimiento de programación funcional y Java, y desea aprender un Lisp, pruebe Clojure .

La implementación es gratuita y multiplataforma, incluido Linux, porque se ejecuta en la JVM. Al ser un Lisp, es lo suficientemente diferente (en formas útiles y maravillosas) de la mayoría de los otros idiomas para hacer las cosas interesantes. Algunas características, como las estructuras de datos inmutables, los métodos múltiples, el soporte de metadatos, el enfoque en la concurrencia segura, etc. son bastante novedosas en comparación con los idiomas que enumeró. Clojure está orientado en gran medida hacia ser un lenguaje práctico y útil en lugar de académico. Es un lenguaje funcional pero no "puro", lo que podría decirse que es algo bueno. También puede hacer uso trivial de cualquier biblioteca de Java desde Clojure.

Clojure es un nuevo lenguaje, por lo que el único libro publicado hasta ahora es Programming Clojure , pero es bastante bueno. También hay un wiki que puede no estar completamente actualizado, porque el lenguaje todavía está evolucionando muy rápidamente. La lista de correo y el canal de IRC son lugares muy amables y acogedores para hacer preguntas. El sitio web oficial también es un buen recurso, por supuesto.


Tanto Common Lisp como Ocaml son ciertamente útiles para aprender. Si ya conoces a Haskell, CL podría ser la experiencia más diferente.

SBCL y Clozure CL son implementaciones muy útiles de Common Lisp en Linux. (Descripción general de varias implementaciones: encuesta de Common Lisp ).

Como punto de partida, recomendaría usar el excelente libro de Peter Seibel, Practical Common Lisp , que está disponible en línea e impreso.

Los punteros de la comunidad están aquí: CLIKI .


Voy a recomendar algo que aún no he intentado, pero planeo hacerlo, así que debes juzgar por ti mismo este. Existe este lenguaje, llamado IO , que es particular porque está basado en un prototipo, como JavaScript, pero también toma prestados conceptos de muchos otros idiomas. Su mercado de trabajo es probablemente inexistente, pero pensé que mencionaba este lenguaje.

De lo contrario, un idioma de la familia Lisp puede ser bastante diferente de lo que ya sabes. En ese sentido, recomendaría Scheme , que es, en mi opinión, más elegante que Common Lisp. El nuevo concepto que podrías encontrar interesante en Scheme son las continuations .

Si tomas el camino del Esquema, tómate un tiempo para ver estos videos de 1986. Son increíbles.


Yo segundo la recomendación de Rainer Common Lisp.

CL tiene todas las cosas que busca y proporcionará una experiencia realmente novedosa que también mejorará sus esfuerzos de codificación y enfoques en otros idiomas.

Pero trae paciencia y persistencia, tendrás que comprender muchos conceptos que parecerán extraños al principio.


Erlang es bastante interesante de aprender debido a su modelo de concurrencia súper eficiente y la facilidad con la que puede escribir sistemas distribuidos (por ejemplo, CouchDB fue escrito en Erlang). Es un lenguaje funcional de tipo dinámico, pero también puede escribir código de manera procesal. El tutorial con el que lo aprendí se llama "Getting Started with Erlang" , que cubre casi todas las partes del idioma.


Factor es radicalmente diferente de todo lo que dijo que sabe, y también de todo lo que se menciona. Se basa en la pila, como Forth, pero tiene una biblioteca bastante completa y muchas características interesantes.

Ada es muy práctico, hay un compilador basado en gcc, pero también muy diferente de los otros lenguajes imperativos que conoces. Encuentro el sistema de tipos un poco sofocante, pero valió la pena aprender algo sobre.