JavaRush /Blogue Java /Random-PT /Níveis de linguagens de programação
Marat Sadykov
Nível 41

Níveis de linguagens de programação

Publicado no grupo Random-PT

Introdução

Quais são as diferentes linguagens de programação? Que tipo de conceitos estão embutidos neles? Como eles se desenvolveram? Neste artigo, veremos os tipos de linguagens de programação baseadas nos chamados níveis – desde códigos de máquina (baixo nível, próximos ao hardware do computador) até linguagens como Java ou C# (alto nível). Quanto menos transformações a listagem de texto do programa sofrer ao longo do caminho para se transformar em um conjunto de zeros e uns, menor será o nível.
Níveis de linguagens de programação - 1
A seguir veremos:
  1. Linguagens de baixo nível (códigos de máquina e assembly)
  2. Nível intermediário (C, Fortran….)
  3. Alto nível (C++, Java, Python, Ruby, JavaScript...)
O nível também caracteriza quanto detalhe a listagem do futuro programa precisa ser detalhada para implementar a implementação. Quão simples é esse processo para os humanos? O nível de uma língua não deve ser considerado um indicador inequívoco das suas capacidades. Uma linguagem de programação é uma ferramenta eficaz em uma área e menos útil em outras. Tanto o marceneiro quanto o carpinteiro trabalham com madeira. O primeiro possui a ferramenta principal - um conjunto de cinzéis, o segundo - um machado. No entanto, um carpinteiro tornará um armário esculpido mais elegante e um carpinteiro construirá uma casa mais rapidamente. Embora cada um seja capaz de fazer o trabalho do outro, eles o farão com muito menos eficiência. Vários dados em um computador são representados como conjuntos de zeros e uns. Os comandos de controle para seu processamento são os mesmos dados contendo instruções que determinam a localização das informações necessárias e o método de modificação.

Linguagens de máquina (nível mais baixo)

Teremos que fazer uma breve visita da área de Software à área de Hardware. Vejamos isso de forma simplificada. O processador é o principal “cérebro” do computador. A placa-mãe na qual está instalado contém controladores que servem para interagir com outros dispositivos através de barramentos (canais de dados para comunicação).
Níveis de linguagens de programação - 2
Alguns trabalham em alta velocidade (setas vermelhas): o processador extrai comandos da memória e manipula dados, a placa de vídeo, principalmente em jogos 3D, consome grandes quantidades de texturas, formas, coordenadas de pixels e outros objetos para construir uma imagem na tela do monitor . Outros (devido a limitações na velocidade da troca de informações) não necessitam de indicadores tão elevados. Vários dispositivos internos e externos estão conectados no diagrama com setas verdes.

O mundo interior do processador

Todos os comandos do processador vêm da memória para execução em formato binário. O formato, número e subconjunto de instruções dependem de sua arquitetura. A maioria deles é incompatível entre si e segue ideologias diferentes. E também o tipo de comando depende fortemente do modo (16/08/32... profundidade de bits) e da fonte de dados (memória, registro, pilha...) com a qual o processador trabalha. A mesma ação pode ser representada por instruções diferentes. O processador possui instruções para adicionar dois operandos (ADD X,Y) e adicionar um ao especificado (INC X). Adicionar um triplo a um operando pode ser feito como ADD X,3 ou chamando três vezes INC X. E, para processadores diferentes, é impossível prever qual desses métodos será ideal em termos de velocidade ou consumo de memória. Por conveniência, as informações binárias são escritas em formato hexadecimal. Vamos considerar parte de um programa familiar (linguagem C, cuja sintaxe é semelhante à Java)
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
Código que implementa as mesmas ações na forma de uma sequência de instruções para o processador: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... Esta é a aparência real da linguagem de programação de baixo nível do processador Intel. Um fragmento que chama um método com um argumento e retorna o resultado incrementado em um. Trata-se de linguagem de máquina (código), que é transferida diretamente, sem transformações, ao processador para execução. Prós:
  • Somos completamente donos da situação, temos as mais amplas possibilidades de utilização do processador e do hardware do computador.
  • Todas as opções para organizar e otimizar o código estão à nossa disposição.
