자동 프로그래밍 : 코드를 작성하는 코드 작성 [닫기]


105

The Pragmatic Programmer 라는 책을 읽은 후 , 제가 ​​가장 흥미로 웠던 주장 중 하나는 "코드를 작성하는 코드 작성"이었습니다.

나는 인터넷을 통해 더 많은 설명이나 기사를 검색하려고 시도했지만 주제에 대한 좋은 기사를 찾았지만 여전히 특정 코드 구현이나 좋은 예제를 찾지 못했습니다.

나는 그것이 여전히 일반적인 주장이 아니며 문서가 부족하거나 많은 사람들이 그것을 받아들이지 않는 것이라고 생각하며 그것에 대해 더 많이 알고 싶습니다.

주제에 대해 어떻게 생각하십니까? 실제로 생산성을 높이는 것입니까? 책, 블로그, 슬라이드 쇼 등 주제에 관한 좋은 자료는 무엇입니까?


일부 코드 예제는 구현을 더 잘 이해할 수 있도록 크게 감사하겠습니다.


다음 은 메타 프로그래밍, 생성 프로그래밍 및 코드 생성과 같은 다양한 관련 프로그래밍 기술이있는 주제에 대한 위키 페이지 입니다.


32
한 번 코드를 작성하는 코드를 작성하는 코드를 작성했습니다 ... :)
Benjol

9
@Benjol : Lisp로 작성 했습니까?
compman

11
또한 서버 측 언어는 HTML, CSS 및 JavaScript를 생성하여 항상이 작업을 수행합니다. 더 많은 html을 생성하는 javascript로 html을 생성하는 서버 측 스크립트를 생성하는 서버 측 스크립트를 가질 수 있으며, 그 공통점 때문에 아무도 그것에 대해 눈을 돌리지 않을 것입니다.
zzzzBov

8
: 당신이 이미하지 않은 경우,이 IBM developerWorks 기사 시리즈 체크 아웃 " 메타 프로그래밍의 예술 " 1 부 , 2 부3 부 .
John Tobler

3
AtomWeaver ( atomweaver.com )는 자동 프로그래밍의 좋은 예입니다. 먼저 Lua에서 재사용 가능한 미니 프로그램을 만듭니다. 그런 다음 이러한 자산을 재사용하여 시스템을 모델링하십시오. 그런 다음 AtomWeaver는 "미니 생성기"가 포함 된 Lua 프로그램을 짜서 시스템의 최종 소스 코드를 생성합니다. 그런 다음 모델을 조정하고 다시 생성 할 수 있습니다.
Rui Curado

답변:


49

Lisp 세계에서는 코드를 작성하는 코드를 작성하는 코드를 보는 것이 일반적입니다. 따라서 적절한 크기의 Lisp 또는 Scheme 프로젝트는 좋은 코드 예제로 사용됩니다. Bigloo 뿐만 아니라 라켓 컴파일러와 런타임 소스를 보는 것이 좋습니다 . 라이브러리는 훌륭합니다.

생산성 : 메타 프로그래밍을 거의 모든 개발 작업에서 지배적 인 기술로 사용하고 있으며 코드 크기를 줄이고 가독성을 높이는 데 많은 도움이됩니다. 핵심은 Domain Specific Languages ​​사용 에 있으며 메타 프로그래밍은이를 구현하는 가장 효율적인 방법 중 하나입니다.


67

나는 조금 더 나아가서 코드를 작성하는 코드를 작성 하는 대신 객체, 메소드, 함수를 생성하는 코드를 작성 하는 것을 선호 합니다. 예를 들어 Lisp 매크로 나 Ruby 동적 프로그램 수정 기능을 사용하면됩니다.

작은 차이점은 자동으로 생성 된 소스 파일로 끝나지 않는다는 것입니다. 일반적으로 이러한 파일은 사람이 읽을 수 없으며 수정할 수 없으므로 파일을 방해하는 이유는 무엇입니까? 제어 할 수없는 것으로 코드베이스를 늘리는 아이디어가 마음에 들지 않습니다.

주제에 관해 읽은 책 중 하나는 Ruby메타 프로그래밍 하는 것입니다 (루비 언어를 아는 경우)


주석에서 다음 질문 이후에 편집하십시오.

생성 코드를 여전히 코딩해야하는 것이 왜 유용해야합니까? 반복해서 재사용 할 수 있도록 사용자 입력에 따라 다른 것을 생성 할 수있는 코드를 작성해야합니까?

첫째, 메타 프로그래밍은 목표가 아니라 도구입니다. "멋지다"또는 "X는 모든 개발자가 사용해야한다고 말했기 때문에 메타 프로그래밍을 사용하지 마십시오.

메타 프로그래밍을 사용하는 한 가지 좋은 이유는 코드에서 찾은 일반적인 패턴 (반복되는 것으로 패턴)을 일반화하고 다른 일반적인 프로그래밍 기술 (상속성, 디자인 패턴 등)로는 달성 할 수없는 것이라고 생각합니다.

으로 요르단 말했다 , 하나의 일반적인 사용 사례 데이터베이스 처리 및 ORM (객체 관계 매핑)입니다. 루비에서는 다시 ORM에 적용된 메타 프로그래밍의 좋은 예인 ActiveRecord 를 살펴 봐야 합니다.

마지막으로 :

"메타 프로그래밍을 적용하고 싶습니다. 어디에서 코드에 적용 할 수 있습니까?" 라고 생각하지 마십시오 .

