¿Cuáles son los idiomas importantes para aprender a entender diferentes enfoques y conceptos? [cerrado]


Cuando todo lo que tienes es un par de cortadores de pernos y una botella de vodka, todo parece la cerradura de la puerta del cobertizo de Wolf Blitzer. (Reemplace eso con un martillo y un clavo si no lee xkcd)

Actualmente programo Clojure, Python, Java y PHP, por lo que estoy familiarizado con la sintaxis de C y LISP, así como con el espacio en blanco. Conozco sistemas imperativos, funcionales, inmutables, OOP y un par de tipos y otras cosas. Ahora quiero más!

¿ Cuáles son los idiomas que toman un diferente enfoque y sería útil para la elección de herramientas prácticas o la comprensión teórica?

No tengo ganas de aprender otro lenguaje funcional(Haskell) u otro lenguaje imperativo OOP(Ruby), ni quiero practicar lenguajes divertidos poco prácticos como Brainfuck.

Una cosa muy interesante que me encontré son los lenguajes basados en stack monoicónicos como Factor.

Solo cuando siento que entiendo la mayoría de los conceptos y tengo respuestas a todas mis preguntas, quiero empieza a pensar en mi propio lenguaje de juguetes para contener todas mis preferencias personales.

Author: Pepijn, 2010-10-18

24 answers

Las cuestiones de practicidad son altamente subjetivas, así que simplemente diré que aprender diferentes paradigmas de lenguaje solo servirá para hacerte un mejor programador. ¿Qué es más práctico que eso?

Funcional, Haskell - Sé que dijiste que no querías, pero deberías reconsiderarlo. Has conseguido algo de exposición funcional con Clojure e incluso Python, pero no lo has experimentado al máximo sin Haskell. Si realmente estás en contra de Haskell entonces los buenos compromisos son ML u OCaml.

Declarative, Datalog - Muchas personas recomendarían Prolog en esta ranura, pero creo que Datalog es un ejemplo más limpio de un lenguaje declarativo.

Array, J - Acabo de descubrir J, pero me parece que es un lenguaje impresionante. Torcerá tu mente en un pretzel. Le agradecerás a J por eso.

Stack, Factor / Forth - Factor es muy poderoso y planeo profundizar en él LO antes posible. Forth es el abuelo de los lenguajes de pila, y como un bono adicional es fácil de implementar usted mismo. Hay algo que decir sobre el aprendizaje a través de la implementación.

Dataflow, Oz - Creo que la influencia de Oz está en el auge y solo continuará creciendo en el futuro.

Basado en prototipos, JavaScript / Io / Self - Self es el abuelo y altamente influyente en todos los lenguajes basados en prototipos. Esto no es lo mismo que el OOP basado en clases y no debería ser tratado como tal. Muchas personas vienen a un lenguaje prototipo y crean un sistema de clases ad-hoc, pero si su objetivo es expandir su mente, entonces creo que es un error. Utilice el lenguaje a su plena capacidad. Lee Organizar Programas sin Clases para obtener ideas.

Sistema experto, CLIPS - Siempre recomiendo esto. Si conoces Prolog, entonces probablemente tendrás la ventaja para ponerte al día, pero es un idioma muy diferente.

Frink - Frink es un lenguaje de propósito general, pero es famoso por su sistema de conversiones de unidades. Encuentro que este lenguaje es muy inspirador en su impulso implacable de ser el mejor en lo que hace. Además... es muy divertido!

Tipos funcionales + opcionales, Qi - Usted dice que tiene experiencia con algunos sistemas de tipos, pero ¿tiene experiencia con sistemas de tipo "skinnable*? Nadie lo ha hecho... pero deberían. Qi es como Lisp en muchos sentidos, pero su sistema de tipo soplará su mente.

Actors + Fault-tolerance, Erlang - El modelo de proceso de Erlang recibe mucho ruido, pero sus mecanismos de tolerancia a fallos y hot-code-swapping cambian el juego. No aprenderá mucho sobre FP que no aprendería con Clojure, pero sus características de FT le harán preguntarse por qué más idiomas no pueden hacer esto bien.

Disfrute!

 288
Author: fogus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-06 19:02:02

¿Qué pasa con Prolog (para unificación/backtracking, etc.), Smalltalk (para "everything's a message"), Forth (polaco inverso, intérpretes roscados, etc.), Scheme (continuaciones)?

No es un lenguaje, pero el Arte del Protocolo Metaobject es cosas alucinantes

 33
Author: The Archetypal Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-18 11:31:42

Actualmente programo Clojure, Python, Java y PHP [...] ¿Cuáles son los idiomas que adoptan un enfoque diferente y serían útiles para la elección de herramientas prácticas o la comprensión teórica?

