Yığın tabanlı bir programlama dilinin eşzamanlı olması mümkün müdür?


14

FORTH ve Cat gibi yığın tabanlı programlama dilleri hakkında okuyordum ve doğası göz önüne alındığında, paradigmalarına bakılmaksızın bir seferde sadece bir eylem gerçekleştirebilecekleri anlaşılıyor (Cat işlevselken FORTH zorunludur).

Zorunlu bir dil yığını değiştirir ve Joy gibi tamamen işlevsel bir dil yeni bir yığın döndürür, ama asıl nokta aynı anda yalnızca bir yığının kullanılmasıdır.

Peki, yığın tabanlı programlama dilleri eşzamanlı olabilir mi? Aynı anda birden fazla yığın veya benzer bir şey kullanarak eşzamanlılık elde edebilirler mi?

Tembel değerlendirmeyi yığın tabanlı bir programlama dilinde uygulamak mümkün müdür?

Yukarıda belirtilen diller ve kavramlar hakkında yanlış bir şey anlıyorsam lütfen beni düzeltin


5
Herhangi bir zorunlu dil aynı anda nasıl olabilir ?
Bergi


Gerçekten eşzamanlılık (başarmak o kadar zor değil, sadece bağımsız yığınlarla ve paylaşılan bellekle çalışan birden çok iş parçacığı kullanın) veya paralellik mi demek istiyorsun?
Daniel Jour

@DanielJour iyi anlarsam, eşzamanlılık eşzamanlı yürütme anlamına gelirken eşzamanlılık bağımsız yürütme anlamına gelir, yani, evet, eşzamanlılık anlamına gelir. Her bir iş parçacığı için bağımsız yığınlar hakkında daha fazla bilgi verebilir misiniz?
Armando H.

Yanıtlar:


16

Peki, yığın tabanlı programlama dilleri eşzamanlı olabilir mi?

Elbette.

Aynı anda birden fazla yığın veya benzer bir şey kullanarak eşzamanlılık sağlayabilirler mi?

Zaten normal diller için çoklu iş parçacığı genellikle birden çok "çağrı" yığınına sahip olmak anlamına gelir. Her iş parçacığına kendi veri yığınını vermek tamamen doğal olacaktır. Diyelim ki vücudu yığın tabanlı bir dilde kodla uygulanan bir aktöre sahip olmak basit olurdu. Açık bir paralellik ve la GHC'nin parek açıklamaları makul derecede açık olmalıdır. Bir şeyleri paralel olarak yürütmeyle ilgili temel sorun, kodu yürütene kadar kodun yığın efektinin ne olacağını bilmemenizdir. Ancak, Joy benzeri bir sözdizimi kullanarak, [a b c] paryürütme olarak düşünülebilira b cboş bir yığına veya yığının bir kopyasına karşı ve yığının yalnızca en üstteki öğesini tamamlanmaya devam eder (veya yığın boşsa kukla bir değer iter). Varyasyonları hayal edebilirsiniz. Örtülü paralellik, saf işlevsel bir dile kıyasla safça yapmak daha zor olurdu, ama kesinlikle da yapılabilir. Kullanıcı tanımlı bir birleştiricinin derlenmiş kodu genellikle "normal" koddan çok farklı değildir.

Tembel değerlendirmeyi yığın tabanlı bir programlama dilinde uygulamak mümkün müdür?

Bilinmeyen yığın efektleri yine zor kısımlardır. Dili tüm yığın efektlerinin statik olarak belirlenebileceği şekilde tasarlarsanız, o zaman çok zor görünmüyor. Eğer tembellik açıksa, o zaman nispeten basit görünüyor ve Joy'un alıntılarına kabaca benziyor ve i. Bir dil kendisini çağıran bir tembel birleştirmeli dil Ne söyleyebilirim yukarıdaki yaklaşımların her ikisinin bir karışımını yapmak gibi görünüyor. En azından belirsiz bir şekilde kullanılabilir olmayan bir şekilde, dinamik yığın efektleri karşısında dolaylı olarak tembel bir birleştirici dilin nasıl çalışacağını gerçekten görmüyorum, ancak bu sadece benim tarafımda hayal gücü eksikliği olabilir.

Bu arada, yığın tabanlı dillerin çoklu yığınlara sahip olması nadir değildir, örneğin Forth, üzerine rastgele veriler yerleştirebileceğiniz bir veri yığınına ve bir dönüş yığınına sahiptir.


