Executando verificação de segurança...
4

Como as linguagens de programação são criadas?

Essa é uma dúvida que eu frequetemente tenho e com ela outras surgem, como:

1 Elas são criadas a partir de qual linguagem?

2 A primeira linguagem não pode ter sido criada por outra, então como ela foi desenvolvida?

3 As linguagens mais velhas são mais limitadas do que as atuais ou elas podem ser "atualizadas"?

Provavelmente pelas minhas perguntas você já reparou que sou iniciante na comunidade, por isso já justifico as minhas perguntas possivelmente ingênuas

Carregando publicação patrocinada...
4

1 Elas são criadas a partir de qual linguagem?

O mais comum é o inglês, mas nada impede que seja em qualquer outra.

Tá achando estranho? Não é, isso está correto, continue lendo.

2 A primeira linguagem não pode ter sido criada por outra, então como ela foi desenvolvida?

Aí temos que ir longe, mas eu logo vou responder o que eu acho que quer saber de verdade. Entendo a confusão.

3 As linguagens mais velhas são mais limitadas do que as atuais ou elas podem ser "atualizadas"?

Elas podem ser atualizadas, tanto que foram e não precisam ser limitadas.

Fortran por exemplo, que alguns consideram como a primeira linguagem de programação de alto nível a ser inventada hoje é muito mais poderosa do que era na década de 50.

Lisp que foi a primeira sob certo ponto de vista (não foi implementada logo) já era muito poderosa na época, até por ser homoicônica.

COBOL é orientada a objeto hoje em dia.

Vamos desmistificar algumas coisas

Leia O que é linguagem de programação, IDE e compilador? para entender melhor que linguagem de programação é uma coisa, e a implementação dela, provavelmente através de um compilador é outra completamente diferente.

Por isso uma linguagem não depende de outra a não ser a língua natural que alguém se comunica para fazer algo. Em resumo, a linguagem é só um conjunto de regras, e costuma ser expressado em inglês. Para ajudar alguns usam BNF.

A primeira linguagem de programação de computador moderno era binária e foi estabelecida pela forma como o processador foi desenhado. Códigos 0 e 1 eram colocados de tal forma que faziam que o procesador manipulasse um dado de uma determinada maneira de acordo com a disposição das portas lógicas do processador. Você tinha que entrar isso no computador com uma chave de ligado e desligado, e portanto o programa tinha que ser escrito no papel antes. Era extramente trabalhoso e cheio de erros. Por sorte só se fazia aplicações muito simples.

Depois disso criaram linguagens abstratas que mapeavam diretamente para o código binário, mas na prática só existe na cabeça das pessoas. E assim conseguiram construir um código que ajudava a montar outros códigos.

Só depois criaram um compilador para uma linguagem de alto nível, usando as linguagens de baixo nível que foram sendo criadas antes, cada vez com mais abstrações, mas ainda mapeando para o que o processador sabe fazer. Alguém deu alguns nomes para as instruções do processador e estabeleceu uma regra do que usar depois do nome. Essa linguagem foi o primeiro Assembly. Cada processador tem o seu, e é possível ter mais de um Assembly para o mesmo processador, desde que o mapeamento seja igual. Isso foi um avanço e já ficou bem mais fácil programador do que colocar zeros e uns. Mas em um primeiro momento alguém tinha que transformar esse código escrito em Assembly para código binário na mão! Depois escreveram um programa que automatizava isso e foi um aumento enorme na produtividade.

Até que finalmente alguém criou uma linguagem de alto nível. Essa nova linguagem foi escrita em inglês e o compilador dela foi escrito em Assembly, e foi usado um montador até que o próprio compilador da nova linguagem fosse capaz de compilar um código escrito nela própria que poderia compilar seu código fonte. Isso chama-se *bootstraping* (lá explica como é esse negócio do ovo e da galinha).

Então, grosso modo podemos dizer que para a implementação das linguagens aconteceu: linguagem binária -> Assembly -> linguagem de alto nível

Agora você vai querer descobrir Como é desenvolvida uma linguagem de programação. Não esqueça de seguir os links presentes lá porque tem muita informação valiosa para entender isso e como um compilador é escrito. E se pesquisar pode ver por lá mesmo como tuo isso vira código inário e como executa noi procrssador.

Também pode ser útil.

