No SICP , os autores declaram ( Seção 1.1 ) que existem três "mecanismos" básicos de linguagens de programação:
expressões primitivas , que representam as entidades mais simples com as quais o idioma se refere
meio de combinação , pelo qual elementos compostos são construídos a partir de elementos mais simples
meios de abstração , pelos quais elementos compostos podem ser nomeados e manipulados como unidades
Como posso analisar uma linguagem de programação convencional (Java, por exemplo) em termos desses elementos ou mecanismos?
Respostas:
A distinção entre expressões primitivas, meios de combinação e meios de abstração é útil na modelagem de linguagens de programação. Observe que isso não é uma propriedade intrínseca do idioma: você não pode apontar para nenhuma definição de idioma e dizer "esse recurso é inequivocamente uma expressão primitiva, esse recurso é inequivocamente um meio de combinação". A distinção é uma propriedade do modelo, e modelos complexos podem resistir à classificação.
Um exemplo de livro didático desses três conceitos é o cálculo lambda , que possui exatamente um de cada:
Quando você acessa idiomas com mais recursos, a modelagem pode se tornar mais ambígua. De um modo geral, uma expressão primitiva é aquela que você não pode ou não decompõe em componentes primitivos. Mas é como o átomo : é primitivo até a ciência avançar. Por exemplo, existe uma variante do cálculo lambda em que variáveis usam números em vez de nomes ( índices de Bruijn ), o que é particularmente conveniente ao modelar termos lambda para provas de computador; e nas provas de computador, os números inteiros são divididos em partes constituintes . Portanto, nesses modelos, as variáveis não são expressões primitivas, afinal.
Em (um modelo típico de) Java, expressões primitivas são principalmente constantes e variáveis. Os meios de combinação incluem os numerosos operadores; mais precisamente, "expressão aditiva" é um meio de combinação com dois slots (o lado esquerdo e o lado direito) ou com três slots (os dois lados e o operador) se você incluir A
+
B e A-
B sob esse nome (nesse caso, os operadores+
e-
seriam construções primitivas por direito próprio). Outros meios de combinação incluem sequências da instrução I;
J , construções de loopwhile (…) {…}
, e assim por diante. Então você tem construções como declarações de variáveis, definições de funções, definições de classe e assim por diante, que são ambos meios de combinações (eles combinam nomes e tipos de parâmetros, corpos, inicializadores ...) e meios de abstração (porque definem nomes para reutilização). De fato, é bastante comum que meios de abstração também sejam meios de combinação: eles combinam um nome com sua definição.fonte
Facada áspera:
Expressões são exatamente isso; o que constitui uma expressão em Java. Não sei se isso se expandiria para incluir declarações ou não.
As combinações incluiriam expressões compostas, instruções (variáveis ?,), métodos, o mecanismo de classe e pacotes. Módulos também quando estão no idioma.
Em Java, o meio mais simples de abstração é uma classe: nada pode existir fora de uma classe. Talvez haja "camadas" de abstração: um método estático é sem dúvida mais simples que um método de instância, porque não requer uma instância.
Os genéricos oferecem uma camada adicional de abstração (e frustração).
fonte
Aqui está minha categorização básica. Estou tentando desenhar um paralelo com o LISP.
Expressões primitivas
Paralelo no LISP : átomos, números e listas.
Meios de combinação (maneiras de criar estruturas de dados compostas)
Paralelo no LISP : células contras, listas
Meios de Abstração
+
,-
,*
,/
, ...)Paralelo no LISP : Funções, açúcar sintático como
let
,define
fonte
Uma linguagem de programação é geralmente definida por sua sintaxe e sua semântica . Ambos serão definidos nos padrões para o idioma.
A sintaxe descreve como escrever um programa válido e a semântica define o que esse programa válido significa.
Nos seus casos, a sintaxe informará quais são suas primitivas, como você as combina e como as abstrai. A semântica lhe dirá o que significam as combinações e abstrações.
Por exemplo, a sintaxe informa como escrever um
for
loop válido . A semântica lhe dirá o que o loop for faz.Se você realmente deseja começar a analisar uma linguagem de programação, pegue uma cópia do padrão e veja o que está lá. Eu realmente começaria com uma linguagem simples, como C, antes de me aprofundar em Java. Eu também leria o resto do livro. Aprender por que os linguagens de programação funcionam dessa maneira me tornou um programador melhor, mesmo que eu não implemente compiladores.
fonte
x = ++x;
não é válido, mesmo que um compilador típico a aceite.Não sei se está correto, mas a maneira como entendo a divisão é a seguinte:
expressões primitivas , seriam coisas como >>, +, *, /, int, boolean, variáveis, métodos etc.
meios de combinação, isso pode ser discutível, seja por coisas como + e concact, ou por falar sobre idéias mais avançadas, como herança versus composição e os métodos para fazer isso. Injeção, o novo operador, extensão etc.
meios de abstração, seria a sintaxe usada para nomear variáveis e métodos, bem como meios de criar interfaces, classes, classes estáticas, métodos de sobrecarga etc.
No entanto, é possível que você precise nos fornecer mais informações do livro para que saibamos exatamente o que isso significa.
fonte
means of combination
- que é difícil descobrir o que exatamente pertence a ele. Boa resposta, no entanto.