C

Hay un lote de código C por ahí---es definitivamente práctico. Si aprendes C++ también, hay ungran lote de más código alrededor (y el salto es corto una vez que conoces C y Java).

También te da (o te obliga a tener) una gran comprensión de algunas cuestiones teóricas; por ejemplo, cada programa en ejecución vive en una matriz de bytes de 4 GB, en algún sentido. Punteros en C son realmente sólo índices en esta matriz - - - son sólo un tipo diferente de entero. No es diferente en Java, Python, PHP, excepto oculto debajo de una capa superficial.

También, puede escribir código orientado a objetos en C, solo tiene que ser un poco manual sobre vtables y tal. La colección de rompecabezas portátil de Simon Tatham es un gran ejemplo de código C accesible orientado a objetos; también está bastante bien diseñado y vale la pena leerlo a un programador de C principiante / intermedio. Esto es lo que sucede en Haskell también - - - las clases de tipo son en cierto sentido "solo otra vtable".

Otra gran cosa sobre C: participar en preguntas y respuestas con programadores de C expertos te dará muchas respuestas que explican C en términos de construcciones de nivel inferior, lo que construye tu base de conocimiento más cercana a la hierro.

Puede que me esté perdiendo el punto de OP - - - Creo que lo estoy, a juzgar por las otras respuestas---pero creo que podría ser una respuesta útil para otras personas que tienen una pregunta similar y leen este hilo.

 33
Author: Jonas Kölker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-21 17:54:23

Secundo a Haskell. No pienses "Conozco un ceceo, así que sé programación funcional". ¿Has oído hablar de clases tipo? ¿Tipos de datos algebraicos? Las mónadas? "Moderno" (más o menos - al menos no 50 años ;) ) los lenguajes funcionales, especialmente Haskell, han explorado una plétora de conceptos nuevos y útiles muy poderosos. Las clases de tipos agregan polimorfismo ad-hoc, pero la inferencia de tipos (otra cosa que los lenguajes que ya sabes no tienen) funciona como un encanto. Los tipos de datos algebraicos son simplemente impresionantes, especialmente para modelar estructuras de datos similares a árboles, pero también funcionan bien para enumeraciones o registros simples. Y mónadas... bueno, digamos que la gente los usa para hacer excepciones, E/S, analizadores, comprensiones de listas y mucho más, ¡de maneras puramente funcionales!

Además, todo el tema es lo suficientemente profundo como para mantenerlo ocupado durante años;)

 33
Author: 2 revs, 2 users 80%user395760,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-12 06:38:05

Del sitio de Peter Norvig:

"Aprende al menos media docena de lenguajes de programación. Incluya un lenguaje que soporte abstracciones de clases (como Java o C++), uno que soporte abstracción funcional (como Lisp o ML), uno que soporte abstracción sintáctica (como Lisp), uno que soporte especificaciones declarativas (como Prolog o plantillas C++), uno que soporte corrutinas (como Icon o Scheme), y uno que soporte paralelismo (como Sisal). "

Http://norvig.com/21-days.html

 27
Author: Galactus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-18 14:04:29

Me sorprende que después de 6 meses y cientos de votos, nadie haya mencionado SQL...

 13
Author: ypercubeᵀᴹ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 19:21:09

En los tipos como teoremas / sistemas de tipos avanzados: Coq ( creo que Agda viene en esta categoría también).

Coq es un asistente de pruebas integrado en un lenguaje de programación funcional.

Puede escribir pruebas matemáticas y Coq ayuda a construir una solución. Puede escribir funciones y probar propiedades al respecto.

Tiene tipos dependientes, que solo me volaron la mente. Un ejemplo sencillo:

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

Es la firma de una función que concatena dos matrices de tamaño n y m de elementos de A y devuelve una matriz de tamaño (n + m). No se compila si la función no devuelve eso!

Se basa en el cálculo de construcciones inductivas, y tiene una teoría sólida detrás. No soy lo suficientemente inteligente para entenderlo todo, pero creo que vale la pena echarle un vistazo, especialmente si tiendes a la teoría de tipos.

EDITAR: Necesito mencionar: escribes una función en Coq y luego puedes PROBAR que es correcta para cualquier entrada, ¡eso es increíble!

 11
Author: GClaramunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-20 02:45:06

Uno de los idiomas que me interesa tiene un punto de vista muy diferente (incluyendo un nuevo vocabulario para definir los elementos del lenguaje y una sintaxis de diferencias radical) es J. Haskell sería la opción obvia para mí, aunque es un lang funcional, porque su sistema de tipos y otras características únicas abren tu mente y te hacen repensar tus conocimientos previos en programación (funcional).

 6
