Analisando uma linguagem de programação


10

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?


Você já consultou a Forma Estendida Backus-Naur, EBNF ou Backus-Naur Form, BNF ? Ele pode quebrar uma gramática semelhante a esses três conceitos, embora eu não tenha muita certeza de quais são suas intenções, então não sei se isso vai ajudar ou não.
Jetti

@ Jetti - sim, eu tenho, e não, não é disso que estou interessado. Estou realmente procurando analisar a semântica (pergunta: essa é realmente a palavra que estou procurando?) Das linguagens de programação, não suas formas escritas (ou seja, sintaxe).

Respostas:


1

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:

  • Variáveis x , y ,… são as únicas expressões primitivas.
  • A aplicação de função MN é o único meio de combinação.
  • Abstração lambda λx.M é o único meio de abstração.

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.


Boa resposta; você tem os problemas que eu estava lutando com - a distinção ambígua entre primitivos, combinações, etc.

O que você quer dizer com "variável" exatamente? Não podem ser descritos como meios de abstração porque têm um nome?
morbidCode

@morbidCode O conceito de variável é complicado e a palavra tem um significado diferente, porém relacionado, no cálculo lambda e em Java. Uma variável pode ser considerada uma "abstração", pois se refere a um valor não especificado. No entanto, não é um meio de abstração: não cria a referência, é apenas uma maneira de usar a abstração existente. Uma abstração lambda cria uma maneira de usar um bloco de código como um objeto que pode ser manipulado.
Gilles 'SO- stop be evil'

4

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).


@MattFenwick Uma expressão pode consistir em uma única primitiva, combinações de primitivas e outras entidades formam uma expressão composta (ainda uma expressão, mas não uma declaração).
Dave Newton

@ MattFenwick Eu não sou, não estou dizendo que uma expressão é um primitivo, estou dizendo que uma expressão pode consistir em apenas um único primitivo. Não há como uma String ser primitiva apenas porque a linguagem fornece açúcar sintático para ela, a menos que você queira diferenciar entre uma string imediata e a referência que ela cria. Eu diria que + é, porque não pode ser posta em prática de forma alguma.
Dave Newton

Em relação ao seu lado: existe um problema com a implementação de genéricos em Java?
Steven Evers

2

Aqui está minha categorização básica. Estou tentando desenhar um paralelo com o LISP.

Expressões primitivas

  • Todos os valores primitivos, coisas que você pode representar usando literais (números, booleanos, ...)

Paralelo no LISP : átomos, números e listas.

Meios de combinação (maneiras de criar estruturas de dados compostas)

  • Matrizes
  • Objetos / estruturas.

Paralelo no LISP : células contras, listas

Meios de Abstração

  • Toda a sintaxe do fluxo de controle (se, enquanto para)
  • Todos os operadores embutidas ( +, -, *, /, ...)
  • Todas as funções (nesta categoria, incluímos classes e métodos)

Paralelo no LISP : Funções, açúcar sintático como let,define


Boa resposta! Eu estava pensando que talvez algumas das construções de controle-fluxo se encaixassem em meios de combinação, no entanto. Paralelos legais com o LISP, isso ajuda muito.

Não é bem assim. Matrizes e objetos são executados em um nível diferente, fazem parte da representação de dados, não da própria linguagem. Inicializadores de matriz são parte do idioma e são um meio de combinação. Operadores e construções de fluxo de controle não são meios de abstração, porque eles não “armazenam” nada para reutilização. Os meios de abstração geralmente dão um nome a uma entidade para reutilização futura sob esse nome.
Gilles 'SO- stop be evil' (

0

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 forloop 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.


11
Espere o que? "Simples como C antes de se aprofundar em Java." Você me perdeu no "Simple like C".
corsiKa

Matt, acho que realmente não entendo o que você está fazendo então. O livro que você citou fala sobre essas duas coisas, quer os autores as chamem explicitamente de sintaxe e semântica ou não.
mpdonadio

De fato, "sintaxe" descreve precisamente as coisas "mais simples" das línguas, cujos átomos são compostos.
Ira Baxter

A sintaxe não captura completamente o que é um programa válido, longe disso. Por exemplo, um programa sintaticamente correto pode falhar na verificação de tipo. O programa AC que executa a instrução x = ++x;não é válido, mesmo que um compilador típico a aceite.
Gilles 'SO- stop be evil' (

0

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.


O livro é gratuito online; um link é fornecido no OP. Eu meio que senti a mesma coisa means of combination- que é difícil descobrir o que exatamente pertence a ele. Boa resposta, no entanto.

Você sabe quais outros capítulos ele fala sobre combinações e abstrações?
Bob
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.