Programlama bağlamında “şeyleştirme” ve “şeyleştirme” ne anlama geliyor?


82

Bu terimi haskell ve fonksiyonel programlama hakkındaki bloglarda çok okudum (özellikle sigfpe blogunda ) ama ne anlama geldiğine dair bir fikrim yok. Çoğu zaman bilmemekten kurtuldum, ama bilseydim muhtemelen metinleri çok daha iyi anlardım. Google bana yardım etmedi. Teknik şeylerin içinde kayboluyorum.

Ayrıca dünyanın teknik olmayan anlamı ("soyut somut olanı çevirmek"), koddaki bir şeyi somutlaştırmanın pratikte ne anlama geldiğini anlamama yardımcı olmuyor.

Bilgisayar bilimi kavramlarında biraz yavaşım, bu yüzden kodla ilgili pratik örnekler iyi olurdu. : P

Yanıtlar:


42

Bu yüzden bunu okudum ve hemen hemen ne anlama geldiği: soyut bir kavramı alıp somutlaştırmak. Veya soyut kavramı temsil eden bir vekil var. Örneğin, Lisp'te, lambdaları kullandığınızda prosedür soyutlama ve uygulama kavramı somutlaştırılır.

Tek başına şeyleştirme geniş bir kavramdır ve sadece işlevsel programlama dilleri için geçerli değildir.

Örneğin Java'da, çalışma zamanında kullanılabilen türler vardır. Bunlar geri dönüştürülebilir türlerdir. Yani, çalışma süresi boyunca tipin soyut kavramının somut bir temsili vardır. Aksine, yeniden yapılandırılamayan türler vardır. Bu, özellikle jeneriklerin Java'da kullanımı sırasında belirgindir. Java'da, jenerikler tür silme işlemine tabidir ve bu nedenle genel tür bilgileri, çalışma süresi sırasında kullanılamaz (parametreli tür, sınırsız joker karakterler kullanmadıkça).

Başka bir örnek, bir kavramı modellemeye çalıştığınız zamandır. Örneğin, bir Groupsınıfınız ve bir Usersınıfınız olduğunu varsayın . Şimdi ikisi arasındaki ilişkiyi tanımlayan belirli soyut kavramlar var. Örneğin, a'nın bir Userüyesi olmanın soyut kavramı Group. Bu ilişkiyi somutlaştırmak isMemberOfiçin a'nın a'nın Userbir üyesi olup olmadığını söyleyen bir yöntem yazarsınız Group. Burada ne yaptık size olmasıdır Yani şeyleşmiş (gerçek / açık / beton yapılan) soyut bir kavramı grup üyeliğinin.

Bir başka güzel örnek, nesneler arasında ebeveyn-çocuk ilişkilerine sahip olduğunuz bir veritabanıdır. Bu ilişkiyi soyut bir ağaç kavramı içinde tanımlayabilirsiniz . Şimdi, bu verileri veritabanından alan ve gerçek bir Tree nesne oluşturan bir işleviniz / yönteminiz olduğunu varsayalım . Ne şimdi yaptık edilir şeyleşmiş bir içine ilişkinin ağaç gibi ebeveyn-çocuk soyut bir kavramı gerçek Tree nesne.

Genel olarak işlevsel dillere geri dönersek, belki de somutlaştırmanın en iyi örneği, Lisp programlama dilinin kendisinin yaratılmasıdır. Lisp tamamen soyut ve teorik bir yapıydı (temelde bilgisayar dilleri için matematiksel bir gösterim). Lisp'in evalişlevi aslında Steve Russel tarafından bir IBM 704'te uygulanana kadar bu şekilde kaldı :

Paul Graham'ın Hackers & Painters'da bildirdiğine göre, s. 185, McCarthy şunları söyledi: "Steve Russell dedi, bak, neden bu değerlendirmeyi programlamıyorum ... ve ona dedim ki, ho, ho, teoriyi pratikle karıştırıyorsun, bu değerlendirme okumak için değil Ama o devam etti ve yaptı. Yani, makalemdeki değerlendirmeyi IBM 704 makine kodu, hata düzeltme olarak derledi ve sonra bunu bir Lisp yorumlayıcısı olarak ilan etti, ki kesinlikle öyleydi. Yani bu noktada Lisp vardı özünde bugün sahip olduğu biçim ... "