Author: jneira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-18 12:34:43

La programación de flujo de datos, también conocida como programación basada en flujo, es un buen paso adelante en el camino. Algunas palabras de moda: procesamiento paralelo, prototipado rápido, programación visual (no tan malo como sonidos primero).

Los artículos de Wikipedia son buenos:

En ciencias de la computación, basado en el flujo programación (FBP) es una programación paradigma que define las aplicaciones como redes de procesos "black box", que intercambian datos a través de conexiones por paso de mensajes, donde el se especifican las conexiones externamente a los procesos. Estos los procesos de caja negra se pueden volver a conectar infinitamente para formar diferente aplicaciones sin tener que ser cambiado internamente. FBP es así naturalmente orientado a componentes.

Lea el libro de JPM: http://jpaulmorrison.com/fbp /

(Hemos escrito una implementación simple en C++ para fines de automatización del hogar, y estamos muy contentos con ella. La documentación está en construcción.)

 6
Author: ern0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-18 23:20:36

Al igual que fogus te lo ha sugerido en su lista, te aconsejo que también mires el lenguaje OzML / Mozart Muchos paradigmas, principalmente dirigidos a la programación de concurrencia / multiagente.

En cuanto a la concurrencia, y el cálculo distribuido, el equivalente del cálculo Lambda (que está detrás de la programación funcional) se llama Cálculo Pi.

Solo he comenzado a comenzar a mirar alguna implementación del cálculo Pi. Pero ya han ampliado mis concepciones de informática.

 5
Author: Stephane Rolland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-18 13:59:59

Has aprendido muchos idiomas. Ahora es el momento de enfocarse en un idioma y dominarlo.

 5
Author: Sandman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 20:59:23

Quizás quiera probar LabVIEW para su programación visual, aunque es para fines de ingeniería.

Sin embargo, pareces bastante interesado en todo lo que hay ahí fuera, de ahí la sugerencia

Además, puedes probar la aplicación Android appinventor para crear visualmente cosas

 4
Author: Belun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-18 12:11:47

Bruce A. Tate, tomando una página de El Programador Pragmático escribió un libro sobre exactamente eso: Siete Idiomas en Siete Semanas: Una Guía Pragmática para Aprender Lenguajes de Programación

En el libro, cubre Clojure, Haskell, Io, Prolog, Scala, Erlang y Ruby.

 2
Author: Aissen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 15:40:21

Mercurio: http://www.mercury.csse.unimelb.edu.au /

Es un Prolog escrito, con tipos y modos de unicidad (es decir, especificando que el predicado append(X,Y,Z) que significa X anexado a Y es Z produce una Z dada una X e Y, pero puede producir múltiples X/Ys para una Z dada). Además, no hay corte u otros predicados extra-lógicos.

Si quieres, es Prolog como Haskell es Lisp.

 2
Author: yatima2975,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 19:34:34
  1. La programación no cubre la tarea de los programadores.
  2. Las cosas nuevas siempre son interesantes, pero hay algunas cosas viejas muy interesantes.

El primer sistema de base de datos fue dBaseIII para mí, pasé alrededor de un mes escribiendo pequeños ejemplos (dBase/FoxPro/Clipper es una base de datos basada en tablas con índices). Luego, en mi primer lugar de trabajo, conocí PAPERAS, y me dolió la cabeza. Era joven y de cerebro fresco, pero me llevó 2 semanas entender el modelo de la base de datos de PAPERAS. Hubo un momento, al igual que en los cómics: después de 2 semanas, un botón se ha encendido, y la bombilla se ha aligerado en mi mente. Las PAPERAS son naturales, de bajo nivel y muy-muy rápido. (Es un btree desequilibrado, no formalizado sin tipos.) Las tendencias actuales muestran el camino de regreso a él: NoSQL, key-value db, multidimensional db - por lo que solo quedan algunos pasos, y llegamos a las paperas.

Aquí hay una presentación sobre las ventajas de las PAPERAS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

Un breve doc sobre db jerárquica: http://www.cs.pitt.edu / ~chang/156/14hier.html

Una introducción a las MUMPS globals (en MUMPS, variables locales, corto: los locales son las variables de memoria, y las variables globales, corto: las globales son las "variables db", estableciendo una variable global va al disco inmediatamente): http://gradvs1.mgateway.com/download/extreme1.pdf (PDF)

 1
Author: ern0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-21 08:36:41

Di que quieres escribir un poema de amor...

En lugar de usar un martillo solo porque ya tiene uno en la mano, aprenda las herramientas adecuadas para la tarea: aprenda a hablar francés.

Una vez que hayas alcanzado el nivel de habla casi nativa, estás listo para comenzar tu poema.

 1
