A concurrent programming language with session types

Detalhes bibliográficos
Autor(a) principal: Franco, Juliana Patrícia Vicente
Data de Publicação: 2013
Tipo de documento: Dissertação
Idioma: eng
Título da fonte: Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
Texto Completo: http://hdl.handle.net/10451/10017
Resumo: Tese de mestrado em Engenharia Informática, apresentada à Universidade de Lisboa, através da Faculdade de Ciências, 2013
id RCAP_4db112332fbe46ce78bb0178fd73e377
oai_identifier_str oai:repositorio.ul.pt:10451/10017
network_acronym_str RCAP
network_name_str Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
repository_id_str 7160
spelling A concurrent programming language with session typesTipos de sessãoConcorrênciaTipos refinadosCálculo piCanais de comunicaçãoTeses de mestrado - 2013Tese de mestrado em Engenharia Informática, apresentada à Universidade de Lisboa, através da Faculdade de Ciências, 2013Em computações concorrentes complexas onde os processos comunicam por troca de mensagens existe normalmente um elevado número de mensagens trocadas. Geralmente, estes programas são muito difíceis de implementar visto que a ordem e o tipo das mensagens enviadas e recebidas são muitas vezes alvos de erros dos programadores. Numa comunicação entre dois processos que partilham o mesmo meio de comunicação é necessário garantir que estes trocam as mensagens de forma correcta: quando um envia um valor de tipo inteiro, o outro deve estar a espera de receber um valor de tipo inteiro, quando um oferece um conjunto de opções, o outro deve estar pronto a selecionar uma dessas opções e quando um tem de terminar a sua interação nesse canal, o outro também deve terminar. Também é importante garantir a não ocorrência de condições de corrida, assegurando que durante uma comunicação entre dois intervenientes, outros não interferem. Por isso, é útil abstrair protocolos que governam as interações entre os intervenientes de uma comunicação descrevendo quando e quais são as mensagens trocadas entre eles. Temos então os tipos de sessão que descrevem as contínuas interações entre os diferentes parceiros de uma comunicação. Para definir quantos parceiros conhecem um dado canal de comunicação em qualquer ponto do programa, é possível qualificar o tipo de sessão, associado a esse canal, como linear ou partilhado. Os tipos qualificados como lineares representam extremidades de canais que apenas podem aparecer em exatamente um fio de execução, enquanto que os partilhados representam extremidades que podem ocorrer num número ilimitado de fios de execução. Deste modo podemos garantir que não existem condições de corrida, pois em situações sujeitas a tal pode-se usar tipos lineares. Mas por outro lado, se for necessário que muitos processos tenham acesso ao canal podemos usar tipos partilhados. Com vista a facilitar a programação concorrente, construímos uma nova linguagem de programação chamada SePi. Esta é uma linguagem de programação concorrente baseada no cálculo pi que usa tipos de sessão linearmente refinados para descrever as operações realizadas nos canais de comunicação. Esta linguagem concorrente, onde os processos comunicam de forma síncrona através canais bidirecionais (cada canal é definido por duas extremidades), permite que as interações entre processos sejam verificadas em tempo de compilação utilizando os tipos de sessão para descrever o tipo e a ordem das mensagens, bem como o número de processos que podem partilhar os canais. A linguagem SePi tem construtores de processos para enviar e receber uma mensagem, para representar a receção replicada, a composição paralela, com zero ou mais processos a serem executados concorrentemente, o processo condicional e a criação de novos canais definidos por duas extremidades. Os processos podem enviar mensagens de tipo inteiro, booleano, string ou extremidades de canais. Para além dos tipos primitivos, a linguagem apresenta também tipos para descrever o envio e receção de mensagens, a oferta e a seleção de opções, um tipo para representar canais onde não é possível ocorrer mais interações, tipos refinados e tipos recursivos. Por exemplo o tipo lin?boolean.lin! integer.end representa uma extremidade de um canal que recebe um valor booleano e de seguida envia um inteiro. Os tipos recursivos permitem efetuar a mesma operação, ou o mesmo conjunto de operações, no mesmo canal um número indeterminado de vezes. Os tipos refinados, uma forma de tipos dependentes, aparecem com o objetivo de especificar certas propriedades dos valores de um programa SePi anexando fórmulas a tipos. Estas fórmulas podem ser predicados não interpretados, na forma de p(v1, ..., vn), tensores na forma de A x A ou unit. Por exemplo, um cliente que queira efetuar um pagamento a uma loja utilizando o seu cartão de crédito quer ter a certeza que este é utilizado apenas uma vez e para cobrar a quantia certa. Os tipos de sessão não são suficientes para assegurar este comportamento, pois podemos garantir que a loja cobra um inteiro, mas não podemos garantir que cobra o montante exato da compra. No entanto podemos usar tipos refinados para especificar o montante que vai ser cobrado no cartão de crédito e o número de vezes que esta cobrança é feita. Um exemplo de tipos refinados é então {x:integer | charge(x , card)}. Para conseguirmos obter este comportamento, tratamos das fórmulas como se fossem recursos. Elas são introduzidas no sistema de tipos através do processo assume, passadas entre processos através dos tipos refinados e removidas através do processo assert. Existe outro conceito muito importante na nossa linguagem, a dualidade, que nos permite garantir que dois processos que partilham um canal comportam-se de forma complementar. Dizemos então que as duas extremidades de um canal têm tipos duais ou complementares. Isto é, quando uma extremidade é usada para enviar uma mensagem a outra deve ser usada para receber, quando uma é usada para selecionar uma opção então a outra tem de ser usada para oferecer um conjunto de opções. O tipo que define canais sem interação é dual dele próprio e os tipos primitivos e refinados não têm a função de dualidade definida. Por exemplo o tipo lin?boolean.lin!integer.end é dual de lin !boolean. lin?integer.end. Até agora descrevemos apenas a linguagem “base”. A versão mais recente da linguagem SePi é baseada na primeira mas apresenta mais construtores, tais como construtores derivados e abreviaturas. Como abreviaturas temos o uso opcional do qualificador linear ou o uso de um * para representar uma classe comum de tipos partilhados, o operador dualof que permite obter o tipo dual de outro, e a composição paralela de zero valores que também é opcional. Como construtores derivados dos da linguagem base, temos o envio e receção de múltiplos valores, a definição de processos (que deriva de uma criação de um novo canal seguido de uma receção replicada em paralelo com o resto do programa) e a declaração de tipos mutuamente recursivas. A linguagem SePi também apresenta expressões binárias, como as aritméticas, lógicas e relacionais, ou expressões unárias, como a negação. O nosso objetivo ao introduzir estes novos construtores é o de capturar com uma sintaxe especial, os idiomas e padrões de programação mais comuns e assim reduzir o número de linhas de código SePi e eventuais erros associados. Esta linguagem é baseada nos trabalhos de Vasconcelos e Baltazar et al. Para facilitar a programação em SePi desenvolvemos um plugin para o Eclipse de modo a permitir a validação sintática e semântica, completação e refactoring de código, bem como interpretação. Para além disso, implementamos também uma versão para a linha de comandos. A nossa implementação foi feita utilizando a framework Xtext que permite o desenvolvimento de novas linguagens de programação e plugins para o Eclipse. Sendo que o Xtext gera vários dos componentes de um compilador/interpretador, podemos dividir a nossa implementação em quatro partes: escrita da gramática, implementação de um mecanismo para verificar se todas as variáveis de um programa estão devidamente declaradas, implementação do algoritmo de verificação de tipos e escrita do interpretador. interpretador é baseado na máquina abstrata de estados de Turner. Este trabalho resulta assim numa linguagem de programação concorrente, baseada no cálculo pi monádico onde a comunicação entre os processos de um programa é governada por tipos que resultam de uma combinação entre tipos de sessão e tipos linearmente refinados.We present a concurrent programming language based on the monadic pi-calculus, where communication among processes is governed by linearly refined session types. In SePi, processes communicate synchronously via bi-directional channels (defined by two end-points) by message-passing. Interactions on channels are statically verified against session types describing the type and order of messages exchanged, as well as the number of processes that may share a channel. We first implement a core language where there are constructs to send and receive (including a form of replicated input) messages, select and offer a set of options, parallel composition, conditional and channel creation. In order to allow describing more precise properties of programs, SePi includes assume and assert primitives at the process level and refinements at the type level. Refinements are treated linearly, which allows a finer, resource-oriented use: each assumption is asserted exactly once, and conversely each assertion is also assumed exactly once. On top of this core language we provide some abbreviations and some derived constructs with the purpose of facilitate code development, resulting in the current version of SePi. We introduced a few abbreviations, as for instance the dualof operator or the optional qualifiers, and derived constructs, such as the input and output of multiple values and mutually recursive process definitions and type declarations. SePi is currently implemented as an Eclipse plugin, allowing code development (and interpretation) with the usual advantages of an IDE, such as syntax highlighting, syntactic and semantic validation, code completion and refactoring. The syntax, type system and operational semantics of SePi are introduced in references and the interpreter is based on Turner’s abstract machine.Vasconcelos, Vasco Thudichum, 1964-Martins, Francisco Cipriano da Cunha, 1972-Repositório da Universidade de LisboaFranco, Juliana Patrícia Vicente2014-01-13T12:15:05Z20132013-01-01T00:00:00Zinfo:eu-repo/semantics/publishedVersioninfo:eu-repo/semantics/masterThesisapplication/pdfhttp://hdl.handle.net/10451/10017TID:201289237enginfo:eu-repo/semantics/openAccessreponame:Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)instname:Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informaçãoinstacron:RCAAP2023-11-08T15:54:57Zoai:repositorio.ul.pt:10451/10017Portal AgregadorONGhttps://www.rcaap.pt/oai/openaireopendoar:71602024-03-19T21:34:04.564452Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos) - Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informaçãofalse
dc.title.none.fl_str_mv A concurrent programming language with session types
title A concurrent programming language with session types
spellingShingle A concurrent programming language with session types
Franco, Juliana Patrícia Vicente
Tipos de sessão
Concorrência
Tipos refinados
Cálculo pi
Canais de comunicação
Teses de mestrado - 2013
title_short A concurrent programming language with session types
title_full A concurrent programming language with session types
title_fullStr A concurrent programming language with session types
title_full_unstemmed A concurrent programming language with session types
title_sort A concurrent programming language with session types
author Franco, Juliana Patrícia Vicente
author_facet Franco, Juliana Patrícia Vicente
author_role author
dc.contributor.none.fl_str_mv Vasconcelos, Vasco Thudichum, 1964-
Martins, Francisco Cipriano da Cunha, 1972-
Repositório da Universidade de Lisboa
dc.contributor.author.fl_str_mv Franco, Juliana Patrícia Vicente
dc.subject.por.fl_str_mv Tipos de sessão
Concorrência
Tipos refinados
Cálculo pi
Canais de comunicação
Teses de mestrado - 2013
topic Tipos de sessão
Concorrência
Tipos refinados
Cálculo pi
Canais de comunicação
Teses de mestrado - 2013
description Tese de mestrado em Engenharia Informática, apresentada à Universidade de Lisboa, através da Faculdade de Ciências, 2013
publishDate 2013
dc.date.none.fl_str_mv 2013
2013-01-01T00:00:00Z
2014-01-13T12:15:05Z
dc.type.status.fl_str_mv info:eu-repo/semantics/publishedVersion
dc.type.driver.fl_str_mv info:eu-repo/semantics/masterThesis
format masterThesis
status_str publishedVersion
dc.identifier.uri.fl_str_mv http://hdl.handle.net/10451/10017
TID:201289237
url http://hdl.handle.net/10451/10017
identifier_str_mv TID:201289237
dc.language.iso.fl_str_mv eng
language eng
dc.rights.driver.fl_str_mv info:eu-repo/semantics/openAccess
eu_rights_str_mv openAccess
dc.format.none.fl_str_mv application/pdf
dc.source.none.fl_str_mv reponame:Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
instname:Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
instacron:RCAAP
instname_str Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
instacron_str RCAAP
institution RCAAP
reponame_str Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
collection Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
repository.name.fl_str_mv Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos) - Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
repository.mail.fl_str_mv
_version_ 1799134235553955840