Sistema de tipos para desempenho


11

Existem sistemas do tipo (estático) que tentam formalizar as características de desempenho dos programas? Não consigo encontrar parecem encontrar essas tentativas.

Como os sistemas de tipos são (uma das) as ferramentas mais poderosas no arsenal do programador para fazer declarações sobre programas, e como há muitos casos em que o desempenho é crítico, não parece exagero imaginar que tentativas foram realizadas para crie um sistema de tipos que tente fazer pelo menos algumas declarações sobre as características de armazenamento e tempo de execução dos programas.


1
O que seu sistema de digitação diria sobre o desempenho if condition then expensive_operation else cheap_operation?
svick

Eu sei que houve desenvolvimentos no uso da interpretação abstrata para inferir automaticamente a pior complexidade do código (e terminação). Você pode estar interessado nela ...
Bakuriu

Não totalmente relacionado, mas ainda assim: kernelnewbies.org/FAQ/LikelyUnlikely No Linux kernel / gcc o compilador são macros prováveis ​​/ improváveis ​​de otimizar certos caminhos. Por exemploif (likely(operation_went_fine)) { // Do something } else if (unlikely(error_occured)) { // Do something else }
AmazingDreams

As palavras-chave voláteis e de registro em C vêm à mente.
mattnz

Respostas:


6

Você pode imaginar um sistema de tipos sofisticado o suficiente para estar relacionado ao WCET ou à complexidade do programa. Em seguida, a questão é criar um analisador (ou verificador) de tipo de som - isto é, regras de digitação - para tornar isso possível e implementá-lo com eficiência suficiente para torná-lo razoavelmente útil.

A maioria dos sistemas de tipos é simples o suficiente para ser rápida na computação (pelo menos para o conjunto razoável de programas que um desenvolvedor humano poderia escrever manualmente).

Algumas linguagens de programação acadêmica (por exemplo, AGDA ) possuem sistemas de tipos muito sofisticados que são completos em Turing, portanto, seu compilador pode levar uma quantidade grande (talvez infinita) de tempo.

(Se bem entendi, o trabalho de doutorado de Jérémie Salvucci em andamento no LIP6 em Paris está bastante relacionado à sua pergunta; enviei um e-mail a ele sobre isso; você pode procurar regiões e tipos ...).

No entanto, esteja ciente do teorema de Rice e do problema da parada . Os sistemas de tipos nem sempre podem ser a bala de prata que você deseja que eles sejam (consulte o antigo livro de balas de prata ).


4
WCET é "Pior tempo de execução caso" neste contexto (no caso que não me alguém perguntar)
Klaas van Schelven

9
Linguagens de tipo dependente, como Agda, Coq, Epigram, Guru, Isabelle etc. "resolvem" o Problema da Parada, o Teorema de Rice e seus amigos por não serem completos em Turing. Por construção (ou seja, simplesmente não é possível gravar um loop infinito / recursão sem finalização), exigindo que todos os programas sejam gravados de forma que o verificador de finalização possa provar a finalização ou exigindo que o programador envie um prova de terminação verificável por máquina.
Jörg W Mittag

3

Parece eminentemente possível criar um sistema de tipos que categorize a característica de desempenho dos tipos(por exemplo, "rápido / lento para acesso serial", rápido / lento para acesso aleatório "," memória eficiente / ineficiente "). Essas características podem ser tipos abstratos colocados na hierarquia de maneira que os tipos mais concretos herdados deles. No entanto, o desempenho de qualquer programa usando esses tipos depende da maneira como eles são realmente usados ​​/ acessados.Para o sistema de tipos fazer declarações sobre o próprio programa, o uso de (acesso a) esses tipos deve ser representado como tipos Isso significaria renunciar ao uso de estruturas de controle internas (por exemplo, loops for / while) e, em vez disso, usar tipos que as implementam.Portanto, a hierarquia pode ter um tipo de acesso serial abstrato e uma lista descendente de acesso serial, árvore-serial tipos de acesso e assim por diante.A eficiência do uso pode então ser pelo menos parcialmente expressa pela combinação e aplicação desses tipos um ao outro.

Em uma linguagem funcional como Haskell - que quase não tem estruturas de controle - isso me parece bastante prático e obrigatório. Em Java, no entanto, tal sistema uma parece muito menos realizáveis (não tão muito com a implementação a partir da exigibilidade / confiabilidade do resultado).

Haskell já nos permite declarar definitivamente quanto de um programa é puro e fornece maneiras de limitar atividades específicas dentro de caixas seladas. Como o paralelismo / simultaneidade em Haskell é implementado por meio do sistema de tipos , pode-se argumentar que ele já faz parte do caminho para lá (do que você deseja). Por outro lado, linguagens imperativas (mesmo as estaticamente tipadas como Java) oferecem ao codificador muitas e muitas maneiras de subverter qualquer tentativa de fazê-lo.

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.