Yalnızca işlevsel programlama için tasarlanmış bir CPU nasıl farklı olabilir?


14

CPU'lar, insanların dolaylı ya da açık bir şekilde onun için yazacakları yazılım dikkate alınarak tasarlanmıştır.

Bana öyle geliyor ki, talimat seti mimarilerinin tasarımına bakarsanız, her talimatın bir zorunlu stil komutunu kodlaması anlamında çok "zorunludur". Bana öyle geliyor ki, mevcut talimat seti mimarileri kısmen programcıların ürettiği kod türüne göre gelişti.

Biri, sadece işlevsel bir programlama tarzında yazılmış programları çalıştıracağını bildiğimiz bir CPU'yu sıfırdan tasarlarsa, bu CPU mevcut CPU'lardan nasıl farklı tasarlanır?


9
John Backus "Programlama von Neumann Tarzından Kurtuluyor mu?" bu tür birkaç çalışmadan bahsedilmektedir (bölüm 15).
Dmitri Urbanowicz

W. Kluge'un baskısı tükenmiş olan Redüksiyon, Veri Akışı ve Kontrol Akış Sistemleri Örgütü'nün (MIT Press, 1992) bir kopyasını bulmayı umarak (grafik) azaltma makinelerini arayın veya yerel araştırma kütüphanenizi ziyaret edin .
Kai

2
Ayrıca Koopman'ın Birleştirici Grafik Azaltımı için Mimari (AP, 1990) adlı kitabı . Lisp makinelerine bakmak da muhtemelen faydalı olacaktır. en.wikipedia.org/wiki/Lisp_machine
Pseudonym

Bence makinelerimiz zaman içinde çalıştıklarından ve durumlarını değiştirerek daima zorunlu olacaklar.
orlp

Birkaç kullanışlı CPU özelliği, thunks için yerel destek ve daha verimli atlama olacaktır. Ayrıca CPU, bellekteki belirli konumların belirli bir kapsamın üzerine yazılmayacağını ve CPU'nun bir yığını yığın tabanlı dillerde olduğu gibi tutması gerekmediğini bilerek bazı kısayollar alabilir.
Monica

Yanıtlar:


3

Aslında yapıldı: https://en.wikipedia.org/wiki/Lisp_machine

FP için CPU tasarımının bir yönü çöp toplamadır. GC işlevsel diller için çok önemlidir. Genel uygulamalar, GC'nin işaretçiler ve işaretçi olmayan veriler arasında ayrım yapabilmesini gerektirir. Etkili bir şekilde, bu, verileriniz boyunca fazladan bir bit depolamak anlamına gelir. Örneğin, OCaml tam sayılarının 32 bit mimarilerde sadece 31 bit ve 64 bit mimarilerde 63 bit olmasının nedeni budur. Tamsayı aritmetiği daha sonra garip ekstra kaydırma işlemleri içerir. Diğer diller (veya diğer OCaml veri türleri), bu ekstra bit için tüm makine kelimelerini harcayabilir, böylece 64 bit tamsayılar için 128 bit kullanır. Yerel olarak GC'ye göre tasarlanmış bir CPU'nun 65-bit veri yolu ancak 64-bit aritmetiği olabilir.

Bununla birlikte, birçok işlevsel olmayan dil de çöp toplama özelliğine sahiptir ve bu nedenle ilgili mimarilerden kâr elde edecektir.

Akla gelen bir başka şey de FP'nin bellek kullanımının zorunlu programlardan çok daha dağınık olmasıdır. Temel olarak dizileri kullanmak daha az doğal olduğu için. Sonuç olarak, bu programlar bitişik bellek yığınlarını önbelleğe almaktan daha az kazanç sağlar. Bu nedenle, bir FP CPU farklı önbellek stratejileri kullanabilir.


1

Hiçbir şeyi değiştirmez ya da Reduceron ve halefi PilGRIM 1'deki gibi büyük bir paralel ayarı büyük bir yığınla kullanırdı .