생각 "나는 내 모든 코드를 통해 반복 것이 패턴을보고, 나는. 더 작고 재사용 무언가에 코드를 리팩토링하는 방법을 찾을 수 어쩌면 메타 프로그래밍은 나를 도울 수 있습니까?"


3
@Jose : 가장 일반적으로 템플릿을 통해 코드를 생성합니다. 예를 들어 아파치 (N-) 속도 또는 Visual Studio T4 템플릿이 있습니다. 그런 다음 메타 데이터를 템플릿에 공급하고 그때부터 새 파일을 만드는 프로그램이 있습니다. UI 스켈레톤, 엔티티 등을 생성하기 위해 항상 매우 쉬워요.
Falcon

2
@Jose Faeti는 Lisp 매크로 (또는 플랫폼 환경 설정에 따라 Clojure 또는 Nemerle)를 자세히 살펴보십시오.
SK-logic

1
메타 프로그래밍을 추가하여 정책이나 상태와 같은 일부 패턴을 대체 할 수 있지만 런타임 비용은 없습니다. 이는 일반적인 리팩토링으로 달성 할 수없는 문제뿐만 아니라 언젠가 더 나은 대안입니다.
deadalnix

1
@ Joose Faeti : 나는 당신이 파이썬을 알고 있음을 알았습니다. 메타 프로그래밍 기능도 있지만 실제로는 사용하지 않았습니다. Dangerously Advanced Python PDF
Kit

3
@Falcon : 코드를 생성하는 최악의 방법 인 IMO; 내장 메타 프로그래밍 기능이없는 언어의 경우 해결 방법이 매우 좋지 않습니다. Java 또는 C #을 생성하는 대신 해당 코드를 더 높은 수준의 JVM 또는 .NET 언어로 작성하는 것이 좋습니다.
케빈 클라인

19

더 좋은 방법은 다른 사람이 작성한 코드를 사용하여 코드를 작성하는 것입니다.

코드 자동화는 일반적으로 ORM 및 기타 데이터베이스 상호 작용 코드 및 반복적이지만 유사한 코드 작성에 좋습니다.

물론, 비슷한 클래스를 많이 만들고 있다면 훨씬 더 빨리 역동적 인 언어로 같은 것을 성취 할 수 있었을 것입니다.

코드 생성기로 레이블이 지정된 소프트웨어가 종종 있지만 이것은 많은 사람들이 수용합니다.

CodeSmith 및 MyGeneration과 같은 회사 및 제품을 보거나이 Wikipedia 기사를 찾아보십시오 : http://en.wikipedia.org/wiki/Comparison_of_code_generation_tools


6
더 나아지지 않습니다. 귀중한 작은 코드는 다른 블로크의 코드 생성 도구로 제대로 관리 할 수 ​​없습니다. 다른 블로크는 사용자의 특성에 대해 아무것도 모르기 때문입니다. 메타 프로그래밍의 가장 생산적인 사용은 도메인 별 언어를 구현하는 것입니다. 이름에서 알 수 있듯이 문제가있는 도메인에 따라 다르므로 다른 사람이 구현할 수 없습니다.
SK-logic

@ SK-logic : ORM 생성 코드는 어떻습니까? 다른 도구 / 라이브러리에서 생성되며 여전히 많은 프로젝트 요구를 충족시킵니다.
David

@David, 솔직히 말해서, 나는 일반적인 ORM에 대해 확신하지 못했습니다. 나는 과거에 그들에게 너무 많은 문제가 있었으며 종종 내 작은 ORM을 구현하는 데 의존했습니다.
SK-logic

1
@ Jordan, 모든 도구는 너무 구체적입니다 ( 텍스트 기반, 즉 디자인이 열등합니다). 대신 적절한 메타 프로그래밍에 대해 이야기하고 있습니다.
SK-logic

1
@ AtillaOzgur, 그들은 "매우 좋다"는 사실 일 수 있습니다. 그러나 eDSL보다 낫지는 않습니다. 독립형 코드 생성은 매크로 메타 프로그래밍보다 훨씬 제한적이고 유연합니다.
SK-logic

16

고전적인 예 중 하나는 lex와 yacc입니다. 그들의 주요 목적은 모든 종류의 파서를 작성하는 번거 로움을 피하는 것입니다. 그 과정에서 많은 규칙과 상태로 복잡한 파서를 작성하는 것이 훨씬 빨라지고 사람들이 자신의 롤링으로 인한 모든 놀라운 실수를 피할 수 있습니다.

이것은 c 뒤에 숨겨져있는 아이디어이기도하며 어셈블러를 작성하는 도구입니다. 당신이 명명하고자하는 모든 고급 언어에 대해서도 마찬가지입니다. 코드를 작성하는 도구에는 몇 가지 간단한 패러다임이 있습니다.

적절한 IDE는 손끝에서 문서화, 스마트 자동 완성 및 코드 스 니펫을 제공하여 도움을줍니다. IDE에는 다양한 템플릿도 포함되어 있으므로 프로그램을 처음부터 시작할 필요가 없습니다. uml 다이어그램을 작성하고 고급 언어로 수업을 진행하는 프로그램이 있습니다.

