P2IR: Curso 2022-2023. Enlaces de interés

Table of Contents

Home Avisos Prácticas Teoría Enlaces de interés Ficha de la asignatura

Enlaces sobre programación.

Sistema Operativo

  • En la asignatura empleamos la versión de Ubuntu instalada en la EPS.

    Puedes descargarla de aquí.

    En esta instalación tienes la versión del compilador de C++ que empleamos en la asignatura. Asegurate siempre que el código de tus prácticas compila y se ejecuta adecuadamente con esta versión del compilador pues es la que se empleará para corregir tus prácticas.

  • Ubuntu es un S.O. de la familia Gnu/Linux que, a su vez, son una variante (flavour) de otro S.O. llamado Unix. Estos S.O. son diferentes a otros como Windows. Si quieres aprender un poco más sobre ellos, te recomiendo que consultes estos enlaces:
    1. Filosofía de los SO de la familia UNIX.
    2. Interacción con el S.O.: Missing Semester IAP 2020. Esta colección de vídeos te resultará muy útil para desenvolverte a nivel del terminal en un S.O. de la familia UNIX.

      También te resultará útil esta chuleta para el uso del terminal.

    3. Por cierto, MacOS X es otra variante de Unix, descendiente del S.O. NeXTSTEP empleado (inicialmente) en los computadores construidos por la empresa NeXT. Puedes comprobarlo en este vídeo.
    4. Hay más S.O. de la familia Unix como p.e.: FreeBSD, OpenBSD y NetBSD.
  • Los S.O. de la familia Unix se suelen emplear:
    1. Desde un terminal en modo texto. Si usas tu computadora desde un entorno gráfico, realmente lo que empleas es una aplicación conocida como emulador de terminal.
      • Dentro de este terminal o emulador de terminal se ejecuta un programa conocido como shell, el cual es el encargado de leer y ejecutar las órdenes que le damos. En los SO GNU/Linux el shell usado por defecto es bash, pero hay muchos otros.
      • Como con cualquier otro tipo de aplicación existen diversos emuladores de terminal. Algunos ellos los puedes ver aquí.
      • Puedes aprender a usar el terminal, realmente el shell que se ejecuta dentro de él, con multitud de tutoriales como p.e. este.
      • Echa un vistazo a este vídeo donde se explica por qué, a pesar de disponer de interfaces gráficos de usuario, es relevante conocer y usar un terminal hoy en día.
    2. Pero también se pueden usar de manera gráfica utilizando para ello escritorios similares a Windows o MacOS X. Algunos ejemplos son Gnome, Kde, Xfce, etc…

Vídeos recomendados para aprender a programar

  1. Este es el primero de los vídeos sobre agentes de dirección autónomos del canal The Coding Train. Te recomiendo todos los vídeos de este canal.

    Daniel Shiffman, el creador de The Coding Train, también ha escrito el libro The Nature of Code donde explica como representar en un computador elementos y aspectos del mundo real. Puedes leerlo completamente on-line.

  2. En este vídeo del canal One Lone Coder su autor nos enseña a razonar sobre como programar un sencillo juego de dados. También te recomiendo todos los vídeos de este canal pero especialmente los siguientes:
  3. En el vídeo The mind behind Linux se realiza una entrevista a Linus Torvalds (el creador del núcleo Linux). Es muy interesante por todo lo que comenta en ella pero sobre todo cuando habla de la implementación de un TAD Lista simplemente enlazada para usar en el núcleo y en qué cosas se fija de esa implementación.
  4. No te pierdas esta charla de Dylan Beattie.

Editores/IDEs, tipos de letra, esquemas de colores, instalación de software en Ubuntu

  1. Atom.
  2. VSCode. En este vídeo tienes algunos consejos muy útiles de como usar ciertas funciones de vscode. Aquí tienes otro vídeo de presentación de Visual Studio Code hecho por Daniel Shiffman.

    Si te gusta la privacidad deberías echar un vistazo a vscodium.

  3. SublimeText.
  4. Code::Blocks.
  5. Geany.
  6. Gnome Builder.
  7. GNU Emacs. Unas distribuciones muy extendidas son Spacemacs y Doom-Emacs. Aquí tienes un par de tutoriales para principiantes. Aquí tienes un listado de personas conocidas que usan Emacs.
  8. Vi es, junto a Emacs, otro clásico editor de textos de los S.O. de la familia UNIX. Con el tiempo han ido apareciendo versiones mejoradas del mismo como Vim y Neovim.
  9. Específicos para python: Idle, PyCharm, Thonny y Eric.
  10. Cuida tus ojos, para programar es mejor emplear tipos de letra mono-espaciados en lugar de proporcionales. Usa un tamaño de letra apropiado, evita tamaños muy pequeños.
  11. Unicode y UTF-8/16/32. Aquí, aquí y aquí tienes más información. La página web del proyecto. Si vas a usar Unicode desde programas consulta estas bibliotecas.
  12. Si tu S.O. es Ubuntu en este artículo puedes ver cómo instalar software en él.

