¿Se consideró el lenguaje de programación C como un lenguaje de bajo nivel cuando se publicó?

148

Actualmente C se considera una lenguaje de bajo nivel , pero en los años 70, ¿se consideraba de bajo nivel? ¿Era el término incluso en uso entonces?

Muchos idiomas populares de nivel superior no existían hasta mediados de los 80 y más, así que tengo curiosidad por saber cómo ha cambiado la naturaleza del nivel bajo con los años.

    
pregunta joeyfb 30.06.2018 - 17:45

7 respuestas

156

Esto depende de su definición de lenguaje de alto y bajo nivel. Cuando se desarrolló C, cualquier cosa que fuera de un nivel superior al ensamblaje se consideraba un lenguaje de alto nivel. Esa es una barra baja para despejar. Más tarde, esta terminología cambió al punto de que algunos en la actualidad consideran que incluso Java es un lenguaje de bajo nivel.

Incluso dentro del panorama lingüístico de alto nivel de los años 70, vale la pena señalar que C es un nivel bastante bajo. El lenguaje C es básicamente B más un sistema de tipo simple, y B no es mucho más que una práctica capa de sintaxis procesal / estructurada para el ensamblaje. Debido a que el sistema de tipo es un ajuste retroactivo en la parte superior del lenguaje B sin tipo, aún puede omitir las anotaciones de tipo en algunos lugares y se asumirá int .

C conscientemente excluye funciones caras o difíciles de implementar que ya estaban bien establecidas en el momento, como

  • gestión automática de memoria
  • funciones anidadas o cierres
  • OOP básica o coroutines
  • sistemas de tipos más expresivos (por ejemplo, tipos de rango restringido, tipos definidos por el usuario, como tipos de registro, escritura fuerte, ...)

C tiene algunas características interesantes:

  • compatibilidad con la recursión (como consecuencia de sus variables automáticas basadas en pila, en comparación con los idiomas en los que todas las variables tienen una vida útil global)
  • punteros de función
  • Los tipos de datos definidos por el usuario (estructuras y uniones) se implementaron poco después del lanzamiento inicial de C.
  • La representación de cadena de C (puntero a caracteres) es en realidad una gran mejora con respecto a B, que codifica varias letras en una sola palabra de máquina.
  • Los archivos de encabezado de C fueron un truco de eficiencia para mantener pequeñas las unidades de compilación, pero también proporcionan un sistema de módulos simple.
  • Punteros no restringidos de estilo de ensamblaje y aritmética de punteros, en comparación con referencias más seguras. Los punteros son una característica inherentemente insegura pero también son muy útiles para la programación de bajo nivel.

En el momento en que se desarrolló C, otros lenguajes innovadores como COBOL, Lisp, ALGOL (en varios dialectos), PL / I, SNOBOL, Simula y Pascal ya se habían publicado y / o se usaban ampliamente para fines específicos. Dominios problemáticos. Pero la mayoría de esos lenguajes existentes estaban destinados a la programación de mainframe, o eran proyectos de investigación académica. P.ej. Cuando ALGOL-60 se diseñó por primera vez como un lenguaje de programación universal, la tecnología y la informática necesarias para su implementación aún no existían. Algunos de estos (algunos dialectos ALGOL, PL / I, Pascal) también estaban destinados a la programación de bajo nivel, pero solían tener compiladores más complejos o eran demasiado seguros (por ejemplo, sin punteros no restringidos). Pascal carece notablemente de un buen soporte para arreglos de longitud variable.

En comparación con esos idiomas, C rechaza las características "elegantes" y caras para que sea más práctico para el desarrollo de bajo nivel. C nunca fue principalmente un proyecto de investigación de diseño de lenguaje. En cambio, fue una rama del desarrollo del kernel Unix en la minicomputadora PDP-11 que estaba comparativamente limitada por los recursos. Por su nicho (un lenguaje minimalista de bajo nivel para escribir Unix con un compilador de una sola pasada que es fácil de portar) C fue absolutamente excelente, y más de 45 años después sigue siendo la lingua franca de la programación de sistemas.

    
respondido por el amon 30.06.2018 - 18:18
142

Para responder a los aspectos históricos de la pregunta:

La filosofía de diseño se explica en The C Programming Language , escrito por Brian Kernighan y el diseñador de C Dennis Ritchie, el "K & R" que hayas escuchado. El prefacio a la primera edición dice

  

