오메타
OMeta오메타는 2007년 알레산드로 워스와 이안 피우마르타가 관점 연구소에 의해 개발한 패턴 매칭을 위한 객체 지향 전문 프로그래밍 언어다.언어는 '프로그래머가 토큰라이저, 파서, 방문자, 트리 변환기를 구현할 수 있는 자연스럽고 편리한 방법'[1]을 제공하기 위한 목적으로 컨텍스트 프리 그래머가 아닌 파싱 표현 그래머(PEGs)를 기반으로 한다.
OMeta의 주요 목표는 더 넓은 청중이 파싱과 같은 언어 프로그래머들에게만 일반적으로 이용할 수 있는 기술을 사용할 수 있도록 하는 것이다.[1]OMeta로 작성된 프로그램은 JavaScript와 같이 바닐라(기본 언어) 구현으로 작성된 프로그램보다 일반적으로 효율성이 떨어지는 것으로 알려져 있지만, 프로토타입을 신속하게 만드는 데 사용하는 것으로도 알려져 있다.[2][3]
OMeta는 도메인별 언어를 만드는 데 사용하는 것으로, 특히 구현의 유지 가능성(Newcome)을 위해 사용하는 것으로 유명하다.OMeta는 다른 메타 언어와 마찬가지로 호스트 언어가 필요하다; 원래 COLA 구현으로 만들어졌다.[1]
설명
OMeta는 도메인별 언어의 프로토타이핑과 생성에 사용되는 메타 언어다."패턴 매칭을 위한 객체 지향 언어"[1]로 소개되었다.그것은 문자, 숫자, 문자열, 원자, 목록과 같은 임의의 종류의 데이터를 처리하기 위해 고안된 파싱 표현 문법("현들을 생성하는 대신 인식한 언어"에 대한 설명)[4]을 사용한다.이를 통해 다용성이 향상되어 정형 데이터와 비정형 데이터 모두에서 작업할 수 있다.[1]
유사한 언어에 비해 언어가 갖는 주요 장점은 컴파일(예: 렉싱 및 파싱)의 모든 단계에 대해 동일한 코드를 사용할 수 있다는 점이다.OMeta는 또한 인수에 기초한 생산 규칙의 정의를 지원한다; 이것은 OMeta가 실행 중인 호스트 언어뿐만 아니라 OMeta 자체에 그러한 규칙을 추가하는 데 사용될 수 있다.또한 이러한 규칙들은 서로를 인수로 사용하여 "고차순 규칙"을 만들고, 서로를 상속하여 기존 코드로부터 생산 규칙을 얻을 수 있다.OMeta는 패턴 매칭 중에 호스트 언어의 술어(True/False)를 사용할 수 있으며, 이를 "대서양 술어"라고 한다.OMeta는 프로그래머가 단일 도구로 컴파일 단계를 보다 쉽게 구현하고 확장할 수 있도록 일반화된 패턴 매칭을 사용한다.[1]
OMeta는 그것이 작동하는 규칙을 결정하기 위해 그래머를 사용한다.문법이 만들어질 때 부르는 __init__ 함수의 사용으로 인해 문법은 무한정 많은 변수를 담을 수 있다.그래머는 서로를 부르는 것뿐만 아니라 상속할 수도 있다("외국의 생산 호출 메커니즘"을 사용함으로써 그래머가 서로의 입력 스트림을 "빌릴" 수 있게 한다). 마치 완전한 프로그래밍 언어의 클래스처럼 말이다.[1]OMeta는 또한 대부분의 메타 언어와 달리 모호성을 제거하기 위해 주어진 문법 내에서 옵션의 우선순위를 정한다.주어진 문법에 대한 입력을 패턴 매칭한 후, OMeta는 패턴의 각 구성요소를 변수에 할당하고, 변수들은 호스트 언어로 공급한다.[5]
OMeta는 전통적 컴파일 단계를 모두 스스로 수행하기 위해 패턴 매칭을 사용한다.그것은 먼저 토큰을 만들기 위해 캐릭터에서 패턴을 찾고, 그 토큰을 문법에 맞추어 구문 트리를 만든다.그런 다음 타이프체커는 구문 나무의 패턴을 일치시켜 주석이 달린 나무를 만들고, 방문객들은 다른 나무를 만들기 위해 같은 일을 한다.그런 다음 코드 생성기는 코드를 생성하기 위해 나무를 패턴화한다.[3]OMeta에서는 "이러한 기능이 기본적으로 지원되기 때문에 파스 트리를 통해 이동"하는 것이 쉽다.[3]
메타 언어는 구현 언어에서 가장 일반적으로 사용되지만 대부분의 프로그래밍 언어에서 유용성으로 유명하다.예를 들어, OMeta/JS는 자바스크립트에서 사용된다.[5]숙주어가 필요하기 때문에 OMeta의 창작자들은 그것을 "기생 언어"[6]라고 부른다.
개발
알레산드로 워스와 이안 피우마르타가 2007년 연구 시스템과 개인 컴퓨팅을 개선하기 위한 기구인 관점 연구소에서 OMeta를 개발했다.이들은 처음에는 복합 오브젝트 람다 아키텍처, 즉 COLA(Points Research Institute에서 조사한 자기 설명 언어)를 OMeta의 호스트 언어로 사용했고, 이후 오시마 요시키가 도움을 받아 스퀵 스몰토크에 포팅해 복수의 호스트 언어로 사용성을 검증했다.OMeta는 또한 "의 거의 완전한 서브셋을 구현하기 위해...Javascript"는 그것의 도입부 논문에서 사례 연구로 사용된다.[1]
사용법
OMeta는 다른 메타 언어와 마찬가지로 주로 도메인별 언어(DSLs in the domain specific language, 줄여서 DSLs)를 만드는 데 사용된다. 특히, OMeta의 느린 실행 속도와 불분명한 오류 보고서는 전체 프로그래밍 언어로서의 기능 대부분을 제거한다(Heirbaut 73–74).OMeta는 컴파일러 생성 시 여러 개의 별도 도구보다는 컴파일러의 모든 단계에 하나의 구문을 사용할 수 있는 능력 덕분에 유용하다.[5]또한, OMeta는 DSL을 만드는 데 사용할 수 있는 속도와 바닐라 구현에 비해 이러한 작업을 수행하는 데 필요한 코드의 양이 현저히 낮다는 점에서 모두 평가되며, 보고서는 바닐라처럼 약 26%의 기능 코드 라인을 보여준다.[2]
예
다음은 OMeta를 사용하는 C#의 기본 계산기 언어의 예다.
오메타 베이직계산 <: 파서 { 숫자 = 잘 하는 군요:d -> d.토 디지트(), 숫자 = 숫자:n 숫자:D -> (n * 10 + d) 숫자, addExpr = addExpr:x ‘+’ 물익스프르:y -> (x + y) addExpr:x ‘-’ 물익스프르:y -> (x - y) 물익스프르, 물익스프르 = 물익스프르:x ‘*’ primExpr:y -> (x * y) 물익스프르:x ‘/’ primExpr:y -> (x / y) 프리림 익스프레스, 프리림 익스프레스 = ‘(‘ 엑스퍼:x ‘)’ -> x 숫자, 엑스퍼 = addExpr }
또한 다음과 같이 작성한 언어의 하위 클래스를 만들 수도 있다.
오메타 지수계산 <: 베이직계산 { 물익스프르 = 물익스프르:x ‘^’ 프리림 익스프레스:e -> 수학.포우(x,e) 잘 하는 군요 }
이전에 쓰여진 언어도 유전되지 않고 다음과 같이 불릴 수 있다.
오메타 사이언티픽칼크 <: 파서 { 매트릭펑크 :n = 토큰(n) 공간, AdvExp = 매트릭펑크(‘sqrt’) AdvExp:x -> 수학.Sqrt(x) 팩 익스프레스 팩 익스프레스 = 프림 익스프레스:x ‘!’ -> { 시합을 하다 r = 1; 을 위해(; x > 1; x--) { r *= x; } 돌아오다 r; } 프림 익스프레스 프림 익스프레스 = 외국인의(지수계산.엑스퍼):x -> x 엑스퍼 = AdvExp }
버전
OMeta는 이론적으로 어떤 호스트 언어로 구현될 수 있지만, 자바스크립트 구현인 OMeta/JS로 가장 많이 사용된다.[5]Warth는 다른 호스트 언어가 다른 유형의 개체를 인식하기 때문에 "OMeta/X--여기서 X는 어떤 호스트 언어"의 패턴이 OMeta 내에서 표준화된 것보다 "X"의 영향을 받는 것이 더 낫다고 말했다.[6]
메타콜라
메타콜라는 언어 입문서에 사용된 OMeta의 첫 번째 구현이었다.메타콜라는 OMeta의 첫 번째 테스트 코드를 구현했으며, 출시 전에 만들어진 언어의 세 가지 형태(다른 형태는 OMeta/Squeak이고 거의 완성된 OMeta/JS) 중 하나이다.[1]
오메타/스퀘크
OMeta/Squeak은 시스템의 초기 시연 시 사용된 OMeta의 항구였다.OMeta/Squeak은 "Skeekak EToys 시스템의 대체 구문 실험에 사용됨" OMeta/Squeak은 대괄호만 필요한 OMeta/JS와는 달리 규칙 운용에서 대괄호와 "점괄호"(브레이스)를 필요로 한다.[6]그러나 OMeta/Squeak 2는 OMeta/JS와 더 유사한 구문을 특징으로 한다.[7]OMeta의 COLA 이행과 달리 스퀵 버전은 중간 결과(이미 계산에 사용된 상점 번호)를 외우지 않는다.[1]
오메타/JS
OMeta/JS는 자바스크립트 구현 형태의 OMeta이다.OMeta/JS를 사용한 언어 구현은 바닐라 자바스크립트만을 사용하여 작성된 언어보다 사용이 편리하고 공간 효율성이 높은 것으로 지적되지만, 전자는 훨씬 더 느리게 수행되는 것으로 나타났다.이 때문에 OMeta/JS는 시제품 제작에 매우 유용한 도구로 여겨지지만, 제작 언어 구현에는 선호되지 않는다.[3]
자바스크립트 대 자바스크립트
OMeta와 같은 DSL 개발 도구의 사용은 NCLOC(Non-Comment Line of Code) 수가 적기 때문에 "바닐라 구현"(즉, 자바스크립트)보다 훨씬 유지보수가 가능한 것으로 간주된다.이는 부분적으로 "AST 개체를 생성하거나 제한된 문자열 연산을 수행하는 대서양 액션 코드"에 기인한다.OMeta는 "콘텍스트 없는 구문"이 부족하여 추가 코드 라인의 비용을 들여 파서 생성과 렉서 생성에 모두 사용할 수 있다.OMeta의 유지 가능성을 나타내는 추가적인 요인으로는 "Halsted 노력"이 높은 유지관리성 지수를 포함하고 있는 반면, "Halsted 노력의 경우 바닐라 파서가 OMeta 파서보다 3배 더 많은 개발 노력이 필요하다는 것을 나타낸다."자바스크립트와 마찬가지로 OMeta/JS는 "Waebric의 완전한 구문 표기법"[3]을 지원한다.
NCLOC의 차이를 담당하는 OMeta의 주요 장점 중 하나는 타이프체커가 파서로부터 메커니즘을 이어받도록 함으로써 "트리 워킹 메커니즘"을 재사용하는 것으로서, JavaScript의 트리 워킹 메커니즘은 더 많은 코드를 포함하고 있으며 수동으로 광고해야 한다.파서의 변화에 적응했다.또 다른 사실은 OMeta의 그래머가 "추상 수준이 더 높다...프로그램 코드보다"또한 문법의 비선명적 공백 정의(OMeta가 DSL crea의 단일 도구로 작용할 수 있도록 구현된 메커니즘) 때문에 함수당 코드 라인이 상대적으로 많이 필요하지만, "AST 객체를 만들거나 제한된 문자열 연산을 수행하는 의미 작용 코드의 결과"로 간주할 수 있다.티온[3]
성능 면에서는 바닐라 구현에 비해 OMeta가 느린 속도로 실행되는 것으로 나타났다.OMeta에 의한 역추적 기법의 사용은 이것에 대한 잠재적인 주요 원인이다(OMeta의 파서 "7개의 룩 어헤드 연산자 포함...이들 연산자는 특정 규칙을 서로 구별하기 위해 필요하며 문법에서 빠질 수 없다." 그러나 이러한 성능 저하는 OMeta의 메모화 방법 때문일 가능성이 더 높다.
"중간 구문 분석 단계를 저장하면 구문 분석표의 크기가 문법에 사용되는 단자수 및 비단자수(오퍼랜즈)에 비례하게 된다.오메타 파서의 문법에는 446명의 피연산자가 포함되어 있기 때문에 성능에 부정적인 영향을 미치는 것으로 생각된다."[3]
그러나 OMeta가 바닐라 구현에 시간을 벌 수 있는 곳은 렉싱에 있다.자바스크립트의 바닐라 렉서는 렉서가 시작되기 전에 구현이 자바를 통해 프로그램 전체를 문자열로 변환하는 방식으로 인해 속도가 현저히 느려진다.그럼에도 불구하고, OMeta 구현은 전반적으로 상당히 느리게 진행된다.[3]
오메타는 오류 보고 측면에서도 뒤처진다.바닐라 구현은 오류 위치 측면에서 "테스트 사례의 약 92%"에 올바른 오류 메시지를 반환하지만, OMeta는 단순히 주어진 오류에 "Match failed!"를 반환한다.OMeta를 통해 소스를 찾으려면 "수동으로...파싱이 실패하는 라인 번호를 출력하기 위해 의미 작용 코드에 뉴라인 문자를 카운트해야 한다."[3]
오메타#
OMeta#는 Jeff Moser의 프로젝트로서 OMeta/JS를 C# 기능으로 번역하기 위한 것이다. 따라서, OMeta#의 디자인은 알레산드로 워스의 OMeta/JS 디자인을 바탕으로 한다.사용자들에게 높은 단순성으로 작업 언어를 만들 수 있는 능력을 부여하는 것이 이 프로젝트의 목표다.특히 OMeta#는 의 단일 도구로 사용할 수 있도록 되어 있다.NET 언어 개발, 언어 개발의 가파른 학습 곡선을 줄이고, 유용한 교육 자원이 되며, 실제 응용에서 실용적으로 사용할 수 있다.[5]OMeta#은 현재 C# 3.0을 4.0이 아닌 OMeta의 호스트 언어로 사용하고 있다. C# 3.0은 동적 언어보다는 정적 언어이기 때문에 OMeta# 내의 호스트 언어에 대한 인식은 동적으로 입력된 언어로 "그것보다 2~3배 더 추하고 크다"고 한다.[8]
OMeta#는 를 사용한다.Grammar 및 Grammars 내부 "규칙"에 대한 방법으로 NET 클래스 또는 Types.OMeta#는 교정기( { 및 } )를 사용하여 문자로 호스트 언어를 인식한다.언어는 숙주 언어의 그것과 같이 강하고 깨끗하고 정적인 타이핑에 초점을 두고 있지만, 이것은 언어의 생성에 복잡성을 더한다.C#의 새로운 구현도 와 호환되어야 한다.NET 메타 언어, 제작을 더욱 복잡하게 만든다.또한, 사용자가 OMeta#의 메타룰을 실수로 잘못 사용하는 것을 방지하기 위해, Moser는 이를 "속성을 통해 노출되는 명시적 인터페이스(예: "_apply" 대신 "MetaRules")로 구현하기로 선택했다.적용""" 언어의 기능성은 C#[9]에 상당히 묶여 있지만, OMeta#의 뒷부분은 언어 자체로 쓰여 있다.OMeta# 소스 코드는 Codeplex에 게시되어 있으며, 오픈 소스 프로젝트로 남으려는 것이다.그러나 업데이트는 프로젝트 시작 직후부터 무기한 중단되어 2012년 10월 1일에 서버에 의해 재기명되었다.[5]
아이언메타
Gordon Tisher는 를 위해 IronMeta를 만들었다.2009년의 NET는 OMeta#과 유사하지만 GitHub의 BSD 라이센스에 따라 배포되는 훨씬 더 지원되고 강력한 구현이다.
옴
옴은 오메타의 후계자로, 문법과 의미 작용을 분리해 (다른 것 중에서) 그것을 향상시키는 것을 목표로 하고 있다.[10]
참고 항목
- 유사한 메타 언어인 ANTLR(언어 인식용 ANTER 도구)
- META II OMeta의 구현에 영향을 미치는 초기 컴파일러 컴파일러
- OMeta/JS github 저장소.
참조
- ^ a b c d e f g h i j 워스, 알레산드로, 그리고 이안 피마르타."오메타: 패턴 매칭을 위한 객체 지향 언어."ACM SIGLAN 2007 동적 언어 심포지엄(DLS '07)03년판TR-2007.Glendale, CA: Points Research Institute, 2007.VPRI 기술 보고서.웹. 2013년 9월 30일.
- ^ a b 클린트, 폴, 티즈 반 데어 스톰, 쥬르겐 빈주. "DSL 도구가 언어 구현의 유지보수에 미치는 영향에 대하여." LDTA '10차 언어 설명, 도구 및 응용에 관한 워크숍 10차 진행.뉴욕, 뉴욕, 2010년 N.P.웹. 2013년 9월 30일.
- ^ a b c d e f g h i 상속인, 니컬러스"도메인 특정 언어에 대한 두 가지 구현 기술 비교: OMeta/JS 대 Javascript."논문.2009년 암스테르담 대학교웹. 2013년 9월 30일.<http://dare.uva.nl/document/153293>.
- ^ 마스카렌하스, 파비오, 세르히오 메데이로스, 로베르토 이에루체림시.구조화된 데이터에 대한 구문 분석 식 그래머.N.P.: N.P., N.D. 웹.<http://www.lbd.dcc.ufmg.br/colecoes/sblp/2011/003.pdf>.
- ^ a b c d e f g h i 모저, 제프"모저웨어." : 오메타#: 누구? 뭐? 언제? 어디서? 왜? 블로거, 2008년 6월 24일.웹. 2013년 9월 30일.
- ^ a b c 워스, 알레산드로."[오메타] OMeta의 구문에." [오메타] OMeta의 구문에. N.p. 2008년 7월 4일.웹. 2013년 10월 16일.<http://vpri.org/pipermail/ometa/2008-July/000051.html>.
- ^ 워스, 알레산드로."오메타/스퀘이크 2."오메타/스퀘이크 2. N.p.N.d. 웹. 2013년 10월 16일.<http://tinlizzie.org/ometa/ometa2.html>.
- ^ 모저, 제프"Moserware." : 2008년 8월 25일, Meta-FizzBuzz, Blogger.웹. 2013년 9월 30일.
- ^ 모저, 제프"모저웨어" : 객체지향 기생금속구두 블로거 구축, 2008년 7월 31일웹. 2013년 9월 30일.
- ^ "Ohm Philosophy".