Por que alguns programadores categorizam C, Python, C ++ de maneira diferente? - em relação ao nível

16

Estou fazendo um curso introdutório sobre python e o instrutor diz que python é uma linguagem de alto nível e C e C ++ são linguagens de baixo nível. É apenas confuso. Eu pensei que C, C ++, Python, Java, etc eram todas linguagens de alto nível.

Eu estava lendo perguntas no stackoverflow em C, C ++, etc, e todas elas parecem se referir a esses idiomas como de alto nível. Parece-me que alguns programadores usam esses termos de forma intercambiável.

ateísta
fonte
1
Como muitas coisas, alto versus baixo nível é uma simplificação - útil para a compreensão, mas potencialmente enganosa se você esquecer que é uma simplificação. Qual nível é certamente relativo, como outros já disseram. Mas não é necessariamente uma linha - há diferentes direções nas quais você pode abstrair (por exemplo, diferentes paradigmas). Só porque você está se afastando da abstração da máquina não significa necessariamente que você está se movendo para uma abstração apropriada para o seu aplicativo.
31313 Steve314
Até o ponto de partida pode variar. Por exemplo, na IMO, o cálculo lambda é um nível muito baixo de abstração - bastante abstraído na máquina, mas é uma abstração muito simples que serve como ponto de partida para as linguagens funcionais começarem a criar abstrações. Em qualquer caso, o cálculo lambda provavelmente não está mais próximo da abstração ideal para qualquer aplicação em particular do que o código da máquina.
31310 Steve1314

Respostas:

31

Nível alto e nível baixo são termos relativos, portanto, o uso mudou com o tempo. Nos anos 70, o UNIX fez ondas porque mostrou que um sistema operacional podia ser escrito principalmente em uma linguagem de alto nível: C. Na época, C era considerado de alto nível, em contraste com o assembler.

Atualmente, C é considerado uma linguagem de baixo nível, porque nem a linguagem nem as bibliotecas padrão fornecem nenhuma das estruturas de dados de pão e manteiga, como vetores, dicionários, iteradores e assim por diante. Você pode ter todas essas estruturas em um programa em C, mas você mesmo as escreverá. Python, Java etc. são de alto nível em relação a C, porque muitas dessas estruturas de dados padrão são incorporadas à linguagem ou fazem parte das bibliotecas padrão. Ter esses itens prontos para uso facilita a programação em um nível mais abstrato.

C é de baixo nível no 2º sentido: permite a manipulação direta do hardware do computador (pelo menos tão direta quanto o SO permitir). As implementações mais comuns de Python, Java etc. são pelo menos uma etapa a mais removidas do hardware porque são executadas em uma VM. Se você deseja manipular o hardware do Python, você terá que escrever uma extensão para a VM do Python, geralmente em C ou C ++.

C ++ é um caso estranho. Ele fornece toneladas de estruturas de dados interessantes como parte da biblioteca padrão, mas também permite a manipulação de baixo nível do hardware.

Charles E. Grant
fonte
3
C ++ não é realmente um caso tão estranho, IMO - é simplesmente uma linguagem de nível misto. O nível de abstração obtido depende de quais recursos você usa.
31510 Steve1314
1
@ Steve314: Sim e não: normalmente a abstração vem com ocultação de informações, ou seja, uma linguagem ou biblioteca é como uma caixa preta que fornece uma interface, e ninguém quer saber o que está dentro da caixa preta. C ++ é um pouco estranho nisso, porque oferece construções de nível superior, mas não impede que o programador acesse sua representação e as quebre. C ++ é a única linguagem que conheço que não isola diferentes camadas de abstração (mas talvez haja outras linguagens que não conheço).
Giorgio
1
@Giorgio - C ++ permite que você oculte qualquer detalhe de implementação - por exemplo, faça parte dos internos privados de uma classe, de modo que a única maneira oficial de usá-lo é através da interface pública dessa classe. É claro que você pode quebrar as regras e embaralhar sua memória o quanto quiser - mas, na prática, você pode fazer isso em qualquer idioma que suporte o desenvolvimento de aplicativos no mundo real.
precisa saber é o seguinte
@Giorgio - Tomemos, por exemplo, Haskell. "Inseguro" nesse caso tende a significar não-referencialmente-transparente (como em unsafePerformIO). Existem IOReftipos, mas não há equivalente de que reinterpret_casteu conheça e nem equivalente de aritmética de ponteiro. Mas isso não significa que é seguro para pessoas que andam com memória. Para ser uma linguagem prática, Haskell precisa fazer interface com sistemas operacionais e bibliotecas do mundo real. Possui uma "interface de função externa". Se realmente quero subvertê-lo, tudo o que preciso fazer é usar o FFI para escrever as funções primitivas de subversão.
21313 Steve314
@ Giorgio - É claro que posso ter dificuldade em encontrar os valores que quero corromper na memória, mas o mesmo pode se aplicar em C ++, dependendo de quão bem os ocultei. Por exemplo, eu posso usar um PIMPL . Se eu fornecer apenas o código e o cabeçalho do objeto para a biblioteca que entende o que isso aponta, o possível subversivo precisará fazer engenharia reversa desse código de objeto para descobrir o que subverter e como.
precisa saber é o seguinte
8

Pense nisso em termos de escala móvel, desde idiomas de baixo nível até idiomas de alto nível. À medida que uma linguagem sobe na escala, de BAIXA a ALTA, a linguagem fornece cada vez mais abstração da interface específica com o computador.

Linguagens de baixo nível são escritas para direcionar explicitamente o computador - pense no código de máquina e no código de montagem.

