# Lenguaje de bajo nivel

Un lenguaje de programación de características de bajo nivel o de primera generación es aquel en el que sus instrucciones ejercen un control directo sobre el hardware y están condicionados por la estructura física de las computadoras que lo soportan. El uso de la palabra bajo en su denominación no implica que el lenguaje sea menos potente que un lenguaje de alto nivel, sino que se refiere a la reducida abstracción entre el lenguaje y el hardware.

## Complejidad vs dificultad

Los lenguajes de bajo nivel tales como el lenguaje ensamblador pueden ser más difíciles de programar que los lenguajes de alto nivel debido a que están más íntimamente relacionados con las características técnicas del hardware. Además estos suelen carecer de abstracciones de mayor nivel. No es posible una abstracción fuera de lo estipulado para el conjunto del microcódigos del microprocesador de un ordenador. Por otro lado, es más fácilmente traducible a lenguaje de máquina, tarea que realiza esencialmente un compilador.
De menor a mayor nivel de abstracción respecto del hardware es posible clasificar los lenguajes de programación de la siguiente manera:
* Lenguaje de máquina: Está formado por los unos (1) y ceros (0) que ejecutará directamente la unidad central de procesamiento (CPU). Al visualizar este lenguaje en un editor de texto plano parecerá sin sentido (caracteres basura). Muchos de ellos serán caracteres no imprimibles. Estos ceros y unos representan literalmente instrucciones y datos a ser procesados.
* Lenguajes ensambladores (en inglés assembler): También denominados nemotécnicos o nemónicos, son un primer nivel de abstracción. No son ya programas ejecutables directamente por el ordenador, sino textos de código fuente inteligibles por humanos que necesitan de alguna herramienta (esencialmente un compilador) para su traducción a lenguaje de máquina que el CPU pueda ejecutar. Sus instrucciones suelen ser una denominación abreviada de la instrucción máquina que simbolizan, y tienen una correspondencia casi directa (uno a uno) a las instrucciones de máquina que representan. El código resultante de la compilación del lenguaje ensamblador genera un código de máquina binario ejecutable.
    Son instrucciones que ensamblan los grupos de conmutadores necesarios para expresar una mínima lógica aritmética. Están íntimamente vinculados al hardware. Algunas de estas instrucciones pueden ser por ejemplo MOV para mover un dato de un lugar a otro, o ADD para sumar dos valores. Por norma general están disponibles a nivel firmware, cmos o chip set. Estos lenguajes están orientados a procesos. Los procesos se componen de tareas. Contienen tantas instrucciones como la arquitectura del hardware así haya sido diseñada. La arquitectura CISC contiene muchas más instrucciones a este nivel, que la RISC.
*   * Por ejemplo: Assembler x86, JMP y MULT.
    Los otros lenguajes que completan la clasificación no serían ya lenguajes de bajo nivel.
* Lenguajes de medio nivel: Son aquellos que, basándose en los juegos de instrucciones disponibles (chip set), permiten el uso de funciones a nivel aritmético, pero a nivel lógico dependen de literales en ensamblador. Estos lenguajes están orientados a procedimientos. Los procedimientos se componen de procesos.
*   * Ejemplos: C, Basic. De mayor nivel pero aun así considerables de nivel medio: C++, Rust, Fortran, Cobol, Lisp,Go.

## Interacción máquina

En este tipo de lenguajes se trabaja a nivel de instrucciones, es decir, su programación es al más fino detalle, además, está completamente orientado a la máquina.
* Adaptación - Máxima entre programación y aprovechamiento del recurso de la máquina.
* Velocidad - Máxima al contar con un acceso directo a los recursos, sin capas intermedias.
* Portabilidad - Mínima por estar restringido a las especificaciones del fabricante.
* Abstracción - Mínima por depender completamente de la técnica del hardware.
* Uso - Requiere de la máxima atención y de una organización estructurada sobre la base de los planos del hardware y del objetivo del software.
* isomorfismo - Conceptualización de los datos de la información, que se complementaran.

## Primera generación

El lenguaje de programación de primera generación (por sus siglas en inglés: 1GL), es el lenguaje de código máquina. Es el único lenguaje que un microprocesador entiende de forma nativa. El lenguaje máquina al constar de unos y ceros, es de difícil lectura y gran probabilidad de equivocación al ingresarlo, por lo tanto es raro que una persona lo use directamente.
Las instrucciones en lenguaje máquina, constan de una o dos memorias de instrucción, y otras memorias con datos (ver artículo modos de direccionamiento)
Ejemplo, una instrucción en lenguaje máquina acorde al microprocesador Z80 :
| Índice de memoria | Binario | Hexadecimal | Significado |
| 0 | 10000111 | 87 | Agrega lo que esté en la siguiente memoria a la memoria acumulador |
| 1 | 01110111 | 77 | Dato. Número 119 en decimal y 77 en hexadecimal. |

## Segunda generación

El lenguaje de programación de segunda generación (por sus siglas en inglés: 2GL), es el lenguaje ensamblador. El avance respecto al anterior, es que en vez de llanos unos y ceros, se tienen mnemónicos ya escritos como un texto, y datos visibles a un lado del mnemónico. En este se requiere de un programa que traduzca los mnemónicos a lenguaje máquina.
Un programador de lenguaje ensamblador debe conocer la arquitectura del procesador (como por ejemplo las particularidades de sus registros o su conjunto de instrucciones).