A linguagem de programação C foi considerada uma linguagem de baixo nível quando foi lançada?

148

Atualmente C é considerado um linguagem de baixo nível , mas nos anos 70 foi considerado de baixo nível? O termo estava em uso então?

Muitas linguagens populares de nível superior não existiam até meados dos anos 80 e além, por isso estou curioso para saber se e como a natureza do baixo nível mudou ao longo dos anos.

    
por joeyfb 30.06.2018 / 17:45
fonte

7 respostas

156

Isso depende da sua definição de linguagem de alto nível e baixo nível. Quando o C foi desenvolvido, qualquer coisa que fosse de nível superior à montagem era considerada uma linguagem de alto nível. Essa é uma barra baixa para limpar. Mais tarde, essa terminologia mudou ao ponto de alguns considerarem que até mesmo o Java é uma linguagem de baixo nível.

Mesmo dentro do cenário de linguagem de alto nível dos anos 70, vale a pena ressaltar que C é um nível razoavelmente baixo. A linguagem C é basicamente B mais um sistema de tipos simples, e B não é muito mais do que uma camada de sintaxe procedural / estruturada conveniente para montagem. Como o sistema de tipos é um ajuste retro em cima da linguagem B não-digitada, você ainda pode deixar de fora as anotações de tipo em alguns lugares e int será assumido.

C conscientemente sai caro ou difícil de implementar recursos que já estavam bem estabelecidos no momento, como

  • gerenciamento automático de memória
  • funções aninhadas ou encerramentos
  • OOP básica ou coroutines
  • sistemas de tipos mais expressivos (por exemplo, tipos com restrição de intervalo, tipos definidos pelo usuário, como tipos de registro, digitação strong, etc.)

C tem algumas características interessantes:

  • suporte para recursão (como consequência de suas variáveis automáticas baseadas em pilha, em comparação com idiomas em que todas as variáveis têm tempo de vida global)
  • ponteiros de função
  • Tipos de dados definidos pelo usuário (estruturas e uniões) foram implementados logo após o lançamento inicial de C.
  • A representação de string de C (pointer-to-chars) é na verdade uma grande melhoria em relação a B, que codificava múltiplas letras em uma palavra de máquina.
  • Os arquivos de cabeçalho do
  • C foram um truque de eficiência para manter as unidades de compilação pequenas, mas também para fornecer um sistema de módulos simples.
  • Ponteiros irrestritos de estilo de montagem e aritmética de ponteiros, em comparação com referências mais seguras. Os ponteiros são um recurso intrinsecamente inseguro, mas também muito útil para programação de baixo nível.

Na época em que C foi desenvolvido, outras linguagens inovadoras como COBOL, Lisp, ALGOL (em vários dialetos), PL / I, SNOBOL, Simula e Pascal já haviam sido publicadas e / ou estavam em uso domínios problemáticos. Mas a maioria desses idiomas existentes era destinada à programação de mainframe, ou eram projetos de pesquisa acadêmica. Por exemplo. Quando o ALGOL-60 foi projetado pela primeira vez como uma linguagem de programação universal, a tecnologia e a ciência da computação necessárias para implementá-lo ainda não existiam. Alguns desses (alguns dialetos do ALGOL, PL / I, Pascal) também eram destinados a programação de baixo nível, mas eles tendiam a ter compiladores mais complexos ou eram muito seguros (por exemplo, sem ponteiros irrestritos). Pascal notavelmente não tem um bom suporte para matrizes de tamanho variável.

Em comparação com esses idiomas, o C rejeita recursos “elegantes” e caros para ser mais prático para o desenvolvimento de baixo nível. C nunca foi principalmente um projeto de pesquisa de design de linguagem. Em vez disso, foi um desdobramento do desenvolvimento do kernel Unix no minicomputador PDP-11, que era comparativamente limitado a recursos. Por seu nicho (uma linguagem minimalista de baixo nível para escrever Unix com um compilador single-pass que é fácil de portar) C absolutamente se destacou - e mais de 45 anos depois ainda é a lingua franca da programação de sistemas.

    
por 30.06.2018 / 18:18
fonte
142

