Örtük ve açık alt tipleme


18

Bu sayfa iddia

birçok dil, açık / beyan edilmiş alt türü (bildirim eşdeğeri) tercih ederek örtük alt türleme (yapısal eşdeğerlik) kullanmaz

Çoğunlukla açık alt tip kullanan programlama dillerini kullandım . Yukarıdaki notlarda açıklandığı gibi örtük alt tiplemenin avantajları nelerdir.


1
SSS'den, bu mübadelenin kapsamı hakkında: "Bu alanda çalışma genellikle matematiksel teknik ve titizliğe verdiği vurgu ile ayırt edilir." Aşağıya oy veriyorum çünkü bu sorunun cevaplarında titizlik için bir kapsam görmüyorum.
David Eppstein

6
Ne yazık ki, bu soruyu cevaplamak için başlangıçta umduğunuzdan çok daha fazla kapsam var. Pek çok seçkin insan, 90'ların çoğunu alt tipleme ile ilgili görünüşte önemsiz sorularla yaktı. Maalesef çok zayıf çaba / ödül oranına sahip bir alan.
Neel Krishnaswami

6
evet, matematik ve titizlik için bu soruyu cevaplamak veya en azından örtük alt tiplemenin ne olduğunu matematiksel olarak açıklamak için çok yer vardır . Emeklilik-ödül oranından emin değilim.
Noam Zeilberger

1
Muhtemelen bunun "çok zor" olduğunu söylemeliydim, çünkü yansıma üzerine cevaplarla çok ilgilendiğimi fark ettim.
Neel Krishnaswami

1
Tamam, ikna oldum. Benim oyumu kaldırırdım ama sistem bana izin vermiyor.
David Eppstein

Yanıtlar:


19

Kısa cevap "mevcut kodun ek özelliklerini doğrulamak" tır. Daha uzun cevap gelir.

Emin değilim "örtük" vs "açık" iyi bir terminoloji. Bu ayrım bazen "yapısal" ve "nominal" alt tipleme olarak adlandırılır. Sonra yapısal alt tiplemenin olası yorumlarında da ikinci bir ayrım vardır (kısaca açıklanmaktadır). Alt tiplemenin her üç yorumunun da gerçekten dik olduğunu ve bu yüzden her birinin kullanımlarını anlamak yerine bunları birbirleriyle karşılaştırmanın gerçekten mantıklı olmadığını unutmayın.

A <: B yapısal alt tipleme ilişkisinin yorumlanmasındaki temel operasyonel ayrım, (çalışma zamanı / derleme zamanı) hesaplama içeriğine gerçek bir zorla şahit olup olmadığı ya da kimlik baskısı ile şahit olup olamayacağıdır. Birincisi, tutması gereken önemli teorik özellik "tutarlılık" ise, yani A'nın B'nin alt yapı alt tipi olduğunu göstermenin birden fazla yolu varsa, eşlik eden zorlamaların her birinin aynı hesaplama içeriğine sahip olması gerekir.

Verdiğiniz bağlantı, yapısal alt tiplemenin ikinci yorumunu göz önünde bulunduruyor gibi görünüyor, burada A <: B kimlik baskısı tarafından tanık olabilir. Buna bazen, bir türün bir değer kümesini temsil ettiği naif bir bakış açısıyla alt tiplemenin "altkümesi yorumu" olarak adlandırılır ve bu nedenle A tipinin her bir değerinin B tipi bir değer olması durumunda A <: B olur. bazen "ayrıntılandırma yazımı" olarak adlandırılır ve orijinal motivasyon için okunacak iyi bir makale Freeman & Pfenning'in ML için Arıtma türleridir . F # 'da daha yeni bir enkarnasyon için Bengston ve ark., Güvenli uygulamalar için Arıtma türleri okuyabilirsiniz.. Temel fikir, halihazırda tiplere sahip olabilecek (veya olmayabilir), ancak tiplerin bu kadarını garanti etmediği (örneğin, sadece bellek güvenliği) mevcut bir programlama dilini almak ve programların alt kümelerini seçen ikinci bir katman katmanını düşünmektir. ek, daha kesin özellikler.

