2008-09-30 22 views
15

La sección web del proyecto (en las propiedades del proyecto en VS2008) tiene una lista de depuradores: ASP.NET, código nativo, servidor SQL. ¿Qué es el código nativo?¿Qué es el código nativo?

Respuesta

19

El código nativo es código máquina ejecutado directamente por la CPU. Esto está en contraste con .NET bytecode, que es interpretado por la máquina virtual .NET.

Un buen MSDN recibido: Debugging Native Code

+0

Entonces, estaba leyendo sobre XMLHttpRequest de JavaScript en la red de desarrolladores de Mozilla - [allí] (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest?redirectlocale=en-US&redirectslug=XMLHttpRequest) - allí es una advertencia para la función _onreadystatechange_ que dice _no usarlo con código nativo _... ¿Esto significa que hay situaciones donde JavaScript puede ser ejecutado directamente por una CPU, no a través de un navegador? Supongo que es una tontería, pero nunca imaginé que esto sucediera. Si es cierto, ¿alguien tiene algún ejemplo de tal situación? –

4

código nativo no se ejecuta en el Common Language Runtime (CLR). Un ejemplo sería una aplicación C++ no administrada.

+0

En este enlace: http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm El autor sugiere que el nativo El código es el que no se ejecuta en el CLR, pero se ejecuta directamente contra la máquina, por lo que la salida de JIT IL, que también se ejecuta directamente contra la máquina, también se puede considerar código nativo, pero también se gestiona eficazmente porque se ha ido a través del CLR – Davos

1

El código nativo es esencialmente datos en la memoria que el chip de procesamiento central en la computadora puede leer y ejecutar directamente. Piense en la succión de la CPU en los datos, y que los interruptores voltear datos a medida que pasa a través, cambiando las cosas de vez en cuando:

[ CPU ] ==================================== [ RAM ] 
    ^^^^^ 
    | | 

    LOAD _memoryAddress12, D1 ; tells the CPU to get data from slot 12 
           ; in RAM, and put it in register D1 inside the CPU 

    ^^^^^ 
    | | 

    ADD D1, 24     ; tells the CPU to do an internal calculation 

    ^^^^^ 
    | | 

    STORE R0, _memoryAddress23 ; tells the CPU to put the answer into slot 23 in ram 

Se puede pensar en las instrucciones como tarjetas perforadas, o aquellas cosas rollo de piano musicales, que flip cambia en la CPU a medida que avanzan. La parte importante es que esto está en HARDWARE: es literalmente que ocurre en cables/circuitos, casi a la velocidad de la luz. Pero hay son una gran cantidad de interruptores para voltear. Por lo tanto, cada una de esas "instrucciones nativas" que entran en la máquina se ejecuta a la "velocidad de reloj" de la máquina (alrededor de 2,5 mil millones de veces por segundo en una PC moderna). En realidad, es un poco más complejo, algunas instrucciones demoran un poco más, algunas se realizan al mismo tiempo, etc.

Ahora, en cambio, las máquinas virtuales ejecutan código no nativo (a menudo llamado bytecode), literalmente en una máquina falsa virtual. Cuando se trata de idiomas, una máquina virtual es un programa que ejecuta OTRO programa, en lugar del programa que se ejecuta directamente en el hardware. Por lo tanto, cuando los datos de carga de programas anteriores, se agrega a él, y almacena el resultado en sólo tres instrucciones nativas de un programa virtual podría hacer algo de la misma familia (Negación: esto es oxidado, código de pseudo-montaje):

load _firstInstruction, D1 
    if_equal D1, 12 
    jump _itsAnAddInstructionHandleIt 
    if_equal D1, 13 
    jump _itsASubstractInstructionHandleIt 
    if_equal D1, 14 
    jump _itsAMultiplyInstructionHandleIt 
    if_equal D1, 15 
    jump _itsADivideInstructionHandleIt 
    if_equal D1, 16 
    jump _itsALoadInstructionHandleIt 
    ... 

_itsALoadInstructionHandleIt: 
    load D1, D2 
    add 4, D2 
    load D2, D3 
    return 

Y así sucesivamente. Este es solo un ejemplo de cómo manejar ONE de las instrucciones nativas anteriores de forma no nativa: aproximadamente 10 instrucciones (dependiendo de la implementación) en lugar de la primera instrucción nativa, y omití detalles importantes, como datos de desempaquetado ! El punto es que, probablemente en un promedio de aproximadamente 20-30 instrucciones más adelante, habrá logrado lo mismo que UNA línea del código nativo anterior.

AHORA. Dicho todo esto, las BUENAS máquinas virtuales tienen un JIT, que puede convertir ALGUNOS de estos en código nativo a medida que se ejecutan o justo antes de ejecutarlos. Pero hay muchas cosas, como los tipos Boxed, que no se pueden convertir directamente, porque el objetivo de una máquina virtual es que no funcione en un modo de bajo nivel y sin circuitos, ese código nativo . Las máquinas virtuales son más fáciles de programar, pero mucho más lentas.

Otra gran desventaja de las máquinas virtuales es que a menudo tienen grandes gastos generales de memoria, lo que las hace bastante inútiles si desea codificar millones de elementos de datos, todo en la memoria al mismo tiempo. En momentos como ese, una máquina virtual, aunque destinada a hacer que el código sea de nivel superior y más legible, puede obligarlo a hacer cosas más desagradables y de nivel más bajo que el código nativo, porque los beneficios comienzan a ser inconvenientes.

0

Para los principiantes, el código nativo es solo un lenguaje intermedio diseñado para ejecutarse en un ensamblado en particular. Se asemeja al código objeto como en otros HLL.

Cuestiones relacionadas