stroustrup programming program online example ejemplos descargar code bjarne c++ programming-languages

programming - c++ online



Programador C++ busca ampliar perspectiva (18)

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

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

  • "Whaoo ... ¡esto es genial! No sabía que podía programar de esa manera".
  • "Wow, ¡nunca pensé que un problema de diseño pudiera resolverse de esa manera!"

Entonces, ¿qué idioma te hizo eso? Estoy buscando el máximo efecto, por lo que no creo que Java se ajuste a la ley. = p Estoy abierto a cualquier sugerencia, sin embargo!

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


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

Si tuviera que elegir otra cosa que sea tan incomprendida y fácilmente obusa pero de expresión increíble, claro que sí: JavaScript.

El siguiente indicador líder y útil es nuevamente el favorito de Google, Python, pero se están moviendo hacia los dos anteriores a un ritmo más rápido que en cualquier momento anterior.


El prólogo es un deber. Cualquier otro idioma de un paradigma diferente sería un buen comienzo. El prólogo es de un paradigma lógico. Otro gran lenguaje muy diferente es el esquema. Es de la familia del lenguaje funcional.

Aquí una muestra de un validador Palindrome.

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

Esquema factorial

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

Prólogo factorial

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

Y mis ejemplos originales:

Muestra de prologo

:- 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.

Aquí hay una solución en el 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)) ) ) ) )


En primer lugar, ¡bueno en ti por mirar hacer algo diferente! Si estás preparado para hacerlo, esta es una gran oportunidad para probar algo que funciona de una manera completamente diferente, aunque solo sea para ampliar tu comprensión de cómo funcionan las cosas. Me gustaría repetir los comentarios de ManicMailman sobre Prolog , que es muy diferente al 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 por derecho propio. Funciona casi completamente en las pilas, por lo que los operadores que llaman quitan los argumentos de la pila y devuelven los resultados. Por supuesto, también tiende a tener un dispositivo de salida de alta calidad asociado, lo que puede ser útil. :-)

Además, si está preparado para algo muy diferente a lo que está acostumbrado, le convendría 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 ir por un nuevo lenguaje de programación es el camino a seguir. Si tiene una mentalidad académica moderada, podría encontrar que la lectura de datos y algoritmos podría mejorar seriamente la forma en que entiende y resuelve los problemas informáticos. Uno de los textos estándar es Sedgewick''s Algorithms in C , aunque, en mi opinión, The Art of Computer Programming de Knuth es el mejor en el campo.

¡Buena suerte! :-)


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

C # también está bien: la sintaxis de puntero a miembro de C ++ es tan complicada que los delegados anónimos de C # son comparativamente divertidos (obtendremos algo como ellos en la próxima versión de C ++).


He programado en Pascal, Delphi, Assembly, C, C ++, Scheme, Lisp, Java, C # y CUDA.

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


He publicado, arriba:

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

Y tengo este comentario:

Ese ejemplo de button.onclick fue definitivamente genial. y parece muy intuitivo también. ¡Gracias! - ShaChris23

Esto 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 de C descubriendo JavaScript: esto es "genial". Cual es verdad ! Sin embargo, un programador de JavaScript que descubra C ++ pensará lo contrario, como "¡qué tosco es un lenguaje, ni siquiera puedo agregar un método a una clase en tiempo de ejecución!" y tendrá razón, también.

Por ejemplo, usarías un patrón de fábrica, cuando un programador de Python simplemente ponga 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 escribí un programador basado en el tiempo, que se llamaba como:

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

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

Aprender nuevos idiomas, incluso solo aprendiendo los conceptos básicos, lo convertirá en un mejor programador en todos los idiomas, ya que ampliará su perspectiva.

Incluso si nunca lo usas, aprende Lisp ...

JavaScript también es bueno, tiene fuertes genes prog funcionales.

Desearía que TODOS hayan aprendido al menos Python.

Entonces nadie escribiría manipulación de texto en B, jajaja.


Para algo realmente diferente, prueba Lisp o Scheme.


Por supuesto Haskell, pero en realidad todos los siguientes realmente cambiaron mis perspectivas:

Comencé en GWBasic hace años cuando era niño, por lo que gravitaba naturalmente con los lenguajes de procedimiento.

