¿Crees que escribir programas en lenguaje ensamblador es más fácil que cualquier lenguaje de alto nivel en el contexto de sistemas en tiempo real?

El acceso a las estructuras es más directo en el montaje. Yo diría que sí. Así es más fácil. Y si necesita bibliotecas de cualquier tipo, simplemente úselas como las usaría en C.

Lo único que leo y escucho a menudo desde mediados de los 80 es: “No puedes escribir el código de ensamblado a mano, posiblemente sea mejor de lo que te da tu compilador”. Y con respeto, una completa tontería si lo piensas. Lo sé, no es culpa de las personas que repiten este mantra, se repitió desde que fui a la universidad y eso fue hace 30 años.

Pero simplemente piénsalo por un momento. Si tienes la habilidad mínima para ensamblar, siempre puedes dejar que el compilador haga la primera ejecución, echar un vistazo a la basura que produce y cortar las esquinas. Un novato total en Assembly puede hacer esto y obtendrá una velocidad promedio de 20 a 50% de eso. Así. Si él sabe lo que está haciendo y no estoy hablando de una experiencia de ensamblaje de por vida, más o menos algunos meses, en muchos problemas vencerá al compilador con factores del 3 al 5 y eso es totalmente realista. Si es un compilador de mierda con un lenguaje de mierda y hay problemas, que realmente encajan en Assembly es fácilmente un factor de 100 o 1000. Si realmente entiendes la fuerza de tu idioma, puedes hacerlo.

Si está en un sistema integrado, es posible que necesite esta aceleración. Y no es mucho más lento codificar, como principiante, y de hecho, a veces incluso más rápido codificar como un codificador experimentado.

No me malinterpretes, los compiladores reales (GCC) son muy rápidos para un pequeño robot despistado y despistado, pero son solo eso. Y ese es su límite. Nunca debes subestimar las ideas que están programadas en él, que son nombres “optimización de mirilla”, que son trucos realmente geniales y que debes aprender totalmente de él. Pero él solo tiene algunos de ellos, eso es todo.

Eres mejor que eso. No te permitas comparar o incluso reducir los trabajos de una máquina sin sentido. Eres un programador, un programador, con el don del arte y la imaginación. Vas a vencer a la mierda de cada compilador.

Pero ¿por qué asamblea?

No escribiría todo en ensamblaje, pero algunas cosas son mucho más fáciles. Al igual que los siguientes punteros, hardware de lectura, lectura o escritura de bytes en puertos, la programación de registros de hardware y todas las comunicaciones con el sistema son mucho más fáciles de ensamblar.

En C solo tienes este puntero abstracto y eso no te lleva a ninguna parte. No puedes ver lo que realmente está sucediendo, no tienes los números y es difícil depurar la mierda que compila tu compilador. Y si cambias una bandera en el compilador, todo tu código cambia y no sabes dónde está todo.

Es un desastre. Entonces, es posible hacer el trabajo duro en HLL, me refiero a que no es tan malo como Python o Lisp en este contexto, pero le falta mucha información. Y te faltan las banderas, también. No llevar, no cero, solo nada. Es para mí como volar ciego en una nube. No puedes ver nada y la mala respuesta que te da tu compilador, simplemente no es lo mismo.

Entonces sí.

Es más fácil en el montaje, pero, por supuesto, hay que saberlo. Para un principiante en ensamblaje, puede ser bastante difícil. Y en este momento no conozco a nadie, que sigue siendo un verdadero revuelo en la arquitectura moderna de Intel. La mayoría de la gente pudo, bueno, hace 20 o 30 años. Esas son todas las cosas de 32 bits que encontrarás en la web.

Cada exploit que encuentro está compilado -m32, ¿adivina qué? Todo copiar y pegar cosas. El código real se ha vuelto raro. Y con ese codificador real. Y con eso algunos manuales de trabajo y documentación. Estamos de vuelta a la piratería real en ese campo.

Hackers reales, solo hay muy pocos alrededor. La mayoría se han vuelto grises.

Entonces, antes de que realmente puedas cosechar el poder de la asamblea, tienes que morderte a través de esta pared de arroz alrededor de la tierra donde está la leche y la miel. Pero después de que hayas hecho eso, las cosas se volverán mucho más fáciles.

Especialmente porque puedes simplemente aplicar ingeniería inversa a las cosas que hacen toda la diversión, eso no está documentado pero funciona. Y eso, naturalmente, se ejecutará en ensamblaje y no en C. No hay C en el bytecode. Bueno, hay una C pero esa es la letra. No es el idioma. 😀

Para tiempo real difícil, donde necesita nano segundos resultados deterministas, el ensamblaje es la única opción. En realidad, puede calcular el costo en nano segundos para cada ruta de ejecución. Antes de las arquitecturas modernas de CPU esto era muy común. En parte porque las CPU eran tan lentas que no podía ahorrar muchos ciclos, pero también que no había una tubería para vaciar y hacer que el conteo fuera difícil de manejar. Hay microcontroladores modernos que están diseñados para ser utilizados de esta manera (la PRU en la línea TI ARM viene a la mente).

