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.