Ainda existem diversos outros mitos. Em geral as pessoas leem coisas, mas como nunca tiveram prática com o assunto, acaba virando um telefone sem fio e os mitos vão se solidificando. Se quer mesmo saber o correto sobre isso precisa pesquisar mais em fontes confiáveis. No que eu passei já vai dando o caminho onde tem mais informações e termos para pesquisar.

Quando você treina o erro é ele que fará para sempre. Treine o acerto. Seja curioso e poderá aprender tudo o que desejar.

Faz sentido?

Espero ter ajudado.

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1
2

1 Elas são criadas a partir de qual linguagem?

Qualquer uma que o desenvolvedor quiser usar, no futuro o desenvolvedor pode ate reescrever o compilador na propria linguagem

2 A primeira linguagem não pode ter sido criada por outra, então como ela foi desenvolvida?

Simples, com código de maquina na unha, as pessoas nao tinham outra opção, criaram o primeiro assembler com codigo de maquina e depois usaram assembly por bastante tempo até criarem compiladores. E agora a gente usa compiladores pra fazer outros compiladores.

3 As linguagens mais velhas são mais limitadas do que as atuais ou elas podem ser "atualizadas"?

Depende muito, não tem como dar uma resposta objetiva.

Se quiser ver um exemplo de uma linguagem de programação compilada sendo escrita do 0 com python e depois reescrito na propria linguagem, veja o porth do tsoding: https://www.youtube.com/watch?v=8QP2fDBIxjM

1

2 A primeira linguagem não pode ter sido criada por outra, então como ela foi desenvolvida?

Antes de existirem linguagens de programação, existem instruções de maquina. Esse é o nivel mais baixo de abstração, ou seja, você está trabalhando diretamente com bits.

As instruções são sequências de bits que indicam o que você quer fazer, e estas instruções e sequências variam de processador para processador (falando a nível de arquitetura, não modelo.)

Para simplificar isso, existe a linguagem Assembly, que é uma abstração para estas instruções e seus argumentos, e implementa algumas facilidades para o programador, como rotulos.

Para ter ideia como Assembly é baixo nível: não existem variaveis como nós conhecemos, apenas endereços de memoria que operamos diretamente, movendo um valor, somando, subtraindo, rotacionando bits, setando ou resetando um bit especifico, fazendo operações de lógica binária, etc.

Então essa seria a primeira linguagem de programação.

As demais linguagens compiladas todas geram instruções de maquina que podem ser facimente traduzidas em Assembly, porém isso não significa que elas geram Asssembly.

Existem ainda as linguagens de script, que não geram instruções de maquina diretamente, mas aí é outra história.

2
1

A única coisa que o computador entende é linguagem de máquina, ela é diretamente arquitetada em componentes digitais, pode até mesmo usar válvulas ou transistores, porém será uma máquina extremamente lenta e simples.
Das mais antigas até as mais modernas todas seguem praticamente utilizando a arquitetura de Von Neumann.
Mas nenhum ser humano programa diretamente em linguagem de máquina pois são só números.
Tem que existir pelo menos a linguagem assembly que são mnemônicos para cada instrução da máquina, ou seja, opcodes (códigos de operação).

Este jogo da Steam explica bem essa relação entre assembly e eletrônica.
https://store.steampowered.com/app/1885690/Virtual_Circuit_Board/

Convertendo Código de Máquina em Assembly
https://embarcados.com.br/convertendo-codigo-de-maquina-em-assembly-mips-parte-1/

Exemplo
Instrução ADDI - adiciona um valor imediato (constante) ao registrador.
Em binário 01000
Em decimal 8
Em assembly ADDI

1

Salve, Clayton8!

A sua pergunta é sensacional, e eu vou aproveitar esse gancho pra falar um pouquinho da história da computação.

No começo do século XX, o tubo à vácuo foi inventado. Esse dispositivo permitia controlar correntes elétricas, e usava ele mesmo uma corrente elétrica como entrada. Assim, um tubo poderia controlar um outro tubo, e desta forma você pode concatenar vários tubos para formar sistemas complexos (e, sim, dá até pra fazer uns sistemas com retroalimentação com isso).

Essa inovação foi potencializada por um formalismo matemático ainda mais antigo, a álgebra Booleana. Basicamente, esta álgebra tratava sobre proposições que poderiam ser falsas ou verdadeiras - e sobre as derivações possíveis a partir de um certo conjunto de proposições. O mais louco é que, se nós representarmos nossos números decimais em base 2, esse formalismo nos permite até fazer operações matemáticas, como, por exemplo, a soma de dois números.

