2010-01-15 6 views
12

저는 (거의 완성 된) Javascript 프로젝트를 14 개월 넘게 작업하고 있습니다. 프로젝트는 밤새 끝날 것으로 예상되는 해킹으로 시작되었지만 시간이 지남에 따라 Javascript 부분은 68 개의 개별 파일과 10,314 개의 비어 있지 않은 행으로 성장했습니다. 슬프게도 현재 C 제작 프로세서에 의존하여 구축하고 있습니다.자바 스크립트 친화적 인 전 처리기 딜레마

JavaScript에 대해 cpp를 사용하는 방법을 설명하기가 어렵습니다. 이것은 단지 해킹 일 뿐이며, 매크로 확장, ifdef 정의 및 너무 많은 노력없이 포함 된 것을 필요로했습니다. 약 3 초가 지나면 cpp가 작업에 "완벽 함"을 알게되었습니다.

  • 릴리스 모드에서 사라지는 LOG() 매크로를 제공하십시오.
  • 릴리스 모드에서 사라지는 ASSERT() 매크로를 제공하고 원본 파일 및 줄 번호 태그가 지정된 예외를 생성합니다.
  • 충돌이 발생하면 서버에 다시보고되는 이벤트를 압축 된 형태로 기록하는 "확인 된"빌드를 생성 할 수있는 코드에 대해 LOG() 및 ASSERT() 구현을 스왑합니다.
  • Python 백엔드와 공유되는 구성 파일을 기반으로 PROJECT_SOME_CONFIG_VAR_NAME을 "1"로 바꿉니다.

모든 해킹과 마찬가지로이 해킹은 현재 프로젝트에 너무 하드 코딩되어있어 실제로이를 대체해야하는 작업에 대해 생각조차 싫어합니다. 내 프로젝트는 코드베이스를 자신의 전용 테스트 서버 (내 랩탑이 아닌)로 옮기고 싶지만, 리눅스 인스턴스를 설정할 때, 4.1 이후의 GNU cpp 버전은 더 이상 자바 스크립트를 사전 처리하지 않는다는 것을 발견했다. 오류가 발생하여 고장났습니다.

GCC의 특정 버전을 빌드 요구 사항 목록에 추가하는 대신, 나는이 혼란을 진정으로 해결할 좋은 시간이 될 것이라고 생각했습니다. 내 문제는, 그게 내가 cpp와 동일한 전원 및 기능을 가진 대체 선행 프로세서를 찾을 수 없다는 것입니다! 나는 m4를 고려해 보았지만, m4는 고통의 세계입니다. 내가 찾은 다른 자바 스크립트 특정 처리기는 모든 예를 들어 나는 현재에 의존하고 기능이 부족 :

  • 가 경비를 포함
    • __FILE__ & __LINE__
    • 가변 인자 매크로를
    • 토큰 연결
    • 조건부 컴파일

    심각하게 고려하고 있습니다. Javascript만을위한 아주 새로운 전 처리기를 구현했다. C 전처리 기 구문이 너무 잘 작동했기 때문에이 전 처리기 구문을 완전히 빌려왔다. 그렇게하기 전에 더 나은 옵션이 있는지 궁금합니다. :) 아마도 스왑 할 수있는 cpp와 유사한 일반 전처리 기가 아마도 있을까요? 68 개의 파일에서 모든 전 처리기 구문을 바꾸는 데 필요한 작업은 전처리기만 간단히 다시 구현하는 데 필요한 작업량에 접근합니다.

    C 전처리기에 의존하면서 필자가 지금까지 만든 것에 놀랐습니다. 그것은 마음이 이해하기에 건강한 것보다이 일에 더 효과적입니다. 나에게 열려있는 또 다른 옵션은 Linux, Darwin-i386, Win32 용 cpp-4.1 버전을 정적으로 빌드하고이 바이너리를 프로젝트 저장소에 저장하는 것이다.

    도움말!

    +0

    좋아, 나는 동정한다. 너 진짜 엉망진창이야, 왜 cpp가 추락하니? 그렇게해서는 안됩니다. –

    +0

    @Stefano, 세분화 오류와 같은 진정한 충돌은 아닙니다. Javascript의 어휘 및 문법 집합이 C. GCC 4.2+와 분명히 다르므로 파서가 혼란스러워지고 있습니다. GCC 4.2+는 훨씬 더 엄격한 파서를 갖고있는 것처럼 보입니다. 호기심에서 벗어난 – dmw

    +0

    : JS 구성 요소가 C PP를 혼동 하는가? – Christoph

    답변

    3

    이미 mcpp을 사용해 보셨나요?"휴대용 C 전처리 기"

    그럴 수 없다면 일반적인 매크로 프로세서 (예 : gema)를 사용하고 그 위에 충분한 cpp를 만들 수 있습니다.

    +2

    mcpp에 대한 링크를 가져 주셔서 감사합니다. "- @ old"모드로 상당히 멀리 떨어져 있지만 문자열 (C의 문자 리터럴)에 작은 따옴표 문자를 사용하고 있기 때문에 실패한 것으로 보입니다. 일시적으로 ema마를 조사하십시오. – dmw

    +1

    이 질문에 대한 답은 가장 유용했기 때문에 답해주십시오. 결국 순수 글쓴이에 필요한 거의 모든 기능을 포함하고 있기 때문에 전체 코드베이스를 Google Closure로 변환하기로 결정했습니다. 컴파일러는 '배포'시간에 동일한 이점을 제공합니다 (함께 링크하고 디버그 제거 암호). – dmw

    0

    비슷한 질문에 대한 답변을 바탕으로 cpp와 다른 경쟁자들을 살펴 보았습니다. 그렇다면 제가 생각한 것 중 가장 좋은 대답은 PHP입니다. 다음을 고려하십시오 :

    1) PHP는 실제로 전 처리기 (약자로 사용)입니다.

    2) PHP는 대부분의 서버에서 사용할 준비가되었습니다. 파일 확장자를 ".js"에서 ".php"또는 ".js.php"로 변경하거나 (내 환경 설정) 서버 설정 파일을 간단히 편집하면됩니다 (자세한 내용은 다른 위치에서 찾을 수 있습니다).).

    3) 많은 JavaScript 개발자는 이미 PHP에 익숙하거나 전문가입니다.

    4) PHP는 다른 많은 전 처리기와 달리 Turing-complete입니다.

    5) 많은 이점을 얻으려면 기본적인 PHP 지식 만 필요합니다.

    6) 다른 프리 프로세서보다 PHP에 대한 더 많은 문서/자습서/포럼이 있습니다.

    하지만 대부분 이상하지만 너무 멋지다. 누구에게 저에게 아이디어를 주 었는지에 감사드립니다. 나는 지금 자신의 게시물을 찾을 수 없습니다.

    +0

    PHP가 다른 프로그래밍 언어보다 나은 이유는 무엇입니까? 몇 가지 예를 보여줄 수 있습니까? 예를 들어 release mode_에서 사라지는 _LOG() 매크로를 어떻게 수행할까요? _ 좋은 방법으로 _1을 사용하여 _PROJECT_SOME_CONFIG_VAR_NAME을 바꾸시겠습니까? –