마지막으로, 문제 세트 내에서 코드 생성을위한 고유 한 도구를 작성할 수 있습니다. 이것이 lex와 yacc가 처음 시작된 방법입니다. 이러한 이유로 모든 종류의 도메인 특정 언어가 존재합니다. 코드를보다 쉽게 ​​이해하고, 일반적인 활동을 정리하거나, 간단한 명령으로 복잡한 섹션을 설명하는 솔루션을 설명하는 빌딩 블록을 만듭니다. 모든 문제 에 대한 해결책을 찾고 있지는 않지만 다루고있는 특정 문제를 쉽게 정의 할 수 있습니다.

어떤 의미에서 이진 계층 위에서 수행하는 모든 작업은 코드 자동화입니다.


정말 좋은 전망입니다. 대체로 프로그래머가 구문 코드 세부 정보 대신 작업을 용이하게하고 더 높은 수준의 코딩에 집중하기 위해 사용하는 많은 방법 중 하나 일뿐입니다.
Jose Faeti

1
@Jose Faeti wikipedia 기사 en.wikipedia.org/wiki/Automatic_programming 은 좀 더 자세한 내용에 관심이 있다면 다양한 도구에 대한 링크를 제공합니다. 또한 lex와 yacc에 대해 더 많은 문서와 설명이 있기 때문에 lex와 yacc를 읽는 것이 좋습니다.
스펜서 Rathbun

충분히 강력한 언어 (예 : C가 아닌 C ++)에서는 lex 및 yacc와 같은 외부 도구가 필요하지 않습니다.
케빈 클라인

YACC는 "모든 종류의 파서"를 작성하지 않습니다. 자동화 된 도움 없이는 제대로 처리하기 어려운 하나의 특정 종류의 파서 (LALR)를 작성합니다. 또 다른 유형의 파서 (재귀 하강)가있어 작성하고 이해하기가 훨씬 쉬우 며, 이에 따라 진행 상황을 읽고 이해하기가 더 쉽습니다.
메이슨 휠러

@MasonWheeler 파서의 종류는 광범위하고 정확하지 않은 방식으로 문제를 해결하기 위해 만들 수있는 문법을 언급하고있었습니다. 1 년 후 그것을 읽었을 때, 내가 원했던 것만 큼 명확하지 않습니다. 그래도 작성하고 사용하기가 더 쉬운 LL (*) 파서에 대해서는 귀하에게 동의하지 않습니다.
스펜서 Rathbun

13

메타 프로그래밍

메타 프로그래밍은 많은 상점에서 논란의 여지가있는 기술입니다. 그 이유는 다른 강력한 도구와 마찬가지로 도움이나 상처의 크기가 크다는 것입니다.

찬성

  • 보다 표현력이 높고 작성 및 유지 보수가 적은 코드 (주로 10 배 이상)
  • 코드로 해결하는 문제 클래스에 대한 일관성,보다 일관된 동작
  • 더 큰 문제 공간에 대한 솔루션을위한 코드가 적은 생산성

단점

  • 복잡성, 코드가 적더라도 매우 복잡 할 수 있습니다
  • 안전, 언젠가 유형 안전 및 정적 분석이 일반적으로 희생됩니다
  • 버그가 더 많은 영향을 미침, 작은 오류는 더 큰 영향을 미칩니다

저는 메타 프로그래밍에 대한 열렬한 팬이지만 오랫동안 그렇게 해왔습니다. 저에게 코드 크기 축소와 일관된 행동의 위험을 보상하는 것 이상의 트레이드 오프가 있습니다. 코드가 적다는 것은 버그가 적고 유지 관리해야 할 코드가 적다는 것을 의미하며 일반적으로 많은 기능을 매우 빠르게 추가 할 수 있습니다.

그러나 이것이 모든 프로그래머가 참여해야한다고 생각하지는 않습니다. 메타 프로그래밍으로 인한 큰 문제를보고 수정해야했습니다. 일반적으로 개념을 이해하지 못하고 기능을 확장하려고 시도하거나 버그를 수정하려는 사람들로부터 시작됩니다. 최소한의 디테일 지향적 인 특정 사고 방식이 필요합니다. 메타 프로그래밍 기술 사용에 대한 질문은 팀의 결정이어야합니다 . 이해하지 못하는 팀 구성원이있는 경우 기질이 없거나 반대하는 팀은 메타 프로그래밍을 사용해서는 안됩니다.


유용한 고려에 감사드립니다! 메타 프로그래밍을 사용하여 구현할 수있는 정말 간단하고 기본적인 작업을 제안 해 주시면 정상적인 코딩보다 시간을 절약 할 수 있습니다.
Jose Faeti

하하 몇 년 전에 GCC와 관련된 오류를 기억하게합니다. 162 줄은 오류 메시지를 화면에 표시합니다. 재귀 메타 프로그래밍 FTW!
deadalnix

6
메타 프로그래밍의 복잡성은 과대 평가되었습니다. 올바른 도구를 사용하는 한 복잡한 것은 없습니다. DSL은 일반적인 상용구 코드보다 디버깅 및 유지 관리가 훨씬 쉽습니다. 또한 유형 안전성을 희생 해야하는 이유를 이해할 수 없습니다. DSL에는 도메인 고유의 고효율 유형 시스템이있을 수도 있습니다.
SK-logic

2
@ SK-logic : 모든 언어가 메타 프로그래밍을 지원하지는 않습니다. 따라서 때로는 유형 안전과 같은 것들이 희생됩니다 (즉, C) . 또한 메타 프로그래밍은 단순한 DSL이 아닙니다. 디스패치 스타일 프로그래밍, 제네릭, 커리, 객체 검사, 동적 응용 프로그램 등과 같은 것들이 포함됩니다. 복잡성에 관해서는, 우리 (메타 프로그래밍 경험이있는 사람들)가 복잡하지 않다고 말하는 것이 쉽다고 생각합니다. 코드가 실행될 모든 경우를 이해하는 데 어려움을 겪었습니다. 그것은 주로 그들의 경험과 관련된 기술에 달려 있습니다.
dietbuddha

