¿Puede explicar la siguiente oración: “Ciertas partes del software deben escribirse en código ensamblador para un mayor control”.

Un ejemplo en el que no puede tener un control directo, incluso en un lenguaje de bajo nivel por encima del ensamblado, es el cambio de contexto en los procesos del sistema operativo o en los hilos del kernel (en realidad, puede encontrar muchos ejemplos interesantes si busca código de bajo nivel en los sistemas operativos ) De un vistazo, hay un proceso (el programador del sistema operativo / hipervisor) que se encarga de almacenar todo el estado del procesador (por ejemplo, registros de propósito especial y general) en la memoria de un proceso y restaurar un estado similar de un proceso diferente / hilo en el procesador (y luego, presionando “play”). Esto requiere la ejecución de instrucciones particulares que son específicas de ISA, es decir, específicas de la familia de procesadores en particular. También depende del estado que desee mantener igual después del cambio, por lo que puede haber algunos registros o estados que desee mantener compartidos. En cualquier caso, jugar con registros de CPU individuales requiere un nivel de control que está más allá de las capacidades de los lenguajes de programación regulares de alto nivel.

Por supuesto, aún puede ajustar una función de nivel superior (por ejemplo, C) alrededor de su código de ensamblaje y simplemente llamar a la función (y esto es casi siempre el caso en los núcleos del sistema operativo), e incluso entonces, puede ajustar una función de nivel aún más alto (por ejemplo, Matlab o Go o Haskell) alrededor del segundo y simplemente llame al de alto nivel. ¡Y puede compilar su código Haskell como un ejecutable y llamarlo desde un script de shell que se invoca a través de un intérprete interactivo nodejs implementado en C ++! Todo el campo de la informática se basa en esta idea de proporcionar niveles de abstracciones; lo que estoy tratando de decir es que el control es una declaración relativa con lenguajes de programación (y no un problema estricto de “lenguaje de ensamblaje versus lenguaje de alto nivel”). ), y para todas las “ciertas partes” de las soluciones de software hay idiomas que le brindan un “mayor control”.

Todas las respuestas dadas aquí son correctas, pero también pierden lo que me parece el punto principal, que es “¿con qué frecuencia esto importa?” La mayoría de los ejemplos dados están hablando de hardware especializado o cosas que se hicieron hace mucho tiempo. En general, los humanos no son buenos en lo que hacen las computadoras, y las computadoras no son buenas en lo que hacen los humanos. Escribir en ensamblador generalmente cuenta como “tratar de hacer algo en lo que las computadoras son buenas”. Los diseños modernos de CPU son bastante difíciles de optimizar a mano, y es mejor dejar que el compilador lo haga. El hecho de que pueda controlar qué registros se utilizan y cuándo, no significa que deba hacerlo. Los lenguajes JITTED (compilados justo a tiempo, es decir, compilados sobre la marcha en tiempo de ejecución) pueden ser aún más inteligentes en la optimización, ya que pueden elegir las optimizaciones que tienen más sentido en tiempo de ejecución, que es cómo los lenguajes como Java o C # pueden En ciertas circunstancias, superan a los lenguajes totalmente compilados como C / C ++.

Entonces, dado lo difícil que es escribir un ensamblaje más que cualquier otra cosa, y cuánto más difícil es comprender el comportamiento, preguntaría las razones detrás de una declaración como “Ciertas partes del software deben escribirse en código ensamblador para un mayor control”. De hecho, podría ser cierto, pero la cantidad de casos en los que disminuye cada año.

Hace mucho tiempo, solía escribir rutinas gráficas que escribían directamente en la memoria de video en lugar de llamar a funciones lentas del sistema de Windows. Esta era la única forma de obtener gráficos razonablemente rápidos para los juegos en ese entonces. Acceder a la memoria de video usando rutinas de ensamblaje agregó otro ligero aumento de velocidad porque evitó instrucciones ineficientes generadas por el compilador. Sin embargo, esto ya no es realmente un problema.

Una vez tuve un colega que tuvo que recurrir al ensamblaje para aprovechar al máximo una nueva arquitectura de procesador. La API que estaba disponible en ese momento no implementó todas las características de la arquitectura.

En el mundo de Arduino, es mucho más rápido hablar con los registros que usar las llamadas API de puerto IO. Esto se debe a que la API agrega un nivel de abstracción y seguridad que hace que su código sea portátil a múltiples dispositivos y lo ayuda a evitar hacer algo estúpido. Pero si sabe lo que está haciendo y necesita un control adicional, ir a un nivel bajo es la única forma de hacerlo.

Cuando dice “para un mayor control” no significa que el programa o la biblioteca puedan comportarse mal. Está más relacionado con el hardware.
A veces necesita un ensamblaje exacto para una CPU específica (o diferentes versiones para diferentes CPU). Con un compilador, no tiene ninguna garantía sobre qué código de ensamblador produciría. Si necesita dicha garantía, debe escribirla en conjunto.