8

FORTH hakkında biraz biliyorum, bu yüzden kendimi bununla sınırlayacağım. Programcı olarak tüm donanım kaynaklarına erişmenizi sağlayan düşük seviyeli bir dildir. Böylece ne istersen yapabilirsin.

eşzamanlılık

Parallell programlara sahip olmak için (edit: gerçek eşzamanlı programları söylemek için kullanılır) en az iki yürütme birimine (CPU) ihtiyacınız vardır. Örneğin, "bu sözcüğü bu iki argümanı kullanarak işlemci 2'de çalıştır" diyerek FORTH'da bir kelime uygulamak oldukça önemsiz olacaktır. Sözcük, işlemci 2'ye gereken iki yığını ayıracak ve sözcüğü çalıştırmaya başlayacaktır. Kendinizi bu programda hangi yapıları kullanabileceğinizle sınırlamanız gerekir.

Eşzamanlı programların sayısı yürütme birimi sayısından fazla ise "sözde parallell" programları için gidersiniz. Temel olarak bunu yapmanın iki yolu vardır: coroutines veya önleyici çoklu görev. Her durumda bunu başarmak mümkündür (kolay değil, ancak literatürde iyi tanımlanmıştır) ve FORTH, ihtiyacınız olan tüm düşük seviyeli şeylere erişmenizi sağlar.

Tembel değerlendirme

Tabii ki bunu herhangi bir programlama dilinde olduğu gibi FORTH'da da yapabilirsiniz. Haskell dediği kadar zarif ya da "yerleşik" olmayacak. Çok naif bir örnek kullanacağım.

Fikir, bir şeyler kümesi döndüren bir "işlev" (burada gevşek kullanılır) tanımlamanızdır. Örnek olarak tüm tamsayıları döndüren bir işlev verilebilir. Daha sonra bu sette işlemler yaparsınız ve işiniz bittiğinde sonucu verir. Örneğin, toplam 1000'den büyük olana kadar tüm tamsayıları toplamak isteyebilirsiniz. Tembel olmayan bir değerlendirme ilk olarak tüm tamsayıları bir küme olarak atayacaktır, bu sonsuz sayıda tamsayı olduğu için imkansızdır. Daha sonra bu set üzerinde çalışmaya başlayacaktı. Tembel bir uygulamanın "sette bir sonraki değeri ver" yolu vardır. Bu gerçekten funktion "son değer vermek" bir değişken gerekir.

Haskell işleri bu şekilde yapar. Tabii ki daha karmaşık durumları ele alıyor ama fikir aynı. Değerlendirmeyi, bir programcı olarak, nasıl çözüleceğine değil, probleme konsantre olmanıza izin verecek şekilde şekillendirir.


4
"Gerçek eşzamanlı programlara sahip olmak için en az iki yürütme birimine ihtiyacınız var". Bu sadece bir uygulama sorunudur. Programlama dili açısından bakıldığında, tek bir CPU veya iki CPU üzerinde çalışan iki iş parçacığı arasında neredeyse hiçbir fark yoktur. Bir anlamda, her iş parçacığı kendi başına bir 'yürütme birimi' olarak düşünülebilir.
Ayrık kertenkele

1
Bazen, uygulama ayrıntıları dikkate alınmalıdır. Bunun bir örneği, gerçek bir bilgisayar dışındaki gerçek dünyayla arayüz oluştururken verilebilir. Gerçek zamanlı olarak, "doğru cevap çok geç yanlış" ifadesine göre, iki exekution ünitesinde çalışmayı bir ünitede karışmış çalışmayla karşılaştırdığınızda zamanlama farklı olabilir.
ghellquist

Bazen yaparız. Ancak bunun böyle bir durum olduğundan şüpheliyim. Örneğin, soru gerçek zamanlı zamanlama gereksinimlerinden bahsetmez.
Ayrık kertenkele

3
"Eşzamanlılık"! = "Paralellik". Tek işlemcili bir makinede çalışan birden çok iş parçacığının, paralel işlem yapılmasa bile, birbiriyle eşzamanlı çalıştığı söylenebilir.
Solomon Slow

Eşzamanlılık ile paralellerin karşılaştırılması. Metni değiştireceğim.
ghellquist
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.