@dietbuddha, 어떻게 구현하든 상관없이 하나의 희생 유형 안전이 자체 DSL 인 이유는 무엇입니까? 강력한 유형 시스템을 사용하여 순수한 C로 임시 인터프리터를 작성할 수 있습니다 (예 : 포옹 참조). 대상 언어 유형 시스템에 의존하지 않고 모든 유형 검사 자체를 수행하는 C를 대상으로하는 코드 생성기를 작성할 수 있습니다. 복잡성 : 대부분의 사람들은 불필요하게 복잡한 방식으로 작업을 수행하는 반면, "정상적인"프로그래밍에서와 같이 모든 동일한 설계 방법을 코드 생성에 적용 할 수 있습니다. 거의 새로운 지식이 필요하지 않습니다.
SK-logic

9

대부분의 코드는 코드를 작성합니다. 예를 들어 PHP 코드는 HTML 작성에 도움이됩니다. php pdo 라이브러리는 SQL 호출을 작성하는 데 도움이됩니다. 파일 I / O 기능은 OS와 통신하기위한 코드를 작성합니다. 일반 함수 호출조차도 실행되는 다른 코드 블록에 대한 참조입니다. 따라서 함수 호출은 코드를 작성합니다.

넓은 의미에서, 우리는 컴퓨팅을 하드웨어에 연결된 코드의 물리적 현실과 맞닥뜨릴 때 스택을 반복적으로 형성하는 코드를 작성하는 코드를 작성하는 것으로 생각할 수 있습니다.


3
나는 HTML을 프로그래밍 언어라고 부르지 않을 것이다. 그것은 문서를위한 구문입니다
Simon Bergot

3
@ 시몬의 흥미로운 점. 우리가 사용하는 다른 코드에는 다양한 표현력이 있습니다. 코드는 약한 언어, 더 강한 언어 또는 자체 언어로 작성할 수 있습니다.
벤 헤일리

5

이 작업을 수행하는 방법은 요구 사항에 따라 다릅니다. 정적 코드 생성을 사용한다고 가정하면 모든 인프라를 직접 작성하거나 CodeSmith 또는 MyGeneration과 같은 기존 생성기를 사용할 수 있습니다. 이를 사용하여 필요한 템플릿을 작성하기 만하면됩니다.

마지막 프로젝트는 기본적인 ASP.NET CRUD 화면이었습니다 (코드 생성이 좋습니다). 프로세스는 엔티티를 XML 파일의 메타 데이터로 정의했습니다. 필요한 다양한 아티팩트 (엔티티 클래스, 저장소, 서비스 클래스, asp.net 컨트롤, asp.net 페이지 등)를 포괄하는 템플리트를 작성하십시오. 생성 프로세스를 실행하고 출력 스타일을 지정하십시오.

템플릿을 작성하는 데 약간의 오버 헤드가 있지만 후속 유사한 프로젝트에 재사용 할 수 있습니다. 마찬가지로 기본 데이터에 대한 변경은 메타 데이터를 변경하고 생성을 다시 실행하여 변경을보다 간단하고 빠르게 구현함으로써 처리됩니다.

테스트에 관해서. 이것은 템플릿 시스템이므로 프로세스의 출력을 처음 확인하는 데 약간의 시간을 소비해야합니다. 템플릿이 잘못되면 해당 템플릿의 모든 출력도 비슷하게 잘못됩니다. 이것에 만족하면 코드 생성기를 사용하여 XML 메타 데이터에서 기본 테스트를 작성하여 특수한 경우를 포함하도록 확장 할 수 있습니다. 그러나 특정 사항을 충족시키기 위해 코드 테스트를 수동으로 수행해야 할 수도 있으며 코드 생성으로 작업이 줄어드는 것은 아닙니다.


5

우리 회사에서는 실제로 인터넷에서 다운로드 한 데이터로 C ++ 또는 C # 클래스를 생성하는 일부 도구를 사용합니다. 이 클래스는 데이터 컨테이너이며 목록에 많은 수의 개체가 포함되어 있습니다.


예를 들어 Visual Studio와 같은 IDE에서 발견 된 코드 스 니펫과 같은 것이 있습니까?
Jose Faeti

@Jose 우리 도구는 HTML 출력을 클래스로 변환하는 응용 프로그램입니다. 따라서 응용 프로그램을 시작할 때마다 데이터를 다운로드하는 대신 한 번 다운로드하여 클래스를 만듭니다.
Holli

5

메타 프로그래밍은 오랫동안 프로그래밍의 일부였습니다. SWIG 또는 WYSIWYG 디자이너뿐만 아니라 코드를 생성하는 도구뿐만 아니라 C의 전 처리기 또는 C ++의 템플릿 및 C # / Java의 제네릭과 같은 언어 도구도 반영합니다.

실제로 모든 컴파일러는 다른 메타 프로그램 일 뿐이며 프로그램 텍스트와 출력 기계 또는 VM 코드를 사용한다고 주장 할 수 있습니다. 그리고 컴파일러가없는 삶? 아야


맞습니다. 그러나 실제로 생산성을 높이기 위해 어떻게 자신의 프로그래밍 언어로 구현할 수 있습니까? 그것이 내가 놓친 것입니다.
Jose Faeti