Para responder aos aspectos históricos da questão:

A filosofia de design é explicada em A Linguagem de Programação em C escrita por Brian Kernighan e o designer C Dennis Ritchie, o "K & R" de que você pode ter ouvido falar. O prefácio da primeira edição diz

C is not a "very high level" language, nor a "big" one...

e a introdução diz

C is a relatively "low level" language... C provides no operations to deal directly with composite objects such as character strings, sets, lists, or arrays. There are no operations that manipulate an entire array or string...

A lista continua por um tempo antes que o texto continue:

Although the absence of some of these features may seem like a grave deficiency,... keeping the language down to modest size has real benefits.

(Eu só tenho a segunda edição de 1988, mas o comentário abaixo indica que o texto citado é o mesmo na primeira edição de 1978.)

Então, sim, os termos "alto nível" e "baixo nível" estavam em uso naquela época, mas o C foi projetado para se encaixar em algum ponto do espectro entre eles. Era possível escrever código em C que fosse portátil entre plataformas de hardware, e esse era o principal critério para se uma linguagem era considerada de alto nível na época. No entanto, C não tinha alguns recursos que eram característicos de linguagens de alto nível, e essa foi uma decisão de design em favor da simplicidade.

    
por 30.06.2018 / 22:38
fonte
36

No início dos anos 70, C era um ar deslumbrante de ar fresco usando construções modernas de forma tão eficaz que todo o sistema UNIX poderia ser reescrito da linguagem assembly em C com espaço desprezível ou penalidade de desempenho. Na época, muitos contemporâneos se referiam a ele como uma linguagem de alto nível.

Os autores de C, principalmente Dennis Ritchie, foram mais circunspectos e no O artigo do Bell System Technical Journal disse que "C não é uma linguagem de alto nível". Com um sorriso irônico e pretendendo ser provocativo, Dennis Ritchie diria que era uma linguagem de baixo nível. O principal de seus objetivos de design para o C era manter a linguagem próxima da máquina e ainda fornecer portabilidade, ou seja, a independência da máquina.

Para mais informações, consulte o artigo original do BSTJ:

Obrigado Dennis. Que você descanse em paz.

    
por 30.06.2018 / 21:56
fonte
21

Como escrevi outro lugar neste site quando alguém se referiu ao padrão de gerenciamento de memória malloc / livre como "programação de baixo nível",

Funny how the definition of "low-level" changes over time. When I was first learning to program, any language that provided a standardized heap model that makes a simple allocate/free pattern possible was considered high-level indeed. In low-level programming, you'd have to keep track of the memory yourself, (not the allocations, but the memory locations themselves!), or write your own heap allocator if you were feeling really fancy.

Para o contexto, isso foi no início dos anos 90, bem depois de C sair.

    
por 30.06.2018 / 17:49
fonte
15

Muitas respostas já se referiram aos primeiros artigos que diziam coisas como "C não é uma linguagem de alto nível".

Eu não posso resistir a acumular, no entanto: muitas, se não a maioria, ou todas as HLLs na época - Algol, Algol-60, PL / 1, Pascal - forneceram verificação de limites de array e detecção de estouro numérico.

Por último, verifiquei que os estouros de buffer e inteiro eram a causa raiz de muitas vulnerabilidades de segurança. ... Sim, ainda é o caso ...

A situação do gerenciamento de memória dinâmica foi mais complicada, mas ainda assim, o estilo C malloc / free foi um grande passo para trás em termos de segurança.

Então, se a sua definição de HLL incluir "automaticamente previne muitos bugs de baixo nível", bem, o estado lastimável de cibersegurança seria muito diferente, provavelmente melhor, se C e UNIX não tivessem acontecido.

    
por 01.07.2018 / 17:01
fonte
8

Considere idiomas mais antigos e muito mais antigos que antecederam C (1972):

Fortran - 1957 (nível não muito maior que C)

Lisp - 1958

Cobol - 1959

Fortran IV - 1961 (nível não muito maior que C)

PL / 1 - 1964

