Bir veri yapısının sadece aptal bir programlama dili olduğunu söyleyerek Bill Gosper ne demek istiyordu? [kapalı]


16

Ralph William Gosper, Jr'dan şöyle bir alıntı var :

Veri yapısı sadece aptal bir programlama dilidir.

Bununla ne demek istedi? Ne yazık ki, Google'da bulabildiğim tek şey, herhangi bir bağlam olmadan, teklifin kendisinin amansız kopyaları / macunları.




Turing-complete tip sistemlere sahip diller vardır. Bazıları aptal.
SK-logic

@ SK-logic: Tür sistemlerinin, tam veya başka bir deyişle, bu alıntıyla ne ilgisi var?
missingfaktor

1
@RehnoLindeque, hiç Agda veya Coq gördün mü? Türler Turing-complete olabilir.
SK-logic

Yanıtlar:


10

Açıklamanın kalbi şöyle:

Veri yapısı sadece ... bir programlama dilidir

Bunu düşünürseniz oldukça doğrudur. Sonuçta, derleyiciler her zaman bu geçişe güveniyor; bir programlama dili alır, bir veri yapısına dönüştürür, bu veriler üzerinde bazı dönüşümler yapar ve sonucu başka bir programlama diline dönüştürür.

Aslında, eğer bir C veri yapısı gibi deli bir şey bile yapabilirseniz, çeşitli yöntemleri çağırarak C kodu yazmanıza izin verir - örneğin (tür C #, çünkü şu anda kullandığım şey budur):

var C = yeni HorribleCObject ();
C.İşlev <int> ("ana", typeof (char [] []), typeof (int))
  Değişken ("i", typeof (int), 0).
  ("İ", Func (i) => i <10))
     Çağrı ("printf", "% d", "i").
     .PostIncrement ( "I"),
  .EndWhile ();
  .Return (0)
 .EndFunction ();