5

여기 내 과거의 구체적인 예가 있습니다.

데이터 액세스를 위해 BDE를 사용하여 약 50MB의 Delphi 소스 코드가있는 사이트에서 일하고있었습니다. 그들은 직접 Oracle Access를 사용하여 BDE에서 지원하는 최고 버전을 넘어서 Oracle 업그레이드를 허용하려고했습니다.

따라서 코더 팀이 모든 양식과 데이터 모듈을 통해 수동으로 모든 구성 요소를 변경하는 대신 PERL 스크립트를 작성했습니다.

  1. DFM (양식 파일)을 구문 분석하고 모든 TQuery, TTable, TStoredProcedure & TDatabase 오브젝트를 식별하여 항목을 목록에 저장했습니다.

  2. PAS (코드)를 파싱하고 객체의 사용법을 식별했습니다. TQueries가 업데이트 또는 선택을 수행 했습니까? 또한 IDE에서 양식에 놓지 않고 코드로 작성된 모든 오브젝트를 식별했습니다.

  3. DFM & PAS를 다시 작성하여 오브젝트 유형을 적절하게 변경 (예 : SQL 특성이 "select * from"등으로 설정된 TTable-> TOracleDataSet) 및 메소드 호출. 또한 매개 변수를 닫고 열고 설정하기에 적절한 경우 추가 메소드 호출이 추가되었습니다.

즉, 3 개월 동안 스크립트를 조정하여 6 개월 동안 일하는 5 명 이상의 개발자가 아닌 다른 코딩 스타일로 다른 팀이 작성한 다른 응용 프로그램에서 작동하도록합니다.

그리고 그 접근법을 사용하려고 생각한 이유 는 Pragmatic Programmer 를 읽는 것이 었습니다.


며칠이 지난 지금 Perl에 들어 갔으며 웹 사이트 개발을위한 기본 작업 영역을 생성하기 위해 이미 "작업 영역 만들기"를 입력하여 모든 디렉토리, 파일 등을 생성하는 몇 가지 생산성 도구를 만들었습니다. :)
Jose Faeti

1
@ 호세 그 아이디어입니다. 스크립팅 언어를 사용하여 반복적 인 작업을 자동화하십시오. 일회성으로 생산성을 8 배 향상 시키거나 경우에 따라 시간이 많이 걸리는 작업을 반복해서 수행 할 수 있습니다.
mcottle

4

당신은 예를 요구합니다 ....

SQL로 작업 할 때는 데이터베이스를 직접 변경하지 말고 대신 데이터베이스의 구조적 변경 (테이블, 열, 기본 키, 제약 조건 추가 등)을 비롯하여 원하는대로 변경하는 스크립트를 실행해야합니다. . 종종 많은 테이블이나 열에 대해 동일한 작업을 동시에 수행해야하며 하나씩 하나씩 수행하는 것은 지루한 일이 될 것입니다. 짧은 스크립트는 원하는 것을 수행하는 큰 스크립트를 출력하여 실제 일 수 있습니다. 시간 절약.

예를 들어, DATE 데이터 유형이 MS SQl Server에 도입되기 전에 날짜 열의 유일한 선택은 시간 부분 (데이터를 조금 더 다루기 어렵게 만드는 시간 부분)이있는 DATETIME이었습니다. 날짜 데이터 유형의 버전으로 업그레이드 할 때 시간이 항상 00:00 인 열을 업데이트 할 수 있습니다. 수십 또는 수백 개의 DateTime 열이있는 데이터베이스에서는 시간이 많이 걸립니다. 그러나 모든 테이블을 쿼리하는 스크립트를 작성하는 것은 쉽습니다. 데이터 유형이 DATETIME 인 모든 열을 검사하여 시간이 00:00이 아닌지 확인하고 테이블 / 열을 변경할 ALTER 문을 작성하지 않는지 확인하십시오. DATE에 데이터 유형. Presto, 코드를 작성하는 코드


3

CL (Common Lips) Macros를 살펴보십시오. 제 생각에는 정확히 당신이 원하는 것입니다. 입술은 메타 프로그래밍에 완벽합니다.

또한 나는 Nemerle을 제안 한다 완벽한 메타 프로그래밍 지원 (매크로 포함)으로 .NET 기능을 원한다면

그러나 진정한 코드 생성 엔진을 원한다면 Apache thrift를 살펴보십시오.


3

나는 그런 도구를 만들고 있습니다. 특별한 경우 데이터베이스의 함수 시그니처를 기반으로 데이터 계층에 기반한 VB.NET 코드를 생성합니다.

코드 생성 방법을 모르지만 일단 규칙이 설정되고 생성되어야하는 코드는 항상 해당 규칙을 기반으로 생성 할 수 있으므로 코드 생성 작업시작하기 란 처음에는 어렵습니다. , 그 코드로 작업하는 것은 그리 어렵지 않습니다. 물론 코드 생성의 복잡성과 규칙 수에 따라 작업이 더 어려워 질 수 있습니다. 그러나 본질적으로 자동 코드 생성은 반복적 인 코딩 작업에 사용되며 크게 다른 고급 코드에는 사용되지 않습니다.

출력 테스트 는 두 가지입니다. 먼저 코드가 컴파일되고 쉬운 지 확인해야합니다. 그런 다음 출력이 생성 된 매개 변수를 기반으로 출력이 의도 한대로 작동하는지 확인해야합니다. 그 어려움은 생성하는 코드의 복잡성에 따라 다릅니다.

