Subtipagem implícita x explícita


18

Esta página afirma que

muitos idiomas não usam subtipagem implícita (equivalência estrutural), preferindo subtipagem explícita / declarada (equivalência de declaração)

Eu usei principalmente linguagens de programação que usam subtipos explícitos . Quais são as vantagens da subtipagem implícita, conforme descrito nas notas acima.


1
Nas Perguntas frequentes, sobre o escopo dessa troca: "O trabalho neste campo é muitas vezes distinguido por sua ênfase na técnica matemática e no rigor". Estou com voto negativo porque não vejo margem para rigor nas respostas a esta pergunta.
David Eppstein

6
Infelizmente, há muito mais espaço para responder a essa pergunta do que você poderia inicialmente esperar. Muitas pessoas muito eminentes queimaram muitos dos anos 90 lutando com perguntas aparentemente triviais sobre subtipagem. Infelizmente, é uma área com uma relação esforço / recompensa muito baixa.
Neel Krishnaswami

6
sim, há muito espaço para matemática e rigor para responder a essa pergunta, ou pelo menos para explicar matematicamente o que é subtipo implícito . Não tenho certeza sobre a relação esforço / recompensa.
Noam Zeilberger

1
Eu provavelmente deveria ter dito que era "muito difícil", pois, após reflexão, percebo que estou muito interessado nas respostas.
Neel Krishnaswami

1
Ok, estou convencido. Eu removia meu voto negativo, mas o sistema não me deixou.
David Eppstein

Respostas:


19

A resposta curta é "para verificar propriedades adicionais do código existente". Resposta mais longa segue.

Não tenho certeza de que "implícito" vs "explícito" seja uma boa terminologia. Essa distinção às vezes é chamada de subtipo "estrutural" vs "nominal". Depois, há também uma segunda distinção nas possíveis interpretações de subtipagem estrutural (descritas em breve). Observe que todas as três interpretações de subtipagem são realmente ortogonais e, portanto, não faz sentido compará-las entre si, em vez de entender os usos de cada uma.

A principal distinção operacional na interpretação de uma relação de subtipagem estrutural A <: B é se ela é testemunhada por uma coerção real com o conteúdo computacional (tempo de execução / tempo de compilação) ou se pode ser testemunhada pela coerção de identidade. Se o primeiro, a importante propriedade teórica que deve ser mantida é a "coerência", ou seja, se existem várias maneiras de mostrar que A é um subtipo subestrutural de B, cada uma das coerções associadas deve ter o mesmo conteúdo computacional.

O link que você deu parece ter em mente a segunda interpretação do subtipo estrutural, onde A <: B pode ser testemunhado pela coerção da identidade. Isso às vezes é chamado de "interpretação de subconjunto" de subtipagem, assumindo a visão ingênua de que um tipo representa um conjunto de valores e, portanto, A <: B no caso de todo valor do tipo A também ser um valor do tipo B. às vezes chamado de "digitação de refinamento", e um bom artigo para ler sobre a motivação original são os tipos de refinamento para ML da Freeman & Pfenning . Para uma encarnação mais recente em F #, você pode ler Bengston et al, Tipos de refinamento para implementações seguras. A idéia básica é usar uma linguagem de programação existente que pode (ou não) já ter tipos, mas na qual os tipos não garantem muito (por exemplo, apenas segurança de memória) e considerar uma segunda camada de tipos, selecionando subconjuntos de programas com propriedades adicionais e mais precisas.

(Agora, eu argumentaria que a teoria matemática por trás dessa interpretação de subtipagem ainda não é tão bem entendida como deveria ser, e talvez seja porque seus usos não são tão amplamente apreciados quanto deveriam ser. Um problema é que o "conjunto dos valores ", a interpretação dos tipos é muito ingênua e, às vezes, é abandonada em vez de refinada. Para outro argumento de que essa interpretação de subtipo merece mais atenção matemática, leia a introdução aos subespaços de Paul Taylor em Abstract Stone Duality .)


A×B×C<:A×BCAB

1
O trabalho do otimizador é descobrir o layout ideal da memória, para que as coerções identidades sejam realmente o resultado da otimização.
Andrej Bauer

2
portanto, apenas para esclarecer o comentário de Andrej com relação à minha resposta, em uma interpretação de digitação de refinamento, as relações de subtipagem sempre são testemunhadas pela coerção de identidade por definição , porque os tipos de refinamento não possuem conteúdo computacional extra. Em outras palavras, se A e B são dois refinamentos ("subconjuntos" / "propriedades") de um tipo de valores X, A <: B afirma que, para cada valor x em X, se x: A, também x: B. Essa declaração pode ser verificada ou falsificada, mas não tem efeito no tempo de execução, pois as provas de que x: A e x: B não existem no tempo de execução.
Noam Zeilberger

1
N{x:N|x<232}

3
N{x:N|x<232}N{x:N|x<232}
Noam Zeilberger

4

Essa resposta é uma espécie de complemento mínimo à excelente resposta de Noam. Um ponto de interesse de dados é o destino dos conceitos de C ++, que fracassaram na tentativa de unificar noções nominais e estruturais de tipo.

Há uma excelente redação aqui, com links para grande parte da discussão relevante: http://bartoszmilewski.wordpress.com/2010/06/24/c-concepts-a-postmortem/

No entanto, a redação acima não discute a questão nominal versus estrutural em profundidade. Há outro artigo aqui, que faz: http://nerdland.net/2009/07/alas-concepts-we-hardly-knew-ye/

O documento principal que ambos apontam é “Simplificando o Uso de Conceitos” , de Bjarne Stroustrup: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2906.pdf , que entra na prática problemas encontrados com alguma profundidade.

Como um todo, a discussão é mais pragmática do que rigorosa. No entanto, fornece uma boa visão dos tipos de tradeoffs envolvidos nessas questões, especialmente no contexto de um grande idioma existente.

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.