2012-07-23 15 views
6

Empecé a aprender a ensamblar recientemente y mientras miraba en internet veo cada vez más personas que dicen que ensamblar no es inútil, pero tampoco vale la pena programar cosas en un lenguaje que requiere tanto tiempo y esfuerzo en comparación con los idiomas de alto nivel. ¿La eficiencia entre un programa de lenguaje de alto nivel y uno de bajo nivel realmente no es lo suficientemente notable como para prestarle atención hoy en día, y hay otro lenguaje de bajo nivel como el ensamblaje que se usa más ampliamente?¿Es el ensamblaje el único lenguaje de programación de bajo nivel y, de no ser así, es el más utilizado?

+1

Parte de la pregunta que hace le pide algo que es más una opinión que una realidad. No importa si la velocidad extra (la gente ha estado diciendo que los compiladores son tan buenos que no se puede obtener velocidad adicional durante décadas, aún no es cierto) vale la pena el tiempo extra que se gasta en ella. La opinión popular dice que debe ser tan descuidado con el rendimiento como sea posible, y lo justifica con "La Ley de Moore lo acelerará la próxima década". – harold

+0

Realmente es muy difícil vencer a los compiladores actuales. También puede preguntarse, ¿quiere que pase muchas horas (a $ 100/hora) para optimizar el programa, o desea gastar sus $ 100 en más RAM y una CPU adicional? El hardware es barato, los buenos programadores son caros. –

+0

@BoPersson Usted gana $ 100 por hora? De todos modos, esa línea de razonamiento solo funciona para el software que solo vas a usar tú mismo. De lo contrario, un millón de personas tendría que gastar $ 100 en más RAM * o * simplemente compre el software de su competidor en lugar del suyo. – harold

Respuesta

10

es la eficiencia entre un programa de lenguaje de alto nivel y un mínimo de un nivel de realidad ni siquiera lo suficientemente perceptible para prestar atención a hoy en día

A menudo, los compiladores generan mucho mejor montaje de los desarrolladores pueden escribir . Hay ciertos desarrolladores que pueden vencer al compilador. Pero dado que la escritura de código de bajo nivel requiere más atención a los detalles y es más difícil de escribir y mantener, por lo general solo se implementan pequeñas piezas específicas de código en el ensamblaje para lograr mayor eficiencia. La diferencia puede ser notable. Pero también puede ser not-noticable si los desarrolladores hacen optimizaciones falsas.

Te recomiendo que leas Michael Abrash's Graphics Programming Black Book - tiene mucho en ensamble y optimizaciones + buenas historias de la vida real.

y hay otro lenguaje de bajo nivel como el ensamblado que se usa más ampliamente?

ensamblador es probablemente el nivel más bajo lenguaje de programación de aplicaciones. El único otro recurso sería escribir código binario a mano, pero los códigos de operación binarios difícilmente pueden llamarse "lenguaje".

Sin embargo, la programación va más allá del software. El hardware necesita ser programado, también. Hay lenguajes de descripción de hardware (HDL) que se pueden usar para programar hardware (es decir, puede crear su propia CPU). Los lenguajes HDL más populares son Verilog y VHDL.

+0

@kjh: De nada. Acabo de notar un precio ridículo por el libro en Amazon. También está disponible en línea gratis, aquí - http://www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/graphics-programming-black-book-r1698 –

7

El montaje de escritura fue apropiado en tiempos más simples. Cuando el generador de códigos en un compilador de C aún no era muy inteligente y era simple predecir el tiempo de ejecución del código de la máquina.

Hecho de más y más, un humano no puede vencer ni la inteligencia incorporada en un generador de códigos moderno ni su incansable atención a los detalles. El tipo de detalle requerido para saber exactamente cuándo se inserta una captación previa de caché para que los datos estén disponibles en el momento preciso. Y cómo las instrucciones de reordenamiento simplemente le dan la mejor escalabilidad. E insertando nops justo para que los objetivos de salto estén alineados. Y cómo desenrollar los lazos mecánicamente. Y cómo aprovechar el paralelismo automático proporcionado por SIMD. Etcétera Y para hacer esto no solo una vez, sino una y otra vez a medida que cambia el código.

3

compiladores de idiomas de nivel superior se vuelven más inteligentes cada día. En el pasado, los trucos de ensamblador podían aumentar mucho el rendimiento. Hoy en día, los compiladores implementan muchos de estos trucos.

ejemplos son: cambiando en lugar de dividir, manipulando el contador de programa en un salto de la tabla para un interruptor de encendido/caso, inlining funciones si sólo se utilizan una vez, etc.

Todavía hay espacio para optimización de su, pero la ganancia de rendimiento será tan baja que es mejor usar un lenguaje de nivel superior y para mantener el mantenimiento.

3

Bueno, "ensamblaje" es más una colección de diferentes variedades, en realidad. Depende de la arquitectura para la que estás programando. Por ejemplo, el ensamblaje para x86 podría (y será) muy diferente del ensamble para ARM, o MIPS, o cualquier arquitectura que se pueda imaginar. Esto se debe al hecho de que el ensamblaje es una traducción uno a uno del código binario que ejecuta el procesador. Como las diferentes arquitecturas tienen conjuntos de instrucciones diferentes, su lenguaje de ensamblaje también es diferente.

De hecho, el montaje es lo más bajo que puede hacer sin escribir código binario simple. Pero, no es un lenguaje específico, en lugar de un grupo de idiomas. Por lo tanto, si está hablando, por ejemplo, del ensamblaje x86, y lo compara con otro idioma de igual nivel bajo, encontrará que ese otro lenguaje también sería una variedad de ensamblaje. Por otra parte, sería para otra arquitectura, por lo que no sería muy útil también.

Cuestiones relacionadas