Arduino y Pidgin C ++

¿En qué programa el Arduino? ¿C? De hecho, los procesos de construcción bizantinos de Arduino utilizan C ++. Todas las funciones que obtiene de las bibliotecas normales son en realidad clases de C ++. El problema es que muchas personas escriben C e ignoran las funciones de C ++ además de usar un objeto ya creado para ellos. Así como los operadores a menudo usaban Pidgin English como un lenguaje simplificado para hablar con personas que no hablaban inglés, muchos programadores de Arduino usan Pidgin C ++ para codificar C de manera efectiva en un entorno C ++. [Bert Hubert] tiene un póster de dos partes que no se trata específicamente de Arduino, sino de pasar de C a C ++ más moderno.

Incluso aquellos de nosotros que usamos C ++ a menudo usamos lo que consideramos como C ++ “clásico”. Más o menos el C ++, que cobró vida como preprocesador antes que el compilador C. C ++, sin embargo, ha cambiado mucho desde entonces. [Bert] analiza las características más útiles del estándar C ++ 2014, que ahora está ampliamente disponible en compiladores. Solo está hablando un poco sobre algunas características de 2017. Sin embargo, no está hablando de características de supernova o características altamente especializadas, que probablemente no serán su primera parada en una transición C.

Especialmente, [Bert] no cubre herencia múltiple, metaprogramación de plantillas, gran parte de iostreams, sitios C ++, literales definidos por el usuario o exóticos. Solo para motivarlo, muestra un ejemplo de que llamar a la biblioteca C para ordenar una matriz grande es más lento que el código con patrones C ++ que aprovechan el paralelismo. Aunque este es un caso especial, muestra que C ++ no es simplemente "otra forma de escribir lo mismo". Podrías escribir un tipo más rápido en C, pero escribirías mucho código, no solo insertando una biblioteca.

Lo que cubre son cadenas, espacios de nombres, clases, punteros inteligentes, subprocesos y manejo de errores. Algunos de estos serán más útiles en Arduino que otros, pero si está escribiendo para otras plataformas como una computadora o Raspberry Pi, puede usarlos todos. Planea agregar más elementos en futuras partes de la serie.

