언어 개발 프레임 워크를 얼마나 쉽게 사용해야합니까?


11

이것은 언어 설계에 사용되는 개념을 프레임 워크 형태로 추상화하는 것을 목표로하는 추상화 프로젝트라는 프로젝트에 중점을 둔 일련의 질문 중 일부입니다.

구조적 타이핑과 관련된 다른 페이지는 여기에서 볼 수 있습니다 . 프레임 워크에 대한 문의 및 적절한 게시 장소와 관련된 메타 주제는 여기 에서 찾을 수 있습니다 .

언어 개발 프레임 워크를 사용하는 것이 얼마나 쉬워야합니까?

대규모 코드 생성 프레임 워크를 작성했으며 결과를 언어 별 컴파일러로 보내는 기능도 포함했습니다. 사용 편의성이라는 주제는 이러한 프레임 워크 예 중 하나 인 CodeDOM 또는 코드 문서 객체 모델에서 비롯됩니다.

일반적인 코드 구조를 설명하는 Microsoft에서 작성한 프레임 워크이지만 일반적으로 많은 부분 (표현식 강제)을 제외하고 특정 구문을 표현할 때 약간 추상적이면서 사용자가 수행 한 작업에 따라 잘못된 코드를 완전히 방출하는 경향이있었습니다. 사용 된 유형이 일반 인터페이스 인 경우 CodeDOM에서 방출 기능 PrivateImplementationType을 제대로 처리하지 못했습니다 CodeMemberMethod. CodeDOM은 첫 번째 코드 생성기를 작성한 최초의 이유였습니다.

내가하려고하는 한 가지, 프레임 워크를 단순화하기 위해 수행해야 할 작업의 양을 줄이고 작업에 해당 작업을 구성하는 특정 유형에 중점을 두는 것입니다.

다음은 내가 작성하는 프레임 워크의 작동 방식을 나란히 비교 한 것입니다.

//Truncated...
/* *
 * From a project that generates a lexer, this is the 
 * state->state transition character range selection logic.
 * */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
 * 'start' <= nextChar && nextChar <= 'end'
 * */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));

코드 대

//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));

이 프레임 워크의 초점은 언어 애호가 및 코드 또는 응용 프로그램 생성에 관심이있는 사람들입니다. 컴파일, 코드 생성 및 언어 개발에 중점을 둔 프레임 워크는 사용 편의성 또는 강력한 기능에 중점을 두어야합니까?

저의 주요 목표는 이러한 도구의 가용성을 높이는 것이므로 도메인에 관심이있는 사람들은 자신의 언어 중심 프로젝트를 시작하기 전에 언어 이론 도메인에 대한 많은 경험이 필요하지 않습니다.

내가 프레임 워크의 저자라는 것을 감안할 때, "사용성"에 대한 나의 견해는 편향되어 있습니다. 따라서 프로젝트에 관련되지 않은 다른 사람들에게 초점과 목표가 합당한 지 다른 사람에게 물어봐야합니다.


1
codereview.stackexchange.com 에서이 질문을 해야 합니다.
Robert Harvey

6
원시 전력을 희생하여 프레임 워크를 쉽게 사용할 수 있어야하는지에 대한 문제는 "소프트웨어 시스템의 높은 수준의 아키텍처 및 디자인"이 아닌 Code Review.SE에 전혀 적합하지 않은 것으로 보입니다. 주제 도, 그리고에 대한 주제 여기에있다. 코드 검토는 작업 코드가 있고 비판을 원할 때를위한 것입니다.

코드 생성기에 대한 입력은 또 다른 프로그래밍 언어입니다. 코드 생성에 대한 요구는 생성하는 언어가 충분하지 않다는 것을 의미합니다. 더 나은 언어에는 코드 생성기가 내장되어 있습니다.
케빈 클라인

@kevincline 코드 생성기의 일반적인 사용 사례는 범용 코드 생성 프레임 워크를 사용하는 도메인 별 언어입니다. 이것은 실제로 많은 선택이 아니며 대안은 내부 중급 언어로 컴파일하여 VM을 통해 해석하거나 더 낮은 수준의 구문으로 변환하는 것이지만 결국 같은 일을하고 있습니다 . 이것이이 프레임 워크의 목표입니다. 코드를 동적으로 생성하기 위해 작업을 수행해야 할 때,이를 사용하여 동일한 것을 직접 구현하는 것입니다.
Allen Clark Copeland Jr

