Atualmente, o C é considerado um idioma de baixo nível , mas nos anos 70 era 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 se e como a natureza do nível baixo mudou ao longo dos anos.
programming-languages
c
history
joeyfb
fonte
fonte
Respostas:
Para responder aos aspectos históricos da pergunta:
A filosofia do design é explicada na linguagem de programação C, escrita por Brian Kernighan e pelo designer C Dennis Ritchie, o "K&R" de que você já deve ter ouvido falar. O prefácio da primeira edição diz
e a introdução diz
A lista continua por um tempo antes que o texto continue:
(Só tenho a segunda edição de 1988, mas o comentário abaixo indica que o texto citado é o mesmo da primeira edição de 1978).
Então, sim, os termos "alto nível" e "baixo nível" estavam em uso na época, mas C foi projetado para se encaixar em algum lugar do espectro no meio. Era possível escrever código em C que fosse portátil em plataformas de hardware, e esse era o principal critério para saber se um idioma era considerado de alto nível na época. No entanto, C carecia de alguns recursos característicos de linguagens de alto nível, e essa foi uma decisão de design em favor da simplicidade.
fonte
Isso depende da sua definição de linguagem de alto e baixo nível. Quando C foi desenvolvido, qualquer coisa de nível superior ao assembly era considerada uma linguagem de alto nível. Essa é uma barra baixa para limpar. Mais tarde, essa terminologia mudou a tal ponto que hoje em dia alguns consideram até o Java uma linguagem de baixo nível.
Mesmo no cenário linguístico de alto nível dos anos 70, vale ressaltar que C é um nível bastante baixo. A linguagem C é basicamente B mais um sistema de tipos simples, e B não é muito mais que uma camada de sintaxe processual / estruturada conveniente para montagem. Como o sistema de tipos é um ajuste retroativo no idioma B não digitado, você ainda pode deixar anotações de tipo em alguns lugares e
int
será assumido.C conscientemente deixa de fora caros ou difíceis de implementar recursos que já estavam bem estabelecidos na época, como
C tem alguns recursos interessantes:
No momento em que o 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 eram amplamente utilizadas para domínios de problemas específicos. 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 destes (alguns dialetos ALGOL, PL / I, Pascal) também foram projetados para programação de baixo nível, mas eles tendiam a ter compiladores mais complexos ou eram muito seguros (por exemplo, nenhum ponteiro irrestrito). Pascal não possui um bom suporte para matrizes de comprimento variável.
Comparado a esses idiomas, o C rejeita recursos "elegantes" e caros, a fim de 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, era uma ramificação do desenvolvimento do kernel do Unix no minicomputador PDP-11 que era comparativamente limitado por recursos. Por seu nicho (uma linguagem minimalista de baixo nível para escrever o Unix com um compilador de passagem única que é fácil de portar) C se destacou absolutamente - e mais de 45 anos depois ainda é a língua franca da programação de sistemas.
fonte
%r10
como o "ponteiro de cadeia estática", que é exatamente o que você está falando. Para C, é apenas mais um registro de rascunho, mas acho que Pascal o usaria. (Funções aninhadas GNU C usá-lo para passar um ponteiro para o escopo externo quando tal função não inline (por exemplo, se você fizer um ponteiro de função a ele para que o compilador cria um trampolim de código de máquina na pilha): A aceitabilidade da regulares uso de R10 e R11 )a = b;
para copiar uma estrutura inteira da maneira que você pode na ISO C89. Portanto, no início do C, os tipos definidos pelo usuário eram definitivamente de segunda classe e só podiam ser passados por referência como função args. Aversão de C a matrizes e também Por que o C ++ suporta a atribuição de matrizes por membros dentro de estruturas, mas geralmente não?No início da década de 1970, C era uma deslumbrante lufada de ar fresco, usando construções modernas tão efetivamente que todo o sistema UNIX podia ser reescrito da linguagem assembly para C, com pouco espaço 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 cautelosos e, no artigo do Jornal Técnico do Sistema Bell, "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 entre seus objetivos de projeto para C era manter o idioma próximo à máquina e ainda fornecer portabilidade, ou seja, independência da máquina.
Para mais informações, consulte o artigo original do BSTJ:
Obrigado Dennis. Que você descanse em paz.
fonte
Como escrevi em outro lugar deste site, quando alguém se referia ao padrão de gerenciamento de memória malloc / free como "programação de baixo nível"
Por um contexto, isso foi no início dos anos 90, bem após o lançamento de C.
fonte
malloc()
chamar diretamentebrk(2)
oummap(2)
gerenciar a memória resultante. É uma PITA enorme, sem nenhum benefício concebível (a menos que você esteja implementando algo semelhante ao malloc), mas você pode fazê-lo.Muitas respostas já se referiram a artigos anteriores que diziam coisas como "C não é uma linguagem de alto nível".
Porém, não resisto a acumular: muitas, senão a maioria ou todas as HLLs da época - Algol, Algol-60, PL / 1, Pascal - forneceram verificação de limites de matriz e detecção numérica de estouro.
A última vez que verifiquei o estouro de buffer e número inteiro foi a causa raiz de muitas vulnerabilidades de segurança. ... Sim, ainda é o caso ...
A situação do gerenciamento dinâmico de memória era mais complicada, mas ainda assim, o malloc / free no estilo C foi um grande retrocesso em termos de segurança.
Portanto, se sua definição de HLL inclui “automaticamente impede muitos bugs de baixo nível”, bem, o triste estado de segurança cibernética seria muito diferente, provavelmente melhor, se C e UNIX não tivessem acontecido.
fonte
popcnt
.Considere idiomas mais antigos e muito mais altos que antecederam C (1972):
Fortran - 1957 (nível não muito mais alto que C)
Lisp - 1958
Cobol - 1959
Fortran IV - 1961 (nível não muito mais alto que C)
PL / 1-1964
APL - 1966
Além disso, uma linguagem de nível médio como o RPG (1959), principalmente uma linguagem de programação para substituir os sistemas de registro de unidades baseados em painéis.
Nessa perspectiva, C parecia uma linguagem de nível muito baixo, apenas um pouco acima dos montadores de macros usados nos mainframes da época. No caso dos mainframes da IBM, as macros do assembler eram usadas para acesso ao banco de dados, como BDAM (método básico de acesso ao disco), já que as interfaces do banco de dados não tinham sido portadas para Cobol (na época), resultando em um legado de uma mistura de montagem e montagem. Programas Cobol ainda em uso hoje em mainframes IBM.
fonte
A resposta para sua pergunta depende de qual idioma C está sendo perguntado.
A linguagem descrita no Manual de Referência C de Dennis Ritchie, em 1974, era uma linguagem de baixo nível que oferecia algumas das conveniências de programação de linguagens de nível superior. 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 na programação de máquinas reais, mas descreveu uma linguagem de nível superior que poderia ser - mas não era necessário - implementado em termos de nível inferior.
Como observam os autores da Norma C, uma das coisas que tornou a linguagem útil foi o fato de muitas implementações poderem 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 as linguagens de alto nível não podiam fazer, os autores do Padrão permitiram que as implementações se comportassem de maneira arbitrária. se os programas tentassem usar construções de baixo nível. Conseqüentemente, a linguagem descrita pelo Padrão C nunca foi uma linguagem de programação de baixo nível.
Para entender essa distinção, considere como o Ritchie's Language e o C89 visualizariam o trecho de código:
em uma plataforma em que "char" é 8 bits, "int" é big-endian de 16 bits, "float" é de 32 bits e as estruturas não têm requisitos especiais de preenchimento ou alinhamento, portanto o tamanho de "struct foo" é de 8 bytes.
No idioma de Ritchie, o comportamento da última instrução pegaria o endereço armazenado em "p", acrescentaria 3 * 8 + 2 [ie 26] bytes a ele e buscaria um valor de 16 bits nos bytes naquele endereço e no próximo , adicione um a esse valor e, em seguida, escreva de volta esse valor de 16 bits nos mesmos dois bytes. O comportamento seria definido como ação nos bytes 26 e 27 após o endereço p, sem levar em consideração o tipo de objeto armazenado lá.
Na linguagem definida pelo Padrão C, no caso de * p identificar um elemento de uma "estrutura foo []" que é seguida por pelo menos três elementos mais completos desse tipo, a última instrução adicionaria um ao membro y de o terceiro elemento após * p. O comportamento não seria definido pela Norma em nenhuma outra circunstância.
A linguagem de Ritchie era uma linguagem de programação de baixo nível porque, embora permitisse ao programador usar abstrações como matrizes e estruturas quando conveniente, definia o comportamento em termos do layout subjacente dos objetos na memória. Por outro lado, a linguagem descrita pelos padrões C89 e posteriores 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 de maneira útil em mais casos do que as exigidas pela Norma, mas não há documento "oficial" especificando o que uma implementação deve fazer para ser adequada a esses 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 Comitê de Padrões C, 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 da Norma.
fonte