¿Por qué algunos programadores clasifican C, Python, C ++ de manera diferente? - con respecto al nivel


16

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.


1
Como muchas cosas, el nivel alto vs. bajo es una simplificación: útil para comprender, pero potencialmente engañoso si olvida que es una simplificación. Qué nivel es ciertamente relativo, como han dicho otros. Pero no es necesariamente una línea: hay diferentes direcciones en las que puede abstraer (por ejemplo, diferentes paradigmas). El hecho de que se esté alejando de la abstracción de la máquina no significa necesariamente que se esté moviendo hacia una abstracción adecuada para su aplicación.
Steve314

Incluso el punto de partida puede variar. Por ejemplo, IMO, el cálculo lambda es un nivel muy bajo de abstracción, bastante abstraído en la máquina, pero es una abstracción muy simple que sirve como punto de partida para que los lenguajes funcionales comiencen a construir abstracciones. En cualquier caso, el cálculo lambda probablemente no esté más cerca de la abstracción ideal para una aplicación en particular que el código de máquina.
Steve314

Respuestas:


31

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.


3
C ++ no es realmente un caso extraño, en mi opinión, es simplemente un lenguaje de nivel mixto. El nivel de abstracción que obtenga depende de las características que utilice.
Steve314

1
@ Steve314: Sí y no: normalmente la abstracción viene con la ocultación de información, es decir, un idioma o una biblioteca es como un cuadro negro que proporciona una interfaz, y nadie quiere saber qué hay dentro del cuadro negro. C ++ es un poco extraño en esto porque ofrece construcciones de alto nivel pero no impide que el programador acceda a su representación y las rompa. C ++ es el único lenguaje que conozco que no aísla diferentes capas de abstracción (pero tal vez hay otros lenguajes que no conozco).
Giorgio

1
@Giorgio - C ++ le permite ocultar cualquier detalle de implementación, por ejemplo, hacerlo parte de los elementos internos privados de una clase, por lo que la única forma oficial de usarlo es a través de la interfaz pública de esa clase. Por supuesto, puede romper las reglas y codificar su memoria todo lo que quiera, pero en la práctica puede hacerlo en cualquier lenguaje que admita el desarrollo de aplicaciones del mundo real.
Steve314

@Giorgio - Tome por ejemplo Haskell. "Inseguro" en ese caso tiende a significar no referencialmente transparente (como en unsafePerformIO). Hay IOReftipos, pero no hay equivalente de lo reinterpret_castque 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.
Steve314

@Giorgio: por supuesto, es posible que tenga dificultades para encontrar los valores que quiero corromper en la memoria, pero lo mismo puede aplicarse en C ++, dependiendo de qué tan bien los haya ocultado. Por ejemplo, podría usar un PIMPL . Si solo proporciono el código objeto y el encabezado de la biblioteca que comprende a qué apunta eso, el posible subversivo tiene que aplicar ingeniería inversa a ese código objeto para descubrir qué subvertir y cómo.
Steve314

8

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


5

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) newy delete(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.


Yo diría que alto nivel versus bajo nivel no es una escala, sino dos escalas separadas. El nivel bajo se relaciona con qué tan bien se relaciona un lenguaje con el comportamiento de la máquina, mientras que el nivel alto se relaciona con su capacidad de proporcionar una abstracción. C # es más un lenguaje de alto nivel que C99, pero también es más bajo que el lenguaje definido por el Estándar C, ya que el comportamiento de, por ejemplo, usar un puntero "int" para procesar valores "cortos" en una matriz dos a la vez el tiempo se define en C #, pero no en C99.
supercat

3

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.