C no es un lenguaje de "muy alto nivel", ni uno "grande" ...

y la introducción dice

  

C es un lenguaje relativamente de "bajo nivel" ... C no proporciona operaciones para tratar directamente con objetos compuestos, como cadenas de caracteres, conjuntos, listas o matrices. No hay operaciones que manipulen una matriz o cadena completa ...

La lista continúa por un tiempo antes de que el texto continúe:

  

Aunque la ausencia de algunas de estas características puede parecer una deficiencia grave, ... mantener el lenguaje a un tamaño modesto tiene beneficios reales.

(Solo tengo la segunda edición de 1988, pero el comentario a continuación indica que el texto citado es el mismo en la primera edición de 1978).

Entonces, sí, los términos "alto nivel" y "bajo nivel" estaban en uso en ese entonces, pero C estaba diseñado para ubicarse en algún punto del espectro intermedio. Era posible escribir código en C que fuera portátil a través de plataformas de hardware, y ese era el criterio principal para determinar si un idioma era considerado de alto nivel en ese momento. Sin embargo, C carecía de algunas características que eran características de los lenguajes de alto nivel, y esta fue una decisión de diseño a favor de la simplicidad.

    
respondido por el gatkin 30.06.2018 - 22:38
36

A comienzos de la década de 1970, C era un soplo de aire fresco deslumbrante que usaba construcciones modernas con tanta eficacia que todo el sistema UNIX podía reescribirse desde el lenguaje ensamblador a C con un espacio insignificante o una penalización de rendimiento. En ese momento, muchos contemporáneos se referían a él como un lenguaje de alto nivel.

Los autores de C, principalmente Dennis Ritchie, eran más circunspectos y en el El artículo de Bell System Technical Journal decía "C no es un lenguaje de muy alto nivel". Con una sonrisa irónica y con la intención de ser provocativa, Dennis Ritchie diría que era un lenguaje de bajo nivel. El principal de sus objetivos de diseño para C era mantener el lenguaje cerca de la máquina y proporcionar portabilidad, es decir, independencia de la máquina.

Para obtener más información, consulte el artículo original de BSTJ:

Gracias Dennis. Que descanses en paz.

    
respondido por el bud wonsiewicz 30.06.2018 - 21:56
21

Como escribí en otra parte de este sitio cuando alguien se refirió al patrón de gestión de memoria libre / malloc como "programación de bajo nivel"

  

Es curioso cómo la definición de "bajo nivel" cambia con el tiempo. Al principio, cuando estaba aprendiendo a programar, cualquier lenguaje que proporcionara un modelo de pila estandarizado que hiciera posible un patrón simple de asignación / libre se consideraba de alto nivel. En programación de bajo nivel, usted tendría que realizar un seguimiento de la memoria (¡no de las asignaciones, sino de las ubicaciones de la memoria!), O escribir su propio asignador de pila si se sentía realmente elegante .

Para el contexto, esto fue a principios de los 90, mucho después de que saliera C

.     
respondido por el Mason Wheeler 30.06.2018 - 17:49
15

Muchas respuestas ya se han referido a artículos anteriores que decían que "C no es un lenguaje de alto nivel".

Sin embargo, no puedo resistir la acumulación: muchos, si no la mayoría o todos los HLL en ese momento (Algol, Algol-60, PL / 1, Pascal) proporcionaron la verificación de los límites de la matriz y la detección de desbordamiento numérico.

La última vez que revisé el búfer y los desbordamientos de enteros fueron la causa raíz de muchas vulnerabilidades de seguridad. ... Sí, sigue siendo el caso ...

La situación para la administración dinámica de la memoria era más complicada, pero aún así, el estilo malloc / free de C fue un gran paso hacia atrás en términos de seguridad.

Entonces, si su definición de HLL incluye "evita automáticamente muchos errores de bajo nivel", bueno, el lamentable estado de la ciberseguridad sería muy diferente, probablemente mejor, si C y UNIX no hubieran sucedido.

    
respondido por el Krazy Glew 01.07.2018 - 17:01
8

Considere los lenguajes más antiguos y mucho más altos que preceden a C (1972):

Fortran - 1957 (no mucho más alto que C)

Lisp - 1958

Cobol - 1959

Fortran IV - 1961 (nivel no mucho más alto que C)

PL / 1 - 1964

APL - 1966

