Ur(프로그래밍 언어)
Ur (programming language)패러다임 | 기능적, 반응적 |
---|---|
가족 | ML |
설계자 | 애덤 치팔라 |
처음 등장한 | 2014년 12월[1] |
안정된 릴리스 | 20200209 출시 / 2020년 2월 , 전( |
플랫폼 | POSIX |
면허증. | 오픈 소스 |
파일 이름 확장자 | .ur, .urs, .urp |
웹 사이트 | impredicative |
영향을 받다 | |
해스켈, 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]컬렉션을 사용하지 않는 매우 효율적인 객체 코드를 생성합니다.
언어에 포함된 SQL 구문 템플릿은 테이블을 쉽게 처리할 수 있습니다.
구문은 표준 ML을 기반으로 하지만 이 언어에는 Haskell의 개념과 추가적인 유형 조작이 포함되어 있습니다.
Ajax 콜/응답은 트랜잭션(Haskell의 IO에 대응)이라는 모나드를 통해 시리얼화되며, 그 마샬링과 디코딩은 rpc 함수로 캡슐화됩니다.
브라우저 클라이언트 측에는 유형 및 신호 모나드를 사용하는 기능적 리액티브 프로그래밍 설비가 포함됩니다.
Ur/Web은 웹 어플리케이션을 쓰기 쉽게 할 뿐만 아니라 보안도 강화합니다.
Chlipala는 "웹페이지에 캘린더 위젯이 있고 캘린더 위젯을 제공하는 라이브러리를 사용한다고 가정해 보자"며 "같은 페이지에는 광고 네트워크에 의해 제공되는 코드를 기반으로 한 광고 상자도 있다"고 말했다.
"당신이 원하지 않는 것은 광고 네트워크가 캘린더의 작동 방식이나 캘린더 코드의 작성자가 광고 전달에 간섭할 수 있는 것을 바꾸는 것입니다."
프로그램 예시
웹 [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 구에서 발생하며 네스트된 구 내의 변수에 주석을 붙이는 유형으로 사라집니다.
「 」를 참조해 주세요.
레퍼런스
- ^ UrWeb은 베타판 종료
- ^ a b c d e f "The Ur Programming Language Family". impredicative.com/ur. Retrieved 3 April 2016.
- ^ Chlipala, Adam (January 2015). "Ur/Web: A Simple Model for Programming the Web". MIT / Association for Computing Machinery (ACM). Retrieved 5 January 2015.
- ^ "Taking the grunt work out of Web development". mit.edu. December 23, 2014. Retrieved 29 December 2016.
- ^ Ur 언어 데모 프로그램
- ^ Chlipala, Adam (January 2015). "The Ur/Web Manual – Project files". https://enn.github.io/urweb-doc. Retrieved 8 January 2015.
{{cite web}}
:외부 링크
(도움말)publisher=
- ^ Ur/Web 매뉴얼 - 웹 어플리케이션 구조
- ^ 예기치 않은 형식 오류: "생성자의 대체가 너무 깊은 통일 변수에 의해 차단되었습니다."