Author: roger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 14:14:02

Si bien aprender nuevos idiomas a nivel académico es un pasatiempo interesante, en mi humilde opinión no puedes aprender a usar uno hasta que intentes aplicarlo a un problema del mundo real. Así que, en lugar de buscar un nuevo idioma para aprender, yo en tu lugar primero buscaría cosas nuevas para construir, y solo entonces buscaría el idioma correcto para usar para ese proyecto específico. Primero elige el problema, luego la herramienta, no al revés..

 1
Author: ivanhoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 15:22:56

Para cualquiera que no haya existido desde mediados de los 80, sugeriría aprender 8-bit BASIC. Es de muy bajo nivel, muy primitivo y es un ejercicio interesante para programar alrededor de sus agujeros.

En la misma línea, elegiría una calculadora de la serie HP-41C (o emulador, aunque nada supera el hardware real). Es difícil envolver tu cerebro alrededor de él, pero bien vale la pena. Un TI-57 servirá, pero será una experiencia completamente diferente. Si logra resolver ecuaciones de segundo grado en un TI-55, serás considerado un maestro (no tenía condicionales ni ramas excepto un RST, que saltó el programa al paso 0).

Y por último, escogería ADELANTE (se mencionó antes). Tiene un bonito Lisp de "construye tu lenguaje", pero es mucho más bare metal. Te enseñará por qué Rails es interesante y cuándo DSLS tiene sentido y tendrás un glipse sobre lo que tu calculadora no-RPN está pensando mientras escribes.

 1
Author: rbanffy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 16:05:56

PostScript. Es un lenguaje bastante interesante, ya que está basado en pilas, y es bastante práctico una vez que desea poner las cosas en papel y desea hacerlo o solucionar por qué no se está haciendo.

Erlang. El paralelismo intrínseco le da una sensación bastante inusual y de nuevo se pueden aprender cosas útiles de eso. No estoy tan seguro de la practicidad, pero puede ser útil para algunas tareas de prototipado rápido y sistemas altamente redundantes.

Intente programar GPU - CUDA u OpenCL. Son solo extensiones de C / C++, pero el modelo mental de la arquitectura es otra vez completamente diferente del enfoque clásico, y definitivamente se vuelve práctico una vez que necesitas hacer algunos cálculos de números reales.

 1
Author: pasky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 16:32:07

Erlang, Forth y algunos trabajos incrustados con lenguaje ensamblador. Realmente; comprar un kit Arduino o algo similar, y crear un pitido polifónico en el montaje. Realmente aprenderás algo.

 1
Author: Bart van Deenen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 16:57:20

También Hay anic:

Https://code.google.com/p/anic/

Desde su sitio:

Más rápido que C, más seguro que Java, Más simple que *sh

Anic es el compilador de implementación de referencia para el lenguaje de programación experimental, de alto rendimiento, implícitamente paralelo y libre de bloqueos de datos de propósito general ANI.

Ya no parece estar en desarrollo activo, pero parece tener algunos conceptos interesantes (y eso, después de todo, es lo que pareces estar buscando).

 1
Author: itistoday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 18:07:25

Mientras no cumpla su requisito de "diferente" - yo apuesto a que Fantom es un lenguaje que un programador profesional debe mirar. Por su propia admisión, los autores de fantom lo llaman un lenguaje aburrido. Simplemente complementa los casos de uso más comunes de Java y C#, con una sintaxis de cierre prestada de ruby y lenguajes similares más nuevos.

Y sin embargo se las arregla para tener su propio compilador bootstrap, proporcionar una plataforma que tiene una caída en la instalación con no las dependencias externas, obtiene los paquetes correctos-y trabaja en Java, C# y ahora en la Web (a través de js).

Puede que no amplíe sus horizontes en términos de nuevas formas de programación, pero sin duda le mostrará mejores formas de programación.

 1
Author: vkd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 19:07:47

Una cosa que veo que falta en las otras respuestas: lenguajes basados en reescritura de términos.

Podrías echar un vistazo a Pure - http://code.google.com/p/pure-lang / .

Mathematica también está basado en la reescritura, aunque no es tan fácil averiguar qué está pasando, ya que es bastante cerrado.

 1
Author: JonyEpsilon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 20:22:47

APL, Forth y Assembly.

Diviértete un poco. Coge un kit de robot Lego Mindstorm y el RobotC de CMU y escribe un código de robótica. Suceden cosas cuando escribes código que tiene que" ensuciarse " e interactuar con el mundo real que no puedes aprender de ninguna otra manera. Sí, el mismo lenguaje, pero una perspectiva muy diferente.
 0
Author: martin's,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 18:52:41