Sintaxe
A sintaxe das linguagens costuma ser muito diferente. Claro que algumas coisas podem e são iguais, especialmente quando uma linguagem se inspira em alguma outra linguagem.
Em geral quem fala isso ou está fazendo uma simplificação. Em muitos casos é melhor para um entendimento geral, ou a pessoa não entende bem do que está falando, ela aprendeu errado, talvez por alguém que fez uma simplificação, ou outra que não sabia, e usa sua percepção para dizer isso. A pessoa acha que tomate é um legume porque ele parece ser um.
A ideia geral da sintaxe pe parecida, tanto quanto na língua escrita e falada por humanos. Isso não é sintaxe.
Você pode ter a pontuação em comum, alguns comandos comuns que podem ser invocados com as mesmas palavras-chave, mas passa a ter uma diferença e costuma ser grande.
Em alguns casos é praticamente só a sintaxe que muda. Por exemplo, C# e VB.NET quase ficou assim em determinado momento, pelo menos se considerar um subset deles, mas hoje isso foi quase abandonado (na verdade a evolução de VB.NET foi abandonada, não o suporte). JS e TS tem sintaxe idêntica em boa parte. C e C++, ainda que em uma parte pequena.
Tem muitos casos em que grande parte das diferenças é a existência de mais ou menos syntax sugar. Ou seja, ter formas diferentes, mais simples de fazer o mesmo. Embora em alguns casos possa ter diferenças semânticas, toda a diferença é sintática.
Quais padrões de projeto serão feitos pelo programador e quais serão providenciados pela sintaxe da linguagem?
A expressividade da linguagem pode ser dada pela sintaxe.
Então você terá chocolate e banana com sintaxe igual em inglês e portugu~es e algumas outras linguagens, mas não todas, mas não muito mais que isso. Tem caso que a sintaxe muda bem pouco como radio, ou que muda um pouco mais como tomato, e tem outras iguais mas com significados (sêmantica) bem diferentes, como data e costume ou as que enganam como actually e apology.
Regras de identificadores mudam detalhes, em alguns casos são idênticos, mas quase sempre achará pequenas diferenças. Isso é regra de sintaxe, mas não é a sintaxe exatamente.
Semântica e mecanismos
A semântica exata também costuma ser muito diferente, embora na essência elas se parecem, no básico.
Os mecanismos das linguagens quase nunca funcionam da mesma maneira que as outras, ainda que sejam só detalhes. Em muitos casos vão bem além de detalhes.
Tirando um if
, eventualmente um while
e um for
, sempre tem mudanças, pelo menos sutis de semântica. Note que eu estou falando do comando puro, o que vai nele já muda mais, por exemplo o que costuma usar de condições é muito comum os operadores darem resultado diferentes, até por ter precedência diferentes. Mas tem linguagem que pode ter um while
quase idêntico, mas muda porque ele aceita else
. E isso já é semântica, mais que sintaxe.
O que é exposto pode mudar muito, por exemplo, ter ponteiro, referência, ou deixar tudo opaco. Ter um mecanismo de controle de tempo de vida. Ter lazyness. Generics. Ser homoicônica, talvez parcialmente. Ter mecanismos como exceções, atributos personalizados, reflexão, que paradigmas se conforma, e os mecanismos que facilitam esses paradigmas, o que em boa parte pode exigir sintaxe (vai ter classes? Como?). Como lida com certos erros?
Vai ter goto
? Com variações? Todos eles vão chamar goto
, ou pode ser break
ou continue
? Pode ter label em todos? Pode mandar para qualquer lugar dentro do escopo? E fora do escopo? Inclusive fora da função? Percebe como tem muito detalhe que vai variar? Só um mecanismo e já tem muita decisão, mesmo que dê outro nome.
Como fica o escopo?
Imagine a quantidade de diferenças entre o uso de parâmetros das funções, como retornar dados, como resolver sobrecarga, se tiver.
E os tipos de dados básicos, quais são e como eles se comportam?
Até conceitos e termos a linguagem pode diferir. Quase nenhuma concorda com o que é um primitivo. Quase todas possuem campos nas suas estruturas de dados, quase nenhuma chama de atributos, mas quase todo mundo aprendeu esse termo.
Tem casos que a linguagem usa um nome e faz outra coisa. Tem linguagem que tem match
que não faz pattern matchingpattern matching. Outras fazem o switch
ter semânticas completamente diferentes. Tem linguagem que tem um tipo chamado Hash que usa uma árvore ou um dicionário, mas não um hash. Tem linguagem que reinventa conceitos, usa termos errados e cria uma sequência de implementações e ideias ruins, em geral copiando mal o que outras linguagens têm porque elas querem estar na moda. E essas linguagens costumam ter muitos fãs, porque é bom estar na moda.
Tipagem
A tipagem muda bastante, no geral e principalmente nos detalhes. Pode ser um dos casos que mais mude a forma da linguagem trabalhar. Tem muitas maneiras de expor a tipagem. Como pode fazer cast (implícito ou explícito). Os números serão segregados pela sua magnitude, precisão ou outra característica, ou vai tratar tudo como um coisa só?
O que não é a linguagem
Uma coisa muitas vezes o pessoal coloca como diferença, em muitos casos não é. Por exemplo, a linguagem ser interpretada ou compilada, gera código nativo ou não. Em geral isso é circunstancial, depende da implementação, a linguagem não é assim, uma implementação que a pessoa usa é que é assim (exemplo, outro, mais um). Como a pessoa aprendeu errado ela tende repetir isso, e muita gente repetindo começa parecer que é verdade. E quem diz que é errado muitas vezes é considerado maluco. Imagina se a maioria começa falar que a Terra é plana, o maluco é quem diz que ela é redonda.
Tem casos que pode ou não ser parte da linguagem. Pode ser relacionado à biblioteca que pode ser considerado algo extra ou essencial para a linguagem. Mas o grosso da biblioteca não é a linguagem. Precisa ser algo que influencia a linguagem diretamente. Então uma classe de string
pode ser, em parte, considerada como algo da linguagem porque há semânticas definidas na linguagem que dependem do que essa classe faz. A forma como a linguagem interage com outras e com o runtime pode fazer parte das diferenças da linguagem.
Outro exemplo que pode ou não fazer parte da linguagem, em geral faz parte, é o gerenciamento de memória. Ter um GC determinístico ou não, ou fazer uso manual, quase sempre faz parte da semântica da linguagem, mas eventualmente não. Até mesmo pode fazer diferença ter stack ou não (algumas linguagens deixam essa decisão para a implementação).
Conclusão
Acho que tem uma listinha de coisas sobre isso.
Você sabe o que é uma linguagem de programação? E a diferença para o compilador? E como ele feito?
Faz sentido para você?
Espero ter ajudado.
Se tiver positivos na resposta eu melhoro mais, até porque eu peguei só alguns exemplos. Mais links? Eu estou estruturando melhor o texto, só escrevi o que foi vindo na cabeça.
Tem caso que a pergunta é simples, mas pode gerar respostas importantes.
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).