Ur(프로그래밍 언어)

Ur (programming language)
Ur 프로그래밍 언어 패밀리
패러다임기능적, 반응적
가족ML
설계자애덤 치팔라
처음 등장한2014년 12월[1]
안정된 릴리스
20200209 출시 / 2020년 2월 9일, 2년 전(2020-02-09)
플랫폼POSIX
면허증.오픈 소스
파일 이름 확장자.ur, .urs, .urp
웹 사이트impredicative.com/ur
영향을 받다
해스켈, ML[2]

Ur/Web이라고도 불리는 Ur/Web은 Massachusetts Institute of Technology[3] Adam Chlipala가 개발한 웹 개발에 특화된 무료 오픈 소스 기능 프로그래밍 언어이며, 단일 프로그램에서 선택한 데이터베이스 백엔드에 특화된 서버 코드, 브라우저 클라이언트 코드 및 SQL 코드를 생성합니다.

Ur은 행 [2]유형에 기반한 강력한 메타프로그래밍을 지원합니다.

Ur/Web은 Ur에 특별한 표준 라이브러리와 해석 및 최적화를 위한 관련 규칙을 더한 것입니다.Ur/Web은 SQL 데이터베이스로 지원되는 동적애플리케이션 구축을 지원합니다.표준 라이브러리의 시그니처는 매우 넓은 의미에서 잘 타이핑된 Ur/Web 프로그램이 "잘못되지 않도록" 하는 것입니다.특정 페이지 생성 중에 크래시가 발생하지 않을 뿐만 아니라 다음과 같은 [2]경우도 있습니다.

  • 모든 종류의 코드 주입 공격에 시달리다
  • 잘못된 HTML 반환
  • 비활성 응용 프로그램 내 링크 포함
  • HTML 양식과 핸들러가 예상하는 필드가 일치하지 않음
  • 원격 웹 서버가 제공하는 "AJAX" 스타일의 서비스에 대해 잘못된 가정을 하는 클라이언트 측 코드 포함
  • 잘못된 SQL 쿼리 시도
  • SQL 데이터베이스 또는 브라우저와 웹 서버 의 통신에서 부적절한 마셜링 또는 마셜링 해제 사용

이러한 유형의 안전성은 Ur/Web 방법론의 기초일 뿐입니다.메타프로그래밍을 사용하여 유형 구조를 [2]분석하여 중요한 응용 프로그램을 구축할 수도 있습니다.

또한 Ur/Web 컴파일러는 가비지 [2]컬렉션을 사용하지 않는 매우 효율적인 객체 코드를 생성합니다.

이 모든 것의 구현은 오픈 [2]소스입니다.

언어에 포함된 SQL 구문 템플릿은 테이블을 쉽게 처리할 수 있습니다.

구문은 표준 ML을 기반으로 하지만 이 언어에는 Haskell의 개념과 추가적인 유형 조작이 포함되어 있습니다.

Ajax 콜/응답은 트랜잭션(Haskell의 IO에 대응)이라는 모나드를 통해 시리얼화되며, 그 마샬링과 디코딩은 rpc 함수로 캡슐화됩니다.

브라우저 클라이언트 측에는 유형 및 신호 모나드를 사용하는 기능적 리액티브 프로그래밍 설비가 포함됩니다.

Ur/Web은 웹 어플리케이션을 쓰기 쉽게 할 뿐만 아니라 보안도 강화합니다.

Chlipala는 "웹페이지에 캘린더 위젯이 있고 캘린더 위젯을 제공하는 라이브러리를 사용한다고 가정해 보자"며 "같은 페이지에는 광고 네트워크에 의해 제공되는 코드를 기반으로 한 광고 상자도 있다"고 말했다.

"당신이 원하지 않는 것은 광고 네트워크가 캘린더의 작동 방식이나 캘린더 코드의 작성자가 광고 전달에 간섭할 수 있는 것을 바꾸는 것입니다."

[4]

프로그램 예시

[5]데모에서 Ajax 통신과 함께 클라이언트, 서버 및 데이터베이스 코드를 보여 주는 데모 프로그램입니다. 각 컴포넌트의 개요를 설명하는 추가 코멘트를 첨부합니다.

확장자가 .urs인 인터페이스 파일(ML-like signature):

(* 환경 모나드는 트랜잭션이라고 불리며 Haskell의 IO 모나드에 해당합니다*).  주된 : 구성 단위 -> 거래. 페이지입니다. 

구현 파일(.ur 확장자):