Linguagens de alto nível tentam abstrair os detalhes básicos (principalmente alocação de memória e liberação de memória). A idéia é fornecer uma interface mais "natural" para a programação e, esperamos, permitir que o programador se concentre no design e na produção.

Atualmente, C é considerado uma linguagem de baixo nível. Ele ainda possui algumas abstrações significativas do código de máquina e do código de montagem, por isso é tecnicamente "mais alto" que essas. No entanto, ele ainda fornece endereçamento de memória direto e não fornece coleta de lixo. Portanto, esses são detalhes para os quais um programador deve criar.

Compare isso com outras linguagens como Python, Ruby ou Haskell e você terá uma interface muito mais obscura. Essas linguagens têm grandes bibliotecas de código que abstraem a maior parte do comando do computador. Já imaginou o que acontece com uma variável no Python quando você sai do escopo local de uma função ou a exclui? Provavelmente não está certo? E isso é porque em um idioma de alto nível você não precisa! Eles cuidam da alocação / liberação de memória para você.

Linguagens de alto nível têm a vantagem da função. Eles nos permitem projetar e desenvolver livremente (e com segurança!).

Idiomas de baixo nível têm a vantagem da velocidade na maioria dos casos. Há um custo para interpretar o código de alto nível. Além disso, é meio legal escrever algo no 'computador speek'.

Espero que isto ajude

Nick Burns
fonte
5

Alto nível vs. baixo nível não é uma coisa em preto e branco, mas uma escala contínua. Os termos são usados ​​para descrever o quão perto uma linguagem de programação está do hardware; quanto maior o nível, mais ele abstrai o hardware.

O nível mais baixo, obviamente, é o código binário da máquina - é a representação exata que o sistema operacional carrega e alimenta na CPU. Assembly é o primeiro nível de abstração construído sobre ele: em vez de código binário, escreve-se códigos simbólicos legíveis por humanos e mnemoics que representam instruções de máquina binária. Isto é o que as pessoas usavam para programação de sistemas antes do UNIX.

C é o próximo passo na cadeia de abstração, agrupando padrões comuns em construções de controle de fluxo e abstraindo instruções específicas da máquina em sintaxe independente de plataforma, e essas últimas abstrações foram um dos principais fatores que tornaram o UNIX revolucionário e altamente bem-sucedido, porque significava que o mesmo código poderia ser compilado para qualquer plataforma sem grandes alterações.

O C ++ adiciona outra camada de abstrações: adiciona classes (abstraindo vtables e contexto passando para uma sintaxe OOP) newe delete(agrupando alocação de memória e inicialização variável em uma única construção), verificação de tipo em tempo de compilação, modelos (tempo de compilação com segurança de tipo metaprogramação) e várias conveniências de sintaxe em tempo de compilação, como espaços para nome, sobrecarga de funções e operadores, etc.

Python dá outro grande passo para longe do hardware. O C ++ ainda oferece ao programador controle total sobre a alocação de memória e permite a manipulação direta da RAM; O Python cuida do gerenciamento de memória para você. Além disso, em vez de compilar seu código com instruções de máquina totalmente nativas, ele é executado em uma máquina virtual; isso acarreta uma penalidade de desempenho (que às vezes pode ser pesada, mas geralmente não é algo para se preocupar), mas também permite coisas legais que seriam complicadas em C ++ e extremamente difíceis em C, como manipular funções e classes em execução tempo, obtendo os nomes de objetos arbitrários no tempo de execução, instanciando classes pelo nome no tempo de execução, patch de macaco etc. etc.

Portanto, quando as pessoas dividem os idiomas em "alto nível" e "baixo nível", eles desenham uma linha arbitrária em algum lugar, e essa linha nem sempre é a mesma. Em 1970, a linha estava entre montagem e C (abstraindo as instruções específicas da máquina, sendo o fator decisivo); em 1987, pode ter sido algo entre C e C ++; hoje, pode estar entre C ++ e Java (com o gerenciamento automático de memória como fator decisivo).

Para encurtar a história: alto nível é uma escala móvel e, para as três línguas mencionadas, é C <C ++ <Python.

tdammers
fonte
Eu diria que alto nível versus baixo nível não é uma escala, mas duas escalas separadas. O baixo nível refere-se a quão bem uma linguagem se relaciona com o comportamento da máquina, enquanto o alto nível refere-se à sua capacidade de fornecer uma abstração. O C # é mais um idioma de alto nível que o C99, mas também é de nível inferior ao idioma definido pelo Padrão C, uma vez que o comportamento de, por exemplo, usar um ponteiro "int" para processar valores "curtos" em uma matriz dois por vez o tempo é definido em C #, mas não em C99.
supercat
3

A linha entre os idiomas "baixo nível" e "alto nível" muda de tempos em tempos.
Por exemplo:
Nos tempos do UNIX, C era um idioma de alto nível.
Hoje, o C não possui estruturas como os tipos de mapeamento (dicionários), iteradores etc. que as linguagens de alto nível atuais como o Python possuem. Portanto, a linha mudou e C agora caiu no grupo de baixo nível.

Idiomas de baixo nível:
esses idiomas estão "próximos" do que a máquina pode executar (o nível mais baixo é: Código de montagem!).
Ao trabalhar com essas linguagens, o programador precisa pensar nas coisas de nível mais baixo, como gerenciamento de memória. Você é próximo nesse sentido do hardware, precisa trabalhar diretamente com ele.

Idiomas de alto nível:
esses idiomas o afastam do hardware, pois eles gerenciam coisas como a própria memória. Quando você trabalha com esses idiomas, a memória é um fator (obviamente), mas você não trabalha diretamente com o hardware. Em vez disso, o idioma gerencia isso, mantendo-o afastado (talvez mais alto) da interface de hardware mais baixa.

pradyunsg
fonte