Mientras tanto, teníamos nuestra propia historia sobre C ++ moderno y Arduino el año pasado. Si quieres saber más sobre patrones, también hablamos de eso.

  • Raza dice:

    Por lo general, creo que es mejor usar lo que sabe.

    Escribo código en un entorno C ++ la mayor parte del tiempo, pero tengo más experiencia con C.
    Cada vez que escribo código, pruebo algo nuevo en C ++.

    Entonces escribo código que no es un completo error, cómo puedo manejarme bien en C y aún así aprender algo nuevo en C ++.

    • Joel dice:

      Los compiladores modernos de gcc y clang no son tan terribles como dice la gente, pero la mayoría de la gente _todavía_ escribe en C sin reconocer realmente que es una elección estilística de los fanáticos de la programación en línea. Personalmente, prefiero C para el desarrollo de dispositivos RT con recursos limitados y C ++ para aplicaciones con docenas de bibliotecas bien probadas.

      El GSL es como un caramelo 🙂
      https://www.gnu.org/software/gsl/

      Pero las bibliotecas como wxwidgets hacen cosas extrañas fuera del estilo estándar que uno esperaría normalmente, y necesitan aprender un poco de filosofía dialectal.
      https://www.wxwidgets.org/

      Supongo que los dos lenguajes divergieron un poco en función hace mucho tiempo, y decir que una herramienta es mejor / peor siempre será incorrecto según las necesidades de los usuarios. Encuentro que clang refuerza la mayoría de los códigos, pero también ofrece algunos de los peores errores de ejecución si a la gente le gusta crear con trucos de código hold-my-beer ... ya sabes quién eres ;-).

  • David M. dice:

    Cuando su hardware lo permite, ¡C ++ es genial!

    • Alex Rossie dice:

      Realmente no estoy convencido de que haya mucha necesidad o deseo de características de C ++ en Arduino fuera de las cosas que podríamos llamar C ++ "clásico".

  • electrón excéntrico dice:

    Especialmente, [Bert] no cubre herencia múltiple, metaprogramación de plantillas, gran parte de iostreams, sitios C ++, literales definidos por el usuario o exóticos.

    ¿Es eso una crítica constructiva?

    • Al Williams dice:

      No, era su lista de lo que no cubría por una razón u otra.

  • Daños severos a los neumáticos dice:

    ¿Qué se dice de un perro C ++ creado clavando patas a un pez? Solo di no.

    • Gregkennedy dice:

      Hablado como alguien que no usó el idioma 🙂

    • Sarcástico dice:

      https://www.quora.com/What-did-Alan-Kay-mean-by-I-made-up-the-term-object-oriented-and-I-can-tell-you-I-did- no tengo C ++ - en mente

  • Lucas dice:

    todas las operaciones >>

    • Al Williams dice:

      A menudo he dicho (aunque uso y me gusta C ++) ... ¡He visto que Cout se ha cambiado a la izquierda veces "Hola mundo" y salí de allí!

      • PodeCoet dice:

        ¡Yo también! Supongo que esto nos convierte a todos en amigos.

  • werecatf dice:

    Claro que es solo porque no estoy acostumbrado, pero todos los dos puntos y los caracteres más grandes y más pequeños en todo el lugar aterrador hacen que C ++ parezca desordenado y más difícil de leer que C.

  • bga dice:

    Me gustaría usar C ++ moderno con `auto`, lambdas, new` for` loop, etc. pero ...

    avr-g ++. exe –versión
    avr-g ++. exe (GCC) 4.9.2
    Copyright (C) 2014 Free Software Foundation, Inc.
    Este es un software gratuito; consulte la fuente para conocer las condiciones de copia. No existe
    garantía; ni siquiera para VENTA o TAITGECO PARA FIN DETERMINADO.

    • bueyes dice:

      Esta versión realmente funciona bastante bien: https://gcc.gnu.org/gcc-4.8/cxx0x_status.html

      Recuerde especificar

      CXXFLAGS_STD = -std = c ++ 11

      en su Makefile.

    • Redhatter (VK4MSL) dice:

      Parece que construir un AVR de destino gcc más nuevo es imposible:

      $ avr-gcc --version
      avr-gcc (Gentoo Hardened 7.3.0-r3 p1.4) 7.3.0
      Copyright (C) 2017 Free Software Foundation, Inc.
      This is free software; see the source for copying conditions. There is NO
      warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  • deshipu dice:

    Ahora con tentáculos extra.

  • BillyTheGator dice:

    ¿Por qué la gente insiste en codificar en lenguajes lentos? ¡C es lento, C ++ es aún más lento!

    Java debe ser el idioma predeterminado. ¡Java acelera todo! Una vez que funciona el compilador punto a punto, los programas son al menos 10 veces más rápidos que en C y 100 veces más rápidos que el montaje.

    Sé que Java es más difícil que C / C ++, pero debido a que es mucho más rápido, vale la pena la inversión adicional.

    C / C ++ es adecuado para jockeys de código y desarrolladores de "hola". Si está creando un programa real, simplemente use Java.

    • Ryan T Vasquez dice:

      LOLOLOL ???????????

    • lars-mander dice:

      Dum Vere:
      print ('tu versión de Java está desactualizada')
      java.update ()
      hora de dormir (1)

    • Ostraco dice:

      Por supuesto. ¿De qué otra manera obligaremos a los fabricantes de hardware a que nos proporcionen hardware caro y caro para ejecutar nuestros lenguajes de programación masculinos?

    • bueyes dice:

      No puedo decir si es impensable o trolling ...

      • andrewjhull dice:

        "No sé si es una idea o un troll ..."
        En ese caso, probablemente lo controle un verdadero maestro del arte. }; ~)

    • Dan dice:

      Y con la ventaja adicional de que puede escribirlo una vez y, a menos que sea un programa de ejemplo trivial, ¡funcionará directamente en una plataforma!

      • BillyTheGator dice:

        Si tiene la versión correcta de Java, las bibliotecas de clases adecuadas, suficiente memoria [8gb should be enough for most trivial programs] , cuádruple cpu y 10 GB de espacio en disco.

        • Enero 42 dice:

          olvidó que Java es increíble porque consume toda la RAM, ¡así que le ahorra quejarse de comprarlo y no usarlo!

        • Hiswif dice:

          ¡Y todo tiene que funcionar como raíz! Incluso servidores.

      • Al Williams dice:

        Escribe una vez, limpia en todas partes.

    • Olsen dice:

      https://imgs.xkcd.com/comics/real_programmers.png
      Guau. Simplemente guau.

    • rdesanctis dice:

      ... el compilador de correo electrónico funciona ... 10 seg. de distancia ... parpadeo del led ... 10 segundos de distancia ... la versión de java debe actualizarse

    • D Aaron dice:

      Java también es lento. Me pregunto si hay una ventaja en la memoria, la velocidad o las bibliotecas en C o C ++ que hacen que ambos sean más deseables. ¿Un tipo de datos nativo único que mejora el procesamiento? Creo que el costo adicional de la herencia de clases reduciría la eficiencia de la codificación. La única ventaja que puedo imaginar es que podrías usar títulos + clases para implementar una pseudo-biblioteca de algún lenguaje más moderno. ¿Afecta esto a los procesos de FPG?

      • Paul LeBlanc dice:

        No existe un tipo de datos exclusivo de C (o C ++) que se adapte mejor a cualquier entorno específico; todos los tipos de datos dependen hasta cierto punto del entorno en sí, y los tipos de datos más complejos o esotéricos implementados en hardware sin soporte nativo para ellos siempre será menos eficaz.

        Y no asuma que la herencia "superior" de la clase da como resultado un código más grande y / o más lento; he visto muchos casos en los que la herencia hace que el código sea más pequeño, más rápido, más eficiente en memoria y más fácil de mantener.

        • BrilaBluJim dice:

          "Y no asuma que el 'superior' de la herencia de clases da lugar a un código mayor y / o más lento".

          Realmente asume lo contrario. Observo que los compiladores de C ++ más nuevos no se convierten a C primero, pero para los compiladores que sí se convierten a C antes de compilar, casi todas las herencias de clases desaparecen en el código C.

          Lo que trae a colación otro punto: incluso más allá del principio básico de las máquinas de Turing (extendido a los lenguajes), es decir, todo lo que se puede escribir en un lenguaje completo de Turing se puede portar a cualquier otro, todas las funciones de C ++ se pueden llevar a cabo. en C. ¿Quieres un polimorfismo? Solo incluya un argumento adicional a todas sus funciones que diga qué tipo espera que devuelva. Todo lo que se puede hacer con una clase se puede hacer por estructura; incluso puede poner punteros de función en la estructura. Sí, estoy simplificando demasiado, así que no se moleste en decirme "eso no funciona for ___ case ", porque obviamente el preprocesador C ++ puede hacer que funcione para ____ case.

          Intento evitar C ++; cuando escribo aplicaciones Qt, hago el retroprocesamiento en C, pero lo mejor es escribir funciones C ++ sin usar ninguna extensión C ++. Lo que significa que no me molesta que los bocetos de Arduino sean programas C ++.

    • Paul LeBlanc dice:

      C es lento si lo escribe lentamente. C ++ es lento si lo escribe lentamente. Cada idioma es lento si lo escribes lentamente.

      Pero considerando que casi todo UNIX fue transportado a C por un ensamblador a mediados de los 70, diría que es bastante rápido. Pero hasta que alguien lleve UNIX a Java y demuestre que en realidad puede ejecutarse más rápido en el mismo hardware (y dejar suficiente memoria para ejecutar sus programas), estará hablando en su sombrero.

      • BrilaBluJim dice:

        ¿En serio no puedes detectar el sarcasmo en el comentario original?

        • Paul LeBlanc dice:

          Nací sarcásticamente sordo; solo puedo detectarlo escuchando las frecuencias táctiles generadas al mezclar sarcasmo con sinceridad.

          O eso, o leer toda la publicación antes de que aparezca ...

  • Jeffeb3 dice:

    IIRC, la biblioteca estándar de Arduino es el punto clave. std :: vectors son la columna vertebral de C ++ y no funcionan en arduino. Creo que hay un problema similar con las cadenas (por lo que Stribg en arduino).

    El compilador ESP tiene bibliotecas de plantillas estándar y funciones modernas de C ++ y yo uso lambdas para usar las tareas gratuitas. Es genial. Sin embargo, el esp también es significativamente más rápido.

    • Steven Clark dice:

      Y para hacer muchas cosas buenas en C ++ sin las estructuras de datos habituales, necesita la plantilla de mapa STL. Ya sea que desee una decisión básica sobre IA mínima o A *, o ejecutar el algoritmo de Djikstra, o una máquina de estado terriblemente compleja, los mapas le facilitan la vida.

      • bueyes dice:

        Un mapa es un árbol binario y los árboles necesitan una asignación de memoria dinámica. Eso no funciona bien con el espacio de memoria limitado de Arduino.

        Pero entonces, ¿por qué usar Arduino hoy cuando puede tener ESP32?

    • pelrun dice:

      La asignación de memoria dinámica es una mala idea en los dispositivos integrados. No puede codificarlos como lo haría en una máquina de escritorio con intercambios y memorias gigantes, que puede reiniciar ocasionalmente si hay memoria.

      • macegr dice:

        La asignación dinámica se ha inventado en sistemas más pequeños que algunos de los microcontroladores que usamos ahora, para eludir algunas de las limitaciones del hardware de una manera medio controlable. DEBE considerarse un puente giratorio hacia la funcionalidad y no debe usarse si es evitable, pero ... plazos.

      • lars-mander dice:

        En Python tiendo a soportar listas o cadenas grandes arbitrarias, etc. En el escritorio, no me molesto demasiado si mis 100 líneas de Python usan el 50% de mi CPU y el 50% o ram. Aprendo C y lo encuentro muy diferente (las cadenas son matrices de tamaño fijo, etc.) pero eso parece más intuitivamente vinculado al hardware y a la RAM limitada. Luego veo Strings (S mayúscula), que creo que es C ++, y parecen mucho más similares a las cosas que "dejé" en Python.

    • Jonathan Wilson dice:

      ¿Qué pasa exactamente con STL (o su implementación gnu-libstdc ++) que dificulta la operación con AVR? ¿Es la falta de RAM disponible?

      • Steven Clark dice:

        Para tener un tamaño dinámico, las clases de estructura de datos almacenan sus datos reales en la pila en lugar de en la pila (por lo que necesita uno de los que puede que AVR no tenga). También fragmentación de RAM. Si es nuevo y elimina muchas asignaciones grandes en el montón, es posible que no tenga un bloque adyacente de memoria libre lo suficientemente grande para hacer coincidir un nuevo objeto más adelante. Hay formas de evitarlo con una "nueva ubicación", donde un objeto se construye en un puntero preasignado en la memoria, pero necesita un mecanismo para alimentar un bloque de asignaciones a la estructura de datos para que funcione. Creo que podría haber una forma de hacer esto con el sistema de asignación de STL, pero todavía no entiendo ese sistema, y ​​el enfoque predeterminado terminaría siendo el que no funciona, lo cual no es un gran lugar para trabajo. sabio. Además, el uso de grupos para evitar la fragmentación más o menos no funciona en absoluto con toda la familia de estructuras de datos adyacentes con longitudes variables, como vector y String (y posiblemente unordered_map, depende de si el número de contenedores aumenta).

        Este es un problema bastante general con los sistemas integrados, por lo que lo menciono a pesar de que es posible que AVR no tenga la RAM para ejecutar una IA o un algoritmo de enrutamiento con uso intensivo de memoria.

  • Ralph Doncaster dice:

    "Todas las funciones que obtienes de las bibliotecas normales son en realidad clases de C ++"
    La mayor parte de la biblioteca de Aduino es directa C. digitalWrite, pinMode, shiftOut son todos simples C.

    • pelrun dice:

      C ++ es un superconjunto (en su mayoría) de C. Estas funciones no son C, están en el subconjunto C. Aún necesita un compilador C ++ para todo lo demás.

      • BrilaBluJim dice:

        El hecho de que esté compilado por un compilador de C ++ no lo convierte en C ++. Si está compilado en un compilador de C, el lenguaje es C. Simple y directo.

    • Al Williams dice:

      Bueno, está bien pero ... Serie ... Transmisión ... Teclado ... Ratón ... Además de casi todo aquí https://www.arduino.cc/en/Reference/Libraries

      Entonces ... bueno ... tal vez "Todos" es una exageración, pero creo que así es como usas "la mayoría".

    • Paul LeBlanc dice:

      El estilo estándar de Arduino para escribir bibliotecas que abstraen funciones de dispositivos es escribirlas como clases C ++: serie, transmisión, impresión, cadena, EEPROM, cable, SPI, servicio, etc.son todas clases de C ++.

      La mayoría de las habilidades avanzadas de C ++ no se utilizan con frecuencia, ya que la plataforma fue diseñada para principiantes, no para desarrolladores con muchos años de experiencia. Pero Print, Stream y Serial usan - * jadeo * - herencia y polimorfismo (funciones virtuales).

  • Enero 42 dice:

    Creo que algunas de las características de C ++ DEBEN ser utilizadas más por personas que escriben código para ardunio .. Además de facilitar la depuración del código (y justificar la primera vez) incluso en ardunio, después de comenzar a escribir programas más grandes de otros chips, es decir, 8266 y esp32, se vuelve más esencial.

    Principalmente -
    1) El uso de clases para la encapsulación TODAVÍA tiene todas las ventajas en un chip integrado, así como en una computadora más grande.
    2) Un solo legado simple sigue siendo muy útil para muchas cosas ... Incluidas las clases abstractas.
    3) ¡el polimorfismo aún más limpia el código!

    Ciertamente, no tendrá que hacer algo en el hardware que incluye funciones que necesitan tiempo. Pero la mayor parte de su código, y donde estarán muchos de sus errores, NO está en un bucle cerrado, y el tiempo requerido para la deferencia del puntero (por ejemplo) es irrelevante, y el código es mucho más fácil de comenzar, más fácil de tomar. cuidado y más fácil de modificar.

    • PuceBabuino dice:

      Ian-42 y A,

      ¿Quiere unir sus cabezas y producir un artículo corto con algunos ejemplos? Fui a los artículos vinculados con grandes esperanzas, pero me di cuenta de que necesitaba más café (ya que el Océano Pacífico vale) antes de "llegar a" cómo poner todo eso en un programa Arduino para el ESP.

      • Rud Merriam dice:

        Busque La-Tecnologia para "Embedded C ++" o Rud Merriam. Encontrará algunos ejemplos de C ++ en Arduino.

        Lo arrojaré aquí, aunque no es una respuesta directa, pero si observa las placas más nuevas y algunas de las más antiguas como Due, verá mucho espacio de memoria para trabajar con C ++.

  • Jay-Son dice:

    use lo mejor para su tarea, no lo haga porque otros lo hagan, hágalo porque usted sabe cómo hacer el trabajo y todos los demás. Personalmente, uso C para micro y miro la lista ASM siempre en secciones críticas y reescribo parte de mi C para tratar de optimizar mis objetivos.

    Ahora es solo mi opinión, quiero al menos estar en mi código y no usar C ++, y nunca me molestaría con uOS, que se suma, y ​​que tiene características que realmente no se necesitan, pero bueno, solo opinión y estoy seguro, que debería haber muchos culos que digan lo contrario en respuesta a esta publicación. Tal vez estoy cansado de los desarrolladores pobres, puedo conseguir un PIC18 simple para hacer 32 salidas de servicio a 250Hz sin necesidad de hardware multitarea o espía.

    Ponte los pantalones de niño y aprende a programar cuando se trata de microcontroladores, donde la memoria, los bytes superan. Cuando diseño para un cliente, una diferencia de $ 2 en chips significa un factor minorista de 2.6, por lo que el chip de $ 2 con más memoria se convierte en $ 5.2, por lo que 100,000 unidades enviadas es un aumento del precio de venta de $ 520,000 o 1, 2 millones de ingresos perdidos ,

    discutir, llama

    • Jonathan Wilson dice:

      Uno de los objetivos más importantes que tuvo Bjarne Stroustrup durante la creación de C ++ fue asegurarse de que C ++ sea tan eficiente como C. Obviamente eso depende de lo bueno que sea el compilador, pero me imagino que los desarrolladores detrás de G ++ - AVR tendría como prioridad la eficiencia del optimizador.

      Ah, y recuerde que estas cosas funcionaron con cosas como los sistemas VAX con recursos muy limitados (RAM en particular). Si C ++ puede ejecutarse en VAX-11/780 con un rendimiento aceptable, seguramente puede ejecutarse en ATmega328P con niveles de rendimiento igualmente aceptables ...

    • Enero 42 dice:

      Bueno, estamos hablando de ardunio, etc. aquí, y me sorprendería si las pocas cosas de C ++ que mencioné anteriormente hicieran que algo saliera mal en el chip. Reconocería (por lo que he visto) que el mayor problema que tiene la mayoría de la gente con el ardunio es la RAM, seguida de bibliotecas infladas y la interacción de las dos. Es mejor no usar un par con funciones de usuario como una coma, cadenas (en lugar de administrar su propio carácter *) y printf ... etc.

      Donde agregar encapsulación, herencia SIMPLE y polimorfismo (donde sea necesario) aumenta en gran medida el código Y no usa mucho los recursos ...

      Y seguí los enlaces del artículo y estuve de acuerdo con [PuceBaboon] arriba, eso no es lo que yo diría para las personas que quieren pasar de C a C ++ en el ardunio ...

      Si tengo tiempo, siempre el problema, escribiré algunos artículos sobre lo que recomendaría a un programa C amateur de una manera diferente con acceso a C ++ en la reunión ... 🙂 Y luego todos podemos discutir sobre eso ...

    • Rud Merriam dice:

      C ++ generalmente no agrega memoria superior o tiempo. Incluso puede reducir el uso de memoria. Lo mencioné en otra respuesta, pero leí mis artículos sobre HAD. Busque Embedded C ++ o Rud Merriam.

      Vamos chicos, el mismo compilador se usa para C y C ++. Generan el mismo código.

      • Dur Mairrem dice:

        A menos que incluya el tiempo de ejecución o utilice métodos virtuales, por supuesto.

        Fanboi es fanboi es fanboi.

        • Paul LeBlanc dice:

          Los métodos virtuales, si se usan correctamente, son la única función de C ++ que todo programador debe aprender y usar, ya que a menudo terminan produciendo código más pequeño y más rápido que las alternativas en C - una larga serie de if..else if .. . sentencias que prueban una variable con varios valores, una sentencia de cambio grande o un conjunto de punteros de función. (De hecho, las funciones virtuales son exactamente lo que es la última opción, excepto que es una matriz de punteros que siempre se inicializa para usted con menos arriba, existe solo una vez para cada clase de objeto y no se puede romper con una tarea incorrecta. )

          Durante el tiempo de ejecución, nunca debe probar si el objeto es A o B o C como lo haría con ifs: el objeto ya sabe de qué tipo es, por lo que las pruebas (y los ciclos de reloj que consumen) se eliminan; todo lo que tiene que hacer es para ignorar un puntero. Entonces, la velocidad, y usted gana más y más profundamente, debe ingresar a la lista de pruebas (lo cual no es una coincidencia, es exactamente la razón por la que existe la declaración de cambio),

          Y la vtable (tabla de método virtual) en una clase con métodos virtuales no es diferente de la tabla de salto que normalmente producirá una declaración común. Excepto que nunca tiene que realizar la prueba en la parte superior del conmutador, la matriz siempre es densamente compacta sin importar cuán pequeño sea su intervalo de prueba, y solo debería suceder una vez para una clase determinada en lugar de en cada lugar que pueda tener. para probar el tipo de objeto para determinar qué acción es necesaria realizar.

          Y el costo máximo cuando se trata del tamaño de los objetos en sí no suele ser ninguno, porque el puntero vtable reemplaza al miembro que de otra manera necesitaría para rastrear el tipo de objeto. De hecho, con el polimorfismo en C ++, a menudo terminas usando menos memoria en general, porque los objetos más bajos en la jerarquía de clases nunca necesitan asignar espacio para miembros introducidos y usados ​​solo por objetos más derivados, ni tienen que inicializar esos miembros. .

  • Enero 42 dice:

    .. y mientras escribía eso, alguien comentó sobre el VAX-11 / 780- Yo solía (en los 80) procesar datos satelitales con VAX, y todo estaba escrito en C ++, con algunas rutinas individuales (aún encapsuladas) en montaje. ¡Exactamente lo que hago hoy con un procesador integrado!

    Hice esto en máquinas muy grandes (también una computadora de escritorio grande), es decir, escribí todo en un buen lenguaje avanzado (relativamente) limpio, SIN EMBARGO, escribo los bits que necesitan ser ensamblados.

    El proyecto actual en el que estoy trabajando tiene alrededor de 50K líneas de C ++ y un puñado de rutinas de ensamblaje ...

    • Paul LeBlanc dice:

      Las complicaciones originales de Borland C ++ tenían un interruptor para la línea de comando que escupía código ensamblador en lugar de código objeto como resultado final. Tomaría partes seleccionadas de eso y lo configuraría para los problemas de tiempo crítico.

      • Enero 42 dice:

        Lo mismo aquí, pero también lo hice con muchos otros compiladores, es decir, ¡el compilador de computadora pl / 1 también lo hizo! A veces era bastante sorprendente ver cuánto código se generaba para hacer cosas simples, pero tenían que considerar todas las posibilidades.
        Y estoy de acuerdo con su otro comentario sobre virtual anterior. E incluso si todo lo que dijiste no fuera cierto (lo que es), ¡simplemente hace que el código sea más fácil de escribir y guardar!

  • Independiente dice:

    Es obvio lo despistados que eran los diseñadores sobre C ++ cuando decidieron que lo nuevo es inaceptable, pero que malloc no lo es, y continuaron eliminando la mitad del lenguaje al deshabilitar deliberadamente new.

    Fue sorprendente, pero después de leer los comentarios aquí, parece que hay mucha gente así.

    • Enero 42 dice:

      lo siento, ¿te refieres a los April Fools bromeando sobre la eliminación de nuevos te https://www.fluentcpp.com/2018/04/01/cpp-will-no-longer-have-pointers/ ??

  • Daniel dice:

    En dispositivos integrados, libstdc ++ no se puede usar y C ++ se trata principalmente de la capacidad de usar ADT.

    El resto es principalmente azúcar sintáctico con el gran problema que el azúcar siempre trae a la mesa si no te importa: la obesidad. Tiendo a evitar C ++ en esos dispositivos, porque nada es más molesto que tratar de averiguar qué declaración o declaración faltante, el diablo acaba de inflar el código generado tanto que es más grande que la memoria flash disponible o incluso más molesta RAM.

    • Enero 42 dice:

      “Azúcar sintáctico”: resulta que no es así.
      Y la declaración más hinchada que he visto a la gente usar en un ardor es algo así

      relación de flotación = 5,46 / 7,85;

      lo que hace que se incluya toda la biblioteca de diapositivas ...

      • Jay-Son dice:

        ¡Sí! no me malinterpretes, me gusta C ++, pero simplemente no aprovecho la mayor parte de él, y cuando se trata de micro-scripts, me siento como un nuevo programador que abstrae todo pobre micro.
        Ejemplo: ayudé a un desarrollador con un dispositivo GPS que hacía seguimiento y proyecciones, cada variable que usaban era flotante, solo hice cada número de 32 bits y sabía que solo estábamos asumiendo un decimal de 4 posiciones, así que cuando imprimimos algo, sabíamos dividir por 10,000. Algo así como cuando trabajas con dinero, haces todo en centavos; es decir, $ 1,50 son 150 centavos.

        solo mis (2/100) centavos

        • BrilaBluJim dice:

          Jay Son: Creo que probablemente esté apuntando (2/100) dólares. Este es el peligro de incluir números de punto fijo de enteros.

      • F dice:

        Este es un ejemplo maravilloso. Muestra exactamente por qué C y C ++ apestan tan mal: lo simple y obvio es la peor solución posible. Omitir la siguiente f en las constantes significa que los números se ejemplifican como dobles, la división es una división de doble precisión y luego el resultado se lanza a flotar. Y luego el valor se coloca en la RAM aunque probablemente sea una constante. Accidente de tren total.

        Un acceso mucho mejor es:

        # definir la relación (5.46f / 7.85f)

        Es de esperar que el compilador descubra que se puede compartir, pero, por supuesto, no hay garantía. Probablemente hay una docena de formas diferentes de expresar esto con C ++, la mayoría de ellas son muy complicadas pero siguen siendo un código completamente válido y el compilador generará felizmente un desastre terrible.

        Cualquiera que piense que C ++ es un buen lenguaje de programación no entiende que el código C ++ debe ser escrito por miembros de la especie homo sapiens. Tampoco ven ninguna importancia para los miles y miles de informes CVE creados para programas C ++.

        • Enero 42 dice:

          no, el mejor enfoque es hacer lo que [Jay Son] ¡dicho! ¡Usarte! O más al punto uint16_t (o cualquiera que sea el tamaño / signo más pequeño con el que pueda salirse con la suya ...)

          • F dice:

            Casi puedo garantizar que dicha implementación, aunque de hecho es la implementación más pequeña y rápida, sufrirá errores incompletos e incompatibilidades de un compilador a menos que se someta a pruebas exhaustivas de unidades. E incluso si lo ejecuta primero, tendrá que quedarse con el tipo que lo escribió, porque nadie más podrá depurarlo. Es por eso que Microsoft tiene tantas dificultades para mantener el código de Windows, está lleno de mejoras de rendimiento agradables incomprensibles para sus desarrolladores actuales.

        • Enero 42 dice:

          Y sí, estoy de acuerdo con C ++: usarlo en su "totalidad" requiere más habilidad que el desarrollador corporativo promedio.
          Pero entonces el problema es, ¿qué escribes si no es C ++? Ningún otro idioma se le acerca si escribe un gran sistema (SIN hablar de incrustado aquí).

          Java no se puede utilizar excepto para cosas relativamente triviales, lenguajes como PHP, que es apropiado para lo que se pretende, son buenos para algunas cosas de sitios web, etc., pero ¿qué más hay?

          Simplemente no tenemos un verdadero paso adelante de C / C ++ si desea construir un gran sistema de producción, aunque estoy de acuerdo en que usar un subconjunto es más la forma.

          • F dice:

            La respuesta "pragmática" es que escribe una implementación de lenguaje específico de dominio en C ++ y luego mueve el desarrollo del programa al lenguaje específico de dominio. Ejemplos: Emacs, AutoCad, gimp, etc. Implemente todas las cosas de bajo nivel en C o C ++. Divide el esfuerzo de programación en dos campos: cosas de bajo nivel realizadas por algunos gurús de C ++, y luego puede contratar programadores que no memorizaron Stroustrup para escribir el código del programa. Si diseña bien las interfaces, puede invertir recursos posteriores en la optimización del código de bajo nivel sin perturbar su inversión en código de alto nivel. A la larga, necesitamos un mejor hardware con tipos de datos etiquetados y un nuevo lenguaje con él.

          • Ostraco dice:

            @ F

            Llegando a una máquina LISP cercana. :-pag

          • F dice:

            No es necesario ser un meteorólogo para saber en qué dirección sopla el viento.

        • BrilaBluJim dice:

          F: usando su ejemplo "#define ratio (5.46f / 7.85f)", si intenta usar esto con variables enteras, se clasificará como (int) (5.46f / 7.85f), que es igual a 0. Esto es probablemente no sea lo que estás buscando.

      • BrilaBluJim dice:

        "Relación de hinchamiento = 5,46 / 7,85;
        lo que significa incluir toda la biblioteca de diapositivas ... "

        ¿Qué tan malo es eso? Si necesita una diapositiva, necesita la biblioteca de diapositivas, tan simple. Hay momentos en los que realmente desea evitar el uso de diapositivas, como cuando se trata de dinero o de contar fotogramas en un video, pero es igual de malo usar un int cuando lo que realmente necesita es un flotador. Si usa un int, debe ocuparse de cada cálculo para que su resultado no se desborde ni se desborde. Y si simplemente se da suficiente margen en ambos lados, eligiendo cuidadosamente su multiplicador (como 100 para expresar dólares como cientos, o 1000 cuando expresa el tiempo en milisegundos), todavía está limitando su rango dinámico. Si necesita multiplicar un número por 19/32, usando números enteros, debe cuidar el orden: multiplicar por 19 y luego dividir por 32 no le da el mismo resultado que dividir primero por 32 y luego multiplicar por 19. Pero flotando, multiplicar por 19f / 32f siempre te da la respuesta correcta.

        • Enero 42 dice:

          He visto muchos más problemas introducidos con la flotación que con el manejo int en su lugar ..

          Pero ignorando eso hoy en día, muchas veces veo flotantes en código ardunio simplemente porque el eprson no miró a través de él, porque la biblioteca flotante usa mucha RAM ...

          El mas común es
          distancia flotante = read_ultrasonic (D1); // donde read_ultrasonic devuelve un flotador

          que devuelve la distancia a algo en cm, con todos esos lugares decimales.

          Es mucho más rápido, y mucho mejor en términos de recursos si mantiene alejada la biblioteca flotante, para hacer

          uint16_t distancia = read_ultrasonic (D1); // donde read_ultrasonic devuelve uint16_t

          y tiene el resultado devuelto en mm o cm (etc.). No hay nada en la lectura y el ultrasonido que necesite un flotador, y este es un resultado más sensible dada la precisión del instrumento.

          Encuentro que si mantienes los flotadores alejados siempre que puedes, a menudo terminas un proyecto sin usar la necesidad de usarlos ... 🙂 Y refiriéndote a uno de los comentarios de muchas publicaciones anteriores: tener un flotador en lugar de no tener un flotador, PUEDE hacer una gran diferencia con algo que coincide con un chip, con algo que no puede ...

          • BrilaBluJim dice:

            Sí, da un buen ejemplo (hombre de paja) donde no se necesita un flotador. Hablé de eso cuando realmente necesitas números de punto flotante. Me dije a mí mismo con bastante claridad: hay lugares correctos e incorrectos para usar un flotador. Si no los necesita, no utilice flotadores. Duh.

          • Enero 42 dice:

            lo mío es que no los necesitas a menudo ...

    • F dice:

      http://andybrown.me.uk/

      Andy Brown opera código C ++ en STM32F042F6P6 (flash de 32 Kb, SRAM de 6 Kb)

  • BrilaBluJim dice:

    Sí, da un buen ejemplo (hombre de paja) donde no se necesita un flotador. Hablé de eso cuando realmente necesitas números de punto flotante. Me dije a mí mismo con bastante claridad: hay lugares correctos e incorrectos para usar un flotador. Si no los necesita, no utilice flotadores.

    • BrilaBluJim dice:

      Hm. que no se publicó correctamente. Lo siento, respondí a ian42 arriba.

  • BrilaBluJim dice:

    Así que me refiero a dos hilos de comentarios aquí (el otro es https://la-tecnologia.com/2018/06/22/linux-fu-the-great-power-of-make/): no 'ni siquiera recuerdas qué es "Arduino". Odio los IDE, así que aunque los "clones de Arduino" son la forma más barata y fácil de obtener programas para microcontroladores Atmel, cuando tengo algo para lo que quiero usar AVR, uso un editor de texto para escribir código C, luego uso make compile, link , convierta a hexadecimal y programe el dispositivo. Obtuve los ejemplos sobre cómo configurar todo el flujo de [Adafruit]. Gracias, chicos, ni siquiera tengo el IDE de Arduino en mi máquina.

    • Enero 42 dice:

      bueno, estoy de acuerdo, el ardunio IDE ni siquiera tiene que llamarse ide, es una mierda. Y también usé recientemente un editor de texto con un colgante de marca de una tecla de función.
      Sin embargo, encuentro que un eclipse, aunque está estúpidamente escrito en Java, lo que significa que solo puede manejar un proyecto de tamaño mediano a la vez, es útil como prólogo editorial. Coloca muy bien todos los archivos de su proyecto en una ventana, la salida en otra ventana y el puerto serie en otra. Por supuesto, puede usar GB o dos RAM para hacer eso (gracias java ...) y el index. La función (si está encendida) necesita más trabajo que hacer una taza de café ...

      Como no uso algunas de sus funciones "avanzadas", uno de estos días voy a escribir algo que pueda hacer algo similar, pero que pueda manejar más cosas a la vez abiertas ... Una vez más, no creo que Alguna vez tendré suficiente tiempo para escribir todo lo que quiero escribir .. 🙂

  • András dice:

    El límite de 2048 bytes de RAM en el Uno es muy estricto. Usar C ++ lo empeoraría aún más. Si usa métodos virtuales, sus punteros se almacenan en la RAM. Lo cual es completamente inútil si solo tiene un tipo de objeto instanciado, lo que generalmente sucede en los programas Arduino. Si no usa funciones virtuales, entonces usar C ++ es inútil.

    Por estas razones me quedo con C en Arduino. Utilizo C ++ solo cuando accedo a bibliotecas escritas por otros en C ++. TBH Tampoco me gusta C ++ en una computadora. Programa cosas complejas en Java o C #. Y cuando necesito usar alguna API de bajo nivel, implemento una fina capa JNI entre Java y la API.

    En lugar de envolver cadenas en objetos C ++, es mejor usar cadenas en PGMSPACE. De esa manera, no usan nuestra valiosa RAM. En lugar de:

    Seria.printado ("BLA-BLA");

    yo suelo
    IMPRIMIR ("BLA-BLA");

    #define PRINT (s) (my_print ((uint32_t) PSTR (s)))

    y

    vacío my_print (const PROGMEM char * ptr)
    {
    char ch = pgm_read_byte (ptr);
    mientras (aprox. = 0)
    {
    Serial.press (ch);
    ptr ++;
    ch = pgm_read_byte (ptr);
    }
    }

    ¡Reserva RAM! ¡No lo desperdicie!

    • Enero 42 dice:

      Hmmm, ese ejemplo es una completa pérdida de RAM ...
      ¿No viste F () ???
      Seria.preso (F ("BLA-BLA"));

      La cadena ahora NO está almacenada en la RAM ... Y no tiene que reescribir todo lo que Serial.print puede hacer ...

      Y sí, el pronóstico importa, y ahí es donde debe mantener la mayoría de las cadenas. Sin embargo, eso no me impide usar algunas funciones de C ++, y en una computadora me parece ridículo que no quieras usar C ++ debido a la luz superior, pero usas java.

    • Paul LeBlanc dice:

      >> Si usa métodos virtuales, sus punteros se almacenan en la RAM.

      No, ellos no son. Los punteros a las funciones residen en una matriz (la vtable) en Flash, y la RAM contiene solo un puntero a esa matriz. Pruebe esto en un Arduino en algún momento (o el equivalente en cualquiera que sea su plataforma favorita):

      clase A
      {
      audiencia:
      virtual int a ();
      virtual int b ();
      virtual int c ();
      };

      int A :: a () {retorno 1; }
      int A :: b () {retorno 2; }
      int A :: c () {retorno 3; }

      A a;

      configuración vacía () {
      Seria.begin (115200);
      Serial.press (tamaño de (A));
      aa ();
      ab ();
      ac ();
      }

      bucle vacío () {

      }

      El resultado de lo anterior es "2"; no hay forma de que los punteros a tres funciones puedan coincidir en solo 2 bytes. Agregue otras 3 funciones virtuales a la misma clase y financiará que el tamaño de (A) todavía devuelve 2. Esos dos bytes son el puntero a la matriz. Todos los buenos compiladores de C ++ harán esto independientemente de la plataforma: la vtable siempre entra en el espacio de código, no en el espacio de datos, independientemente de cómo se implemente cada uno de ellos. Y solo hay una copia por clase; básicamente, es un miembro de datos estáticos ocultos.

      Sin embargo, su problema de poner cadenas sin cambios en Flash es importante. No solo ahorra RAM, sino que también guarda memoria Flash. Esto puede parecer contrario a la intuición, pero las cadenas literales siempre comienzan en Flash o no es posible iniciarlas durante el tiempo de ejecución. Pero si no los mantiene en Flash, donde pertenecen, entonces hay una gran cantidad de código que tiene que funcionar inicializando todas esas cadenas de RAM con las copias de Flash antes de que se pueda hacer cualquier otra cosa.

Gloria Vega
Gloria Vega

Deja una respuesta

Tu dirección de correo electrónico no será publicada.