2009-10-17 11 views
19

He estado programando C++ durante aproximadamente 5 años, y ahora me doy cuenta del valor de saber cómo pensar "de manera diferente".Programador de C++ que busca ampliar la perspectiva

Esta pregunta es para los programadores de C++ que probaron otros lenguajes de programación y se encontró con momentos como:

  • ! "Whaoo..this es tan fresco que no sabía lo que puedo programar así"
  • "¡Guau, nunca pensé que un problema de diseño pudiera resolverse de esa manera!"

Entonces, ¿qué idioma le hizo eso? Estoy buscando el máximo efecto, así que no creo que Java se ajuste a la factura. = p ¡Aunque estoy abierto a cualquier sugerencia!

Descargo de responsabilidad: Hago esta pregunta principalmente porque quiero expandir mi mente. No hay intención de iniciar ninguna guerra de lenguaje de programación aquí!

+6

haz que sea una "wiki de la comunidad" – Etan

+0

hola, acabo de hacerla wiki comunitario. por cierto ... ¿qué es Wiki de la comunidad? lol – sivabudh

+1

"¿Qué es Wiki de la comunidad?" - ver http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts-on-stack-overflow – ChrisW

Respuesta

41

Probablemente estoy en mi corazón, sobre todo un programador de C++, porque lo he usado tanto, por lo que puede encontrar mis experiencias interesantes.

