Parasail (programlama dili) - ParaSail (programming language)
Abouzar Abbasi tarafından tasarlanan Logo
| |
paradigma | derlenmiş , eşzamanlı , zorunluluk , yapılandırılmış , nesne yönelimli |
---|---|
Tarafından dizayn edilmiştir | S. Tucker Taft |
Geliştirici | AdaCore |
İlk göründü | 2009 |
Kararlı sürüm | 7.0 / 2 Kasım 2016
|
Yazma disiplin | Güçlü , statik |
platform | x86 |
işletim sistemi | Linux , OS X , , Windows |
Lisans | GPL v3 |
Dosya adı uzantıları | HJ, .psl |
Web sitesi | parasail-lang |
Başlıca uygulamalar | |
psli, PSLC | |
Tarafından etkilenmiş | |
Modula , Ada , Pascal , ML |
Paralel Şartname ve Uygulama Dili ( Parasail ) bir olan nesne yönelimli paralel programlama dili . Tasarımı ve devam eden uygulaması blog ve resmi internet sitesinde açıklanmıştır.
Parasail bir kullanan işaretçi -ücretsiz programlama modeli, nesneleri büyüyecek ve küçültmek ve değer semantik atama için kullanılır olabilir. Hiçbir küresel sahiptir çöp toplanan yığın. Bunun yerine, bölge tabanlı bellek yönetimi boyunca kullanılır. Türleri kadar uzun özyinelemeli bileşenleri ilan olarak, özyinelemeli olabilir isteğe bağlı . Paralel olarak değerlendirilebilir hiçbir küresel değişkenler, hiçbir parametre örtüşme ve bir ifadenin tüm alt ifadelere vardır. İddialar , ön koşullar , Hedefşartlar , sınıf değişmezleri , vb bir kullanarak, standart sözdizimi parçası olan Hoare benzeri gösterimi. Herhangi olası yarış koşulları tespit edilir derleme zamanında .
Parasail Başlangıç tasarım S. Tucker Taft tarafından Eylül 2009'da başladı.
Hem bir tercüman Parasail kullanarak sanal makine ve bir LLVM Parasail tabanlı derleyici mevcuttur. Çalışma çalma Parasail en hafif zamanlama kullanılır konuları . En son sürüm Parasail web sitesinden indirilebilir.
içindekiler
Hedefleri
Parasail hedefler:
- Örtülü ve açık paralellik için Yaygın, güvenli desteği.
- Derleme zamanı iddiaların önkoşullarınız, Hedefşartlar ve sınıf değişmezler uygulanmasını.
- Verimli, işaretçi içermeyen bölge tabanlı depolama yönetimi.
- Yazın nesne yönelimli bir programlama modeli, sınıf ve arayüz tabanlı.
Açıklama
Sözdizimi Parasail benzer Modula , ancak daha benzer bir sınıf ve arayüz tabanlı nesne yönelimli programlama modeli ile Java veya C # .
Daha yakın zamanlarda, Parasail paralel yapılar üretmek için diğer sözdizimlerinin, adapte edilmiş Java benzeri, Python -like ve Ada benzeri paralel dilleri sırasıyla Javallel, Parython ve Sparkel (Ada alt kümesi adını lakaplı, SPARK üzerinde Bu esas teşkil eden). Bu diller için Derleyiciler ve tercümanlar Parasail uygulaması ile dahil edilmiştir.
Örnekler
Bir aşağıdaki Merhaba dünya programı Parasail içinde:
func Hello_World(var IO) is
IO.Println("Hello, World");
end func Hello_World;
Aşağıdaki temel harita modülüne bir arayüz:
interface BMap<Key_Type is Ordered<>; Element_Type is Assignable<>> is
op "[]"() -> BMap; // Create an empty map
func Insert(var BMap; Key : Key_Type; Value : Element_Type);
func Find(BMap; Key : Key_Type) -> optional Element_Type;
func Delete(var BMap; Key : Key_Type);
func Count(BMap) -> Univ_Integer;
end interface BMap;
İşte ikili ağacını kullanarak bu haritanın modülünün olası uygulama şöyledir:
class BMap is
interface Binary_Node<> is
// A simple "concrete" binary node module
var Left : optional Binary_Node;
var Right : optional Binary_Node;
const Key : Key_Type;
var Value : optional Element_Type; // null means deleted
end interface Binary_Node;
var Tree : optional Binary_Node;
var Count := 0;
exports
op "[]"() -> BMap is // Create an empty map
return (Tree => null, Count => 0);
end op "[]";
func Insert(var BMap; Key : Key_Type; Value : Element_Type) is
// Search for Key, overwrite if found, insert new node if not
for M => BMap.Tree loop
if M is null then
// Not already in the map; add it
M := (Key => Key, Value => Value, Left => null, Right => null);
BMap.Count += 1;
else
case Key =? M.Key of
[#less] =>
continue loop with M.Left;
[#greater] =>
continue loop with M.Right;
[#equal] =>
// Key is already in the map;
// bump count if Value was null;
if M.Value is null then
BMap.Count += 1;
end if;
// in any case overwrite the Value field
M.Value := Value;
return;
end case;
end if;
end loop;
end func Insert;
func Find(BMap; Key : Key_Type) -> optional Element_Type is
// Search for Key, return associated Value if present, or null otherwise
for M => BMap.Tree while M not null loop
case Key =? M.Key of
[#less] =>
continue loop with M.Left;
[#greater] =>
continue loop with M.Right;
[#equal] =>
// Found it; return the value
return M.Value;
end case;
end loop;
// Not found in BMap
return null;
end func Find;
func Delete(var BMap; Key : Key_Type) is
// Search for Key; delete associated node if found
for M => BMap.Tree while M not null loop
case Key =? M.Key of
[#less] =>
continue loop with M.Left;
[#greater] =>
continue loop with M.Right;
[#equal] =>
// Found it; if at most one subtree is non-null, overwrite
// it; otherwise, set its value field to null
// (to avoid a more complex re-balancing).
if M.Left is null then
// Move right subtree into M
M <== M.Right;
elsif M.Right is null then
// Move left subtree into M
M <== M.Left;
else
// Cannot immediately reclaim node;
// set value field to null instead.
M.Value := null;
end if;
// Decrement count
BMap.Count -= 1;
end case;
end loop;
// Not found in the map
end func Delete;
func Count(BMap) -> Univ_Integer is
// Return count of number of items in map
return BMap.Count;
end func Count;
end class BMap;
İşte BMAP modülü için basit bir test programı:
import PSL::Core::Random;
import BMap;
func Test_BMap(Num : Univ_Integer; Seed : Univ_Integer) is
// Test the Binary-Tree-based Map
var Ran : Random := Start(Seed); // Start a random-number sequence
// Declare a map from integers to strings
var M : BMap<Key_Type => Univ_Integer, Element_Type => Univ_String>;
M := []; // Initialize the map to the empty map
for I in 1..Num*2 forward loop // Add elements to the map
const Key := Next(Ran) mod Num + 1;
const Val := "Val" | To_String(I);
Println("About to insert " | Key | " => " | Val);
Insert(M, Key, Val);
end loop;
Println("Count = " | Count(M));
for I in 1..Num loop // Search for elements in the map
const Key := Next(Ran) mod Num + 1;
Println("Looking for " | Key | ", found " | Find(M, Key));
end loop;
for I in 1..Num/3 loop // Delete some elements from the map
const Key := Next(Ran) mod Num + 1;
Println("About to delete " | Key);
Delete(M, Key);
end loop;
Println("Count = " | Count(M));
for I in 1..Num forward loop // Search again for elements in the map
Println("Looking for " | I | ", found " | Find(M, I));
end loop;
end func Test_BMap;
Makaleler
Parasail ilgili makaleler çeşitli forumlarda ortaya çıkmıştır:
- Graham-Rowe, Duncan (28 Temmuz 2011). "Paralel Programlama için yeni Dili" . Teknoloji İnceleme . MİT.
- Clarke, Peter (28 Temmuz 2011). "SofCheck Parasail paralel dilini preps" . EETimes . UBM Elektronik.
- Taft, S. Tucker (9 Haziran 2012). "Parasail: Az daha çok çekirdekli ile" . EETimes . UBM Elektronik.
- Selwood Dick (18 Temmuz 2012). "Dünya yeni bir programlama dili İhtiyaç Var mı?" . EEJournal . techfocus medya, inc.
Referanslar
Dış bağlantılar