데이터형 목록. t = 제로   단점  t * 목록. t  테이블 t : { 아이디 : 인트, A : 스트링 }   기본적인 열쇠 아이디  (* 서버측 데이터베이스 액세스, AJAX XmlHttpRequest를 통해 호출) "rpc" 함수로 캡슐화(리모트프로시저 호출)* 재밌어요 더하다 아이디 s =     (* sql dml 템플릿({[remission]})*)     dml (삽입 안으로 t (아이디, A) 가치 ({[아이디]}, {[s]}))  재밌어요  아이디 =     dml (삭제 부터 t 어디에 t.아이디 = {[아이디]})  재밌어요 찾다 아이디 =     (* haskell style monadic code * )      <-> 1 OrNoRows (선택한다. t.A 부터 t 어디에 t.아이디 = {[아이디]});     사례.           없음. => 돌아가다 없음.           (* return은 "모나드" 리프팅 기능*)         몇개 r => 돌아가다 (몇개 r.T.A)  (* "체크"는 클라이언트 측에서 onClick 이벤트 핸들러에 의해 호출됩니다. 페이지 임베디드 클라이언트스크립트로 JavaScript에 컴파일 됩니다* ) 재밌어요 확인. 이요 =     사례. 이요          제로 => 돌아가다 ()         단점 (아이디, ls') =>             아오 <-> rpc (찾다 아이디);      (* 서버 측 Ajax 콜*)             경계. (사례. 아오                     없음. => '나다'                    몇개 a => a                  );             확인. ls'  재밌어요 주된 () =     idAdd <-> 원천 "";     a추가 <-> 원천 "";      idDel <-> 원천 "";      (* JavaScript 포함 웹 페이지 생성*)     돌아가다 <xml> <본문>       <버튼 가치="1, 2, 3 값 확인"               클릭={fn _ => 허락하다  마이리스트 = 1 :: 2 :: 3 :: []                                                                   확인. 마이리스트                                끝.                                }/> <br/>       <br/>       <버튼 가치="추가"               클릭={fn _ => 아이디 <-> 얻다 idAdd;                                a <-> 얻다 a추가;                                rpc (더하다 (read Error(읽기 오류) 아이디) a)  (* 서버 측 Ajax 콜*)                                }/>       <텍스트 박스 원천={idAdd}/>       <텍스트 박스 원천={a추가}/> <br/>       <br/>       <버튼 가치="삭제"               클릭={fn _ => 아이디 <-> 얻다 idDel;                                rpc ( (read Error(읽기 오류) 아이디))    (* 서버 측 Ajax 콜*)                                }/>       <텍스트 박스 원천={idDel}/>     </body> </xml> 

프로젝트 파일(.urp 확장자)에는 옵션 지시어 목록과 프로젝트 [6]모듈 목록이 포함되어 있어야 합니다.

# 해시 프리픽스코멘트 rewrite url Module1/main # 루트 URL을 Module1/main 함수 exe myexename database dbname=test # 데이터베이스 속성으로 설정합니다. 및 파라미터 sql noise.sql
$/list # stdlib 모듈 앞에 "$/" module2 # 가 붙어 있는 경우 module1 # 메인모듈 에 module1 # 이 필요합니다.
  • 서버측에서는 부작용이 없는 페이지 취득 기능(http GET 메서드)은 /ModulePath/functionName으로 URL을 통해 액세스할 수 있습니다.유형(유닛 -> 트랜잭션페이지)을 가질 필요가 있습니다.
  • 부작용을 일으킬 수 있는 페이지를 내보내려면 Basis.[7]postBody 유형의 페이지 핸들러 인수를 1개 포함합니다.

컴파일:

urweb module1 #은 module1.urp를 찾습니다.

웹 서버로서 실행합니다(다른 모드는 CGI, Fast CGI 등).

./module1.exe -p 8081 # -h : RTS 옵션 도움말

라이브러리

특수 기능 및 문제

  • 레코드 갱신
데이터형 불가사의한 k v =    노드  {열쇠: k, 가치: v}  재밌어요 setKey [k][v] (* 타입 다형 *)            (_: 주문하다 k) (* 클래스 오드의 암묵적인 인스턴스 *)            (callerErr노트: 스트링) (k1: k) (나의: 불가사의한 k v) : 불가사의한 k v =    한다면 k1 < > kmin    그리고나서 에러 <xml> setKey: 불법의 k1 {[callerErr노트]}</xml>    또 다른 사례. 나의               노드 r => 노드 (r --  ++ {열쇠 = k1})                _ => 에러 <xml> setKey: 것은 아니다. a 노드 {[callerErr노트]}</xml> 

대응하는 시그니처(종류 주석(::) 암묵적, (::) 명시적):

결점 불가사의한 :: 유형 -> 유형 -> 유형    (*2 파라미터).타입 컨스트럭터*)   setKey : k ::: 유형 -> v ::: 유형 -> 주문하다 k -> 스트링 -> k -> 불가사의한 k v -> 불가사의한 k v 
  • 레코드 필드 줄임표
  사례. 나의      노드 {열쇠 = k, ...} => 무슨 일이라면 k       _ => .... 
  • 오류 "생성자의 대체가 너무 깊은 통합 [8]변수에 의해 차단되었습니다."

이 오류는 네스트된 경우 arity >0 의 유형 또는 let 구에서 발생하며 네스트된 구 내의 변수에 주석을 붙이는 유형으로 사라집니다.

「 」를 참조해 주세요.

  • 통합된 백엔드 개발을 위한 프로그래밍 언어인 다크
  • Opa, 프런트 엔드 백엔드 복합 개발을 위한 프로그래밍 언어

레퍼런스

  1. ^ UrWeb은 베타판 종료
  2. ^ a b c d e f "The Ur Programming Language Family". impredicative.com/ur. Retrieved 3 April 2016.
  3. ^ Chlipala, Adam (January 2015). "Ur/Web: A Simple Model for Programming the Web". MIT / Association for Computing Machinery (ACM). Retrieved 5 January 2015.
  4. ^ "Taking the grunt work out of Web development". mit.edu. December 23, 2014. Retrieved 29 December 2016.
  5. ^ Ur 언어 데모 프로그램
  6. ^ Chlipala, Adam (January 2015). "The Ur/Web Manual – Project files". https://enn.github.io/urweb-doc. Retrieved 8 January 2015. {{cite web}}:외부 링크 publisher=(도움말)
  7. ^ Ur/Web 매뉴얼 - 웹 어플리케이션 구조
  8. ^ 예기치 않은 형식 오류: "생성자의 대체가 너무 깊은 통일 변수에 의해 차단되었습니다."

외부 링크