En orden cronológico, estos son los idiomas que aprendí y mis epifanías. He resaltado los grandes para mí. Por supuesto, hay muchos idiomas diferentes que pueden proporcionar las mismas ideas, solo estoy compartiendo mis propias experiencias personales.

  1. Atari básico - Enfriar puedo hacer que mi equipo hacer casi cualquier cosa, pero sigo corriendo en mi límite de memoria 8k (o yo agotado los números de línea)!
  2. Logotipo - Sin números de línea. Puedo incrementalmente generar y ejecutar mis programas (después vi esto en Lisp, Scheme, etc.) y
  3. Pascal - Es como básico, pero con más funcionalidades (y no hay números de línea).
  4. C - Así que eso es lo que son los indicadores (ahora entiendo asomarse y asomar).
  5. Ensamblaje - Ah, es por eso que C está diseñado tal como es. También podría usar C en lugar de ensamblaje.
  6. C++ - objetos son una gran manera de estructurar mi programa en partes lógicas
  7. BASH - programación con la corriente (filtros, fuentes y sumideros) puede ser muy poderoso
  8. PostScript - ¡Las fuentes son programas! La programación basada en pila es un paradigma muy poderoso.
  9. Prolog - Así que puede escribir un montón de restricciones y hacer que la computadora resuelva la respuesta. Pero, ¡Dios mío, es difícil saber qué restricciones conseguir para hacer lo que quiero!
  10. Perl - No importa si las personas no conocen todas las reglas. Supongo que algunos lenguajes están diseñados para ser más fáciles de escribir que de leer.
  11. SQL - ¡Qué manera más conveniente de consultar datos! Me recuerda a Prolog. (más tarde me recuerda a la programación funcional).
  12. Lisp - Así que no necesita la gestión de memoria manual, para hacer listas vinculadas! (Tenga en cuenta que no pasé suficiente tiempo con Lisp. Muchas lecciones posteriores podrían haberse aprendido con él).
  13. Objeto Pascal - Enfriar, Pascal también puede tener objetos.
  14. Modula-2 - Extraño, esto se parece a Pascal.
  15. Simula-67 - Hmmm ... ¿así que de aquí provienen los lenguajes orientados a objetos?
  16. Java - Todo puede ser un objeto (después supe que aun más las cosas pueden ser objetos, consulte Smalltalk abajo) y el código se puede compilar una vez y ejecutar en diferentes plataformas. Otras epifanías que tuve fueron las interfaces son una gran manera de construir el software y la recolección de basura es realmente poderosa.
  17. Delphi - Guau, las bibliotecas de GUI pueden ser fáciles de usar. Los eventos son una abstracción impresionante.
  18. C++ templates - Escribir código en tiempo de compilación es extremadamente poderoso (ver Scheme y Lisp).
  19. C++ funtores y carpetas - Pasar funciones a funciones es poderoso, pero la sintaxis es horrible. (Esta fue en realidad mi primera experiencia real con la programación funcional, la mayoría de los lenguajes obviamente lo hacen mejor).
  20. JavaScript - Los prototipos y las funciones eval son realmente potentes.
  21. XSLT - No puedo creer que esto sea completo. Esto debe ser lo que sucede cuando los académicos salen mal.
  22. Eiffel - Los contratos son una excelente forma de expresar supuestos y requisitos de diseño.
  23. AspectJ - Las preocupaciones transversales tienen perfecto sentido, y es cierto que son difíciles de expresar en otras OOPL. ¿Pero identificarlos por el nombre de una función parece un truco?
  24. Scala - Los campos y los métodos son los mismos. Las funciones de orden superior pueden ser simples de escribir. El compilador puede adivinar el tipo de expresiones simples (pero no plantillas). El código de objeto puede ser mucho más simple. La coincidencia de patrones es ordenada, pero ¿cuándo los uso? Los rasgos y las mezclas son incluso mejores que las interfaces.
  25. C# - Esto es como Delphi mezclado con C++ y Scala. Puedo reflexionar sobre todo en tiempo de ejecución e incluso emitir código fácilmente.
  26. D - Así que eso es lo que parece combinar las pruebas unitarias con el diseño por contrato, y un montón de otras cosas, manteniendo una mentalidad C++.
  27. Smalltalk - Realmente no lo aprendí, pero los programadores de Smalltalk me señalaron en esta época que en Smalltalk todo era realmente un objeto (no era necesario boxeo/unboxing), incluidos los bloques de código.
  28. LINQ - SQL es básicamente solo una programación funcional.
  29. Lua - ¡Todo puede ser una mesa! Suena como JavaScript, pero es más fácil de incrustar.
  30. ML - Cuando solo usa patrones, puede escribir mucho código mucho más simple.
  31. cálculo Lambda - Así que aquí es donde Lisp y la programación funcional vino de.
  32. Esquema - Generar código en tiempo de compilación puede ser realmente fácil. Esto es realmente fácil de extender. El manejo numérico se puede hacer realmente bien. Funciones de estado de retención es poderoso. Las continuas son ordenadas, pero no me importa.
  33. Frink - Nunca me di cuenta de que las unidades de medida podían ser tan sofisticadas.
  34. Joy - Ese es el código más corto que he visto. Este es el lenguaje más subestimado por ahí.
  35. Lógica combinatoria (SKI-Cálculo) - No necesita argumentos, pero puede usar combinadores en su lugar. Esto es para Joy lo que Lambda-calculus para Lisp.
  36. Haskell - Desearía poder compilar mi código. El preludio estándar Haskell, tiene que ser una de las bibliotecas más elegantes que he visto.
  37. Factor - Hay tantas cosas interesantes allí, solo desearía que me molestara aprender la sintaxis.
  38. K - Las operaciones primarias basadas en matriz (vector) son extremadamente potentes.
  39. Forth - Esto es como un ensamblaje de alto nivel superpoblado. Sin embargo, hay mucho que aprender.
  40. Python - Esto es realmente legible. Es como una combinación de muchos otros idiomas.
  41. Erlang - Expresar programas como actores es una excelente manera de expresar el paralelismo.
  42. Ejecutable UML - La transferencia de mensajes asíncrona es una forma excelente de expresar algoritmos simultáneos sin tener que pensar en los hilos.
  43. Ruby - Los sistemas de compilación (Rake) se pueden escribir en un lenguaje de programación real. Los bloques de código también pueden ser datos (técnicamente lo aprendí con Scala).

Por supuesto, esta lista es mucho más larga de lo que usted (o cualquier otra persona) probablemente desee. Para un efecto máximo, mi breve lista sería: Scheme (o Lisp), Joy (o PostScript), Erlang, Eiffel, AspectJ, Erlang, ML y Haskell. Si solo quieres enfocarte en un par de idiomas y estás dispuesto a profundizar en ellos, entonces puedes obtener mucho de Master o Scala. Por supuesto, es probable que haya todavía una o dos cosas que puedas aprender de C++ 0x, especialmente si presionas y pinchas un poco.