진심으로 추천하는 바는 반복적 인 방식으로 코드를 작성 하는 것처럼 느껴지고 시간을 할애 할 수 있다는 것입니다. 수행중인 작업을 생성 된 코드로 수행 할 수 없는지 생각하십시오. 그리고 그렇다면 (거의 경우보다 반복적 인 코드 인 경우) 몇 번 연장 해야하는지 생각하고 코드를 약간 수정하고 정확한 종류의 코드를 몇 번 작성해야합니까? 이 중 하나에 대한 답변이 "다수"이면 해당 코드의 생성기를 진지하게 고려해야합니다 .


IPP 가 도움이 되길 바랍니다.


대답 해줘서 고마워요! 예제의 규칙은 실제로 어떻게 구현됩니까?
Jose Faeti

1
나는 모든 규칙을 말할 수는 없지만 몇 가지 예를들 수 있습니다. oracle 데이터베이스에 의해 노출 된 인터페이스를 구문 분석하고 oracle 인터페이스의 함수 시그니처를 고려합니다. 서명을 기반으로 데이터 계층 함수의 이름을 생성합니다. 우리는 항상 오라클 데이터 테이블에서 데이터를 얻는 데 사용하는 특수 객체 유형의 배열로 구문 분석하고 저장하는 결과로 db에서 얻는다는 것을 알고 있습니다. 또한, 우리가 등등 생성 함수에 입력하고 출력 된 대응하는 파라미터에 추가 DB 기능 특성의 입력 / 출력 파라미터에 기초 ..
이오안 폴 Pirau

3

HTML을 생성하는 JavaScript 코드가 포함 된 웹 페이지를 출력하는 PHP 모듈이 있습니다. 그것은 바로 세 개의 층입니다. 소년은 읽기 힘들었다!

프로그래밍 클래스에서는 사용자로부터 수식 문자열을 가져 와서 구문 분석하고 값을 표시하는 프로그램을 작성해야했습니다. 가장 인상적인 솔버는 단순히 사용자 입력을 가져 와서 main () {printf ( "% d", ...);}에 싸서 컴파일, 링크 및 실행하기위한 스크립트를 실행했습니다. 그는 파서를 쓰지 않았다! 오늘은 SQL SELECT 문에서 그렇게 할 수 있습니다.

그것은 당신이 가지고 놀아야 할 도구이며, 나중에 편리하게 사용할 수 있도록 보관하십시오.


실제로 구현하려고했던 것과 동일합니다! :) 그러나 Perl로 오프라인으로 코딩하기로 결정했으며 훌륭하게 작동합니다. 추가하려는 수많은 기능이 있습니다!
Jose Faeti

전혀 문제없이 최대 20 층의 언어를 언어로 변환하는 코드를 작성하고 있습니다. 20 층의 호출 스택 깊이를 갖는 것보다 더 복잡하지 않습니다. 그래서 나는 그것이 " 언제나 유용하게 사용될 미래의 날을 위해 그것을 보관 해 두는 도구"라고 강력히 동의하지 않는다 -코드 생성은 항상 편리하다.
SK-logic

3

Prolog를 사용 하여 깔끔한 메타 프로그래밍 솔루션을 개발했습니다 . C ++에서 주 응용 프로그램은 문제의 추상 정의를 런타임에 Prolog 응용 프로그램으로 변환하여 위임합니다. C ++에서 동등한 기능을 작성하는 데 종종 시간이 오래 걸립니다.

이 시나리오는 코드 작성 코드 인수 를 선호하는 훌륭한 사례라고 생각합니다 .


3

주제에 대해 어떻게 생각하십니까?

메타 프로그래밍은 비생산적이고 비 지능적인 코드가 많지 않은 특정 동작 (ORM 구현과 같은)을 달성하는 데 시간이 더 걸리기 때문에 가장 일반적으로 비 동적 언어와 관련이 있습니다.

그러나 PHP와 같은보다 역동적 인 언어에서도 코드 생성은 실제로 생명을 구하고 생산성을 크게 향상시킬 수 있습니다. 현대 프레임 워크에서는 선언 한 특정 비즈니스 오브젝트에 대한 대부분의 공통 모델, 양식, 테스트 및 조치를 생성하는 스캐 폴딩이 매우 일반적입니다. symfony 또는 RoR과 같은 프레임 워크가 큰 성공을 거둔 이유 중 하나입니다. 이러한 코드 생성 도구는 일관된 코드를 매우 빠르게 만들고 프로그래머의 생산성을 향상시킵니다.

웹 사이트에서 대부분의 상호 작용은 다음과 같은 네 가지 주요 동작으로 이루어집니다.

  • 요소 만들기
  • 필터링 가능한 요소 집합 검색
  • 새로운 속성으로 요소 업데이트
  • 요소 집합 삭제

이 4 가지 주요 행동과 관련된 모든 것은 최소한 생산성을 극대화하기 위해 코드 생성 도구를 사용하여 달성해야합니다.

우리 회사에서는 심포니를 사용하고 있으며 관리자 생성기는 런타임에 코드를 생성 (및 캐시)하기도하는 뛰어난 도구이므로 어떤 종류의 작업이나 외부 도구를 사용하지 않아도됩니다. 새 코드를 생성하려면 캐시를 정리하면됩니다. CRUD 작업에 이러한 종류의 도구를 사용하는 것이 좋습니다.