Şimdi, tam alıntıya gelince: neden böyle bir şey C'nin kendisinde yazmakla karşılaştırıldığında (aptalca)? Bunun ayrıntılı olduğu ve C'deki eşdeğeri kadar okunaklı olmadığı oldukça açık olmalıdır (ve pratikte, C'nin yapabileceklerinin tam kapsamını desteklemeyebilir - typedefs zor olacaktır); bu nedenle, bu veri yapısı sadece "gerçek" bir programlama diline gömülü bir "aptal" programlama dilidir. Aynı mantık aklınıza gelebilecek herhangi bir veri yapısı için genelleştirilebilir; bağlantılı listeler Lisp'in sadece "aptal" bir versiyonudur ve karma haritalar bazı teorik Karma Programlama Dilinin (Hasp?) sadece "aptal" bir versiyonudur.

Mesele şu ki, hash haritalarımızla etkileşim kurmak için her zaman Hasp yazmak istemiyoruz. Bu, etki alanına özgü tüm dillerin sahip olduğu sorun - bir yandan, iyi uygulanmış bir DSL, temel modelin yapabileceği her şeyi ifade edecek kadar güçlü; Öte yandan, DSL'i ilk etapta uygulamalısınız ve daha sonra diğer insanlar bunu öğrenmelidir. Muhtemelen harcamak istemedikleri zaman ve çaba gerektirir; sonuçta, sadece karma haritama bir şeyler koymak ve daha sonra başka şeylerin orada olduğunu kontrol etmek istiyorum, Karma Odaklı Programlamanın tüm inceliklerini öğrenmek istemiyorum.

Yani, hemen hemen düşünmeden, bu teorik son derece spesifik ve çok akıllı programlama dillerini alıyoruz ve bunları bir veri yapısında bulunan birkaç aptal operasyona indiriyoruz. Bağlantılı bir listede basit yöntemlerin küçük bir koleksiyonu vardır; karma haritanın başkaları da vardır. Veri yapısı üzerinde potansiyel olarak gerçekleştirebileceğiniz diğer daha güçlü işlemleri görmezden geliriz (örneğin, LinkedList uygulamalarının çoğunda .Map veya .ForEach işlevi yoktur ve Hasp'te ne yapacağınızı hayal bile edemiyorum), bunları ana programlama dilinde açıkça uygulamaktan yana - çoğu programcının aşina olacağı şey budur.

Veri yapıları, temel olarak, ana dillerinin kavramsal olarak temsil ettikleri sorun alanına aptalca bir uzantısıdır. Yeterince akıllı bir uzantı, yeni, özel bir programlama dili gerektirir ve çoğu insan bunu öğrenmek istemez.


2

Veri yapısı, bir programlama dilinin TEMSİLİNDİR. Ama özellikle "keskin" değil.

Bu, aşağıdaki wiki makalesinde olduğu gibi bir "düğüm diyagramından" görülebilir:

http://en.wikipedia.org/wiki/Root_node#Terminology

Bununla birlikte, bir veri yapısı bir programlama dili olarak EKSİKTİR, çünkü bir programcı için anlaşılabilir olacak sözdiziminden ve tam düşüncelerden yoksundur. Bir veri yapısının "dili", "Ben, soğuk. Ceket al" gibi bir şey söyleyen bir çocukla karşılaştırılabilir.

"Dil" kırılır, ancak anlaşılabilir. Çocuk "soğuk ve daha fazla giysi istiyorum" diyor. Çocuğun ifadesi, İngilizce dilinin "aptal" bir versiyonudur ve benzer şekilde bir programlama diliyle ilgili veri yapısıdır.


1

Ne Bill Gosper amaçlanan bu olduğuna inanıyoruz tüm veri yapıları sadece sınırlı uygulanabilirliği ile yapıları programlama . Bu aynı zamanda "Dil tasarımı kütüphane tasarımı ve kütüphane tasarımı dil tasarımıdır" fikri ile ilgilidir [1].

Konu hakkında düşünmenin bir yolu veri yapılarını sadece algoritmik bir temelde ele almaktır. Depolama gereksinimlerini unutun ya da şimdilik ek açıklamalar yazın, çünkü bunlar sadece yardımcıdır.

Örneğin, ilişkilendirilebilir bir diziyi ( mapbazı dillerde a olarak adlandırılır ) iki şekilde kodlayabilirsiniz: Bellekte depolanan bir tür dizin kullanarak veya basit bir vaka ifadesi kullanarak.

Haskell'de ilişkilendirilebilir bir diziyi veri yapısı olarak kodlayabilirsiniz ...

let assocArray = [("a", 1),("b", 2),("c", 3)]
let key = "b"
lookup key assocArray

... veya bir vaka ifadesi kullanarak ...

let key = "b"
case key of 
  "a" -> 1
  "b" -> 2
  "c" -> 3

... hatta daha doğrudan ...

let key = "b"
if key == "a" 
  then 1 
  else if key == "b"
    then 2
    else if key == "c"
      then 3
      else undefined

Veri yapıları ve kodlar arasındaki bu tür yansıtmanın lambda hesabına bakarak mümkün olduğunu görmek kolaydır. Herhangi bir değer lambda hesabındaki bir fonksiyonla temsil edilebilir ve analizin kendisi evrenseldir (turing tamamlandı).

[1] Alıntı Bjarne Stroustrup sayesinde.


0

Tüm verilerin kod olduğu Javascript'i düşünün. Tüm verilerin kod ve tüm kodun veri olduğu LISP'yi düşünün.

Başlangıçta, sonda ve aradaki her yerde veri sadece bittir. Kolayca insan tarafından okunabilir ve insan tarafından dönüştürülebilir hale getirmek için bitleri metin ve sembollerle ontolojize etmeye çalıştığımız, aşağıdakileri gerektiren bir soyutlama katmanıdır: a) Tanım dilini öğrenirsiniz ve b) soyutlamanın sızıntısını öğrenirsiniz.

Örneğin, C # 'da, bir yapı ve sınıf arasındaki farkı öğrenmek, değer türleri ve başvuru türleri arasındaki eşitlik karşılaştırmasındaki farkı öğrenmenizi gerektirir. Her veri ontolojisi, öğrenmeniz ve uymanız gereken kendi kurallar dizisini gerektirir. Ve herhangi bir dil gibi, hızlı bir şekilde genel fikre ulaşmanıza izin verir, ancak konunun gerçek gerçeğine yaklaşmak istediğinizde, ikiliye daha fazla bakmalısınız.

Son olarak, bir B-ağacı veya benzer bir veri yapısı göz önüne alındığında, ağacın yapısında gezinmek ve üzerinde başka tür işlemler yapmak, ağaçlar, yapılar veya diller arasında aktarılması zorunlu olmayan özel bir sözdizimi gerektirir.


3
Bunun gerçekten kalbine ulaştığından emin değilim. Örneğin jenerik programlama özellikle veri yapısı-agnostik algoritmalar (tipik olarak yineleyiciler veya aralıklarla) ile ilgilidir.
Jon Purdy

4
Ralph William Gosper, Jr.'ın aslında bu anlama geldiğinden emin misiniz?
Robert Harvey

Common Lisp'de tüm veriler kod olarak derlenemez, ancak tüm kodlar veri olarak değerlendirilebilir. Çok fazla sözdizimi kuralı yoktur, ancak en azından makro işlemeden sonra tüm kodların S ifadeleri olması gerekir ve tüm veriler S ifadeleri değildir.
David Thornley
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.