Mi carrera comenzó en C ++, y esa es la base sobre la que construí.

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

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

En orden cronológico, aquí están los idiomas que aprendí, y mis epifanías. He destacado 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 Basic - Genial. Puedo hacer que mi computadora haga casi cualquier cosa, ¡pero me mantengo dentro de mi límite de memoria de 8k (o me quedo sin números de línea)!
  2. Logotipo - No hay números de línea. Puedo construir y ejecutar mis programas de forma incremental (más tarde vi esto en Lisp, Scheme y Forth)
  3. Pascal : es como Basic pero con más funcionalidad (y sin números de línea).
  4. C - Entonces, eso es lo que son los punteros (ahora entiendo echar un vistazo y tocar).
  5. Asamblea - Ah, es por eso que C está diseñado como es. También podría usar C en lugar de ensamblaje.
  6. C ++ : los objetos son una excelente manera de estructurar mi programa en partes lógicas
  7. BASH - La programación con flujo (filtros, fuentes y sumideros) puede ser muy potente
  8. PostScript - ¡Las fuentes son programas! La programación basada en la pila es un paradigma muy poderoso .
  9. Prólogo : así que solo puede escribir un montón de restricciones y hacer que la computadora resuelva la respuesta por sí misma. Pero, Dios mío, ¡es difícil saber qué restricciones hay para conseguir que haga lo que quiero!
  10. Perl : no importa si las personas no conocen todas las reglas. Supongo que algunos idiomas están diseñados para ser más fáciles de escribir que de leer.
  11. SQL - Qué manera conveniente de consultar datos. Me recuerda a Prolog. (Más tarde me recuerda a la programación funcional).
  12. Lisp - ¡ Entonces no necesitas administración de memoria manual para hacer listas enlazadas ! (Tenga en cuenta que no pasé suficiente tiempo en Lisp. Muchas lecciones posteriores podrían haberse aprendido con él).
  13. Objeto Pascal - Genial, Pascal también puede tener objetos.
  14. Modula-2 - Extraño, esto se parece a Pascal.
  15. Simula-67 - Hmmm ... ¿así que aquí es de donde provienen los lenguajes orientados a objetos?
  16. Java : todo puede ser un objeto (luego supe que incluso más cosas pueden ser objetos, consulte Smalltalk a continuación) y el código puede compilarse una vez y ejecutarse en diferentes plataformas. Otras epifanías que tuve fueron las interfaces son una excelente manera de construir software y la recolección de basura es realmente poderosa .
  17. Delphi - Wow, las bibliotecas GUI pueden ser fáciles de usar. Los eventos son una abstracción impresionante .
  18. Plantillas de C ++ : escribir código en tiempo de compilación es extremadamente poderoso (vea Esquema y Lisp).
  19. Functors y carpetas de C ++ : pasar funciones a funciones es poderoso , pero la sintaxis es horrible. (Esta fue realmente 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 poderosos .
  21. XSLT - No puedo creer que esto sea Turing completo. Esto debe ser lo que sucede cuando los académicos van mal.
  22. Eiffel - Los contratos son una excelente manera de expresar los supuestos y requisitos de diseño .
  23. AspectJ : las preocupaciones transversales tienen mucho sentido, y es cierto que son difíciles de expresar en otros OOPL . ¿Pero identificarlos por el nombre de una función parece un hack?
  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 las plantillas). El código objeto puede ser mucho más simple. La coincidencia de patrones es clara, pero ¿cuándo los uso? Los rasgos y las combinaciones 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 pruebas de unidad con diseño por contrato, y un montón de otras cosas, manteniendo una mentalidad de 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 es necesario boxear / desempaquetar), incluidos los bloques de código.
  28. LINQ - SQL es básicamente 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 usas patrones, puedes escribir mucho código mucho más simple.
  31. Cálculo lambda - Así que aquí es de donde viene Lisp y la programación funcional .
  32. Esquema : la generación de 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. Las funciones que mantienen el estado son poderosas. Las continuaciones están limpias, pero no me importa.
  33. Frink : nunca me di cuenta de que las unidades de medida podrían ser tan sofisticadas.
  34. Alegría : ese es el código más corto que he visto . Este es el lenguaje más subestimado que hay.
  35. Lógica combinatoria (SKI-Cálculo) : no necesita argumentos, pero puede usar combinadores en su lugar. Esto es para Joy lo que el cálculo de Lambda es para Lisp .
  36. Haskell - Desearía poder compilar mi código. El preludio estándar de Haskell, tiene que ser una de las bibliotecas más elegantes que he visto en mi vida .
  37. Factor : hay tantas cosas geniales ahí, me gustaría que me molestara en aprender la sintaxis.
  38. K - Las operaciones primitivas basadas en matrices (vectores) son extremadamente potentes .
  39. Forth - Esto es como un ensamblaje de alto nivel con superpoderes. Sin embargo, hay mucho que aprender.
  40. Python - Esto es algo realmente legible. Es como una combinación de muchos otros idiomas.
  41. Erlang : expresar los programas como actores es una excelente manera de expresar el paralelismo.
  42. UML ejecutable : el paso asíncrono de mensajes es una excelente manera de expresar algoritmos concurrentes sin tener que pensar en subprocesos .
  43. Ruby - Build systems ( Rake ) puede escribirse en un lenguaje de programación real. Los bloques de código también pueden ser datos (bueno, técnicamente, aprendí eso con Scala).