Si no sabe cuándo necesitará esto, probablemente nunca lo necesite.

Algunos usos son:
– trucos de la CPU que en C son comportamientos indefinidos
– acceso a ciertos bloques de memoria (como la memoria de video)

Pero creo que cualquier código de ensamblador siempre se puede hacer en lenguaje C (si tiene bibliotecas básicas, por supuesto). El problema es que la versión C sería más lenta (pero más compatible)

Este mayor control depende de la tarea en cuestión.

El código de ensamblaje está más cerca del hardware, por lo que tendrá a su disposición algunos detalles específicos sobre cómo usar ciertos registros, la CPU, etc. Este control adicional puede ser más complejo de administrar, por lo que generalmente tiene un costo más alto.

La gente generalmente recurre al ensamblaje no para control sino para resons de rendimiento.

Los lenguajes de alto nivel no siempre realizan operaciones con el rendimiento más óptimo. Incrustar un código de ensamblaje en su Programa C puede optimizar una pieza específica de funcionalidad.

Ese es solo un ejemplo de cómo “pierde algo de control” al usar un lenguaje de alto nivel. No soy un programador de lenguaje ensamblador, pero sé que hay llamadas específicas para cada sistema que se pueden hacer con lenguaje ensamblador que no estaría disponible en el lenguaje de alto nivel que esté utilizando.

Tiempo y sincronización ajustada. Si tiene que crear algo que sea preciso para el ensamblaje del ciclo de la CPU, es la única forma de asegurar una sincronización precisa del ciclo. Si tuviera que escribir en C y compilar, es posible que pueda combinar con la fuente para obtener una solución de ensamblaje aceptable, pero si instala una actualización o parche en el compilador en el futuro, no sabe a qué se dirige. Llegar.

En algunos casos, los registros de hardware no serán de lectura / escritura. O leer es una operación destructiva, como hacer estallar un fifo. O el hardware solo aceptará escritura de palabras, aunque tenga campos que parecen tener un byte ancho. O puede acceder de manera confiable a operaciones de bucle rápido basadas en hardware u operaciones de vectores, lo que el compilador no hará. O puede acceder a instrucciones de propósito especial privadas para esta CPU. O bien, puede indicar a las operaciones de lectura y escritura que omitan la memoria caché o vacíen secciones de la memoria caché a la memoria.

Todo el software está escrito en abstracciones. Uno solo tiene que preguntarse cuántas abstracciones profundas. El propósito de cada capa de abstracción es simplificar alguna tarea. La compensación es el control. Uno renuncia al control de grano fino para mayor comodidad.

Cuando uno cede el control, limita su capacidad para optimizar el rendimiento. El lenguaje ensamblador deja de lado todas las abstracciones más básicas y se ocupa solo de las pocas operaciones que representan de cerca lo que la computadora realmente hace. Esto permite un mejor control. Esto generalmente es necesario solo cuando el rendimiento es absolutamente crítico.

Piense en un caso como un controlador de dispositivo para algo como una tarjeta de video.

No quiero las “cosas” que un lenguaje de nivel superior podría hacer para que me interpusiera. No quiero verificación de tipo, verificación de límites ni nada de eso.

ESTOS BITS DEBEN IR AQUÍ AHORA MISMO.

More Interesting

¿Cómo se mide el impacto en una organización OSS?

¿La simulación digital de sistemas físicos requiere un verdadero paralelismo en la informática y no una mera concurrencia?

Cómo identificar y calcular la cantidad de recursos necesarios para una tarea de desarrollo de software en particular

¿Por qué necesitamos pruebas de software? Si es necesario, ¿qué tipo de cosas debemos recordar durante las pruebas de software?

¿Cómo no ser un programador falso? ¿Qué camino se necesita para ser uno y cómo evito el síndrome del "programador falso"? ¿Cómo puedo mejorar, por ejemplo, si no provengo de un fondo de ingeniería de software puro?

¿Cuánto cuesta desarrollar un videojuego?

¿Qué tipo de empresas utilizan Java como su idioma principal en el desarrollo de software? Compañías como Dropbox y Quora trabajan con Python, mientras que otras como Facebook, usan C ++ y PHP.

¿Cuáles son los consejos para elegir una empresa de desarrollo de software?

¿Cuáles son algunas de las características clave que busca en una solución confiable de software de monitoreo de redes empresariales?

¿Cuál es el programa de computadora más interesante que has visto?

¿Se pueden almacenar varias imágenes en la misma columna para una base de datos MySQL?

Cómo crear un nuevo software yo mismo

Cómo hacer un tipo de funcionalidad de activación de base de datos en MongoDB

Cómo comenzar a escribir software como freelance

Al aprender un nuevo lenguaje de programación, ¿debo tener en cuenta una aplicación que quiero desarrollar o seguir el flujo del libro y luego trabajar en la aplicación?