그러나 심포니 공헌자들이 한 일을하는 것은 쉬운 일이 아닙니다. 나는 코드 생성 작업을 직접 구현했으며 실제로 일관된 작업을 수행하고 대부분의 사례를 다루는 광범위한 구현으로 쉽지 않습니다.

실제로 생산성을 높이는 것입니까?

메타 프로그래밍은 하위 수준의 작업 (프레임 워크, 캐싱, 컴파일러 등)에서 매우 중요하지만 비즈니스 계층에서 작업을 수행 할 때는 특히주의해야합니다.

코드 생성을 사용하는 것은 의심 할 여지없이 생산성 향상에 큰 도움이됩니다. 직접 프레임 워크를 작성하지 않는 한 자체 코드 생성 도구를 구현하십시오.

책, 블로그, 슬라이드 쇼 등 주제에 관한 좋은 자료는 무엇입니까?

프로그래밍을 이해하는 데 가장 좋은 리소스는 항상 훌륭하고 주석이 달린 소스 코드입니다. 나는에보고 말할 것이다 RubyOnRails심포니의 관리 발생기하는 것은 좋은 생각이다.


3

여기에 많은 답변이 일반적으로 메타 프로그래밍으로 알려진 것을 언급하고 있지만 실제로는 프로그램을 이해 하거나 합성하는 프로그램 에 관한 자동 프로그래밍으로 알려진 AI와 관련된 분야 가있었습니다 [1].

모든 컴파일러 (또는 메타 프로그램, 코드 생성기, 번역기, 매크로 시스템 등)는 변환 작업을 수행하며 고정 변환 알고리즘을 수행하여 입력에서 출력을 생성합니다. 그러나 기존의 컴파일러 또는 메타 프로그램은 목록 정렬의 정의, 설명 또는 예 (예 : [5, 3, 9] => [3,5,9])를 고려하여 정렬 알고리즘을 만들지 않습니다. 이 "자동 프로그래밍"분야에 관심이있는 그러한 문제들.

[1]-프로그램 이해 시스템에 대한 진행 보고서 ftp://db.stanford.edu/pub/cstr/reports/cs/.../CS-TR-74-444.pdf 공유


2

메타 프로그래밍은 유지하기가 매우 어려울 수 있습니다. 처음에는 우아해 보이지만 코너 케이스를 시작하면 오류가 늦게 발생하고 (생성 된 코드에서) 오류가 발생하여 악용됩니다.

나는 주로 파이썬 코드를 작성했으며 경험상 메타 프로그래밍은 항상이 언어로 나쁜 선택입니다. 지루한 일반 언어 기능으로 항상 할 일을 리팩토링 할 수 있습니다. 결과는 덜 펑키지만 살기가 더 쉽습니다.


모든 종류의 코드 유지하기가 매우 어려울 있습니다. 올바른 방법으로 수행하면 매우 쉽습니다. 메타 프로그래밍은 실제로 유지 관리 성을 크게 향상시킬 수 있습니다. 파이썬은 엉뚱한 AST로 파이썬이 이런 사고 방식에 적합하지 않기 때문에 실제 메타 프로그래밍과 관련이 없을 것입니다. 그러나 Python을 사용하더라도 Tempita 라이브러리를 높은 효율로 사용했으며 이전 Python 경험이 거의없는 팀에서도 유지 보수 문제가 없었습니다.
SK-logic

파이썬 AST에 대한 귀하의 요점에 관심이 있습니다. 메타 프로그래밍 목적으로 tempita를 사용 했습니까?
Simon Bergot

이것은 ( docs.python.org/library/ast.html ) 매우 임시 AST이며 파서는 최적화되지 않은 과장된 트리를 제공하여 분석에 문제가 발생합니다 (특히 Python에서 적절한 패턴 일치가 부족함). 이러한 AST를 생성하는 것도 그리 편리하지 않습니다. 나는 파이썬과 C 코드 (예 : 순수한 텍스트 기반 메타 프로그래밍)를 생성하기 위해 tempita를 사용했으며 특정 작업 (보일러 코드 생성)에 잘 작동했습니다. 또한 종종 일부 XML 상위 레벨 설명에서 C 코드를 생성하기 위해 Python을 사용했습니다.
SK-logic

2

OP는 자원을 요구합니다.

당신은 우리를 찾을 수 DMS 소프트웨어 재 설계 툴킷 재미를. 순수한 메타 프로그래밍 도구로, 사용자 정의 프로그램 분석 및 변환 도구를 구축 할 수 있습니다.

[OP의 질문에 대한 의견을 따르기 위해 특정 변환 도구를 작성하는 데 사용될 때 DMS는 코드를 작성하고 코드를 작성하는 제품군입니다.]

DMS는 대상 프로그래밍 언어에 대해 독립적이지만 (독립적이지 않음)이를 달성합니다. OS가 표준 프로그래밍 작업을위한 다양한 서비스를 제공하는 것처럼 DMS는 다양한 메타 프로그래밍 작업에 필요한 표준 서비스를 제공합니다. 이러한 서비스에는 강력한 구문 분석, Abstact 구문 트리의 자동 구성, 트리의 패턴 일치 및 재 작성, 다중 상속, 제어 흐름, 데이터 흐름, 지점 및 호출과 같은 불규칙한 범위 지정 규칙으로 언어를 쉽게 관리하는 기호 테이블 라이브러리가 포함됩니다. 그래프 분석. 처리 할 특정 언어가없는 경우이 중 어느 것도 의미가 없으므로 DMS는 이러한 일반 기계와 관련된 언어 정의를 허용하여 언어 별 구문 분석, AST 구성, 대상 언어 별 패턴 일치 / 재 작성을 사용합니다. 언어 구문