+0

guau, una respuesta aún mejor. – sivabudh

+0

Lista asombrosa. Sorprendido de que aún no hayas probado Ruby on Rails. – lkessler

+0

Iba a decir que no había usado Ruby, pero luego recordé que hice algunas intrusiones con el sistema de compilación Rake. Entonces fui y lo agregué a la lista. – cdiggins

12

Para algo realmente diferente, prueba Lisp o Scheme.

+2

+1 Acepto. Una vez que aprendí Scheme, muchas cosas en STL comenzaron a tener sentido para mí. Aprender cualquier idioma funcional te hará un mejor programador de C++. – AraK

+0

Sí. Cualquier cosa funcional, realmente. Pero Lisp/Scheme tiene un cierto factor añadido. :) – jalf

+0

El esquema es excelente porque el lenguaje en sí es muy simple, casi como un animal, pero con sus pocas formas simples puedes construir las cosas más complejas. – Crashworks

1

He programado en Pascal, Delphi, Ensamblaje, C, C++, Esquema, Lisp, Java, C# y CUDA.

C# es la respuesta: puede escribir programas extremadamente dinámicos usando reflexión, y WPF realmente coloca C# en el borde.

+1

Estoy totalmente de acuerdo. –

+0

Votar hacia abajo porque te gusta C++ o Java es mejor. –

+3

+1 de mí, de todos modos. Para un programador de C++, C# es la mejor forma de acceder a las capacidades modernas de lenguaje/plataforma. La sintaxis no es extrañamente diferente, pero la mayoría de las cosas geniales sobre otros lenguajes modernos de tipo estático (inferencia de tipo, cierres, genéricos, reflexión, metaprogramación, evaluación/listas diferidas, GC) tienen implementaciones muy buenas en C#, y la interoperabilidad con su código C++ existente es muy fácil. Entonces es perfecto –

15

Python me dio la reacción "tan genial"

+1

¿hay alguna que se destaque que podría dar como ejemplo? – sivabudh

+1

Muchas cosas lo hicieron por mí. Las funciones del generador (y las expresiones del generador) fueron particularmente geniales. – divegeek

+1

La naturaleza dinámica de listas y objetos eliminó muchas restricciones a las que estaba acostumbrado desde C++. Siempre me sorprende la expresividad de Python y lo que se puede lograr con tan pocas líneas de código. –

2

Prolog is a must. Cualquier otro lenguaje de un paradigma diferente sería un buen comienzo. Prolog es de un paradigma lógico. Otro lenguaje genial pero muy diferente es Scheme. Es de la familia del lenguaje funcional.

Aquí hay algunas muestras de un validador Palindrome.

EDITAR: Alguien mencionó que el código que escribí es poco impresionante y desalentador. He aquí algunos ejemplos simplificados:

esquema factorial


(define (fact n) 
    (if (= n 0) 
     1 
     (* n (fact (- n 1))))) 

Prolog factorial


factorial(0,1). 

factorial(N,F) :- 
    N>0, 
    N1 is N-1, 
    factorial(N1,F1), 
    F is N * F1. 

Y mis ejemplos originales:

Prolog muestra:


:- set_prolog_flag(toplevel_print_options, [quoted(true), portray(true), max_depth(0), attributes(portray)]). 


readline(Line) :- 
get0(Ch), 
readline(Ch, Line), 
!. 

readline(10, []). 

readline(Ch, [LowerCasedCh | RestOfLine]) :- 
is_alpha(Ch), 
name(N, [Ch]), 
downcase_atom(N, LowerCasedN),  
     %Drops element down to lowercase 
name(LowerCasedN, [LowerCasedCh]), 
get0(NextCh), 
readline(NextCh, RestOfLine). 

%Character Trimming 

