Her fonksiyon çağrısı / bloğunun ayrı bir iş parçacığında yapıldığı programlama dili? [kapalı]


26

Şu anda eğlence için bir programlama dili yaratıyorum; burada her işlev çağrısı / yeni blok (eğer cümle, döngüler vb.) Ayrı bir iş parçacığında çalışacak. Yeni Konular oluşturmak yerine, standart bunu otomatik olarak yapmalı ve ana iş parçacığında çalışmasını istiyorsanız, bunu belirtmeniz gerekir.

Çok iş parçacıklı, paralel programlama hakkında bilgim yok ama temelleri biliyorum (Gelecekler, güvenli iş nesneleri). Bu nedenle, böyle bir dilin sözdizimini nasıl akıllıca göründüğünü ve hatta başlaması mümkün mü diye merak ediyorum. Amaç “yararlı” kılmak değil, eğlencesi ve öğrenme deneyimi için daha fazla.

(Göndermek için yanlış bir yer burası için üzgünüm. Eğer öyleyse, beni benim gibi bir soruya izin verilen doğru yere yönlendirirseniz sevinirim.


17
Konu oluşturmak basittir. Çok iş parçacıklı işin püf noktası, birbirleriyle konuşmak veya aynı kaynaklarla çalışmak zorunda olmalarıdır. Başka bir deyişle, bu zor çatal değil, birleşimlerdir. Çözmeniz gereken temel problem bunu nasıl kontrol ettiğinizdir.
JimmyJames

20
IMO, bunu "işlev" kelimesinin veya "iş parçacığı" kelimesinin genel tanımını ciddiye almadan yapamazsınız. Zaten onlara aşina değilseniz aktörler hakkında okumak isteyebilirsiniz : en.wikipedia.org/wiki/Actor_model
Solomon Yavaş

9
Yeterince iyi not alın ve yazılım geliştiriciye herhangi bir ek yük getirmeden CPU'ların talimatları otomatik olarak paralel hale getirdiğini fark edeceksiniz. Bkz . Sıra Dışı İcra ve Superscalar İşlemci .
8,

8
Bu aslında biraz korkunç geliyor. Nedenini açıklayacaktım ama Karl Bielefeldt zaten yaptı.
Mason Wheeler

1
Dilinizde ne tür bir paradigma desteklemek istiyorsunuz? Zorunlu mu yoksa işlevsel mi olmalı? Tüm ifadelerin aynı anda uygulanacağını mı söylüyorsunuz - o zaman / else-bloklar onlardan sonra gelenlerle birlikte mi?
Bergi

Yanıtlar:


39

Her işlev çağrısı / yeni blok (eğer cümle, döngüler vb.) ayrı bir dizide çalışacaktır.

Hakkında çok şey Devamı devamından ve devamı-geçen tarzda (ve iş parçacığı veya değiş tokuş eden kavramlar ile ilişkisi) Okumayı önermek SICP & Lisp küçük parçalara . Ayrıca, Programlama Dili Pragmatik birkaç dilde yararlı bir genel bakış sunar ve kendi dilinizi tasarlamanıza yardımcı olur.

Bu nedenle, böyle bir dilin sözdiziminde nasıl akıllıca görünebileceğini merak ediyorum.

Sözdizimi fikirleri keşfetmek için çok önemli değil . Anlambilim çok daha önemli. İlk önce S-expr gibi bir sözdizimi ( benimsemeye göre Scheme ve çağrı / cc kullanarak prototip yapabileceksin ).

Fikirleriniz daha açık olduktan sonra (bazı deneylerden sonra), onları en üst düzey lambda üzerinde tartışabilir , daha seksi bir sözdizimi tanımlayabilirsiniz (insanların dilinizi benimsemesini istiyorsanız gerçekten önemli olan şey; Uygulama, ücretsiz bir yazılım örneği uygulaması, dokümantasyon, standart kütüphane, yabancı fonksiyon arayüzü vb.)


25
Neden sözdiziminin alakasız olduğunu belirtmek için + 1. Başka bir + 1 sözdiziminin neden çok önemli olduğunu açıklayabilseydim.
Jörg W Mittag

İyi bir öneri, ancak LtU’daki şeyleri tartışmak için bir hesap istersiniz ve deneyimimden bir tane almak önemsiz değil.
Mael

1
Yükü azaltmak için bir iplik havuzu kullanmalısınız. en.wikipedia.org/wiki/Thread_pool
shawnhcorey

37

Haskell'e paralel veri araştırmaları hakkında bilgi edinmek isteyebilirsiniz . YouTube'da arama yaparsanız, Simon Peyton Jones da konuyla ilgili bazı ilginç görüşmelerde bulundu.

Konuşmalarından doğru hatırlıyorsam, saf işlevsel programlamada, konu oluşturma fırsatları bulmak neredeyse önemsizdir. Onun Araştırma Onun asıl sorun yaşıyor çok çok konuları oluşturma ve bunların sonuçlarını iletişim havai esasen paralellik faydalarını ağır basar, öyle ki, kısa ömürlü olduğunu. Örneğin, bir işleyiciyi sum $ fmap (+1) <100 length vector>, hesaplamak için 100 iş parçacığını döndürmeyi öğretmek kolaydır , ancak ek yükü buna değecek mi?

Bu durumda püf noktası, manuel olarak belirtmek üzere programlayıcıya bir yük getirmeden, konuları faydalı boyutlarda birleştiriyor. Gelecekteki bilgisayarları binlerce çekirdekli bilgisayarları etkin bir şekilde kullanmak için kırılması gereken zor bir problem.


8
Sadece yüzlerce çekirdekli eski moda bir PC ile çalışmaktan mutlu olurum ...
Hagen von Eitzen

8
Çok fazla veri-paralel tasarım için çok etkili bir şekilde çok fazla paralelleştirme yaptığımıza dikkat çekerim: GPU'lar aslında 200-1000 çekirdek makinelidir (hatta kendi hafıza hiyerarşilerine sahiptirler).
Delioth

4
@HagenvonEitzen: Azul Vega JCA'nın (Java Compute Appliance) toplamda 864 çekirdeği olmak üzere her biri 54 çekirdeği olan 16 CPU'su vardı ve bu bir araştırma seviyesi ya da prototip makinesi değil, gerçek bir ürün değildi. Ayrıca tüm bir binayı veya hatta bütün bir odayı doldurmadı, masa başı boyutunda bir cihazdı. Ve 9 yıl önce mevcuttu. GPU'lardan zaten bahsedilmişti, ancak bu 864 genel amaçlı CPU çekirdeğine sahip bir makineydi .
Jörg W Mittag

3
Elbette, bir sebebi var bu devasa çok çekirdekli işlemci masaüstü var artık bu büyük veri-paralel GPU bugün var, ama. İlki ticari olarak uygulanabilir, ikincisi değildir ve bunun nedeni onları verimli bir şekilde programlayamadığınızdır.
MSalters

@ MSalters belki de sadece sonsuz sayıda maymuna ihtiyacımız var? Veya, her adımda mümkün olan her işlemi basitçe yapan Quantum programları?

15

Bu tam olarak Erlang'ın yaptığı şey. Dişleri birleştirmeyi çoğunlukla kuyruklar kullanarak işler. Mükemmel bir konsepttir, ancak arkaplanınız daha prosedürel tipte dillerse, başlangıçta başınızı sarmak biraz zordur. İçine bakarak tavsiye ederim.


4

Öncelikle , eşzamanlı bir algoritmayı tanımlamak için kullanılan bir dil olan PROMELA'ya bakmanızı tavsiye ederim , böylece bir model denetleyicisi , olası tüm davranışları yanlış davranış yapamadığını doğrulamak için zorlayabilir. (Eşzamanlı programlama doğru yapmak zor , bu yüzden böyle doğrulama teknikleri önemlidir.) Bütün yapıları ayrı ayrı dizgelerde çalıştırmaz, fakat oldukça tuhaf sözdizimi ve anlambilim vardır çünkü odak noktası eşzamanlı programların belirsizlikçiliğidir .

Daha soyut, π-matematik , paralel hesaplamayı modellemek için güzel bir yaklaşımdır. Communicating and Mobile Systems: The Pi Calculus adlı kitabı Robin Milner'den almadıysanız , kafanızı bulmak zor . Paralel hesaplama hakkında daha geniş bir anlamda "paylaşılan belleğe erişen çoklu iş parçacıkları" düşünmeme yardımcı oldu. Koşullu ifadelerin, “gotos” ve benzerlerinin daha basit, doğal olarak paralel ilkellerden nasıl inşa edilebileceği oldukça ilginçtir.

Sözdizimi ile ilgili olarak ... Bunu çözmenin en iyi yolu, bazı örnek programlar yazmaktır. Bir diziyi sıralamak veya aynı anda birkaç sunucuya ping atmak ve hangisinin en hızlı yanıt verdiğini bildirmek için bir program yazın veya paralel veya hiç değilse bir labirent çözmeye çalışın. Bunu yaparken söz diziminizde eksik olan şeyler görünecek ve bunları ekleyebilirsiniz. Birkaç şey ekledikten sonra, ortak bir şeyleri olup olmadığını kendinize sorun ve eğer öyleyse, belki birden çok amaca hizmet edebilecek daha basit bir yaklaşım bulabilirsiniz.


4

Geçmişte benzer projeler denenmiştir. Fikirleri yağmalamak için klasiklerle ilgili kitap okumayı öneririm. (Tüm bağlantılar Vikipedi’ye gider)

  • Birlik Bu dil paralel programlamayı öğretmek için kullanılmış / kullanılmıştır. Aslında uygulandığını sanmıyorum. Sözdizimi biraz şifrelidir, ancak temelde bilinmeyen bir sırada yapılan ve yapılacak daha fazla bir şey olmadıkça tekrarlayan ifadeler koleksiyonunuz vardır. Bu istediğin şeye en yakın.

  • Occam Bu dil aslında kullanmak için tasarlanmıştı, ancak gerçekten yakalanmadı. Burada PAR anahtar kelimesi var, bu da ifadelerin bir listesinin paralel olarak yürütülmesi gerektiği anlamına geliyor.

  • Erlang Başka bir gerçek dünya dili. Bu bir telekom şirketi Ericsson tarafından kullanılır ve oldukça takipçisi var. Paralelliğin pratik ve kullanışlı hale getirilmesi için çok çalıştılar.

  • Google GO Bu benim en sevdiğim grubum. Kavramsal olarak Erlang ile aynı, ancak daha iyi bir sözdizimi ve arkasında Google'ın ağırlığı var. Ne yanlış gidebilir ki?

Bir uyarı ile kapatmak istiyorum: Paralelliğin doğru olması çok zor. Modern programlardaki çoğu hata onu yanlış anlamanın sonucudur . Oraya gitmek istediğinden emin misin?


Listemde olmayan herhangi bir dile yönelik hiçbir suç. Sadece bilgim sınırlı.
Stig Hemmer

3

Mümkün olmakla birlikte, tüm düşünceli uygulamaların% 99 + 'ı için faydalı olmayacaktır. Mantık, tipik grup dizisine bağlıdır, bir akıştır. Adım adım bir soruna bir çözüme ulaşırsınız ve adımların sırası önemlidir, çünkü çoğunlukla bir adımın çıktısı bir sonraki için girdi olacaktır.

Birkaç durumda, birbirinden bağımsız olarak yapılabilecek birçok işiniz vardır, bunların paralel olarak çalışmasına izin vermeden önce sırayla ayarlamak genellikle ucuzdur.

Bu yüzden, zamanınızın en sevdiğiniz programlama dilinde çoklu iş parçacığı özelliklerini nasıl kullanacağınızı öğrenmek için harcanacağını düşünüyorum.


5
Bu, farklı bir soruya mükemmel bir cevaptır; OP, böyle bir programın bilgeliğini değil, sadece yapılıp yapamayacağını ve "sözdiziminin" neye benzeyeceğini soruyor.
DepressedDaniel

9
Bunu istemeyenlerin en çok bilgeliğime ihtiyacı var. Birisi bir alışveriş sepetindeki bir tepeye inmek mümkün olup olmadığını sorarsa, en iyi cevap "Bahse girerim! Onları yağladığınızdan emin olun!" Daha çok "Peki, evet, ama ..." gibi olurdu.
Martin Maat

Bana eski EIAO montaj dili talimatını hatırlatıyor - Herhangi Bir Sırayla Yürüt . (Her neyse, herhangi bir Anahtar nerede?)

@MartinMaat hiç kimse eğlence için bir programlama dili yazarak kendilerini öldürmeyecek
user253751

2

Clojure bazı fikirlere bakmaya değer olabilir.

http://clojure-doc.org/articles/language/concurrency_and_parallelism.html

İşte bazı düşünceler: Bir görevden bağımsız olarak gerçekleştirilebilecek bir hesaplama birimini çağırırsak: 1. Görevler bağımsızdır, bu yüzden aynı anda çalıştırılabilir. 2. Farklı görevler farklı kaynaklar gerektirir ve çalışmak için farklı zamanlar alır. Bu nedenle görevler zamanlanmalıdır. Maksimum verim için 4. Programlayıcı olarak görev yapacak tek program işletim sistemidir.

Büyük merkezi dağıtım elma gibi şeyler böyle bir zamanlayıcı sağlamak için bir girişimdir.

Yukarıdakiler, görevleri yerine getirme sorumluluğunun zorunlu olarak programlama dilinin sorumluluğu olmadığı anlamına gelir.

İkinci bir düşünce, paralel sistemlerin programlama yükünü mümkün olduğunca azaltmaktır. Bunu yapmanın tek yolu programdan nasıl bir şey yapılacağına dair herhangi bir şartnameyi kaldırmaktır. Bir program sadece ne yapılması gerektiğini belirtmeli ve gerisi otomatik olarak gerçekleşmelidir.

Yukarıdakiler muhtemelen, dinamik dillerin ve tam zamanında derlemenin yoludur.


2

Aradığın örtük paralellik olarak adlandırılır ve Sun / Oracle'ın Kalesi gibi bu kavramı araştıran diller vardır . Diğer şeylerin yanı sıra, (potansiyel olarak) paralellikte döngüler çalışır.

Ne yazık ki, sonlandırıldı ve çok fazla ölü bağlantı var, ancak yeterince zorluyorsanız, hala etrafta kayan birkaç PDF bulabilirsiniz.

https://www.eecis.udel.edu/~cavazos/cisc879-spring2008/papers/fortress.pdf (dile özgü)

http://stephane.ducasse.free.fr/Teaching/CoursAnnecy/0506-Master/ForPresentations/Fortress-PLDITutorialSlides9Jun2006.pdf

http://www.oracle.com/technetwork/systems/ts-5206-159453.pdf

http://dl.acm.org/citation.cfm?id=1122972 (ödeme duvarı)

Dikkat edilmesi gereken, genellikle her ifade / ifade için gerçek bir iş parçacığı başlatmak istemeyeceğinizdir, çünkü iş parçacığı oluşturmak ve başlatmak pahalıya mal olur - bunun yerine, yapmanız gereken iş parçalarını gönderdiğiniz iş parçacığı havuzunuz olur. . Ama bu bir uygulama detayı.


1
Kaleyi savunmak için +1 ... Dil fikrini çok beğendim. Gelişimin sona
erdiğini

2

Böyle bir programlama dili olmasa da, VHDL'ye bir göz atmalısınız . Özellikle seri olarak yapmasını söylemediğiniz sürece doğal olarak her şeyi paralel yapan dijital devreyi tanımlamak için kullanılır. Hem dilinizi nasıl tasarlayabileceğiniz, hem de ne tür bir mantık için uygun olabileceği konusunda size bazı fikirler verebilir.


0

Bu, C ++ 'ta oldukça kolay bir şekilde simüle edilebilir. Sadece "every" * işlev çağrısının a tarafından gerçekleştirildiğinden emin olun std::future. Geri dönüş değerinin kullanımı basitçe .get()geleceği arayarak yapılır .

Bu nedenle, C ++ 'ı derleyerek dilinizi prototipleyebilirsiniz. Bu ayrıca bize sözdiziminin nasıl görüneceğini de söyler: temel fark, çağrı noktasını (giriş argümanlarının bulunduğu yer) dönüş noktasından (fonksiyon çıkışının kullanıldığı) ayırmanızdır.

(*) "Her fonksiyon" diyorum ama bir fonksiyon olarak sayılan size kalmış. Mı memsetözgü bir ya da işlev? Tam sayıların atanması veya kullanıcı tanımlı türlerin atanması bir işlev çağrısı mı?


Ve, yeterince uzun bir soruya cevap vermeyi ertelerseniz, genellikle bir cevap ihtiyacı gider. Bence buna "Tembel Varlık" deniyor.
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.