O básico da maioria das linguagens procedurais é praticamente o mesmo.
Eles oferecem:
- Tipos de dados escalares: geralmente booleano, inteiros, flutuantes e caracteres
- Tipos de dados compostos: matrizes (cadeias são casos especiais) e estruturas
- Construções básicas de código: aritmética sobre escalares, acesso a matriz / estrutura, atribuições
- Estruturas de controle simples: if-then, if-then-else, while, for loops
- Pacotes de blocos de código: funções, procedimentos com parâmetros
- Escopos: áreas nas quais os identificadores têm significados específicos
Se você entende isso, você tem uma boa compreensão de 90% dos idiomas do planeta. O que torna essas linguagens um pouco mais difíceis de entender é a incrível variedade de sintaxe estranha que as pessoas usam para dizer as mesmas coisas básicas. Alguns usam notação concisa envolvendo pontuação ímpar (APL sendo um extremo). Alguns usam muitas palavras-chave (COBOL é um excelente representante). Isso não importa muito. O que importa é se a linguagem é completa o suficiente por si só para fazer tarefas complexas sem causar rasgos no cabelo. (Tente codificar alguns hacks graves no script de shell do Windows: ele é capaz de Turing, mas é muito ruim em tudo).
Mais linguagens procedurais interessantes oferecem
- Escopos aninhados ou lexicais, namespaces
- Ponteiros que permitem que uma entidade se refira a outra, com alocação dinâmica de armazenamento
- Embalagem de código relacionado: pacotes, objetos com métodos, características
- Controle mais sofisticado: recursão, continuações, encerramentos
- Operadores especializados: operações de string e array, funções matemáticas
Embora não seja tecnicamente uma propriedade do langauge, mas uma propriedade do ecossistema no qual esses idiomas residem, estão as bibliotecas que são facilmente acessíveis ou fornecidas com o idioma como parte da ferramenta de desenvolvimento. Ter uma ampla variedade de recursos de biblioteca simplifica / acelera a gravação de aplicativos simplesmente porque não é necessário reinventar o que as bibliotecas fazem. Embora Java e C # sejam amplamente considerados bons idiomas por si mesmos, o que os torna realmente úteis são as enormes bibliotecas que os acompanham e as bibliotecas de extensão facilmente obtidas.
As linguagens mais difíceis de entender são as não processuais:
- Linguagens puramente funcionais, sem atribuições ou efeitos colaterais
- Linguagens lógicas, como Prolog, nas quais a computação simbólica e a unificação ocorrem
- Idiomas de correspondência de padrões, nos quais você especifica formas que correspondem ao problema e, geralmente, ações são acionadas por uma correspondência
- Linguagens de restrição, que permitem especificar relações e resolver automaticamente equações
- Idiomas de descrição de hardware, nos quais tudo é executado em paralelo
- Idiomas específicos do domínio, como SQL, Redes de Petri coloridas, etc.
Existem dois estilos principais de representação para idiomas:
- Baseado em texto, em que entidades de nomes de identificadores e fluxos de informações são codificados implicitamente em fórmulas que usam os identificadores para nomear as entidades (Java, APL, ...)
- Gráfica, na qual as entidades são desenhadas como nós e as relações entre entidades são desenhadas como arcos explícitos entre esses nós (UML, Simulink, LabView)
As linguagens gráficas geralmente permitem sublínguas textuais como anotações em nós e em arcos. Linguagens gráficas mais estranhas permitem recursivamente gráficos (com texto :) em nós e em arcos. Linguagens gráficas realmente estranhas permitem que os gráficos de anotação apontem para os gráficos que estão sendo anotados.
A maioria dessas linguagens é baseada em um número muito pequeno de modelos de computação:
- O cálculo lambda (base para o Lisp e todas as linguagens funcionais)
- Sistemas de postagem (ou técnicas de reconfiguração de sequência / árvore / gráfico)
- Máquinas de Turing (modificação de estado e seleção de novas células de memória)
Dado o foco da maioria das indústrias em linguagens procedurais e estruturas de controle complexas, você está bem servido se aprender uma das linguagens mais interessantes nesta categoria, especialmente se incluir algum tipo de orientação a objetos.
Eu recomendo altamente aprender Scheme, em especial de um livro realmente maravilhoso: Estrutura e Interpretação de Programas de Computador . Isso descreve todos esses conceitos básicos. Se você conhece essas coisas, outras linguagens parecerão bem simples, exceto pela sintaxe pateta.