소스 언어가 충분하지 않은 것은 아닙니다. 언어 문법은 소스 텍스트에서 대상 플랫폼으로 변환하기 위해 중개 소프트웨어가 작성 될 때까지 텍스트입니다. 이 경우 CLI (Common Language Infrastructure) 또는 CLI를 대상으로하는 범용 언어의 코드입니다. 이 프레임 워크는 높은 수준의 표현을 가져와 IL 생성을 위해 충분히 낮은 수준의 구성으로 변환하는 거친 작업을 처리하는 것을 목표로합니다. 즉, 컴파일러가 필요하다고해서 언어가 충분히 강력하지 않다는 의미는 아닙니다. 필수입니다.
Allen Clark Copeland Jr

답변:


2

언어 개발 프레임 워크를 구축하기가 어렵습니다. 어떤 종류의 일을 지원하고 싶은지 결정한 다음, 어떤 종류의 일을해야하는지, 어떻게 일관된 전체로 통합 할 것인지 결정해야합니다. 마지막으로, 실제 언어 (예 : DSL뿐만 아니라 일반적인 컴퓨터 언어)와 함께 작동하여 실제로 유용한 기능을 수행 할 수 있도록 충분한 투자를했습니다. 시도해 주셔서 내 모자가 벗겨져 있습니다.

15 년 전에 시작한 것과 DMS Software Reengineering Toolkit 과의 노력을 비교할 수 있습니다 . DMS는 범용 구문 분석, 분석 및 코드 변환을 제공하기위한 것입니다. 명시적인 언어 사양이 제공되면 코드 구문 분석, AST 빌드, AST (prettyprint)에서 코드 재생성, 대상 프로그래밍 언어로 작성된 패턴을 사용하여 코드 변환, 기호 테이블 작성, 제어 및 데이터 흐름 계산 등을 수행합니다. 하나는 DMS가 다양한 효과를 발휘하게합니다. (사이트의 도구를 참조하십시오. 도구는 모두 한 형태 또는 다른 형태의 DMS입니다).

여기 DMS에 기술 논문 IS는 몇 년 전으로는. (우리는 계속 개선하고 있습니다)

DMS 자체를 구축하기는 어려웠지만 IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (및 기타 여러 가지)을 포함하여 DMS에 대한 실제 언어를 정의하는 데 상당량의 엔지니어링이 필요하다는 것을 알았습니다.

우리가 생각하는 것 (합리적으로 잘 됨) : 도구 제작 비용을 1-2 배 정도 줄입니다. 이것이 의미하는 바는 1-10 년이 걸리는 작업은 1 개월에서 1 년 프로젝트로 단순한 필사자들에 의해 고려 될 수 있다는 것입니다. 여전히 쉽지 않은 것 :

  • 새로운 언어 정의하기
  • 현재 언어의 모든 이디어 처리
  • 작업에 맞는 사용자 지정 코드를 쉽게 작성할 수 있습니다.
  • 새롭고 복잡한 분석 정의
  • 부분 프로그램 또는 오류가 포함 된 프로그램 처리
  • (초기 시점까지) 비전문가가 이러한 도구를 쉽게 사용할 수 있도록하십시오.

따라서 개선의 여지가 많이 있습니다. 많은 꽃이 피자.


0

이 질문은 "개념적 무결성"섹션 인 The Mythical Man Month에서 답을 얻었습니다. 그렇지 않은 경우 적어도 귀하의 질문과 관련이 있습니다. Brooks가 전체 컴퓨팅 시스템을 설계한다고 설명하지만이 에세이는 프레임 워크와 새로운 언어에 완벽하게 적용됩니다.

기술 채택률과 개념 무결성 및 사용 용이성 간에는 긍정적 인 상관 관계가 있다고 생각합니다. 이러한 상관 관계를 증명하기 위해 언어, 프레임 워크 및 OS와 같은 최신 기술에 대한 사례 연구가 있어야하지만 아직 아무것도 모릅니다.


이 답변의 유일한 문제는 실제 가치를 제공하지 않는다는 것입니다. 소프트웨어 패키지가 릴리스 된 후에 만 ​​책의 섹션을 참조하고 설명을 적용 할 수 있습니다. 기본적으로 '사용하기 쉽고 도메인과 관련이 있으면 잘 될 것입니다.'라는 말이 있기 때문에 릴리스 전에는 대답하지 않습니다. 나는 그것이 당신이 그것을 사용할 수있는 시점이 아니기 때문에 얼마나 잘 할 것인지 말할 수 없습니다. 컴파일러의 장점은 많은 작업을 수행한다는 것입니다. 산에서 절반 쯤 떨어져 있다는 것을 깨닫기 만하면됩니다.
Allen Clark Copeland Jr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.