Desvantagens:
  • É necessário ter amplo conhecimento do funcionamento dos processadores e levar em consideração um grande número de fatores de hardware na execução do código.
  • A criação de programas um pouco mais complexos do que o exemplo dado leva a um aumento acentuado no tempo gasto escrevendo código e depurando-o.
  • Dependência de plataforma: um programa criado para um processador geralmente não funcionará em outros. É possível que para este processador, em outros modos de operação, seja necessária a edição de código.
Os códigos de máquina foram amplamente utilizados no início dos computadores; não havia outros métodos de programação na era dos pioneiros da computação. Atualmente, eles são usados ​​ocasionalmente por engenheiros microeletrônicos no desenvolvimento ou testes de baixo nível de processadores.

Linguagem assembly (baixo nível)

Ao contrário de um computador, você e eu percebemos melhor as informações na forma textual/semântica do que na forma digital. Você pode nomear facilmente cinquenta nomes de contatos em seu smartphone, mas é improvável que consiga escrever de cor os números de telefone correspondentes. É o mesmo com a programação. Subimos na escada de tipos seguindo três etapas básicas:
  • Vamos associar uma instrução simbólica a grupos de instruções do processador digital que executam ações correspondentes.
  • Vamos destacar os argumentos das instruções do processador separadamente.
  • Vamos apresentar a capacidade de nomear áreas de memória, variáveis ​​e a localização de comandos individuais.
Vamos comparar fragmentos do programa anterior em código de máquina (centro) e em linguagem assembly (direita):
2004b0     48 83 ec 08      sub    $0x8,%rsp
2004b4     bf bc 05 20 00   mov    $0x2005bc,%edi
2004b9     31 c0            xor    %eax,%eax
2004bb     e8 e8 fe ff ff   callq  getData
2004c0     48 83 c4 08      add    $0x8,%rsp
2004c4     83 c0 01         add    $0x1,%eax
Como você pode ver, o processo de escrever um programa foi simplificado: não há necessidade de usar livros de referência para gerar valores de comandos digitais, calcular comprimentos de transição, distribuir dados na memória entre suas células e outros recursos do processador. Descrevemos a ação desejada a partir de um conjunto de comandos simbólicos e os argumentos necessários para a lógica de execução, e então o programa tradutor traduz o arquivo de texto em um conjunto de zeros e uns compreensíveis para o processador. Prós:
  • O processo de escrever e modificar código foi simplificado.
  • O controle sobre todos os recursos de hardware foi mantido.
  • É relativamente mais fácil portar o programa para outras plataformas, mas elas requerem modificações dependendo da compatibilidade do hardware.
Desvantagens:
  • A linguagem assembly é uma linguagem de programação de baixo nível. Criar até mesmo pequenas seções de código é difícil. Além disso, também é necessário levar em consideração o funcionamento específico do equipamento.
  • Dependência de plataforma.
O exemplo de demonstração Java mais popular:
public static void main(String[] args) {
    System.out.println("Hello World!");
}
terá a seguinte aparência (sintaxe NASM, usando API do Windows e kernel32.lib):
global _main
	extern  _GetStdHandle@4
	extern  _WriteFile@20
	extern  _ExitProcess@4

	section .text
_main:
	; DWORD  bytes;
	mov 	ebp, esp
	sub 	esp, 4

	; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
	push	-11
	call	_GetStdHandle@4
	mov 	ebx, eax

	; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push	0
	lea 	eax, [ebp-4]
	push	eax
	push	(message_end - message)
	push	message
	push	ebx
	call	_WriteFile@20

	; ExitProcess(0)
	push	0
	call	_ExitProcess@4

	; never here
	hlt
message:
	db  	'Hello, World', 10
message_end:
Assim como os códigos de máquina, a linguagem assembly é usada com mais frequência por engenheiros e programadores de sistemas. Ele é usado para escrever partes dependentes de hardware do kernel do sistema operacional que são críticas em termos de tempo ou críticas para os recursos de implementação de drivers para vários dispositivos periféricos. Mas ultimamente têm recorrido cada vez menos a ele, pois seu uso reduz muito a portabilidade de programas para outras plataformas. Às vezes, eles usam o processo de desmontagem - eles criam uma lista assembly de um programa a partir de códigos digitais para analisar a lógica de execução de pequenos fragmentos. Em casos raros, se o código original de alto nível não estiver disponível: análise de vírus para combatê-los ou perda de código-fonte. A linguagem assembly é considerada de primeira/segunda geração (não consideraremos separadamente os pseudocódigos antes do surgimento do assembler e sua diferença em relação aos comandos simbólicos). Gostaria de destacar o uso do assembler no Demo Scene: uma fusão de arte, matemática e codificação de baixo nível, incorporando as ideias artísticas de seus criadores na forma de programas que geram videoclipes com limitações de recursos. Freqüentemente, o tamanho total do programa e do arquivo de dados não deve exceder 256 bytes (o formato de 4/64 quilobytes também é popular). Aqui está um exemplo de um programa de 4 KB:

Linguagens do grupo C/Fortran (nível intermediário/alto)

Com o desenvolvimento das capacidades da tecnologia computacional, a quantidade de funcionalidades e o tempo de implementação do código em assembler não eram mais satisfatórios. Os custos de escrever, testar e manter programas cresceram muito mais rápido do que suas capacidades. Foi necessário reduzir as exigências do programador em termos de conhecimento do funcionamento do equipamento, para lhe dar uma ferramenta que lhe permitisse escrever em linguagens próximas da lógica humana. Mude para um novo nível de tipos de linguagem de programação. Fornecer a capacidade de divisão em vários módulos com chamadas sequenciais adicionais (paradigma de programação processual), fornecer vários tipos de dados com a capacidade de construí-los, etc. Além disso, essas medidas trouxeram melhor portabilidade do código para outras plataformas, organização mais confortável de trabalho em equipe. Uma das primeiras linguagens que suportou tudo isso foi o Fortran, desenvolvido na década de 50 do século passado . A capacidade de criar em forma de texto uma descrição da lógica de execução usando loops, ramificações, sub-rotinas e operar com arrays e apresentar dados na forma de números reais, inteiros e complexos encantou engenheiros e cientistas. Em pouco tempo, foram criados “frameworks” científicos e bibliotecas. Tudo isso foi consequência do fato de o Fortran ainda ser relevante hoje, embora em um ambiente científico restrito, e estar em desenvolvimento, já que a bagagem de desenvolvimentos é muito grande, só a biblioteca IMSL vem se desenvolvendo ativamente desde 1970 (!), como você se lembra de muitos softwares similares relevantes? Outro ramo de desenvolvimento de linguagens neste nível é C. Se Fortran se tornou uma ferramenta para cientistas, então C foi criado para ajudar os programadores a criar softwares aplicativos: sistemas operacionais, drivers, etc. A linguagem permite controlar manualmente a alocação de memória e dá acesso direto aos recursos de hardware. Os programadores C precisam controlar entidades de baixo nível, por isso muitos são da opinião de que C é uma linguagem assembly avançada e costuma ser chamada de linguagem de “nível médio”. Tendo introduzido a digitação de dados em assembler, elementos de programação processual e modular, a linguagem C ainda é uma das principais linguagens para programação de sistemas, o que também é facilitado pelo rápido desenvolvimento da microeletrônica nos últimos anos. Todos os tipos de gadgets, controladores, redes e outros dispositivos precisam de drivers, implementação de protocolos de colaboração e outros softwares de nível relativamente baixo para implementar a interação com o equipamento. Todos os itens acima contribuem para a demanda pelo idioma hoje. Princípios funcionais e orientados a objetos foram desenvolvidos na forma de C++, C#, Java, aproveitando muito da sintaxe C. Prós:
  • Simplificação do processo de criação de código: introdução de tipos, divisão em módulos, redução de listagens de programas.
  • Прозрачная логика заложенного алгоритма вследствие ухода от машинных codeов к более понятным для человека командам в семантически описательном стиле.
  • Переносимость. Стало достаточно перекомпorровать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
  • Скорость откомпorрованных программ.
Минусы:
  • Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
  • Отсутствие реализации концепций an objectно-ориентированного и функционального программирования.

Развитие языков высокого уровня

