Parasail (linguagem de programação) - ParaSail (programming language)
Logo desenhado por Abouzar Abbasi
| |
Paradigma | compilado , em simultâneo , imperativo , estruturada , orientada a objeto |
---|---|
Projetado por | S. Tucker Taft |
Desenvolvedor | AdaCore |
Apareceu pela primeira vez | 2009 |
Versão estável | 7,0 / 02 de novembro de 2016
|
disciplina Typing | forte , estática |
Plataforma | x86 |
OS | Linux , OS X , o Windows |
Licença | GPL v3 |
extensões de arquivo | .psi, .psl |
Local na rede Internet | parasailing-lang |
grandes implementações | |
psli, PSLC | |
Influenciado por | |
Modula , Ada , Pascal , ML |
Especificação paralelo e implementação da linguagem ( Parasail ) é uma orientada a objeto linguagem de programação paralela . Sua implementação de design e em curso é descrita em um blog e em seu site oficial.
Parasail usa um ponteiro modelo de programação -livre, onde objetos podem aumentar e diminuir, e semântica de valor são usadas para atribuição. Não tem nenhuma mundial lixo coletado heap. Em vez disso, o gerenciamento de memória baseada em região é usado por toda parte. Tipos pode ser recursiva, desde que os componentes recursiva são declarados opcional . Não há variáveis globais, nenhum parâmetro aliasing, e todas as subexpressões de uma expressão pode ser avaliada em paralelo. Afirmações , condições prévias , as pós , invariantes classe , etc., são parte da sintaxe padrão, usando um Hoare notação -como. Quaisquer possíveis condições de corrida são detectados em tempo de compilação .
projeto inicial do parasail começou em setembro de 2009, por S. Tucker Taft.
Tanto um intérprete usando o parasail máquina virtual , e um LLVM baseados Parasail compilador estão disponíveis. Roubo de trabalho é usado para agendar leves do parasail tópicos . A última versão pode ser baixado do site da parasail.
metas
objetivos Parasail:
- Pervasive, suporte seguro para paralelismo implícito e explícito.
- Em tempo de compilação execução das afirmações, pré-condições, pós-condições e invariantes de classe.
- Eficiente, gestão de armazenamento baseado em região livre de ponteiro.
- Familiar classe-e-interface baseada em modelo de programação orientada a objetos.
Descrição
A sintaxe de Parasail é semelhante ao Modula , mas com um modelo de programação orientada a objetos com base na classe-e-interface mais semelhante ao Java ou C # .
Mais recentemente, as construções paralelas de parasail foram adaptados para outras sintaxes, para produzir Java -como, Python -como, e Ada -como linguagens paralelas , apelidado de, respectivamente, Javallel, Parython e Sparkel (nomeado após o subconjunto Ada SPARK em que se baseia). Compiladores e intérpretes para línguas estão incluídos com a implementação parasail.
Exemplos
O seguinte é um programa mundial Olá em Parasail:
func Hello_World(var IO) is
IO.Println("Hello, World");
end func Hello_World;
O seguinte é uma interface para um módulo básico mapa:
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;
Aqui está uma possível implementação deste módulo mapa, usando uma árvore binária:
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;
Aqui está um programa de teste simples para o módulo bmap:
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;
artigos
Artigos sobre Parasail têm aparecido em vários fóruns:
- Graham-Rowe, Duncan (28 de Julho de 2011). "New linguagem para programação em paralelo" . Technology Review . MIT.
- Clarke, Peter (28 de Julho de 2011). "SofCheck prepara linguagem paralela Parasail" . EETimes . UBM Electronics.
- Taft, S. Tucker (9 de Junho de 2012). "Parasail: Menos é mais com multicore" . EETimes . UBM Electronics.
- Selwood, Dick (18 de Julho de 2012). "O mundo precisa de uma nova linguagem de programação?" . EEJournal . media Techfocus, inc.
Referências
links externos