Estoy tomando un curso introductorio sobre python y el instructor dice que python es un lenguaje de alto nivel y C y C ++ son lenguajes de bajo nivel. Es solo confuso. Pensé que C, C ++, Python, Java, etc. eran todos lenguajes de alto nivel.
Estaba leyendo preguntas en stackoverflow en C, C ++, etc. y todos parecen referirse a esos lenguajes como de alto nivel. Me parece que algunos programadores usan esos términos indistintamente.
Respuestas:
Alto nivel y bajo nivel son términos relativos, por lo que el uso ha cambiado con el tiempo. En los años 70, UNIX hizo olas porque demostró que un sistema operativo podía escribirse principalmente en un lenguaje de alto nivel: C. En ese momento, C se consideraba de alto nivel en contraste con el ensamblador.
Hoy en día C se considera un lenguaje de bajo nivel porque ni el lenguaje ni las bibliotecas estándar proporcionan ninguna de las estructuras de datos generales como vectores, diccionarios, iteradores, etc. Puede tener todas esas estructuras en un programa C, pero terminará escribiéndolas usted mismo. Python, Java, etc. son de alto nivel en relación con C porque muchas de esas estructuras de datos estándar están integradas en el lenguaje o son parte de las bibliotecas estándar. Tenerlos listos para usar hace que sea más fácil programar en un nivel más abstracto.
C es de bajo nivel en un segundo sentido: permite la manipulación directa del hardware de la computadora (al menos tan directo como lo permita el sistema operativo). Las implementaciones más comunes de Python, Java, etc. se eliminan al menos un paso más del hardware porque se ejecutan en una VM. Si desea manipular el hardware de Python, tendrá que escribir una extensión en la máquina virtual de Python, generalmente en C o C ++.
C ++ es un caso extraño. Proporciona toneladas de estructuras de datos agradables como parte de la biblioteca estándar, pero también permite la manipulación de bajo nivel del hardware.
fuente
unsafePerformIO
). HayIORef
tipos, pero no hay equivalente de loreinterpret_cast
que sé, y no hay equivalente de aritmética de puntero. Pero eso no significa que esté a salvo de las personas que piratean la memoria. Para ser un lenguaje práctico, Haskell tiene que interactuar con los sistemas operativos y bibliotecas del mundo real. Tiene una "interfaz de funciones foráneas". Si realmente quiero subvertirlo, todo lo que necesito hacer es usar el FFI para escribir las funciones de subversión primitivas.Piense en esto en términos de una escala móvil, desde lenguajes de nivel BAJO hasta idiomas de nivel ALTO. A medida que un lenguaje sube de escala, de BAJO a ALTO, el lenguaje proporciona más y más abstracción de la interfaz específica con la computadora.
Los lenguajes de bajo nivel se escriben para dirigir explícitamente la computadora; piense en el código de máquina y el código de ensamblaje.
Los lenguajes de alto nivel intentan abstraer los detalles esenciales (particularmente la asignación de memoria y la liberación de memoria). La idea es proporcionar una interfaz más "natural" para la programación y, con suerte, permitir que el programador se centre en el diseño y la producción.
En estos días, C es considerado como un lenguaje de bajo nivel. Todavía tiene algunas abstracciones significativas del código de máquina y el código de ensamblaje, por lo que técnicamente es 'más alto' que estos. Sin embargo, aún proporciona direccionamiento directo de memoria y no proporciona recolección de basura. Entonces, estos son detalles que un programador debe diseñar.
Compare esto con otros lenguajes como Python, Ruby o Haskell y tendrá una interfaz mucho más oscura. Estos lenguajes tienen grandes bibliotecas de código que abstraen la mayor parte del comando de la computadora. ¿Alguna vez se preguntó qué le sucede a una variable en Python cuando abandona el ámbito local de una función o la elimina? Probablemente no tiene derecho? ¡Y eso es porque en un lenguaje de ALTO nivel no tienes que hacerlo! Se ocupan de la asignación / liberación de memoria por usted.
Los lenguajes de alto nivel tienen la ventaja de la función. Nos permiten diseñar y desarrollar libremente (¡y de forma segura!).
Los lenguajes de bajo nivel tienen la ventaja de la velocidad en la mayoría de los casos. Hay un costo para interpretar el código de alto nivel. Además, es genial escribir algo en 'computadora speek'.
Espero que esto ayude
fuente
Alto nivel versus bajo nivel no es una cosa en blanco y negro, sino una escala continua. Los términos se usan para describir qué tan cerca está un lenguaje de programación del hardware; cuanto mayor sea el nivel, más abstrae el hardware.
El nivel más bajo, obviamente, es el código binario de la máquina: es la representación exacta que el sistema operativo carga y alimenta a la CPU. El ensamblaje es el primer nivel de abstracción construido sobre él: en lugar de código binario, uno escribe mnemoics, códigos simbólicos legibles por humanos que representan instrucciones de máquina binarias. Esto es lo que la gente usaba para la programación de sistemas antes de UNIX.
C es el siguiente paso en la cadena de abstracción, agrupando patrones comunes en construcciones de control de flujo y abstrayendo instrucciones específicas de la máquina en sintaxis independiente de la plataforma, y estas últimas abstracciones fueron uno de los principales factores que hicieron que UNIX fuera revolucionario y altamente exitoso, porque significaba que se podía compilar el mismo código para cualquier plataforma sin ningún cambio importante.
C ++ agrega otra capa de abstracciones: agrega clases (abstrayendo vtables y el contexto pasando a una sintaxis OOP)
new
ydelete
(agrupando la asignación de memoria y la inicialización de variables en una sola construcción), verificación de tipo en tiempo de compilación, plantillas (tiempo de compilación seguro de tipo) metaprogramación), y un montón de conveniencias de sintaxis en tiempo de compilación como espacios de nombres, sobrecarga de funciones y operadores, etc.Python da otro gran paso lejos del hardware. C ++ todavía le da al programador un control total sobre la asignación de memoria y permite la manipulación directa de RAM; Python se encarga de la administración de la memoria por usted. Además, en lugar de compilar su código con instrucciones de máquina totalmente nativas, lo ejecuta en una máquina virtual; esto conlleva una penalización de rendimiento (que a veces puede ser considerable, pero generalmente no es algo de qué preocuparse), pero también permite cosas interesantes que serían complicadas en C ++ y terriblemente difíciles en C, como manipular funciones y clases en ejecución tiempo, obtener los nombres de objetos arbitrarios en tiempo de ejecución, instanciar clases por nombre en tiempo de ejecución, parches de mono, etc. etc.
Entonces, cuando las personas dividen los idiomas en "alto nivel" y "bajo nivel", dibujan una línea arbitraria en alguna parte, y esa línea no siempre es la misma. En 1970, la línea estaba entre el ensamblaje y C (abstrayendo las instrucciones de máquina específicas de la plataforma como factor decisivo); en 1987, pudo haber estado en algún lugar entre C y C ++; hoy, puede ser entre C ++ y Java (con la gestión automática de la memoria como factor decisivo).
Larga historia corta: el alto nivel es una escala móvil, y para los tres idiomas que mencionas es C <C ++ <Python.
fuente
La línea entre los idiomas de "bajo nivel" y de "alto nivel" cambia de vez en cuando.
Por ejemplo:
en los días de UNIX, C era un lenguaje de alto nivel.
Hoy C no tiene las estructuras como los tipos de mapeo (diccionarios), iteradores, etc. que tienen los lenguajes de alto nivel de hoy como Python. Entonces la línea ha cambiado, y C ahora ha caído en el grupo de bajo nivel.
Lenguajes de bajo nivel:
estos lenguajes están "cerca" de lo que la máquina puede ejecutar (el nivel más bajo es: ¡Código de ensamblaje!).
Al trabajar con estos lenguajes, el programador tiene que pensar en las cosas de nivel más bajo, como la administración de la memoria. En ese sentido, usted está cerca del hardware, tiene que trabajar directamente con él.
Idiomas de alto nivel:
estos idiomas lo alejan del hardware, ya que administran cosas como la memoria ellos mismos. Cuando trabajas con estos idiomas, la memoria es un factor (obviamente), pero no trabajas con el hardware directamente. En cambio, el lenguaje lo maneja, manteniéndote alejado (quizás más alto) de la interfaz de hardware inferior.
fuente