Parasail (programlama dili) - ParaSail (programming language)

Parasail
Parasail Programlama Language.jpg için logo
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 ; 9 yıl önce ( 2009 )
Kararlı sürüm
7.0 / 2 Kasım 2016 ; 2 yıl önce ( 2016/11/2 )
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 .org
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.

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