トップ «前の日記(2005年05月16日) 最新 次の日記(2005年05月21日)» 編集

ohai日誌

2003|12|
2004|01|02|03|04|05|06|07|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|06|08|10|11|
2008|01|02|03|04|05|07|09|
2009|01|02|
2013|06|12|
2014|01|02|03|04|06|09|10|12|
2015|04|
2016|09|
2018|02|

2005年05月17日

_ Ruby Refactoring Browser on Windows

一応動作します。Meadow2での動作を確認しています。Windowsに適当なCコンパイラなど 開発ツールをインストールしてコンパイルしてrb2exeやexerbあたりでbin以下のファイルを 実行ファイル化すれば動きます。

…と言いたいのですがWindowsでの開発環境構築はやたらめんどくさいので作った バイナリ等一式置いておきます。 <URL:http://www.kmc.gr.jp/proj/rrb/archive/rrb-dev-mswin32.zip>です。 mswin32用にコンパイルしてあります。試してみてください。あとMeadow以外への インターフェース作ってください。

_ 「型」に関して

プログラミングにおいて、そしてプログラミング言語を語る際に重要な要素と して「型」というものがあります。しかし型に関する用語はかなり混乱した 使われかたをしています。

で、私が一番もっともらしいと思う解釈を書いておきます。 ちなみに元ねたは、 <URL:http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html#htoc17>です。

型とはなにか

ここでは型とは「データの種類」である、としておきます。 その存在意義は「true(真値)」に「3」を足すなど といった意味のない操作を行うことを防ぐためにあります。なぜ防ぐ必要があるかと いうと、意味のない操作を行なった結果を利用して次の操作を行えば、そこから 先の操作、計算はほとんど意味のない結果を出してしまうからです。これがつまり バグです。よってこれは何らかの方法で検出できたほうが良いわけです。というわ けで型という概念を導入し、その正当性をチェックする必要があるわけです。

ただ型の概念は言語ごとに色々異なるので十把一絡げには言えない面もあるのですが。

型安全(type safe)と型安全でない(type unsafe)

まずはこの2つからです。

上で書いた、型の食い違いによる「意味のない」「正しくない」操作を全て検出 できる言語が型安全な言語、できない言語が型安全でない言語です。

例えばLisp、Ruby、Pythonといった言語はそのような事態が起こった場合、実行時に エラーを発生させ、実行を止めるので型安全です。Javaでもキャストが失敗した際に は停止するので型安全です。

Cではキャストがあるので型安全ではありません。例えば以下のようなコードはエラー も出さず無事「意味のない」出力をして終了します。

#include <stdio.h>

int main(int argc,char** argv){
  float f=32.444;
  int i;
  i = *((int*)&f);
  printf("%d\n",i);
  return 0;
}

C++もキャストがあるため型安全な言語ではありませんが、使用するキャストを dynamic_castに限定することで、Javaのように型安全になります。

また、MLやHaskellといった言語は「失敗する可能性のある型変換」をすべて禁止すること で、型安全性を確保しています。

またForthというスタックタイプの言語がありますが、例えば浮動小数点と 整数のを同じスタックに乗せるような仕様にすればこれも型安全でありません。 ただForthをここに分類するのはなんか無理矢理な気もする…。そもそも型がないんじゃないかという話もあるので。

静的型付け(statically typing)と動的型付け(dynamically typing)

型に関しては安全性という概念の他にも静的型付けと動的型付けという概念が あります。

プログラムを実行する前に全ての式、変数の型が決まっているものを静的 型付けな言語、プログラムを実行してからでないと決まらない式があるものを動的 型付けな言語といいます。プログラムを実行する前というのはコンパイル時という のとほぼ同じ意味です。

C、C++、Java、ML、Haskellといった言語が静的型付け、 Lisp、Ruby、Pythonといった言語が動的型付けな言語です。

以上をまとめると以下のようになります。

$           |      型安全             |    型安全でない   |
----------------------------------------------------------|
静的型付け  | Java,ML,Haskellなど     |     C, C++など    |
----------------------------------------------------------|
動的型付け  | Lisp,Ruby,ECMAScriptなど|     Forthなど     |
----------------------------------------------------------|

強く型付けされた(strictly typed)言語と弱く型付けされた(weakly typed)言語

三つめの軸として、「強い型付け、弱い型付け」という用語があります。この言葉は 人によって使いかたがひどく異なります。で、私が一番妥当だと思う定義は以下の 通りです。

静的型付けのシステムにより、型エラーがおこる可能性をすべてコンパイル時に 検出できる言語を強く型付けされた言語、そうでない言語を弱く型付けされた言語 という。

つまり、Javaなどではキャストの失敗は実行時にしか検出できない場合があるので 弱く型付けされた言語、ML、Haskellはそもそも失敗する可能性のあるキャストな んてものができないので強く型付けされた言語なわけです。

というわけで当然この分類が意味のあるのは静的型付けな言語のみです。 また強く型付けされた言語は型安全です。

まとめ

プログラミング言語談義は楽しいものですが、このあたりの用語の隔たりのせいで 話が不毛になることがあるなあ、と思いこんな文章を書いてみました。私もやった ことがありますので。

あと私はコンピュータサイエンスは専門でもなんでもないので上の文章は間違って いる可能性があります。上で挙げた五十嵐先生の文章を間違って解釈している 可能性もあります。なにかおかしければ是非指摘してください。


トップ «前の日記(2005年05月16日) 最新 次の日記(2005年05月21日)» 編集