ParaSail(프로그래밍 언어)

ParaSail (programming language)
패러세일
Logo for ParaSail Programming Language.jpg
ParaSail 프로그래밍 언어용 로고
패러다임컴파일, 동시, 필수, 구조화, 객체 지향
설계자S. 터커 태프트
개발자아다코어
처음 등장한2009년; 13년 전(2009년)
안정된 릴리스
8.4 / 2019년 11월 2일, 2년 전(2019-11-02)
타이핑 분야강력, 정적
플랫폼x86
OSLinux, macOS, Windows
면허증.GPL v3
파일 이름 확장자.psi, .psl
웹 사이트parasail-lang.org
주요 구현
psli, pslc
영향을 받다
모듈라, Ada, Pascal, ML
영향받은
[1]

Parallel Specification and Implementation Language(Parallel Specification and Implementation Language)는 객체 지향 병렬 프로그래밍 언어입니다.설계와 계속적인 실장은 블로그와[2] 공식 웹사이트에 [3]설명되어 있습니다.

ParaSail은 포인터가 없는 프로그래밍 모델을 사용합니다.이 모델에서는 오브젝트가 확장 및 축소되고 값 의미론이 할당에 사용됩니다.글로벌 가비지 수집 힙이 없습니다.대신 지역 기반 메모리 관리가 전체적으로 사용됩니다.재귀 구성 요소가 선택 사항으로 선언된 경우 유형은 재귀일 수 있습니다.글로벌 변수, 파라미터 앨리어싱은 없으며 식의 모든 하위 식을 병렬로 평가할 수 있습니다.어설션, 전제조건, 사후조건, 클래스 불변수 등은 Hoare와 같은 표기법을 사용하는 표준 구문의 일부입니다.가능한 레이스 조건컴파일 시에 검출됩니다.

ParaSail의 초기 설계는 S에 의해 2009년 9월에 시작되었습니다.터커 태프트.

ParaSail 가상 머신을 사용하는 인터프리터와 LLVM 기반의 ParaSail 컴파일러를 모두 사용할 수 있습니다.워크스틸은 ParaSail의 경량 스레드 스케줄에 사용됩니다.최신 버전은 ParaSail [3]웹사이트에서 다운로드할 수 있습니다.

묘사

ParaSail의 구문Modula와 비슷하지만 클래스 및 인터페이스 기반 객체 지향 프로그래밍 모델은 Java 또는 C#과 더 유사합니다.

최근 ParaSail의 병렬 구조는 Java, Python, Ada와 같은 병렬 언어를 생성하기 위해 다른 구문에 맞게 조정되었으며, 각각 Javallel, Parython 및 Sparkel로 불리고 있습니다(이 언어의 기반이 되는 Ada 서브셋 SPARK의 이름을 따서 명명됨).이러한 언어용 컴파일러 및 인터프리터는 ParaSail [3]구현에 포함되어 있습니다.

다음은 ParaSail의 Hello 월드 프로그램입니다.

기능하다 Hello_World(변화하다 입출력)      입출력.인쇄("안녕하세요, 월드"); 끝. 기능하다 Hello_World; 

다음으로 기본 맵모듈에 대한 인터페이스를 나타냅니다.

인터페이스 BMap< >키_타입  주문된<< 고객명 >>님; 요소_유형  할당 가능< >>>      동작 "[]"() -> BMap;  // 빈 맵 만들기      기능하다 삽입(변화하다 BMap; 열쇠 : 키_타입; 가치 : 요소_유형);     기능하다 검색(BMap; 열쇠 : 키_타입) -> 선택적. 요소_유형;     기능하다 삭제(변화하다 BMap; 열쇠 : 키_타입);     기능하다 세어보세요(BMap) -> Univ_Integer; 끝. 인터페이스 BMap; 

다음으로 바이너리 트리를 사용한 이 맵모듈의 실장을 나타냅니다.