Así que, por supuesto, esta lista es mucho más larga de lo que usted (o cualquier otra persona) querría. Para un efecto máximo, mi lista corta sería: Scheme (o Lisp), Joy (o PostScript), Erlang, Eiffel, AspectJ, Erlang, ML y Haskell. Si solo quieres centrarte en un par de idiomas y estás dispuesto a profundizar en ellos, entonces podrías obtener mucho de dominar Scala o C #. Por supuesto, es probable que todavía haya una o dos cosas que pueda aprender de C ++ 0x, especialmente si lo pulsa y lo pincha un poco.


Probaría tanto Scheme (o Lisp) como Python, en ese orden. El esquema deformará su mente de una manera positiva (lo hizo para mí) y luego se trasladará a Python, donde podrá (casi) reunir su C ++ y su nuevo conocimiento funcional. Obtendrá una gran patada de ambos, lo prometo.


Python me dio la reacción "tan genial"


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

Otra opción es tratar de escribir "hola mundo" en el cerebro fu_k . Tal vez no sea el mejor uso para su tiempo, pero después de eso nunca intentará esa cosa de "ampliar la perspectiva" :)


Ruby debe ser la que me haga decir "Lo mejor es que puedes hacer eso". Pero tengo un nuevo cariño encontrado para JavaScript de nuevo.


Todo el "Whaoo ... esto es tan genial! No sabía que puedo programar así". La revelación me llegó cuando aprendí por primera vez la programación funcional . 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).


Un reciente "¡Esto es genial!" para mi era 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 había visto que estaba relacionada con Java. :)

Oh, está bien, fue el segundo. El primero fue un depurador reversible del que olvido el nombre, pero que te permite ejecutar la máquina virtual "hacia atrás" para encontrar un error.


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

Por ejemplo, siguiendo el ejemplo de una de las otras publicaciones aquí, factorial en J es:

!10 3628800

para, por ejemplo, factorial 10. Extendiendo esto, para evaluar el número de 10 cosas tomadas 5 a la vez:

5!10 252

Las matrices son objetos de primera clase, por lo que el factorial de 5, 10 y 15 es:

!5 10 15 120 3628800 1.3076744e12

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

3!6 8 10 20 56 120

Se podría escribir un corrector de palíndromo.

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

Esto hace coincidir (- :) con el "flip" (|.) El argumento en mayúsculas sin (-.) Ningún espacio. Aplicando esto a tres argumentos y devolviendo "1" para verdadero y "0" para falso:

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

Inicialmente, es difícil acostumbrarse a la programación de manera tan sucinta en un nivel tan avanzado, pero es posible que aumente su crecimiento, especialmente si le gusta probar ideas rápidamente.


Yo segundo Python, y Ruby también.

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

Cuando las clases son objetos de primera clase, por ejemplo, el patrón de fábrica se vuelve obsoleto. Apenas pase la clase, es después de todo 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 una solución para los idiomas que no cuentan con cierres, delegados integrados, etc.

Por ejemplo, en Javascript:

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

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


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