As linguagens de programação de alto nível, em termos de criação de software, têm começado cada vez mais a se afastar dos códigos de máquina e a implementar diversos paradigmas de programação além dos procedimentais. Isso também inclui a implementação de princípios orientados a objetos. C++, Java, Python, JavaScript, Ruby... - a gama de linguagens deste tipo é a mais popular e procurada atualmente. Eles oferecem mais oportunidades para a implementação de uma variedade de softwares e é impossível determinar com clareza a “especialização” de cada um deles. Mas a popularidade da aplicação em áreas relevantes se deve às bibliotecas/frameworks para trabalhar com elas, por exemplo: JavaScript - Frontend. A linguagem foi projetada para interação entre um navegador cliente e um usuário e um servidor remoto. As bibliotecas mais populares são Angular, React e VUE. Atualmente, é usado de forma relativamente ativa na web e em outros servidores (backend), sendo o Node.js especialmente popular. Ruby - back-end. É usado para criar scripts (arquivos de serviço) e em servidores web. A estrutura principal é Ruby On Rails. Python é um domínio científico e de engenharia (além do domínio web). É uma alternativa aos pacotes padrão de computação e matemática (Mathematica, Octave, MatLab...), mas possui a semântica usual da linguagem e um grande número de bibliotecas. Tem muitos fãs na área de sistemas de aprendizado de máquina, estatística e inteligência artificial. Bibliotecas usadas com frequência incluem Django, numpy, pandas e tensorflow. C++ – Desenvolvimento universal e evolutivo da linguagem C. Fornece recursos de programação funcional e orientada a objetos sem perder a capacidade de interagir com hardware de baixo nível. Com isso, obtém-se produtividade e flexibilidade na criação de software, mas o preço também corresponde: uma grande barreira de entrada devido à complexa especificação da linguagem, a necessidade de controle independente dos recursos na execução do programa. Muitos softwares de usuário único e de sistema são escritos usando-o: módulos de sistema operacional (Windows, Symbian...), jogos, editores (Adobe Photoshop, Autodesk Maya...), bancos de dados (MSSQL, Oracle...), players ( WinAmp...), etc. Ressalta-se que o software moderno é um produto complexo, cujo desenvolvimento utiliza diversas linguagens de programação ao mesmo tempo, podendo ser muito difícil determinar o grau de participação de cada uma delas em o resultado geral.

Progresso distante

Recentemente, outro tipo de programação vem ganhando popularidade - funcional (desenvolvimento adicional do nível da linguagem) . Aqui está outro tipo de abstração para cálculos - funções que recebem um conjunto de funções como argumentos e retornam outro. O papel das variáveis ​​​​é desempenhado pelas mesmas funções (variáveis ​​​​que nos são familiares são simplesmente expressões constantes, semelhantes a final antes de uma declaração de tipo em Java). A função em si é fechada em seu escopo, o resultado de sua operação depende apenas dos argumentos passados. Duas propriedades notáveis ​​decorrem disso:
  • Para testar, precisamos apenas de argumentos de função (o resultado do trabalho não depende de variáveis ​​externas, etc.).
  • Um programa de estilo funcional está milagrosamente pronto para simultaneidade: chamadas de função sequenciais podem ser emitidas em threads vizinhas (uma vez que não são afetadas por fatores externos) e não requerem bloqueios (ou seja, não há problemas de sincronização). Um bom incentivo para dedicar tempo a este tópico, dada a ampla adoção de processadores multi-core.
Porém, o limite de entrada é maior do que para OOP: para um código eficaz é necessário construir um programa, descrevendo o algoritmo de execução na forma de funções. Mas também para um estilo funcional puro, seria bom conhecer os fundamentos da lógica e da teoria das categorias. Os mais populares são Haskell, Scala, F#. Mas não tenha medo, elementos de programação funcional apareceram em Java (assim como em outras linguagens modernas de terceira geração) e podem ser combinados com OOP. Você conhecerá todos esses detalhes com mais detalhes no estágio online JavaRush. O campo da programação lógica (o próximo nível de linguagens) ainda não encontrou ampla aplicação prática devido à sua baixa demanda. A construção de programas requer conhecimento dos fundamentos da matemática discreta, lógica de predicados, ferramentas de restrição e outros ramos da lógica matemática. A linguagem ativa mais popular é o Prolog.

Conclusão

Atualmente, as linguagens mais comuns são OOP. Java, desde o seu início, sempre esteve no topo, geralmente entre as três principais linguagens populares. Além de OOP, ele contém elementos de programação funcional e você pode combinar diferentes estilos de escrita de seus programas. A gama de aplicações Java é muito ampla - são tarefas de negócios, implementação de servidores web (backend), linguagem principal para criação de aplicações Android, ambientes de programação e locais de trabalho multiplataforma (IDE/AWM) e modelagem, e muito mais . A posição do Java é especialmente forte no setor empresarial - uma área de software corporativo que requer código de alta qualidade e longa duração e a implementação da lógica de negócios mais complexa.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION