programming machine low language high examples example code c programming-languages low-level

low - machine language



¿Qué tan bajo es C como lenguaje de "bajo nivel"? (12)

¿Qué tal register ? Una palabra clave en una declaración de variable local que le pide al compilador que la almacene en un registro de CPU, aunque puede ignorar su sugerencia.

Sin embargo, GNU C lo extiende hasta el punto en que puede especificar un registro en particular que le gustaría usar.

register int foo asm ("a5");

A menudo escuchamos que C es un lenguaje de bajo nivel, pero ¿qué tan bajo va? El nivel más bajo que conozco es la administración de memoria usando punteros. ¿Hay otros niveles que todavía tengo que descubrir? ¿Qué significa "cerca del hardware"? ¿Cómo "cerca del hardware" es C?


C es poco más que una envoltura procesal alrededor de ASM. Un buen programador de C, que sabe qué hay detrás de ese lenguaje, debería poder ver un fragmento de código y escribir el ASM en el que se compilaría el código. Esas instrucciones de ASM se pueden traducir 1: 1 a instrucciones de máquina binaria. Es casi un paso por encima del ensamblaje y, como tal, puede escribir un código C que CUALQUIER COSA sea capaz de hacer, PERO, al estar en un nivel tan bajo, es relativamente primitivo en términos de lo que debe ser específico. Por ejemplo, la memoria se trata como tal y no se abstrae en construcciones como el "montón". Crear un "nuevo" objeto en un lenguaje OO es tan simple como decirlo; el código C equivalente implicaría un malloc para la suma del tamaño de todos los miembros de ese objeto y los punteros a cada uno de los miembros del objeto dentro del bloque.


C se refiere a veces como "lenguaje ensamblador portátil". Esencialmente, cualquier cosa que pueda hacer en el ensamblaje, puede hacerlo en C (ya sea a través de las características integradas en el idioma o mediante el ensamblaje en línea).


El hecho de que hagas esta pregunta expresa tu ingenuidad con el tema. Simplemente no es tan simple.

Al final, C no tiene la flexibilidad completa de un lenguaje ensamblador, pero se acerca. Le faltan funciones como Tail Recursion

Pero para la mayoría de los propósitos, C hace todo lo que usted podría necesitar.


En la actualidad, C se usa en muchos casos como un "lenguaje ensamblador portátil" porque la semántica del lenguaje puede ser prácticamente una pequeña chapa por encima de la arquitectura de la máquina subyacente.

En el pasado, era bastante sencillo mirar las líneas del código C y tener una buena idea de cuál sería el lenguaje de máquina real que generaría el código C.

Cuando se toma en su totalidad junto con su entorno de desarrollo circundante, es sencillo tener un control perfecto sobre el diseño de la memoria de las estructuras de datos y la ubicación general de la memoria. Tenga en cuenta que este tipo de código C es, en su conjunto, no portátil, ya que se basa en los detalles de implementación del compilador que el estándar C permite para ser flexible y basado en la implementación. Pero en general, el código C en sí mismo puede ser MOSTAMENTE portátil. Este aspecto del lenguaje es lo que lo llevó a su popularidad en sistemas como Unix, ya que permite que la mayor parte del sistema operativo sea portátil en máquinas con la menor cantidad de aspectos específicos de implementación de una implementación, por ejemplo, en lenguaje ensamblador, como sea posible.

Hoy, con los compiladores modernos y sus optimizaciones, C puede ser menos literal. Lo que ve en el código C puede no traducirse literalmente a lo que obtiene en el ensamblaje debido a las optimizaciones reales realizadas por el compilador.

Un simple ejemplo artificial es algo como:

int func(int a, int b) { int c; int d; d = 10; return a * d; }

En un compilador simple, una implementación puede asignar 4 int en la pila, 2 para los argumentos y 2 para las variables de trabajo. Una optimización obvia es no asignar la variable ''c'' en absoluto, ya que no se utiliza. Otra optimización es ignorar ''d'' también, y simplemente usar la constante 10. E incluso un compilador más inteligente puede ver cómo se está utilizando esta función e incorporarla automáticamente en la función de llamada, eliminando completamente la llamada de subrutina.

Entonces, por un lado, puede ver el código y decir "así se verá en el ensamblaje", y así tratarlo como una envoltura de bajo nivel sobre el ensamblaje. Por otro lado, puede activar las optimizaciones de los compiladores modernos para que sean menos literales, manteniendo así la semántica de lo que está expresando en código, si no la implementación perfecta real.


La definición de ''bajo'' es un poco difícil, pero C admite una serie de llamadas al sistema, fotos y hasta mezclas de ensamblajes a través de extensiones.


La memoria que puede administrar en el SO de propósito general es generalmente una memoria virtual , por lo que generalmente todo es un fraude: sus punteros C no contienen las direcciones de memoria física, hay una capa más profunda que eso.

Para obtener más información, es necesario que programe la MMU , que no se realiza fácilmente en C, por lo general requiere un ensamblaje muy dependiente de la arquitectura y su código debería ejecutarse en alguna forma de mode privilegiado (como lo hace el núcleo del sistema operativo)

También puede haber varios otros co-processors o toda una gama de conjuntos de instrucciones que pueden ser difíciles de obtener directamente en C.


Lo principal que C oculta, en la medida en que oculta cualquier cosa en absoluto, es el control de flujo, en algunos casos extremos. Lo único que he escrito en ensamblaje que no se tradujo bien en C involucró saltar a un bloque de código en un punto arbitrario, hacer que se ejecute desde esa posición, verificar periódicamente una determinada condición de estado y al encontrar la necesidad, almacenar La ubicación del programa actual en algún lugar y salir. Luego, la próxima vez, salté de nuevo en la misma posición en la que salió el último bloque de código. Cooperativas coroutines, supongo que las llamarías.

La solución de C fue utilizar dos hilos separados, que se comunican a través de semáforos. Pero los hilos no son parte del lenguaje C en sí.


Lo que quiero decir con nivel bajo es lo que todos quieren decir cuando dicen que C es un lenguaje de bajo nivel. Si supiera que no tendría que hacer la pregunta. - ecounysis hace 27 segundos

Eso no es lo que parecía la pregunta en absoluto.

Si lo que quieres saber es qué significa "bajo nivel" cuando dicen que "wiki" tiene artículos que puedes leer.

http://en.wikipedia.org/wiki/Low-level_programming_language

http://en.wikipedia.org/wiki/High-level_programming_language

Cuando dicen que C es un lenguaje de bajo nivel, no están hablando de ningún grado. O bien un idioma es nivel superior o nivel bajo. Son dos tipos o categorías diferentes.


Necesitas definir qué quieres decir con nivel bajo para poder responder a esta pregunta.

C te permite hacer todo lo que podrías hacer con el ensamblaje, pero bueno, no todo. Si desea hacer algo extraño / particular / inusual, podría necesitar usar el ensamblaje, aunque para la mayoría (/ ¿todos?) Los propósitos reales C será más que suficiente, suponiendo que tenga un buen compilador para su hardware.

EDITAR : elaborando esto un poco más ...

C no le da ninguna garantía sobre la instrucción de ensamblaje en la que se compilará, y solo brinda algunas indicaciones parciales sobre los objetos que se asignarán en la memoria.

En general, si necesita tener cosas en la memoria de una manera particular, o si necesita ejecutar una secuencia particular de instrucciones de ensamblaje, probablemente tendrá que usar otro idioma (probablemente ensamblado directamente), de lo contrario, en general, C estar bien.

Por supuesto, podemos encontrar tantos casos especiales como queramos: si tiene algunas operaciones de ensamblaje especiales que le permiten realizar tareas de alto nivel , C probablemente no podrá explotarlas.

Se ha pensado que C reemplaza el ensamblaje en los procesadores normales (tal vez podría decir, de propósito general ), no será ideal en procesadores con un ensamblaje funcional nativo o en muchos otros contextos.

No puedes simplemente decir "¿qué nivel tiene C?", Debes hacer lo contrario: definir qué tipo de cosas de bajo nivel necesitas y luego ver si C es capaz de hacerlo.


Una persona que crea hardware (cpu, placa base, etc.) también proporciona su lenguaje de máquina (lenguaje ensamblador). Eso se convierte en el nivel más bajo en sí mismo. Luego, otra persona escribe un compilador para C que convierte la sintaxis C en lenguaje ensamblador nativo para ese hardware (corríjame si me equivoco). Con C puedes usar el ensamblaje, por lo tanto el nivel más bajo alcanzado !!


Utilice la terminología estándar. Idiomas de nivel superior e idiomas de nivel inferior.

Los lenguajes de alto nivel están diseñados para la facilidad de la persona que escribe el idioma.

Los idiomas de nivel inferior están diseñados para la facilidad de la computadora que ejecuta el idioma.

C es solo un paso adelante del lenguaje ensamblador, que es prácticamente una traducción humana del código de máquina. No hay nada más bajo que el código de la máquina, pero la gente no lee muy bien el hexadecimal, por lo que el ensamblaje se considera el lenguaje de programación de nivel más bajo.

La mayoría de las operaciones de C se pueden traducir a menos de diez instrucciones de la máquina. Algunos pueden traducirse en una sola instrucción de máquina (dependiendo de muchas circunstancias). En comparación, muchos lenguajes de alto nivel pueden requerir de docenas a miles de instrucciones de máquina para implementar una operación en particular.

El "nivel" de un lenguaje es principalmente un concepto abstracto. No es útil para mucho, excepto para comparar un idioma con otro en el contexto de tratar de entender si tendrá que escribir más código fuente en uno u otro, o si tendrá que saber más sobre la arquitectura de la máquina en un idioma en comparación con otros idiomas. a otro.