Compiladores de C/C++

  1. Gcc. C++ Standards Support in GCC.
  2. Clang. C++ Support in Clang.
  3. tcc: Tiny C Compiler.
  4. Intel C++ compilers.
  5. AMD Tools & SDKs.
  6. PGI compilers & tools.
  7. XL C/C++ for Linux. IBM.
  8. Compiler Explorer: Escribe código C, C++, Rust, Go, D, Haskell, Swift y Pascal, compílalo con diferentes compiladores y observa el código ensamblador generado en cada caso.
  9. Cómo funciona un compilador de C++ realmente: https://cppinsights.io/
  10. Cling es un intérprete de C++.

Sobre C++

  1. Entrevista a B. Stroustrup.
  2. Ya sabemos que C y C++ son lenguajes diferentes: Incompatibilities Between ISO C and ISO C++.
  3. Evolución de C++:
    1. Thriving in a crowded and changing world: C++ 2006–2020.
    2. Not your Grandparent's C++ (Evolution of C++). Historia de C++ desde sus inicios hasta C++-23.
  4. Sobre boost y la biblioteca estándar:
    1. C++ Boost.
    2. 105 STL Algorithms in Less Than an Hour.
  5. Información y ayuda en línea sobre C++:
    1. C++ reference.
    2. The C++ Annotations.
    3. Iso C++. Su FAQ, y dentro de ella te puede resultar interesante la parte relativa a herencia: Inheritance — What your mother never told you.
  6. El uso de excepciones en C++ es algo muy útil pero en arquitecturas actuales puede tener costes temporales muy altos.
  7. La NSA publicó un artículo relacionado con la seguridad del software en el uso de la memoria. En este artículo se dejaba fuera de la lista de lenguajes de programación considerados seguros a C++, lo cual ha hecho que Stroustrup (creador de C++) haya respondido con estos artículos.

    Mientras tanto si quieres que tu código en C++ sea lo más seguro posible estos enlaces te serán de ayuda:

    1. C++ Core Guidelines. Es recomendable seguir estas normas para escribir código C++ idiomático.
    2. La guía de estilo de Google para escribir código C++.
    3. "Modern" C++ Lamentations.
    4. Modern C++ Won't Save Us.
    5. Safer Usage Of C++.
    6. Design Alternatives for Type-and-Resource Safe C++.
    7. Type-and-resource safety in modern C++.
    8. A brief introduction to C++'s model for type- and resource-safety.
    9. C++ Core Guidelines, safety profiles.
  8. Libros y tutoriales sobre C++:
    1. Libro: Ejercicios de programación creativos y recreativos en C++.
    2. Libro: Programming – Principles and Practice Using C++.
    3. Libro: The C++ Programming Language (4th Edition).
    4. Si te gustan los videojuegos el libro Game Programming Patterns está escrito para ti.
    5. El tutorial de w3schools sobre C++.
  9. Compilar C++ es lento, una técnica empleada para acelerar las compilaciones es la que se conoce como Unity Builds. Aquí y aquí tienes un par de artículos sobre ella.
  10. Si te ha sorprendido lo que aporta la POO y en concreto la herencia de clases, te recomiendo que leas el artículo de T.A. Cargill sobre la herencia múltiple en C++.
  11. Con emscripten puedes compilar C/C++ a WebAssembly y ejecutar tus aplicaciones en el navegador. Aquí tienes un ejemplo.
  12. Creando un juego para un Commodore-64 (1982) en C++-17.
  13. Ahora que sabes programar en C++ debes leer este libro de Scott Meyers.
  14. From Earth to orbit with Linux and SpaceX. El Falcon 9 de SpaceX usa GNU/Linux y C++. Ah! también tienen ofertas de trabajo.

Depuradores a nivel de código fuente

  1. Gdb es el depurador del proyecto Gcc. Te puede interesar su interfaz en modo texto.
  2. Lldb es el depurador del proyecto Llvm.
  3. Aquí tienes algunas herramientas que usan gdb por debajo, cada una de ellas tiene su utilidad: gdbgui y rr. Puedes ver aquí un tutorial de rr.
  4. Nemiver es un interfaz gráfico sobre gdb. Aquí tienes su manual.
  5. Y aquí tienes una lista de otros frontales sobre gdb:
    1. El propio gdb tiene un interfaz en modo texto basado en la biblioteca curses, gdb -tui tu-programa.
    2. Y también dispones de cgdb.
  6. En relación con la depuración a nivel de código fuente existen un par de términos curiosos, seguro que te sorprenden:
    1. Heisenbug.
    2. Rubber duck debugging.