Hiçbir şeyi değiştirmeyeceğine dair açıklama ilk başta cesur görünüyor, ancak CPU sıralı olduğu için, verimliliği artırmak için mevcut donanımı kullanan bir çeviri işlemi (derleme) var. Başka bir mimari olacak mı, bazı işlemler daha hızlı olacak, bazılarının onu hızlandırmak için hile yapması gerekiyor.

Fark yaratacak mimari, haritanın çalışmasını ve listelerin daha hızlı çalışmasını gerektirir (tüm hikaye değil, etkiyi göstermesi yeterlidir). Listeleri yerel olarak çalıştırmak için dinamik değişen donanım oluşturma imkanı yoktur, bu nedenle bunlar bitişik bellekte saklanır. Bazı formların dizi gösterimine sadık kalırız. Harita için sıralı olmayan bir ortamda çalıştırmak - Reduceron'a geri dönüyoruz. Ardışık talimatlar için bir merkezi işlem ve paralel işleme desteği.

Farklı olan, birden fazla işlevi yükleme ve bunları çerçeveler hokkabazlık olmadan çalıştırma olasılığıdır - ancak işlevler için birden fazla birim eklemek, belleğe erişmede karışıklık yaratacaktır.

Diz cevabına ek olarak GC, yardımcı işlemci olarak çalışmak için faydalı olacaktır, çok düzgün bir özellik olacaktır.

1: PilGRIM, Boeijink A., Hölzenspies PKF, Kuper J. (2011) ' de düzgün bir şekilde tanımlanmıştır . In: Hage J., Morazán MT (eds) Fonksiyonel Dillerin Uygulanması ve Uygulanması. IFL 2010. Bilgisayar Biliminde Ders Notları, cilt 6647. Springer, Berlin, Heidelberg .


"Özyinelemeyi yerel yapma olanağı yoktur". Bunun neden olduğunu açıklayabilir misiniz? İlk başta benim için şaşırtıcı görünüyor.
user56834

Ayrıca, redüktör bir fpga üzerinde çalışmak yerine sert bir işlemci olabilir mi?
user56834

Benim kötüm, yerel özyineleme demek istedim , ama alakasız. Biraz gözden geçirmem gerekiyor.
Kötülük

0

İlk olarak bir şaka:% 100 fonksiyonel bir program çalıştırmak asla yararlı bir şey yapamaz, sadece bir NOP talimatına sahip olmak yeterli olacaktır. (Bunu alev savaşları için açıyorum).

Bu nedenle, ES için bazı zorunlu talimatlar ve zorunlu programlama için olağan destek olması gerekecektir.

Aksi takdirde kısmen kullanılan gerçek dile bağlıdır. Aklımdaki iki kişi Haskell ve Erlang.

Haskell'in listeler ve haritalar için destek sağlayabileceğine inanıyorum. Bir liste, belirli bir donanım bellek eşlemeleri tarafından desteklenebilir ve bağlantılı listeyi ardışık bir adres grubuna dönüştürür. İlk öğe adres n'de, ikincisi adres n + 1'de vb. Olabilir. İlk öğeyi listeden kaldırmak için n işaretçisini değiştirmeniz yeterlidir. Son olarak, n işaretçisini sildiğinizde tüm bellek serbest bırakılabilir. Haritalar ilişkilendirilebilir diziler olarak desteklenebilir - arama değerini girin ve bellek sistemi öğeyi döndürür. Yinelemeli aramalara gerek yoktur.

Erlang da mesajların / süreçlerin desteklenmesinden ve tam durumla kuyruk yinelemesinden yararlanabilir. Mesajlar ve işlemler çeşitli şekillerde desteklenebilir, bir örnek son derece büyük miktarda işlem çekirdeğine sahip olabilir. Kuyruk yinelemesi, durumun çok daha hızlı kopyalanmasına izin veren, belki de büyük veri yığınlarını kopyalamayan, bunun yerine sadece bellek sistemi işaretleyicilerini değiştiren bir bellek denetleyicisi tarafından geliştirilebilir.

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.