19

私はCoffeescriptがすばらしい言語だと思います!私は静的解析をCoffeescriptに追加するいくつかのプロジェクト/課題/機能を探していました。しかし、いくつかの検索の後、私は、Coffeescript faqthis pageは、静的解析が実行可能でないかもしれないことを示しました。Coffeescript静的解析/静的型チェック - ロードブロッキング

私は、Coffeescriptで静的解析/静的型検査を実装する際に根本的な問題がある場合、この種のものはまだコンパイラには存在しないと思っていましたか?

また、些細なチェックでは不可能ですが、簡単な分析のためにのみ機能するかもしれませんか?私が簡単に言うと、ユーザが同じ名前(クラス内)またはトップレベル(あるいはおそらく関連する.coffeeファイルのコレクションのトップレベル)で関数を2回定義したかどうかのような、 。

スタティック解析/タイプチェックの実装が簡単である/可能な/時間を費やす価値がないことを示す例をいくつか指摘できますか?

ありがとうございました!

+0

生成されたJSファイルでjshintを実行するのはどうですか?あなたが探しているものを行うJSとJSツールへのコーヒーコンパイルはまれではありません。 –

答えて

13

私はこれも興味があるので、この回答はちょっとしたダンプです。それが役に立てば幸い。

Googleクローズコンパイラを使用して、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 

同じパスに沿って別のオプション(これはCoffeeScriptのとの互換性を破るだろうが、多くのクーラーになりますが)コーヒーコンパイラはこのような何かをコンパイル持っているだろう

/*** 
    * @param {number} x 
    * @param {number} y 
    * @return {number 
    */ 
var adder = function(x, y) { 
    return x + y; 
}; 

コンパイル時にクロージャコンパイラに供給される可能性があります。エラーがなければ、コンパイラはすべてのコメントを削除します。

確かに、this guyはこれを正確に実行しているようです。残念ながら、彼の仕事は不完全な状態にあるようです。

これらすべてのケースでは、ハードワークスタティック型チェックをクロージャコンパイラに委ねます。これをやりたくない場合は分かりますが、完全に新しい静的解析ツールを最初から構築することは価値があると私に納得させるのは難しいでしょう。 :)

EDIT 1年後:最近はtypescriptを使用しています。 :)

+4

オプションの統計タイピングのためのSynthetic Sugarは、キラーになるでしょう:) –

+0

@MikkoOhtamaa:私は同意します。悲しいことに、CoffeeScriptの作成者であるjashkenasは、CoffeeScriptをJavaScriptに非常に近づけておくことにかなり激しく、言語の枝はあいまいになりがちです。私は両方の世界のベストを得るための方法があることを望みます。 – thedayturns

8

私はCoffeeScriptの専門家ではないので、これは完全に間違った答えかもしれませんが、基本的にこのことに気づいています:CoffeeScriptは非常に表現力豊かな言語であり、大部分の意味は動的に決定されます)。これは、標準MLのように、はるかに厳密に定義されたセマンティクスを持つ言語とはかなり対照的です。一般に、高次言語の静的解析は、非常にと考えられます。つまり、実際の高次プログラム(Has​​kell、ML、、特にのjavascriptはevalのために静的解析)は制御の流れがはるかに柔軟であるため難しいです。実際、高次言語の静的解析ソリューションは実際には過去20年以内に調査されています。 (特に、a tutorial style description of CFA上のマット・マイトの記事を参照してください。)

基本的には、理由はこのとおりです。

  • 分析を行うには、フォームにフロー制御を来て、表現の意味論の問題に対処する必要があります高次関数をスラミングすることによって得られます。
  • と入力すると、通常、これらの言語には、より豊富な種類の種類が用意されています。例えば、Rubyの変数(C、Java、MLなど)に静的型を代入しようとすると、エラーが発生しますが、プログラムの特定のパスは実行、それはすべての罰金です。それと並んで、Rubyのような言語は、という暗黙の型変換を多量に追加し、クールなプログラミングを行うためにを実際に使用しています。私はfamilar (dynamic analysis of static types for Ruby)のこの分野で注目すべき仕事は私が働いている人の一部から来ますが、確かに他の例があります。
  • 基本的には、言語ははるかに表現力セマンティクスで、はるかにダイナミック方法で使用され、そしてそのことについて推論は、静的にはるかに困難、かつ不正確なことがしやすいです。これに近づくための基本的な前進は、ハイブリッドに見え始めています。プログラムの一部を静的に解析することができます。さらに、ある種の洗練された分析を行うためにいくつかのテストケースを与える必要があります。私は、これはややそれはのCoffeeScriptに適用されるように私が直接あなたの質問の直接の懸念に対処することはできませんもう一度、申し訳ありませんが、あなたの質問に答えるが、仕事の多くは、JavaScriptのようなものを分析することでそこに起こっている願っています

たった今。私はJavascriptの実際の問題のいくつかは、それが奇妙なセマンティクスから来ていることに気付くでしょう。プロトタイプの継承は理由を考えるのが難しいです。特にeval()!通常、これらの言語のプログラム分析では、分析をより実行可能にするために、一定の制限が課されます(たとえば、完全に評価を放棄するなど)。

+0

ダイナミック言語の「型チェック」の分野での更新のために:TypescriptやFlowjsなどのプロジェクトを知っていると思います。乾杯! –

関連する問題