readline(Ch, RestOfLine) :- 
\+is_alpha(Ch), 
get0(NextCh), 
readline(NextCh, RestOfLine). 



palindrome:- 
readline(List), 
sarahPalindrome(List). 


sarahPalindrome(List):- 
reverse(List, ReversedList), 
List = ReversedList. 

Su ¡Es una solución en esquema para el mismo problema!


(define palindrome 
    (lambda (x) 
    (equal? (filter-non-char-alpha (reverse (string->list x))) (filter-non-char-alpha (string->list x)) 
    ) 
) 
) 
(define filter-non-char-alpha 
    (lambda (x) 
     (if (equal? x '()) #t 
        (if (char-alphabetic? (car x)) 
         (cons (char-downcase (car x)) (filter-non-char-alpha (cdr x))) 
         (filter-non-char-alpha (cdr x)) 
        ) 
     ) 
    ) 
) 
 
+0

sí, sarahPalindrome es un método de ayuda, así como un juego de palabras muy malo: P – ManicMailman

+2

Prolog me hizo entender que no toda la programación es igual. El propósito del lenguaje está tan alejado de la línea principal de la codificación diaria que escribir algo en él es una revelación. Incluso "¡Hola, mundo!" tiene una lección sobre la construcción de un programa declarativo. –

+0

De acuerdo. Me gusta ver diferentes idiomas como diferentes conjuntos de herramientas. Puede romper un clavo con un destornillador, pero saber cómo usar un martillo facilitaría la tarea. – ManicMailman

6

voy segundo Lisp/Scheme, y también sugieren Haskell como un lenguaje que pondrá a prueba su forma de pensar acerca de la programación. El libro O'Reilly "Real World Haskell" es una introducción pragmática, bien ilustrada con casos de uso concretos.

+1

+1 para Haskell: creo que es sintácticamente mucho más claro para los académicos y las misiones de autoevaluación, por ejemplo, ceceo. –

4

Ensamblaje (que aprendí antes de C++, y solía escribir controladores de interrupción TSR en DOS): disfruté teniendo la ilusión de saber lo que la máquina realmente está haciendo.

C# también está limpio: la sintaxis del puntero a miembro de C++ es muy intrincada, los delegados anónimos de C# son comparativamente divertidos (obtendremos algo así en la próxima versión de C++).

+0

El ensamblaje es imprescindible para comprender realmente lo que está sucediendo en la CPU, sin embargo, debe aprender la arquitectura de la computadora y los sistemas operativos junto con eso para obtener la máxima comprensión. NO lo recomiendo como el siguiente paso. –

5

Todo el "Whaoo..esto es tan genial! No sabía que podía programar así". La revelación vino a mí cuando supe por primera vez functional programming. En mi caso, esto vino a través de mis estudios en Tcl/Tk, que es multi-paradigma, pero imagino que puede obtener el mismo efecto de cualquiera de los lenguajes fuertemente funcionales (como Lisp o Scheme).

10

Por supuesto Haskell, pero en realidad todos los siguientes Realmente han cambiado mis puntos de vista:

Empecé en GWBasic hace años cuando era un niño, así que gravitaron naturalmente a las lenguas de procedimiento.

Mi carrera comenzó en C++, y esa es la base desde la que construyo.

  • JavaScript - Me introdujo en funciones de primera clase, cierres, tipado dinámico.
  • Python: me introdujo en la sintaxis más simple y en los lenguajes dinámicos en general.
  • SQL - me introdujo a los lenguajes que 'son' frente a los lenguajes que 'hacen', el código 'es' la respuesta.
  • Lua - minimalismo y el uso de estructuras de datos simples (tablas) para la base de todas las estructuras de datos.
  • C# es mi nuevo pan mantequilla & ... Las ventajas de la recolección de basura, construidas en las bibliotecas, etc.
  • C - Tengo el poder!
+0

+1 por tener la valentía y el conocimiento para nombrar algo tan anticuado como SQL. Sigue siendo el único ejemplo verdaderamente exitoso comercialmente de un lenguaje que cambia el paradigma real (¡excepto C++)! – RBarryYoung

+0

gracias, personalmente me gusta su respuesta. – sivabudh

+0

Gracias! Lo aprecio. :) –