La mayoría de los problemas no requieren esto y los desarrolladores ya no lo hacen. Una, porque la CPU puede ser muchas veces más rápida de lo que requiere el problema. En ese caso, el determinismo se alcanza casi por la fuerza bruta. Dos, los modernos diseños en canalización y los núcleos múltiples hacen que los tiempos de ejecución deterministas sean difíciles o imposibles. Los retrasos en la memoria, los aciertos o fallos de la memoria caché y los flujos de tuberías funcionan como tiradas de dados para cambiar los tiempos. Tres, respuestas como esta se entregan a los periféricos más y más. En los dispositivos de chip para microcontroladores, FPGA, o incluso dispositivos de bus estándar, todos estos se pueden agregar fácilmente y solo el programa puede acceder a ellos.

En este moderno día de complejos tiempos de CPU para obtener un rendimiento realmente rápido, el ensamblaje comienza a desaparecer. Hemos descargado el tiempo crítico, trabajo determinista. Los compiladores hacen un buen trabajo y, a menudo, es más fácil obtener un poco más de rendimiento a través del hardware que la optimización. El ensamblaje todavía se usa cuando una característica no puede ser utilizada eficazmente por un compilador, como los comandos SIMD, pero incluso eso se está haciendo más raro. A medida que la CPU se simplifica y la RAM es más pequeña, el ensamblaje suele ser más fácil de usar que una gran cadena de herramientas compiladas, pero ahora lanzamos ARM sopladas a los lugares más pequeños, por lo que también es menos común. Es probable que necesite escribir el ensamblaje para el procesador en una tarjeta microSD, pero ¿cuánto tiempo más encaja?

El ensamblaje no desaparecerá, pero el requisito para usarlo en otros idiomas se ha reducido a un pequeño dominio.

Muy a menudo no (por lo que debería preferir la codificación en C sobre la codificación del código del ensamblador escrito a mano). Una posible excepción podría ser escribir un código de ensamblador corto para un pequeño microcontrolador de 8 bits integrado (dentro de algún gadget no esencial para el consumidor) con menos de 2 o 4 Kinstructions en la ROM y menos de 1 Kbyte de RAM.

Para la mayoría de los sistemas en tiempo real (y ciertamente para todos los microcontroladores de 32 bits), un buen compilador C [cruzado] (como el GCC reciente o Clang / LLVM) con optimizaciones habilitadas producirá un mejor código de máquina del que realmente puede escribir en un ensamblaje escrito a mano. Sin embargo, quizás pueda codificar algunas instrucciones en asm (probablemente al usar sentencias asm extendidas dentro de su código C, por ejemplo, dentro de algunas funciones de C)

Por cierto, para el software de tiempo real integrado crítico (que siempre es muy costoso de desarrollar), también podría considerar analizarlo con analizadores de código fuente estáticos como Frama-C. Luego, agregará algunas anotaciones ACSL en su código para ayudar a la herramienta Frama-C a probar o analizar su fuente de C.

Y para el tiempo real difícil, probablemente necesitará usar algunos analizadores de código estático (por ejemplo, aiT de Absint) para calcular el WCET.

Tenga en cuenta que la programación en tiempo real es difícil, y la programación crítica en tiempo real integrada es muy difícil y cuesta mucho (y en esos casos usted tiene regulaciones como DO-178C, etc.).

Tenga en cuenta que el tiempo real no significa mucho. Programar el Arduino en tiempo real que conduce mi árbol de Navidad (donde los insectos no son molestos) no es lo mismo que programar un corazón artificial o un misil de crucero …

Definitivamente no

Usando el extremo C de C ++, es muy fácil escribir código IO de bits trenzados. La mayoría de los compiladores integrados tienen extensiones para codificar interrupciones y usar bits, etc.

En este caso el montaje no da ninguna ventaja.

Y siempre es más fácil leer y mantener un código de nivel superior

Por lo general, la respuesta es sí, ya que la mayoría de los lenguajes de alto nivel rechazarán su respuesta. Tal vez podría doblar ciertos idiomas de alto nivel a su voluntad en esta situación, pero a menudo pierde más de lo que gana. La productividad disminuye mucho al centrarse en las herramientas en lugar de eliminar los hitos del proyecto.

Desde mi experiencia, sí. Aunque en el pasado, la eficiencia del compilador para generar código para funcionar en tiempo real ha sido severamente probada. Sospecho que en el mundo de hoy con la velocidad actual del procesador, la demanda absoluta de código eficiente ha disminuido un poco, los principales ejemplos son los sistemas operativos actuales que trascienden el término ‘bloatware’ en mundos completamente nuevos de complejidad totalmente innecesaria, que solo son llevados por procesadores muy rápidos.

No es más fácil en absoluto.

Puede ser extremadamente eficiente en tiempo de ejecución.

¿Cómo tiene las mismas herramientas en lenguaje ensamblador que tiene en alto nivel? Hilos de unión, mecanismos de exclusión, recursos de bloqueo-desbloqueo … ¿O necesita implementarlos como macros?