Para realizar essa operações, nós combinamos nossos tubos à vácuo (ou os mais modernos transistores) de forma que eles componham uma porta lógica. As portas lógicas recebem entradas booleanas (TRUE or FALSE) e produzem saídas booleanas. Se vc quiser ver um exemplo de como "brincar" com essas portas sem uma linguagem de programação, aqui vai um vídeo muito massa em que essas portas são implementadas por moléculas de DNA (pois é!), e são usadas para simular um jogador de jogo da velha (pois é em dobro!).

Agora eu vou dar um zoom out das portas lógicas e circuitos somadores para uma estrutura ainda mais complexa em nossos comuptadores: a Unidade Lógica-Aritmética (ULA). Este componente é o cérebro do seu processador, e ela é simplesmente o conjunto de os seus circuitos lógicos para operações matemáticas, como soma, multiplicação, comparação, shift (quando vc desloca seus bits para a direita ou para esquerda dentor do byte) e até transformada de Fourier. Para decidir qual operação usar dentro da ULA, o seu código tem literalmente bits que serão um ou zero para selecionar cada componente.

Por exemplo, imagina que eu tenho um processador que sabe fazer quatro coisas. Eu posso selecionar qual função utilizar com dois bits:
00: soma
01: multiplicação
10: comparação
11: shift

A cada ciclo do processador, ele vai olhar minha lista de instruções (provavelmente, da minha memória - ou mesmo de dentro de um disquete flexível) e escolher a função que eu coloquei no programa. Cada função pode precisar de mais dados (os números que serão multiplicados, ou quantos bits serão deslocados no shift), e podemos adicionar mais bytes a cada instrução. Tudo isso é levado em conta na hora de projetar a ULA.

Com o passar do tempo, certas funções começaram a ser utilizadas com mais frequência - por exemplo "potência" (um número elevado a outro). Para atender às necessidades dos clientes, os produtores de processadores começaram a fazer processadores cada vez mais complexos. Entretanto, isso fazia com que a frequência dos processadores precisasse diminuir, para dar tempo de todas as portas lógicas processarem informações tamb;em mais complexas. Em paralelo, algumas iniciativas de linguagens de programação, que permitiriam escrever um único programa que seria posteriormente "traduzido" para processadores diferentes, também tornavam-se mais populares. Entretanto, os compiladores nem sempre utilizavam todas as instruções místicas de cada processador. Há uns 50 anos, a indústria começou a criar processadores com arquitetura mais simples (chamados RISC - Reduced Instruction Set Computer), o que permitiu retormar o avanço de maiores frequências de processamento.

Mas, e hoje? Bem, se vc achar interessante produzir um processador com uma arquitetura nova, você não precisa escrever um compilador do zero. Você começar com um programa que entende um pequeno conjunto de instruções, e estas instruções te permitem compilar um programa um pouco mais sofisticado, até que vc possa compilar um programa que funcionará como um compilador completo - para quais línguas vc precisar. Por exemplo, você pode fazer um ou dois passos para chagar a um compilador de C e, depois, utilizar um compilador de Python e outro de Java escritos em C também.

E, respondendo a sua terceira pergunta: em cada linguagem, é interessante que cada nova versão seja compatível com especificações anteriores (backwards compatibility). Entretanto, nada impede que novas funções sejam adicionadas a linguagem já existentes. Mas fique esperto: sair aumentando as possibilidades de sintaxe de uma linguagem pode aumentar muito a curva de aprendizado, ou até gerar inconsistências que podem gerar bugs grotescos. É importante saber discernir o que é moda e o que realmente pode agregar para os desenvolvedores, para que todos possam usufruir de nossas ferramentas da forma mais eficiente possível.

0

1 - geralmente linguagens de baixo nível como C, C++ (isso falando mais das linguagens dos anos 90 até agora)

2 - algúem descobriu como dizer para os computadores palavras específicas para realizar alguma ação, o primeiro script foi escrito no papel.

3 - depende do que você considera velha, se considera C velha, acho que não há linguaguem tao funcional para operacoes de baixo nível, e se considera Assembly velho, praticamente tudo feito em qualquer linguagem pode ser feito com o Assembly, com muito mais dificuldade.

0