학급 BMap       인터페이스 이진_노드<< 고객명 >>님        // 단순한 "콘크리트" 바이너리 노드         변화하다 왼쪽 : 선택적. 이진_노드;         변화하다 맞다 : 선택적. 이진_노드;         컨스턴트 열쇠 : 키_타입;         변화하다 가치 : 선택적. 요소_유형;  // null은 삭제된 것을 의미합니다.     끝. 인터페이스 이진_노드;      변화하다 트리 : 선택적. 이진_노드;     변화하다 세어보세요 := 0;    수출.      동작 "[]"() -> BMap   // 빈 맵 만들기         돌아가다 (트리 => 무효, 세어보세요 => 0);     끝. 동작 "[]";      기능하다 삽입(변화하다 BMap; 열쇠 : 키_타입; 가치 : 요소_유형)        // 키를 검색하고, 찾으면 덮어쓰고, 없으면 새 노드를 삽입합니다.         위해서 M => BMap.트리 고리             한다면 M 무효입니다. 그리고나서                 // 지도에 아직 없습니다. 추가하세요.                 M := (열쇠 => 열쇠, 가치 => 가치, 왼쪽 => 무효, 맞다 => 무효);                 BMap.세어보세요 += 1;             또 다른                사례. 열쇠 =? M.열쇠                   [#적다] =>                    계속하다. 고리 와 함께 M.왼쪽;                  [#실패하다] =>                    계속하다. 고리 와 함께 M.맞다;                  [#실패하다] =>                    // 키가 이미 지도에 있습니다.                    // 값이 null인 경우의 범프 수;                    한다면 M.가치 무효입니다. 그리고나서                        BMap.세어보세요 += 1;                    끝. 한다면;                    // 어떤 경우에도 값 필드를 덮어씁니다.                    M.가치 := 가치;                    돌아가다;                끝. 사례.;             끝. 한다면;         끝. 고리;     끝. 기능하다 삽입;      기능하다 검색(BMap; 열쇠 : 키_타입) -> 선택적. 요소_유형        // 키 검색, 관련 값 반환(있는 경우) 또는 null(있는 경우)         위해서 M => BMap.트리 하는 동안에 M null이 아니다 고리             사례. 열쇠 =? M.열쇠                [#적다] =>                 계속하다. 고리 와 함께 M.왼쪽;               [#실패하다] =>                 계속하다. 고리 와 함께 M.맞다;               [#실패하다] =>                 // 찾았습니다. 값을 반환합니다.                 돌아가다 M.가치;             끝. 사례.;         끝. 고리;         // BMap에서 찾을 수 없음         돌아가다 무효;     끝. 기능하다 검색;      기능하다 삭제(변화하다 BMap; 열쇠 : 키_타입)        // 키 검색, 관련 노드(찾은 경우) 삭제         위해서 M => BMap.트리 하는 동안에 M null이 아니다 고리             사례. 열쇠 =? M.열쇠                [#적다] =>                 계속하다. 고리 와 함께 M.왼쪽;               [#실패하다] =>                 계속하다. 고리 와 함께 M.맞다;               [#실패하다] =>                 // 찾았습니다. 최대 1개의 하위 트리가 null이 아닌 경우 덮어씁니다.                 // 해당 값 필드를 null로 설정합니다.그렇지 않으면 값 필드를 null로 설정합니다.                 // (더 복잡한 재밸런싱을 피하기 위해)                 한다면 M.왼쪽 무효입니다. 그리고나서                     // 오른쪽 서브트리를 M으로 이동                     M <==> M.맞다;                 엘시프 M.맞다 무효입니다. 그리고나서                     // 왼쪽 서브트리를 M으로 이동                     M <==> M.왼쪽;                 또 다른                     // 노드를 즉시 회수할 수 없습니다.                     // 대신 값 필드를 null로 설정합니다.                     M.가치 := 무효;                 끝. 한다면;                 // 감소 횟수                 BMap.세어보세요 -= 1;             끝. 사례.;         끝. 고리;         // 지도에서 찾을 수 없습니다.     끝. 기능하다 삭제;      기능하다 세어보세요(BMap) -> Univ_Integer        // 맵 내 항목 수 반환 수         돌아가다 BMap.세어보세요;     끝. 기능하다 세어보세요;  끝. 학급 BMap; 

다음은 BMap 모듈의 간단한 테스트 프로그램입니다.

수입품 PSL::핵심::랜덤; 수입품 BMap; 기능하다 테스트_BMAP(숫자 : Univ_Integer; 시드 : Univ_Integer)      // 바이너리 트리 기반 맵 테스트     변화하다 뛰었다 : 랜덤 := 시작(시드);  // 난수 시퀀스를 시작합니다.      // 정수에서 문자열로 맵 선언     변화하다 M : BMap< >키_타입 => Univ_Integer, 요소_유형 => Univ_String>;      M := [];  // 빈 맵으로 맵 초기화      위해서 I  1..숫자*2 앞으로 고리  // 지도에 요소 추가         컨스턴트 열쇠 := 다음 분.(뛰었다) 모드 숫자 + 1;         컨스턴트  := "밸류"   To_string(To_String)(I);         인쇄("삽입하려고 합니다."   열쇠   " = > "   );         삽입(M, 열쇠, );     끝. 고리;     인쇄("카운트 ="   세어보세요(M));      위해서 I  1..숫자 고리 // 지도에서 요소 검색         컨스턴트 열쇠 := 다음 분.(뛰었다) 모드 숫자 + 1;         인쇄("찾고 있다"   열쇠   ", "를 찾았습니다.   검색(M, 열쇠));     끝. 고리;      위해서 I  1..숫자/3 고리  // 지도에서 일부 요소 삭제         컨스턴트 열쇠 := 다음 분.(뛰었다) 모드 숫자 + 1;         인쇄("삭제하려고 합니다."   열쇠);         삭제(M, 열쇠);     끝. 고리;     인쇄("카운트 ="   세어보세요(M));      위해서 I  1..숫자 앞으로 고리  // 지도에서 요소 다시 검색         인쇄("찾고 있다"   I   ", "를 찾았습니다.   검색(M, I));     끝. 고리;  끝. 기능하다 테스트_BMAP; 

레퍼런스

  1. ^ Rumpf, Andreas (19 October 2017). "Nim without GC". Araq's Musings. Retrieved 1 September 2020.
  2. ^ ParaSail 블로그
  3. ^ a b c ParaSail 웹사이트

일반 참고 자료


외부 링크