Yani Lisp edildi şeyleşmiş gerçek bir programlama diline, soyut bir kavramdan.  


2
Görünüşe göre şeyleştirme duruma bağlı olarak bir süreklilik içinde var oluyor. Soyut lisp bir programlama diline dönüştürülürken, bir programlama dilinin kendisi, makine koduna ve son olarak 1'ler ve 0'lara ve daha sonra elektrik sinyallerine ... vb. Dönüştürülmesi gereken, iletişim kuran oldukça soyut bir kavramdır. Böylece şeyleştirme, soyutlamanın tam tersidir (ikili).
CMCDragonkai

25

Şeyleşme

Şeyleştirme, bir örnekleme biçimidir. Bir kavramı somutlaştırdığınızda, sağladığınız sözlük tanımı gibi soyut bir şeyi alır ve somut hale getirirsiniz.

Bir türü, olası türlerin bazı soyut sözdizimi ağacında yer alan bir terim olarak yeniden ifade etmeyi seçebilirsiniz.

Bir tasarım modelini, bazı diller için genel amaçlı bir uygulamayla gelerek somutlaştırabilirsiniz. Örneğin

template<typename T> class Singleton {
    public:
        static T& Instance() {
            static T me;
            return me;
        }

    protected:
       virtual ~Singleton() {};
       Singleton() {};
}

Tekil tasarım modelini C ++ 'da bir şablon olarak somutlaştırır.

Hoare'nin hızlı sıralama fikrini, seçtiğiniz programlama dilinde bir uygulamaya dönüştürebilirsiniz. Bu bağlamda, kavramları kategori teorisinden Haskell koduna dönüştürmek için çok zaman harcıyorum.

Bir dili o dilin tercümanı olarak yeniden tanımlayabilirsiniz. Larry Wall'un Perl fikri , perl tercümanı olarak somutlaştırılmıştır.

Veri somutlaştırmak ve vakum paketlerinin paylaşımı ile bellekte yapısal şeklini temsil eden grafik olarak terimleri reify.

Yansıma

Şeyleştirmenin diğer tarafı, somut bir şeyi alan ve genellikle bazı ayrıntıları unutarak bir soyutlama oluşturan yansımadır . Belki de bunu soyutlama daha basit olduğu için ya da bir şekilde bahsettiğiniz şeyin özünü yakaladığı için yapmak istiyorsunuz.

Java, C #, vb. Türdeki sistem yansıması, bir programlama dilinde somut bir sınıf alır ve size bir sınıfın soyut yapısını sağlayarak, sınıflarınızın sağladığı üyelerin listesine erişmenizi sağlar. Burada bir tipin somut kavramını alıyoruz ve herhangi bir belirli değeri atarken yapısını tanımlayan soyut bir terim üretiyoruz.

Bir programlama dilini bir uygulamaya nasıl dönüştürdüğünüz gibi, bazen ters yönde gidebilirsiniz. Bu genellikle kötü bir fikir olarak görülse de, bir uygulama alıp davranışının istenen özelliklerinden bir dil özelliğini yansıtmaya çalışabilirsiniz. TeX ilk olarak Knuth, sans spesifikasyonu tarafından uygulandı . TeX'in herhangi bir özelliği Knuth uygulamasından yansıtılmıştır.

(Daha resmi olarak, eğer yansımayı sizi somut bir alandan soyut bir alana götüren unutkan bir işlevli olarak görürseniz, o zaman şeyleştirme ideal olarak yansımaya bitişiktir.)

Yansıma Ben korumak paket bir terim alır ve sonra bir yeni dönem oluşturmanızı sağlar yöntemi yansıtmaktadır bunu temsil eden bir tür veren bir somutlaştırmak yöntem sağlar. Burada 'somut' alan, tip sistemidir ve soyut alan terimlerdir.