3

Python puede ser la respuesta.
Puede mejorar su forma de pensar y diseñar en C++ y enseñarle algunas ideas y metodologías nuevas, como la programación funcional.
Duck typing puede parecer extraño y problemático, al principio, pero tiene sus propios beneficios.
Y puede terminar utilizándolo incluso con fines productivos

Otra opción es intentar escribir "hello world" en brain fu_k. Tal vez no sea el mejor uso para su tiempo, pero después de eso nunca probará esa "ampliación de perspectiva" :) :)

+0

heh [Y puede que termines usándolo incluso para fines productivos] - Personalmente disfruto mucho de Python. Salgo de mi camino para usar Python cada vez que puedo. –

1

En primer lugar, ¡bien por hacer algo diferente! Si está dispuesto a hacerlo, esta es una gran oportunidad para probar algo que funciona de una manera completamente diferente, aunque solo sea para ampliar su comprensión de cómo funcionan las cosas. Me gustaría repetir el ManicMailman's comments about Prolog, que es muy diferente del enfoque de Pascal/C/Java. También sugeriría otras dos ideas.

En primer lugar, uno de mis idiomas favoritos de todos los tiempos es PostScript, generalmente conocido como un lenguaje de descripción de página, pero un lenguaje completo en sí mismo. Funciona casi por completo en stacks, por lo que los operadores de llamadas eliminan los argumentos de la pila y devuelven los resultados. Por supuesto, también tiende a tener un dispositivo de salida de alta calidad asociado, que puede ser útil. :-)

Además, si está listo para algo muy diferente de lo que está acostumbrado, haría bien en considerar un lenguaje de programación funcional.Personalmente no tengo mucha experiencia en esto, pero entiendo que Lisp y Haskell tienen sus admiradores.

Por último, ha asumido que buscar un nuevo lenguaje de programación es el camino a seguir. Incluso si tienes una mente académica moderada, es posible que la lectura de datos y algoritmos mejore seriamente la manera en que entiendes y resuelves los problemas informáticos. Uno de los textos estándar es Sedgewick's Algorithms in C, aunque en mi opinión Knuth's The Art of Computer Programming es el mejor en el campo.

¡Buena suerte! :-)

0

C++ hace el 'whaoo' todo el tiempo ... y cada pocos años más o menos en aplicaciones increíbles.

Si tuviera que elegir algo más que es tan incomprendido y fácilmente obsoleto, pero increíble en expresión, seguro fácil: JavaScript.

El próximo líder y el indicador útil es de nuevo, obviamente, Google favorito, Python, pero se están moviendo en los dos anteriores a un ritmo más rápido que en cualquier momento antes .. Va la figura ..

2

me gustaría probar tanto Esquema (o Lisp) y Python, en ese orden. Scheme deformará tu mente de una manera positiva (lo hizo por mí), y luego pasará a Python, donde serás (casi) capaz de armar tu C++ y el nuevo conocimiento funcional. Recibirás una gran patada de ambos, lo prometo.

2

Un reciente "¡Esto es genial!" para mí fue Scala. Combina la programación funcional, los objetos y los hilos de una manera excelente, y todo se ejecuta en la JVM.

Para mí fue la primera cosa realmente genial que vi relacionada con Java. :)

Oh, está bien, fue el segundo. El primero era un depurador reversible del que me olvidé el nombre, pero que permitía ejecutar la máquina virtual "hacia atrás" para encontrar un error.

2

I segundo Python, y Ruby también.

Vuelva a leer los patrones de diseño ... luego aprenda Python y descubra que muchos patrones de diseño son en realidad paros temporales que intentan parchar un lenguaje defectuoso como C++.

Cuando las clases son objetos de primera clase, por ejemplo, el patrón de Fábrica se vuelve obsoleto. Solo pase la clase, después de todo es una fábrica de instancias. Los métodos de clase de Python también son una herramienta extremadamente poderosa, y la herencia funciona.