(Şimdi, bu alt tipleme yorumunun arkasındaki matematiksel teorinin hala olması gerektiği kadar iyi anlaşılmadığını ve belki de kullanımlarının olması gerektiği kadar takdir edilmediğini iddia ediyorum. türlerin yorumlanması çok naiftir ve bu yüzden bazen rafine edilmekten ziyade terk edilir. Alt tiplemenin bu yorumunun daha matematiksel bir ilgiyi hak ettiğini gösteren başka bir argüman için, Paul Taylor'un Soyut Taş Dualitesindeki Alt Uzaylarına giriş bölümünü okuyun .)


Merhaba Noam, güzel cevap! Nominal alt türlemenin la OO'nun temel olarak yine de op- olmayanlar tarafından gerçekleştirilen bir kimlik dışı zorlama sınıfını tanımlamanın bir yolu olduğunu ekleyeceğim . Yani, kalıtımın neden olduğu nesnelerin genişlik alt türü resmi olarak kimlik dışı bir baskıyı içerir (örneğin, attığınız anlamına gelir ), ancak kayıtları sırayla düzenleyerek bellekte her iki tip için ve bileşenlerini yansıtmak için aynı ikili kodu kullanabilirsiniz . birxBxC<:birxBCbirB
Neel Krishnaswami

1
Optimal bellek düzenini bulmak optimize edicinin görevidir, bu nedenle kimlik olan zorlamalar gerçekten optimizasyonun sonucu olmalıdır.
Andrej Bauer

2
sadece Andrej'in cevabım hakkındaki yorumunu netleştirmek için, ayrıntılandırma yazarak yorumlamada, alt tipleme ilişkilerine her zaman tanım gereği kimlik zorlaması tanıklık edilir , çünkü ayrıntılandırma türleri fazladan bir hesaplama içeriği taşımaz. Başka bir deyişle, A ve B, X tipi bir değerde iki iyileştirme ("alt kümeler" / "özellikler") ise, A <: B, X'teki her x değeri için, x: A ise x: B olduğunu belirtir. Böyle bir ifade doğrulanabilir veya tahrif edilebilir, ancak çalışma zamanında hiçbir etkisi yoktur, çünkü x: A ve x: B'nin kanıtları çalışma zamanında mevcut değildir.
Noam Zeilberger

1
@Noam: Katılıyorum, ama sadece tek bir dilin metatheoryğinden bahsederken, derlemeden bahsediyorsak değil. Kimlik zorlamaları çok fazla iş yapan prosedürlerle, kimlik dışı zorlamalar ise hiçbir şey yapmayan prosedürlerle gerçekleştirilebilir. Somut olarak, bir tipine ve türüne sahip olduğumuzu varsayalım . Daha sonra, tam türün temsil etmesi için bellek ayırmayı gerektirmesine rağmen, ayrıntılandırma öğelerini tek bir kutulanmamış sözcükle uygulayabiliriz. Buradaki kimlik zorlamaları gerçek hesaplama ile gerçekleştirilmelidir. N-{x:N-|x<232}
Neel Krishnaswami

3
@Neel: Bunu iki adıma böldüm, 1. hesaplamadan özgür kimlik baskısını arınmasına uygulayın , sonra 2., kısmen tanımlı zorlamayı (tamamen ayrı) tek bir kutulanmamış sözcük türüne uygulayın, bu da ayrıntılandırmada tamamen tanımlanır . Belki de bu saçları bölüyor ... ama her durumda bu dediğim şeyi gösteriyor ki "bu alt tip yorumlamanın arkasındaki matematiksel teori hala olması gerektiği kadar iyi anlaşılmıyor" :)N-{x:N-|x<232}N-{x:N-|x<232}
Noam Zeilberger

4

Bu cevap Noam'ın mükemmel cevabına bir çeşit asgari ek. İlgilenilen bir veri noktası, nominal ve yapısal tipteki kavramları birleştirme çabasıyla kurulan C ++ kavramlarının akıbetidir.

Burada, ilgili tartışmanın çoğuna bağlantılar içeren mükemmel bir yazı var: http://bartoszmilewski.wordpress.com/2010/06/24/c-concepts-a-postmortem/

Ancak, yukarıdaki yazı nominal ile yapısal meseleyi derinlemesine tartışmamaktadır. Burada başka bir yazı var: http://nerdland.net/2009/07/alas-concepts-we-hardly-knew-ye/

Her ikisinin de ana fikri Bjarne Stroustrup'un “Kavramların Kullanımının Basitleştirilmesi” dir: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2906.pdf , pratik olan bazı derinliklerde karşılaşılan sorunlar.

Bir bütün olarak, tartışma titiz olmaktan daha pragmatiktir. Bununla birlikte, özellikle mevcut büyük bir dil bağlamında, bu konularda yer alan ödünleşmeler hakkında iyi bir fikir vermektedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.