language-agnostic - teorias - que idioma aprender primero
¿Cuáles son los idiomas importantes para aprender a entender los diferentes enfoques y conceptos? (24)
Actualmente programo Clojure, Python, Java y PHP [...] ¿Cuáles son los lenguajes que toman un enfoque diferente y serían útiles para la elección de herramientas prácticas o la comprensión teórica?
do
Hay un montón de código C por ahí, definitivamente es práctico. Si aprendes C ++ también, hay una gran cantidad de más códigos (y el salto es corto una vez que conoces C y Java).
También le da (u obliga a tener) una gran comprensión de algunos problemas teóricos; por ejemplo, cada programa en ejecución vive en una matriz de 4 GB de bytes, en algún sentido. Los punteros en C son solo índices de este conjunto, son solo un tipo diferente de entero. No es diferente en Java, Python, PHP, excepto que está escondido debajo de una capa de superficie.
Además, puede escribir código orientado a objetos en C, solo tiene que ser un poco manual sobre los vtables y demás. La colección de rompecabezas portátil de Simon Tatham es un gran ejemplo de código C orientado a objetos bastante accesible; también está bastante bien diseñado y vale la pena leerlo para un programador principiante / intermedio C. Esto es lo que sucede también en Haskell --- las clases de tipos son, en cierto sentido, "simplemente otra tabla de contenido".
Otra gran cosa sobre C: participar en Q & A con programadores expertos de C te dará muchas respuestas que explican C en términos de constructos de bajo nivel, lo que construye tu base de conocimiento más cercana al hierro.
Me puede estar perdiendo el punto de vista 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.
Cuando todo lo que tienes es un par de cortadores de pernos y una botella de vodka, todo parece el candado de la puerta de la casa de botes 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 C y LISP, así como con el espacio en blanco. Conozco sistemas imperativos, funcionales, inmutables, OOP y un tipo de pareja y otras cosas. ¡Ahora quiero más!
¿Cuáles son los lenguajes que toman un enfoque diferente y serían útiles 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 OOP imperativo (Ruby), ni quiero practicar idiomas divertidos poco prácticos como Brainfuck.
Una cosa muy interesante que encontré son los lenguajes monoicónicos basados en stack como Factor.
Solo cuando siento que entiendo la mayoría de los conceptos y que tengo respuestas para todas mis preguntas, quiero empezar a pensar en mi propio lenguaje de juguete para contener todas mis preferencias personales.
- La programación no cubre la tarea de los programadores.
- Las cosas nuevas siempre son interesantes, pero hay algunas cosas viejas muy buenas.
El primer sistema de base de datos fue dBaseIII para mí, estuve pasando alrededor de un mes para escribir pequeños ejemplos (dBase / FoxPro / Clipper es una base de datos basada en tablas con índices). Luego, en mi primer lugar de trabajo, conocí a MUMPS, y me dio dolor de cabeza. Era joven y de mente fresca, pero me tomó dos semanas entender el modelo de base de datos MUMPS. Hubo un momento, como en los cómics: después de 2 semanas, se activó un botón y la bombilla simplemente se iluminó en mi mente. MUMPS es natural, de bajo nivel y muy, muy rápido. (Es una versión no balanceada, no estructurada sin tipos). Las tendencias de hoy nos muestran el camino de regreso: NoSQL, clave-valor db, DB multidimensional, por lo que solo quedan algunos pasos y llegamos a Paperas.
Aquí hay una presentación sobre las ventajas de MUMPS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation
Un documento corto en db jerárquico: http://www.cs.pitt.edu/~chang/156/14hier.html
Una introducción a MUMPS globales (en MOMPS, variables locales, abreviado: locales son las variables de memoria, y las variables globales, abreviado: globales son las "variables db", establecer una variable global va al disco de inmediato): http://gradvs1.mgateway.com/download/extreme1.pdf (PDF)
¿Qué pasa con Prolog (para unificación / backtracking, etc.), Smalltalk (para "todo es un mensaje"), Forth (pulido inverso, intérpretes enhebrados, etc.), Scheme (continuaciones)?
No es un lenguaje, pero el Arte del Protocolo Metaobject es una cosa alucinante
APL, Forth y Asamblea.
Diviértete un poco. Recoge un kit de robot Lego Mindstorm y RobotC de CMU y escribe un código de robótica. Las cosas suceden cuando escribes código que tiene que "ensuciarse" e interactuar con el mundo real que posiblemente no puedas aprender de otra manera. Sí, el mismo lenguaje, pero una perspectiva muy diferente.
Al igual que fogus lo ha sugerido en su lista, le aconsejo que también mire el lenguaje OzML/Mozart Muchos paradigmas, principalmente dirigidos a la concurrencia / programación de múltiples agentes.
En cuanto a la simultaneidad y el cálculo distribuido, el equivalente del cálculo Lambda (que está detrás de la programación funcional) se denomina Cálculo Pi.
Solo he comenzado a ver alguna implementación del cálculo Pi. Pero ya han ampliado mis concepciones de informática.
- Pict
- Pict nómada
- FunLoft . (este es bastante reciente, concebido en INRIA)
Bruce A. Tate, tomando una página de The Pragmatic Programmer, escribió un libro sobre eso exactamente: 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.
Desde el sitio de Peter Norvig:
"Aprende al menos media docena de lenguajes de programación. Incluye un lenguaje que admita abstracciones de clase (como Java o C ++), uno que admita abstracción funcional (como Lisp o ML), uno que admita la abstracción sintáctica (como Lisp), uno que admita declarativo especificaciones (como plantillas Prolog o C ++), una que admite corutinas (como Icon o Scheme) y una que admite paralelismo (como Sisal). "
Digamos que quieres escribir un poema de amor ...
En lugar de usar un martillo solo porque ya hay uno en su 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.
En los tipos como sistemas de teoremas / tipo avanzado: Coq (creo que Agda también entra en esta categoría).
Coq es un asistente de prueba integrado en un lenguaje de programación funcional.
Puedes escribir pruebas matemáticas y Coq te ayuda a construir una solución. Puede escribir funciones y probar propiedades al respecto.
Tiene tipos dependientes, eso solo me voló la cabeza. Un simple ejemplo:
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 nym de elementos de A y devuelve una matriz de tamaño (n + m). ¡No compilará si la función no devuelve eso!
Se basa en el cálculo de construcciones inductivas, y tiene una sólida teoría detrás de él. No soy lo suficientemente inteligente como para entenderlo todo, pero creo que vale la pena echarle un vistazo, especialmente si te inclinas hacia la teoría de tipos.
EDITAR: Tengo que mencionar: escribes una función en Coq y luego puedes PROBAR que es correcta para cualquier entrada, ¡eso es increíble!
Erlang, Forth y algunos trabajos integrados con lenguaje ensamblador. De Verdad; compre un kit Arduino o algo similar y cree un pitido polifónico en el ensamblaje. Realmente aprenderás algo.
Has aprendido muchos idiomas Ahora es el momento de enfocarse en un idioma y dominarlo.
La programación de Dataflow, 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 suena primero).
Los artículos de Wikipedia son buenos:
En informática, la programación basada en flujo (FBP) es un paradigma de programación que define las aplicaciones como redes de procesos de "caja negra", que intercambian datos a través de conexiones predefinidas mediante el envío de mensajes, donde las conexiones se especifican externamente a los procesos. Estos procesos de caja negra se pueden volver a conectar para formar diferentes aplicaciones sin tener que cambiarlas internamente. FBP está, por lo tanto, naturalmente orientado a los componentes.
- http://en.wikipedia.org/wiki/Flow-based_programming
- http://en.wikipedia.org/wiki/Dataflow_programming
- http://en.wikipedia.org/wiki/Actor_model
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 eso. La documentación está en construcción).
Las cuestiones de practicidad son muy subjetivas, por lo que simplemente diré que aprender diferentes paradigmas lingüísticos solo servirá para que seas un mejor programador. ¿Qué es más práctico que eso?
Funcional, Haskell . Sé que dijiste que no querías, pero en realidad deberías reconsiderarlo. Obtuviste cierta exposición funcional con Clojure e incluso con Python, pero no la has experimentado al máximo sin Haskell. Si realmente estás en contra de Haskell, entonces los buenos compromisos son ML o OCaml.
Declarativo, registro de datos : muchas personas recomendarían Prolog en esta ranura, pero creo que Datalog es un ejemplo más claro de un lenguaje declarativo.
Array, J - Acabo de descubrir a J, pero considero que es un lenguaje asombroso. Te retorcerá la mente en un pretzel. Le agradecerás a J por eso.
Stack, Factor / Forth - Factor es muy poderoso y planeo investigarlo lo antes posible. Forth es el abuelo de los lenguajes de Stack y, como bonificación adicional, es fácil de implementar . Hay algo que decir sobre el aprendizaje a través de la implementación.
Dataflow, Oz - Creo que la influencia de Oz está en alza y solo seguirá creciendo en el futuro.
Basado en prototipos, JavaScript / Io / Self - Self es el abuelo y altamente influyente en cada lenguaje basado en prototipos. Esto no es lo mismo que un POO basado en clases y no debe tratarse como tal. Muchas personas recurren a un lenguaje prototipo y crean un sistema de clase ad-hoc, pero si su objetivo es expandir su mente, entonces creo que es un error. Use el lenguaje a su máxima capacidad. Lea Organizar programas sin clases para obtener ideas.
Sistema experto, CLIPS : siempre lo recomiendo. Si conoces a Prolog, es probable que tengas la habilidad superior 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 para ser el mejor en lo que hace. Además ... ¡es realmente divertido!
Tipos funcionales + opcionales, Qi : dices que tienes experiencia con algunos sistemas de tipo, pero ¿tienes experiencia con sistemas de tipo "skinnable"? Nadie lo ha ... pero deberían hacerlo. Qi es como Lisp en muchos sentidos, pero es tipo de sistema hará volar tu mente.
Actores + tolerancia a fallas, Erlang : el modelo de procesos de Erlang recibe mucho ruido, pero sus mecanismos de tolerancia a errores e intercambio de códigos activos cambian el juego. No aprenderá mucho sobre FP que no aprendería con Clojure, pero sus funciones FT le harán preguntarse por qué hay más idiomas que no pueden hacerlo bien.
¡Disfrutar!
Me sorprende que después de 6 meses y cientos de votos, nadie haya mencionado SQL ...
Para cualquiera que no ha estado presente desde mediados de los 80, sugiero aprender BÁSICO de 8 bits. Es de muy bajo nivel, muy primitivo y es un ejercicio interesante para programar en torno a sus agujeros.
En la misma línea, elegiría una calculadora de la serie HP-41C (o emulador, aunque nada supera al hardware real). Es difícil envolver su cerebro en ello, pero vale la pena. Un TI-57 funcionará, pero será una experiencia completamente diferente. Si logras resolver ecuaciones de segundo grado en un TI-55, serás considerado maestro (no tenía condicionales ni ramas, excepto un RST, que saltó el programa al paso 0).
Y por último, elegiría FORTH (se mencionó antes). Tiene un buen estilo Lisp-ish de "construye tu lenguaje", pero es mucho más bare metal. Le enseñará por qué Rails es interesante y cuando las DSL tienen sentido y usted tendrá una idea de lo que piensa su calculadora que no es RPN mientras escribe.
Posdata. Es un lenguaje bastante interesante, ya que está basado en la pila, y es bastante práctico una vez que quiere poner las cosas en papel y desea hacerlo o resolver los problemas por qué no se está haciendo.
Erlang. El paralelismo intrínseco le da una sensación bastante inusual y puede volver a aprender cosas útiles de eso. No estoy tan seguro de lo práctico, pero puede ser útil para algunas tareas de creación rápida de prototipos y sistemas altamente redundantes.
Intente programar GPU, ya sea CUDA o OpenCL. Son solo extensiones de C / C ++, pero el modelo mental de la arquitectura es una vez más completamente diferente del enfoque clásico, y definitivamente se vuelve práctico una vez que se necesita hacer un verdadero cálculo numérico.
Si bien el aprendizaje de nuevos idiomas en un nivel académico es un hobby interesante, en mi humilde opinión, realmente no se puede aprender a usar uno hasta que intentes aplicarlo a un problema del mundo real. Por lo tanto, en lugar de buscar un nuevo idioma para aprender, en su lugar buscaría primero cosas nuevas para construir, y solo entonces buscaría el lenguaje adecuado para ese proyecto específico. Primero elige el problema, luego la herramienta, no al revés ...
Si bien no cumple con su requisito de "diferente", apostaría a que Fantom es un lenguaje que un programador profesional debería considerar. Según su propia admisión, los autores de Fantom lo llaman un lenguaje aburrido. Simplemente apuntala los casos de uso más comunes de Java y C #, con alguna sintaxis de cierre prestada de ruby y lenguajes más nuevos similares.
Y, sin embargo, logra tener su propio compilador bootstrapped, proporcionar una plataforma que tiene una caída en la instalación sin dependencias externas, obtiene los paquetes correctos, y funciona 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.
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 de flujo de datos de propósito general experimental, de alto rendimiento, implícitamente paralelo y sin interbloqueo ANI.
Ya no parece estar en desarrollo activo, pero parece tener algunos conceptos interesantes (y eso, después de todo, es lo que pareces ser después).
Una cosa que veo que falta en las otras respuestas: idiomas basados en la reescritura de términos.
Puedes echar un vistazo a Pure - http://code.google.com/p/pure-lang/ .
Mathematica también está reescribiendo en base, aunque no es tan fácil averiguar qué está pasando, ya que está bastante cerrado.
Uno de los idiomas que me interesan tiene un punto de vista muy diferente (que incluye un nuevo vocabulario para definir los elementos del lenguaje y una sintaxis de diferencias radical) es J Haskell sería la opción más obvia para mí, aunque es un lenguaje funcional, porque su sistema de tipos y otras características únicas te abren la mente y te hacen repensar tus conocimientos previos en programación (funcional).
Yo segundo Haskell. No piense "Conozco un Lisp, entonces sé programación funcional". ¿Has oído hablar de clases de tipos? Tipos de datos algebraicos? ¿Mónadas? Los lenguajes funcionales "modernos" (más o menos - al menos no 50 años de edad;)), especialmente Haskell, han explorado una plétora de nuevos conceptos útiles muy poderosos. Las clases de tipo agregan polimorfismo ad-hoc, pero escriben inferencia (otra cosa que los idiomas que usted ya sabe que no tienen) funciona como un hechizo. Los tipos de datos algebraicos son simplemente asombrosos, 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 las usa para hacer excepciones, E / S, analizadores sintácticos, listas de comprensión y mucho más, ¡de formas puramente funcionales!
Además, todo el tema es lo suficientemente profundo como para mantener ocupado durante años;)
quizás desee probar LabView para su programación visual, aunque es para fines de ingeniería.
sin embargo, pareces muy interesado en todo lo que hay por ahí, de ahí la sugerencia
también, podrías probar el appinventor de Android para construir visualmente cosas
Mercury : http://www.mercury.csse.unimelb.edu.au/
Es un Prolog mecanografiado, con tipos y modos de exclusividad (es decir, especificando que el predicado append(X,Y,Z)
significa X anexado a Y es Z produce una Z dada una X e Y, pero puede generar múltiples X / Y para un dado Z). Además, sin corte u otros predicados extra-lógicos.
Si lo haces, es para Prolog como Haskell para Lisp.