Análisis estático de código

  1. cppcheck. Resumen en la wikipedia.
  2. Detección de cabeceras innecesarias: Deheader, búsqueda de problemas que ralentizan la compilación: Cppclean.
  3. clang-tidy.
  4. Coverity (comercial).
  5. Microsoft /analyze. Esta herramienta es posible que se integre de otro modo en versiones recientes de VisualStudio, consulta la documentación.
  6. PVS-Studio Analyzer (Static Code Analysis for C, C++, C# and Java), comercial.
  7. PC-lint Plus (para C y C++, comercial).
  8. Visual Lint (para C/C++, C# o Java. Comercial).

Bibliotecas de Interfaz gráfico de usuario (GUI)

  1. Dear ImGui. En YouTube dispones de diversos tutoriales.
  2. Nuklear es una biblioteca cuyo código fuente está todo en un archivo de cabecera. Puede ser usada tanto desde C como desde C++.
  3. Gtkmm.
  4. Qt.

Programación dirigida por eventos

Herramientas y recursos

  1. Libro: Introduction to Algorithms, 3rd Edition.
  2. Libro sobre algoritmos de Jeff Erickson. Disponible en linea.
  3. Libro: Object Oriented Modeling and Design.
  4. Libro: Touch of Class: Learning to Program Well with Objects and Contracts.
  5. Video tutoriales sobre cuestiones matemáticas que te pueden ser útiles a la hora de programarlos: 3Blue1Brown.
  6. Aprende a diseñar el API de tus clases.
  7. CMake + CTest.
  8. Meson: configuración y construcción de proyectos.
  9. Make: compilación de proyectos de forma eficiente. Aquí tienes un tutorial práctico.
  10. Ninja: compilación de proyectos de forma eficiente.
  11. Git: control de versiones. Libro Pro Git. Gitmagic. Gitready. Gitflow: A successful Git branching model. Tutorial sobre Gitflow. How to Write a Git Commit Message.

    Daniel Shiffman también tiene una serie de tutoriales sobre git y Github (Git and Github for Poets). Puedes seguirlos a partir de éste que es el primero.

  12. No dejes de leer este libro: Godel, Escher, Bach: An Eternal Golden Braid. Es indispensable para un estudiante de cualquier ingeniería.
  13. Doxygen: generador de documentación a partir de comentarios.
  14. Bibliotecas software para su uso en robótica.
  15. Manual de usuario de CxxTest.
  16. Learn X in Y minutes.
  17. Computer Languages History.
  18. En el canal de YouTube de Derek Banas encontrarás multitud de vídeos explicando características de diversos lenguajes de programación (entre otras herramientas informáticas).
  19. Uncrustify: Source Code Beautifier.
  20. IEEE-754 Floating Point Converter.
  21. Aquí tienes el código fuente de la calculadora de Windows. Está escrito en C++. Recientemente ha sido portada a GNU/Linux.
  22. Herramientas para generar UML desde archivos de texto.
  23. Steve Jobs on Why Computers Are Like a Bicycle for the Mind.
  24. Steve Jobs hablando sobre gestión de empresas, robots y POO.

Otros lenguajes de programación

  1. Ahora que estás aprendiendo a programar echa un vistazo a Hedy.
  2. Python. Primeros pasos en python. Aprendiendo python.
  3. Fundamentals of Computer Programming with C#.
  4. Rust. Hay empresas como:
  5. Java y similares. Java. Scala. Kotlin.
  6. Processing. Echa también un vistazo a la web de Daniel Shiffman donde encontrarás sus vídeos sobre realización de ejercicios de programación en tiempo real (The Coding Train).
  7. Vala. Vala: Signals/Callbacks.
  8. Lenguaje D. Libro Programming in D, disponible en distintos formatos. En su canal de YouTube Ki Rill ofrece una serie de tutoriales para aprender D. En esta charla, Ali Çehreli presenta las características de D de manera resumida y clara.
  9. Otros -quizás- menos conocidos: Swift, Go, Nim, Crystal, Pony, Zig.
  10. Paradigma funcional: Lisp. Haskell. ML. Erlang. F#.
  11. Paradigma lógico: Prolog. GNU Prolog.
  12. Paradigma orientado a objetos: SmallTalk. Squeak es una versión de código abierto del entorno original de desarrollo de SmallTalk. GNU Smalltalk.
  13. Los clásicos: Fortran, COBOL, Pascal, Ada, Eiffel, Simula.

Sobre programación en general

  1. La página web de Dennis M. Ritchie aún sigue activa. Tiene una gran cantidad de enlaces de interés, muchos de ellos históricos. Y aquí tienes la página de Brian Kernighan.
  2. Entrevista a Brian Kernighan.
  3. Modern C and What We Can Learn From It.
  4. Las tres virtudes según Larry Wall que describen a un programador.
  5. Algunos de los errores cometidos al programar que han supuesto grandes pérdidas.
  6. Aquí tienes otra lista de errores software con consecuencias importantes o graves.
  7. Modelos de tratamiento de errores.
  8. MISRA C and MISRA C++.
  9. Presta atención a los desbordamientos de pila: Stack Overflow Implicated in the Toyota Unintended Acceleration Lawsuit.
  10. Curiously Recurring C++ Bugs at Facebook.
  11. Algorithmist: recursos sobre algoritmos.
  12. En determinadas situaciones poder ver cómo funciona un algoritmo nos puede ayudar a entenderlo mejor.
  13. Teoría de grafos aplicada a la aceleración de la compilación.
  14. DJs of the Future Don't Spin Records — They Write Code.
  15. Things I Learnt The Hard Way (in 30 Years of Software Development) : Consejos muy útiles para programadores dados desde la experiencia.
  16. Epic Games supports Blender Foundation with $1.2 million Epic MegaGrant.
  17. Object-Oriented Programming — The Trillion Dollar Disaster.
  18. Cómo no realizar una práctica de programación. Deberías prestar mucha atención a lo que aquí se dice.
  19. Los peligros de los constructores. No solo de C++ sino también de otros lenguajes de programación. No dejes de leerlo.
  20. What Every Computer Scientist Should Know About Floating-Point Arithmetic.
  21. What Every Programmer Should Know About Memory.
  22. Complejidad: Crecimiento exponencial y covid19.
  23. Learnable programming. Un artículo de 2012 que trata de ayudarnos a entender los programas y así aprender a programar.
  24. En las primeras sesiones de prácticas hemos hablado sobre los includes gratuitos y lo que suponen. En el código fuente del núcleo Linux se han propuesto eliminarlos.
  25. Code bloat has become astronomical. La queja de un programador de videojuegos indie que deberías leer para hacerte pensar después.

Ejemplos de código C++ educativo

  1. Kilopp. Un editor de texto escrito en C++17. Para cuando terminemos la asignatura serás capaz de entender prácticamente todo el código fuente.
  2. Xgalaga++. Se trata de un juego mata marcianos escrito en C++ y usando los principios de la POO que vemos en la asignatura.
  3. C++ programming solved programs/examples.

Enlaces sobre robótica.

  1. Science Robotics.
  2. Openrobotics
  3. Amazon introduces ‘Sparrow’ robotic arm.
  4. Rolls-Royce is developing tiny 'cockroach' robots to crawl in and fix airplane engines.
  5. This little robot swims through pipes and finds out if they’re leaking.
  6. Do we call it a roboat? An autonomous sailboat successfully crosses Atlantic Ocean.
  7. El Mayflower Autonomous Ship trata de recrear de manera autónoma y dirigido mediante Inteligencia Artificial el viaje original del Mayflower.
  8. Creating a robot for Eurobot.
  9. C++ on Mars: Incorporating C++ into Mars Rover Flight Software. Destacar los minutos 4:27 (tests), 40:38 (caracteristicas no-usadas de C++), 1:09:00 (valgrind/purify) y 1:10:07 (equipos de desarrollo y test separados).
  10. En febrero de 2021 la NASA ha puesto un nuevo rover en la superficie de Marte. Una de las novedades que presenta respecto a misiones anteriores es la incorporación de un pequeño helicóptero controlado por GNU/Linux y cuyo software de vuelo es de código abierto. Este último vídeo hace un análisis detallado del código C++ y te recomiendo que lo veas una vez hayamos terminado la asignatura. Y Aquí tienes una imagen de la computadora que lleva el helicóptero.
  11. The Open Artificial Pancreas System project. Conoce a su fundadora Dana Lewis.
  12. Robots Built This Futuristic House That Generates More Energy Than it Needs.
  13. Speedy Soft Robot Survives Being Stepped On.
  14. Computadores redundantes: "Uptime 15,364 days - The Computers of Voyager" by Aaron Cummings.
  15. Learning embedded Rust by building RISC-V-powered robot. Se trata de la primera parte de cuatro. Al final de cada post tienes el enlace al siguiente paso.
  16. An Introductory Robot Programming Tutorial.
  17. Controlling Elegoo Robot Smart Car with ASIO and C++.
  18. Different Types of Robot Programming Languages.
  19. World Record Domino Robot (100k dominoes in 24hrs). Más información aquí.
  20. 7 Rubik's Cube World Record Robots - Fastest & New Inventions.
  21. World's first living robots can now reproduce, scientists say. Y aquí tienes el enlace al paper que lo describe.
  22. En el canal The Coding Train de YouTube tienes disponible la primera parte del vídeo: Robot Controllers Part 1: PID (with Dr. Christian Hubicki).
  23. Robots are making French fries faster, better than humans.

Emacs 28.2 (Org mode 9.5.5)