19

Coffeescript는 멋진 언어라고 생각합니다! 나는 Coffeescript에 정적 분석을 추가하는 몇 가지 프로젝트/이슈/기능을 찾고있었습니다. 그러나 일부 검색 후 Coffeescript faqthis page은 정적 분석이 실행 가능하지 않을 수 있음을 알았습니다.Coffeescript 정적 분석/정적 Typechecking -로드 블록

정적 분석/정적 유형 검사를 Coffeescript에서 구현하는 데 근본적인 문제가있는 경우이 종류의 항목이 컴파일러에 아직 존재하지 않기 때문에 궁금합니다.

또한 사소한 수표로는 불가능하지만 직접적인 분석을 위해서만 작동 할 수 있습니까? 내가 똑바로 말할 때, 사용자가 동일한 이름 (클래스) 또는 최상위 레벨 (또는 관련 .coffee 파일의 모음에서 최상위 레벨)로 함수를 두 번 정의했는지 여부와 같은 사소한 것들을 확인하는 것을 의미합니다. .

누군가 정적 분석/유형 검사를 구현하는 것이 왜 쉽지는 않지만 가능한 시간/가치가있는 가치가 있는지 보여주는 몇 가지 예를 지적 해 주시면 감사하겠습니다.

대단히 감사합니다!

+0

생성 된 JS 파일에서 jshint를 실행하는 것은 어떻습니까? 커피를 JS 및 JS 도구로 컴파일하여 원하는 것을 수행하는 것은 흔한 일은 아닙니다. –

답변

13

이 답변은이 또한 흥미가 있기 때문에 약간의 두뇌 덤프입니다. 희망이 도움이됩니다.

Google Closure Compiler를 사용하여 CoffeeScript가 생성하는 코드를 정적으로 분석합니다. 그것은 정말 좋은 정적 분석기를 가지고 있으며 휠을 재발견 할 좋은 이유가 있는지 확실하지 않습니다. 쉬운 방법은 손으로 주석을 작성하는 것입니다 :

###* 
    * @param {number} x 
    * @param {number} y 
    * @return {number} 
### 
adder = (x, y) -> x + y 

이 조금 자세한하지만 다른 한편으로는 당신은 정말 강력하고 확인할 수있는 폐쇄 컴파일러의 정적 분석 능력을 차입하고 많이. 필자는 실제로 좀 더 간결한 방식으로 주석을 작성한 다음 커피 파일을 다시 쓰는 스크립트를 작성했습니다. 내 코드는 다음과 같이 보입니다.

#! {number} x {number} y @return {number} 
adder = (x, y) -> x + y 

필자가 작성자가 매우 간단하다는 것을 알 수있을 것입니다.

이동하기 전에 빠른 메모. 클로저 컴파일러를 통해 코드를 실행하는 경우 -b (베어)으로 코드를 컴파일해야합니다. 클로저 컴파일러는 꽤 좋지만 데이터 흐름 분석을 수행 할만큼 똑똑하지는 않습니다. CoffeeScript는 기본적으로 익명 함수로 코드를 래핑하여 컴파일러를 작동시킵니다. 이 같은 JS에

adder = (number x, number y): number -> x + y 

:

같은 경로를 따라 또 다른 옵션 (이 커피 스크립트와의 호환성을 깰 것이다, 그러나 많은 쿨러 것)는 커피 컴파일러 이런 식으로 뭔가를 컴파일해야하는 것입니다

이 코드는 컴파일시 클로저 컴파일러에 공급 될 수 있습니다. 오류가없는 경우 컴파일러는 모든 주석을 제거 할 수 있습니다.

실제로, this guy은 정확히 이것을 수행하는 것으로 보입니다. 슬프게도, 그의 작품은 불완전한 상태에있는 것 같습니다.

이 모든 경우에 우리는 하드 작업 - 정적 형식 검사 -를 클로저 컴파일러로 연기합니다. 이 작업을 원하지 않는다면 완전히 이해할 수 있지만 새로운 정적 분석 도구를 처음부터 새로 만드는 것은 가치가 있음을 알기가 어려울 것입니다. :)