Más un lenguaje de nivel medio como RPG (1959), en su mayoría un lenguaje de programación para reemplazar los sistemas de registro de unidades de tablero de mandos.

Desde esta perspectiva, C parecía un lenguaje de muy bajo nivel, solo un poco por encima de los macro ensambladores utilizados en los mainframes en ese momento. En el caso de los mainframes de IBM, las macros del ensamblador se usaron para el acceso a la base de datos como BDAM (método de acceso a disco básico), ya que las interfaces de la base de datos no se habían portado a Cobol (en ese momento), lo que resultó en una herencia de una combinación de ensamblaje y Los programas de Cobol todavía están en uso hoy en los mainframes de IBM.

    
respondido por el rcgldr 02.07.2018 - 18:53
6

La respuesta a su pregunta depende de qué lenguaje C se está preguntando.

El lenguaje descrito en el Manual de referencia C de Dennis Ritchie de 1974 era un lenguaje de bajo nivel que ofrecía algo de la conveniencia de programación de los lenguajes de alto nivel. Los dialectos derivados de ese lenguaje también tendían a ser lenguajes de programación de bajo nivel.

Sin embargo, cuando se publicó el Estándar C 1989/1990, no describía el lenguaje de bajo nivel que se había hecho popular para programar máquinas reales, sino que describía un lenguaje de nivel superior que podía ser, pero no era obligatorio para ser implementado en términos de nivel inferior.

Como señalan los autores del Estándar C, una de las cosas que hizo el lenguaje útil fue que muchas implementaciones podrían tratarse como ensambladores de alto nivel. Debido a que C también se usó como alternativa a otros lenguajes de alto nivel, y como muchas aplicaciones no requerían la capacidad de hacer cosas que los lenguajes de alto nivel no podían hacer, los autores del Estándar permitieron que las implementaciones se comportaran de manera arbitraria Si los programas intentaron usar construcciones de bajo nivel. En consecuencia, el lenguaje descrito por el estándar C nunca ha sido un lenguaje de programación de bajo nivel.

Para comprender esta distinción, considere cómo Ritchie's Language y C89 verían el fragmento de código:

struct foo { int x,y; float z; } *p;
...
p[3].y+=1;

en una plataforma donde "char" es de 8 bits, "int" es de 16 bits big-endian, "float" es de 32 bits, y las estructuras no tienen ningún relleno especial o alineación requisitos para que el tamaño de "struct foo" sea de 8 bytes.

En el lenguaje de Ritchie, el comportamiento de la última declaración tomaría la dirección almacenada en "p", agregue 3 * 8 + 2 [es decir, 26] bytes a ella, y buscar un valor de 16 bits de los bytes en esa dirección y la siguiente, agregue uno a ese valor, y luego vuelva a escribir ese valor de 16 bits a los mismos dos bytes El comportamiento se definiría como actuar en los días 26 y 27. bytes que siguen a la dirección p sin tener en cuenta el tipo de el objeto fue almacenado allí.

En el idioma definido por el Estándar C, en el caso de que * p identifique un elemento de "struct foo []" al que le siguen al menos tres más elementos completos de ese tipo, la última declaración agregaría uno a miembro y del tercer elemento después de * p. El comportamiento no sería definido por el Estándar bajo cualquier otra circunstancia.

El lenguaje de Ritchie era un lenguaje de programación de bajo nivel porque, mientras que Permitió a un programador utilizar abstracciones como matrices y estructuras cuando conveniente, definió el comportamiento en términos del diseño subyacente de objetos en la memoria. Por el contrario, el lenguaje descrito por C89 y posteriores. estándares define las cosas en términos de una abstracción de nivel superior, y sólo define el comportamiento del código que es consistente con eso. Las implementaciones de calidad adecuadas para la programación de bajo nivel se comportarán de manera útil en más casos de los exigidos por la Norma, pero no hay un documento "oficial" que especifique qué debe hacer una implementación para ser adecuada para tales fines.

El lenguaje C inventado por Dennis Ritchie es, por lo tanto, un lenguaje de bajo nivel, y fue reconocido como tal. El lenguaje inventado por el Comité de Normas C, sin embargo, nunca ha sido un lenguaje de bajo nivel en ausencia de garantías proporcionadas por la implementación que van más allá de los mandatos de la Norma.

    
respondido por el supercat 02.07.2018 - 01:31

Lea otras preguntas en las etiquetas