21

Gönderen Haskell Wiki :

Bir şeyi "somutlaştırmak", soyut olan bir şeyi malzeme olarak kabul etmektir. Klasik bir örnek, kadim insanların soyut kavramları (örneğin "zafer") alıp onları tanrılara dönüştürmeleridir (örneğin, Yunan zafer tanrıçası Nike).

Biçimlendirilmiş tür, bir türü temsil eden bir değerdir. Gerçek türler yerine somut türlerin kullanılması, değerlerle yapabileceğiniz her türlü değişikliği onlarla yapabileceğiniz anlamına gelir.


15

Aklıma gelen tek kullanım (eminim ki başkaları da vardır!) Sınıfı sözlüğe dönüştürmektir. EqSınıfı alalım ( /=şu an için operatörü unutarak ):

class Eq a where
    (==) :: a -> a -> Bool

Bu sınıfı somutlaştırırsak, şu olur:

data EqDict a = EqDict (a -> a -> Bool)

inşa edilebilir, incelenebilir vb. Ayrıca, Eqtür başına yalnızca bir örneğiniz, ancak birden çok EqDictdeğere sahip olabileceğiniz kayda değerdir . Ancak örneklerin otomatik olarak oluşturulması (örneğin, öğeler için sahip olduğunuzda listeler için eşitlik elde etme) çalışmaz; EqDict [a]değeri kendiniz inşa etmeniz gerekecek .

Şeyleştirme süreci bu kadar basittir (bu durum için):

reify :: Eq a => EqDict a
reify = EqDict (==)

EqSınıfı kullanan bir işlev şöyle bir şeyi dönüştürebilir:

-- silly example, doesn't really do anything
findMatches :: Eq a => a -> [a] -> [a]
findMatches x ys = [ y | y <- ys, x == y ]

-- version using EqDict
findMatchesDict :: EqDict a -> a -> [a] -> [a]
findMatchesDict (EqDict f) x ys = [ y | y <- ys, f x y ]

Eğer EqDict paketini ve varsa sadece bir geçiş a -> a -> Boolalıyoruz, ..Bygibi işlevleri Data.List.nubByiçin benzer bir hile - ve arkadaşlar Ordiçin potansiyel Data.List.sortBy.


9

Sadece Haskell bağlamında bile bu terim çok geniş bir şekilde kullanılmaktadır. Andy Gill'in reify paketi, yinelemeli yapıları almanıza ve bunları açık grafiklere dönüştürmenize olanak tanır. Sigpfe'nin süreklilik üzerine yazdığı gönderi, "hesaplamanın geri kalanı" nosyonunu etrafta dolaşabileceğiniz bir değere dönüştürmeyi anlatıyor. Şablon Haskell, bir Haskell değerinin adı verildiğinde (bildirildiği yerde, türü, vb.) Mevcut bilgileri döndüren bir reify işlevine sahiptir (derleme zamanında genel olarak TH koduyla birlikte çalıştırılır).

Tüm bu vakaların ortak noktası nedir? Akıl yürütebileceğimiz ve bildiğimiz, ancak doğrudan programlı olarak manipüle edemeyeceğimiz bir şeyi alıp, onu tıpkı diğerleri gibi isimlendirip geçirebileceğimiz gerçek bir birinci sınıf değere dönüştürmekten bahsediyorlar. Ve bu genellikle insanların kelimeyi kullandıklarında iletmek istedikleri niyettir.


2

RDF'de şeyleştirme kavramı olduğunu biliyorum. Tim Bernes-Lee'nin belirttiği gibi :

Bu bağlamda şeyleştirme, bir şeyin dili kullanarak bir dilde ifade edilmesi anlamına gelir, böylece o dil tarafından tedavi edilebilir hale gelir.

Sanırım bu bir tür düşünme veya iç gözlem gibi. Umarım burada bazı iyi cevaplar alırsınız!

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.