APL - 1966

Mais uma linguagem de nível médio como o RPG (1959), principalmente uma linguagem de programação para substituir os sistemas de registro de unidade baseados em plugboard.

Dessa perspectiva, C parecia uma linguagem de nível muito baixo, apenas um pouco acima dos montadores de macros usados em mainframes na época. No caso de mainframes IBM, as macros montadoras eram usadas para acesso ao banco de dados, como BDAM (método básico de acesso ao disco), já que as interfaces de banco de dados não tinham sido portadas para Cobol (naquele tempo) resultando em um legado de montagem e Programas Cobol ainda em uso atualmente nos mainframes da IBM.

    
por 02.07.2018 / 18:53
fonte
6

A resposta para sua pergunta depende de qual linguagem C ela está perguntando.

A linguagem descrita no Manual de Referência C de 1974 de Dennis Ritchie era uma linguagem de baixo nível que oferecia algumas das conveniências de programação de linguagens de alto nível. Os dialetos derivados dessa linguagem também tendiam a ser linguagens de programação de baixo nível.

Quando o Padrão C 1989/1990 foi publicado, no entanto, ele não descreveu a linguagem de baixo nível que se tornou popular para programar máquinas reais, mas descreveu uma linguagem de nível mais alto que poderia ser - mas não era necessária ser implementado em termos de nível inferior.

Como os autores do C Standard observam, uma das coisas que tornaram a linguagem útil foi que muitas implementações poderiam ser tratadas como montadoras de alto nível. Como o C também era usado como uma alternativa a outras linguagens de alto nível, e como muitos aplicativos não exigiam a capacidade de fazer coisas que linguagens de alto nível não podiam fazer, os autores do Padrão permitiam que as implementações se comportassem de maneira arbitrária. se os programas tentassem usar construções de baixo nível. Consequentemente, a linguagem descrita pelo C Standard nunca foi uma linguagem de programação de baixo nível.

Para entender essa distinção, considere como o Language e o C89 de Ritchie exibiriam o snippet de código:

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

em uma plataforma onde "char" é 8 bits, "int" é 16 bits big-endian, "float" é de 32 bits e as estruturas não têm preenchimento ou alinhamento especial requisitos de modo que o tamanho de "struct foo" é de 8 bytes.

Na linguagem de Ritchie, o comportamento da última declaração levaria o endereço armazenado em "p", adicione 3 * 8 + 2 [isto é 26] bytes para ele e buscar um valor de 16 bits dos bytes nesse endereço e o próximo, adicione um para esse valor e, em seguida, escrever de volta esse valor de 16 bits para os mesmos dois bytes. O comportamento seria definido como agindo nos dias 26 e 27 bytes após o que está no endereço p sem levar em conta que tipo de objeto foi armazenado lá.

Na linguagem definida pelo Padrão C, no caso em que * p identifica um elemento de um "struct foo []" que é seguido por pelo menos mais três elementos completos desse tipo, a última declaração adicionaria um ao membro y do terceiro elemento após * p. O comportamento não seria definido pelo Padrão sob quaisquer outras circunstâncias.

A linguagem de Ritchie era uma linguagem de programação de baixo nível porque, enquanto permitiu que um programador usasse abstrações como arrays e estruturas quando conveniente, definiu o comportamento em termos do layout subjacente objetos na memória. Em contraste, a linguagem descrita por C89 e mais tarde padrões define as coisas em termos de uma abstração de nível superior, e apenas define o comportamento do código que é consistente com isso. Implementações de qualidade adequadas para programação de baixo nível se comportarão utilmente em mais casos do que o exigido pela Norma, mas não há documento "oficial" especificando o que uma implementação deve fazer para ser adequada para tais propósitos.

A linguagem C inventada por Dennis Ritchie é, portanto, uma linguagem de baixo nível, e foi reconhecida como tal. A linguagem inventada pelo C Standards Committee, no entanto, nunca foi uma linguagem de baixo nível na ausência de garantias fornecidas pela implementação que vão além dos mandatos do Standard.

    
por 02.07.2018 / 01:31
fonte