Muchos patrones de diseño son solución para los idiomas que carecen de cierres, delegados incorporadas, etc ...

Por ejemplo, en Javascript:

button.onclick = function() {} algún código

Simple, elegante y potente ... ¡en C++ tendrías mucho más trabajo!

+0

ese ejemplo button.onclick fue definitivamente genial. y parece muy intuitivo también. ¡Gracias! – sivabudh

+0

+1 Me encuentro con que "los patrones son solo soluciones" todo el tiempo. Es difícil de explicar a un programador de C++ que no ha adoptado un lenguaje de alto nivel –

1

Ruby debe ser el que me haga decir "Mira cómo puedes hacerlo" al máximo. Pero tengo una nueva afición encontrada para JavaScript otra vez.

0

Recomendaría J (jsoftware.com), como siempre hago. Se diferencia de la mayoría de los otros idiomas en que es simbólico (aunque los símbolos se representan todos en ASCII simple) y funcional. Más importante aún, es dinámico, interactivo y tiene muchos conceptos de alto nivel integrados.

Por ejemplo, tomando el ejemplo de uno de los otros puestos aquí, factorial en J es:

!10 
3628800 

para, por ejemplo, factorial 10.La extensión de este, para evaluar el número de 10 cosas tomadas 5 a la vez:

5!10 
252 

arrays son objetos de primera clase, por lo factorial de 5, 10 y 15 es:

!5 10 15 
120 3628800 1.3076744e12 

y el número de formas de tomar 3 cosas de 6, 8, y 10 cosas:

3!6 8 10 
20 56 120 

Un corrector palíndromo podría escribirse

palincheck=: 3 : '(]-:|.)tolower y-.'' ''' 

Esto coincide (- :) con el "flip" (|.) El argumento de la casilla inferior sin (-.) Espacios. Aplicando esto a tres argumentos y devolver "1" para verdadero y "0" para falsa:

palincheck&>'Able was I ere I saw Elba';'Step on no pets';'Not palindrome' 
1 1 0 

Es un principio difícil acostumbrarse a la programación de manera sucinta a un nivel tan avanzado pero puede encontrar que crece en usted, especialmente si le gusta probar ideas rápidamente.

1

he publicado, arriba:

For instance, in Javascript : 
button.onclick = function(){ some code } 

y se puso este comentario:

que button.onclick ejemplo fue sin duda fresco. y parece muy intuitivo también. ¡Gracias! - ShaChris23

Me parece muy interesante.

Cuando trabaja en un lenguaje de bajo nivel como C++, no piensa en las cosas que es posible hacer en un lenguaje de nivel superior.

ShaChris23 piensa como un programador en C descubriendo JavaScript: esto es "genial". Cual es verdad ! Pero un programador de JavaScript que descubra C++ pensará lo contrario, como "qué grosero es un lenguaje, ni siquiera puedo agregar un método a una clase en tiempo de ejecución". y él también tendrá razón.

Por ejemplo, usted utilizaría un patrón de Fábrica, cuando un programador de Python simplemente coloque la clase en una variable y la pase. ¡Alguien que nunca aprendió nada además de C++ no soñará con eso!

Por ejemplo, en Python que escribió un planificador basado en el tiempo, que se llama así:

task_handle = scheduler.execute_at (tiempo, función)

El uso de un cierre de "función" que hace que este muy poderoso. Aquellos que no conocen el concepto de "cierre" no pueden pensar en esto.

Aprender nuevos idiomas, incluso aprendiendo solo los conceptos básicos, te hará un mejor programador en todos los idiomas, porque ampliará tu perspectiva.

Incluso si nunca lo usa, aprender Lisp ...

JavaScript es bueno también, tiene fuertes genes funcionales progresivos!

Deseo que TODOS aprendieran al menos Python.

Entonces nadie escribiría errores de manipulación de texto en C, lol.

+0

gracias por la perspectiva peufeu. incluso la discusión de patrón de fábrica que usted proporcionó, para mí, es estimulante. ¡Jajaja, pasando una clase como una variable! hombre ... eso es increíble. – sivabudh

Cuestiones relacionadas