EDIT 1 년 후 : 요즘 타이프 스크립트를 사용합니다. :)

+4

선택적 통계 타이핑을위한 구문 설탕은 킬러가 될 것입니다. –

+0

@MikkoOhtamaa : 동의합니다. 안타깝게도 CoffeeScript의 창시자 인 jashkenas는 CoffeeScript를 JavaScript에 매우 가깝게 유지하는 데 매우 열성적이며 언어의 여러 부분은 모호한 경향이 있습니다. 나는 두 세계의 장점을 최대한 활용할 수있는 방법이 있었으면 좋겠다. – thedayturns

8

저는 CoffeeScript 전문가가 아니기 때문에 완전히 잘못된 대답 일 수 있습니다. 기본적으로 CoffeeScript는 매우 표현적인 언어로, 대부분의 의미가 동적으로 결정됩니다 (이상한 가장자리 경우도 있습니다).). 이것은 훨씬 더 엄격하게 정의 된 의미론을 가진 표준 ML과 같은 언어와 많이 대조됩니다. 일반적으로 고차원 언어에 대한 정적 분석은 매우으로 간주됩니다. 즉, 실제 고차 프로그램에 대한 정적 분석 (Haskell, ML, , 특히 javascript는 eval과 같은 것이기 때문에) 제어 흐름이 훨씬 유연하기 때문에 어렵습니다. 실제로 고차원 언어에 대한 정적 분석 솔루션은 지난 20 년 내에 실제로만 탐색되었습니다. (특히, a tutorial style description of CFA에 마 마이트의 문서를 참조하십시오.)

기본적으로, 그 이유는이 있습니다

  • 분석을 수행하려면, 당신은 형태에게 흐름 제어를 오는 표현 의미의 문제를 해결해야 고차원 함수를 슬래 밍하면됩니다.
  • 을 입력하려면을 입력하십시오. 일반적으로 이러한 언어는 사용할 수있는 유형이 훨씬 풍부합니다. 예를 들어 Ruby에서 (C, Java, ML 등에서와 같이) 정적 변수를 변수에 할당하려고하면 오류가 발생하지만 프로그램의 특정 경로는 결코 처형 됐어, 괜찮아. 이와 함께 루비 (Ruby)와 같은 다른 언어는 인 암시 적 유형 변환이 많이 추가되어 멋진 프로그래밍을 수행하기 위해을 실제로 사용했습니다. 내가이 세상에서 주목할만한 작품 인 내가 (dynamic analysis of static types for Ruby)과 함께 일하는 사람들의 일부이지만, 분명히 다른 예가 있습니다.
  • 기본적 언어 훨씬 표현 의미로, 훨씬 더 동적 방식으로 사용되며, 그 이유는 정적 대한 더 힘들어, 부정확 한 것으로 쉽다. 이것 (근래에 접근 중)의 근본적인면은 하이브리드로 보이기 시작합니다. 프로그램의 일부분을 정적으로 분석 할 수 있으며 프로그래머가 일종의 세련된 분석을 수행 할 수 있도록 몇 가지 테스트 케이스를 제공해야합니다.나는이 희망

다소 다시 질문, 대답, 그것은 커피 스크립트에 적용되지만, 자바 스크립트 같은 것들을 분석에서 무슨 일이 많은 거기에 나는 당신의 질문의 직접 직접 문제를 해결 할 수 없습니다 죄송합니다 지금. Javascript의 실제 문제 중 일부는 이상한 의미에서 비롯된 것이며 프로토 타입 상속은 논리적이지 않으며 특히eval()입니다. 일반적으로 이러한 언어에 대한 프로그램 분석은 분석을보다 쉽게 ​​수행 할 수 있도록 특정 제한 사항을 적용합니다 (예 : 평가판을 완전히 버리는 것).

+0

"typechecking"동적 언어 분야의 업데이트 : Typescript 및 Flowjs와 같은 프로젝트를 알고있는 것 같습니다. 건배! –