또한 OS와 마찬가지로 DMS는 작성하려는 메타 데이터에 대한 의견이나 제약이 거의 없도록 설계되었습니다. 즉, 메트릭 추출, 데드 코드 찾기, 가로 세로 찾기, 번역하기 등 다양한 용도로 사용할 수 있습니다. 언어, DSL에서 코드 생성, 대규모 응용 프로그램 재구성 (DMS는 이미 이러한 모든 작업에 사용되었습니다).

언어 참조 매뉴얼의 모든 것을 인코딩하는 데 시간을 소비하지 않으려면 강력한 언어 정의가 필요합니다 (Java 및 C ++의 의미에 대해 생각하십시오). DMS는 완전한 언어 정의 라이브러리를 제공하여이 문제를 해결합니다. 여기서 아날로그는 OS에 데이터베이스가있는 것과 비슷합니다. 데이터베이스 중심 응용 프로그램을 작성하기 위해 이들 중 하나를 구현할 필요는 없습니다.


2

MIT 과정 6.916 : 혁신적인 웹 서비스의 소프트웨어 엔지니어링 ( http://philip.greenspun.com/teaching/psets/ps4/ps4.adp ) 에서 Philip Greenspun의 문제 세트 4를 참조하십시오 .

"학생들에게 메타 데이터의 장점을 가르치십시오.보다 구체적으로, 웹 서비스의 요구 사항을 공식적으로 표현한 다음 해당 서비스를 구현하는 컴퓨터 프로그램을 생성하는 컴퓨터 프로그램을 구축하는 방법을 배웁니다."

이것은 첫 번째 거품 동안 ArsDigita ( http://en.wikipedia.org/wiki/ArsDigita ) 모집이 해결해야 할 문제 세트 중 하나입니다 .

pset의 "Web Nerds에 대한 SQL"책 Philip이 " http://philip.greenspun.com/sql/ 으로 이동했습니다 .


2

2001 년경이나 나는 비즈니스 객체와 데이터 객체를 광범위하게 사용하는 프로젝트를 시작했습니다. 나는 프론트 엔드 웹 사이트를 구축해야했지만 비즈니스 계층과 데이터 액세스 계층이 완전히 개발되지 않았기 때문에 엄지 손가락으로 매달렸다. 몇 주 후, 나는 그 층들이 무엇을하고 있는지 열심히 살펴보기 시작했습니다. 기본적으로 이들은 스토어드 프로 시저에서 리턴 된 데이터를 데이터의 필드에 해당하는 특성을 가진 오브젝트 콜렉션으로 노출하거나 입력 매개 변수를 가져 와서 스토어드 프로 시저로 전송하여 데이터베이스 테이블에 저장했습니다. 두 계층 사이에 많은 직렬화 / 역 직렬화가 발생했으며 IDL / ODL 형식 라이브러리와 관련된 Microsoft Transaction Server가 있었지만 모두 패턴에 맞았습니다.

2 주 후, IDL / ODL을 덤프하고 비즈니스 및 데이터 객체를 덤프하는 코드 생성기가 작동했습니다. 비즈니스 및 데이터 계층 개체를 구축하는 사람은 이러한 개체를 디버깅하고 테스트하는 데 2 ​​년이 걸렸습니다. 2 주 안에 코드 생성과 동일한 결과를 얻었지만 모두 생성되었으므로 버그가 거의 없었습니다.

그 코드 생성기 (하위 CASE 도구)는 원리가 너무 간단하기 때문에 약 8-10 년 동안 여러 가지 반복을 거쳤습니다. 많은 반복적 인 코딩이 가능 해지면 더 이상 걱정할 필요가 없습니다.

예, 코드 생성기를 사용하십시오. 특히 코딩이 반복적이고 잘 정의 된 패턴에 맞을 때.

사람들이 RegX 매크로를 사용하여 비슷한 일을하거나 Excel 수식을 사용하여 비슷한 일을하는 것으로 알고 있습니다 (이 작업도 수행합니다).


2

메타 프로그래밍 예제

Authority 라는 Ruby 인증 라이브러리가 있습니다. 그것은 개발자가 같은 방법으로 자신의 응용 프로그램에서 질문을 할 수 있습니다 current_user.can_read?(@post)@post.readable_by?(current_user). 이러한 질문은 중앙 집중식 권한 부 여자 클래스에 의해 답변됩니다.

이것은 중요한 부분입니다. 기관은 사용자의 구성을 볼 때까지 어떤 방법을 정의할지 모릅니다 . 사용자 구성에는 다음이 포함될 수 있습니다.

config.abilities =  {
  ...
  :read      => 'readable',
  :microwave => 'microwavable',  # user-defined
  ...
}

이 경우와 같은 방법이 필요합니다 current_user.can_microwave?(@post).

메타 프로그래밍은이를 가능하게합니다. 구성을 읽은 후 어떤 메소드를 정의 해야하는지 알고 있습니다 .

Authority.verbs.each do |verb|
  class_eval <<-RUBY, __FILE__, __LINE__ + 1 # allows for a nice bracktrace
    def can_#{verb}?(resource)
      resource.#{Authority.abilities[verb]}_by?(self)
    end
  RUBY
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.