読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

文法対比

JavaScriptRubyの文法対比表を作りました。

類義語
JavaScript Ruby
オブジェクト ハッシュ
文字列 シンボル
プロパティ 属性
対比表
項目 JavaScript Ruby
ソース文字コード Unicode(UCS-2/UTF-16) ソースコードの先頭もしくはshebang行の次に以下のように定義。
# -*- coding: utf-8 -*-
文の区切り ; ;または改行
改行コード ;を挿入して文となる場合自動的に挿入 文が終端
コメント //, /* */ #
識別子 Unicode, _, $のいずれかで始まる 先頭文字[アルファベット, _, @, @@, $]で何の名前か区別。
先頭文字の後は大文字小文字のアルファベット, _,数字
予約語 (*1) (*2)
値型 数値,文字列,論理値,null,undefined なし
参照型 オブジェクト,配列 変数に代入できるものすべて
基本型(リテラルを持つもの) 値型と同じ 数値,文字列,配列,ハッシュ,範囲,シンボル,正規表現
論理値 true/false falseとnilが偽、それ以外真
falseとnilはFalseClassとNilClassの特異インスタンス
その他のデータ型 関数 なし
整数リテラル -2^53から2^53までは正確。それ以上は精度が落ちる OS固有のサイズのFixnumと無限サイズのBignumどちらかに自動変換
文字列 ’または"で囲む ’または"で囲む。%で始まる自由区切り文字入力あり
'で括られた文字列 エスケープシークエンスのほか、"のエスケープが必要 \と'だけエスケープ。他はエスケープ不可
"で括られた文字列 エスケープシークエンスのほか、'のエスケープが必要 エスケーブシーケンスとその他変換あり
エスケープシークエンス \0,\b,\t,\n,\v,\f,\r,\",\',\\ \b,\t,\n,\v,\f,\r,\",\',\\,\e,\s
文字 一文字の文字列 一文字の文字列。Ruby1.8では整数
アスキー文字の整数値 "a".charCodeAt(0) ?a
文字列の文字への参照 s.charAt(i) s[i]
数値から文字列へ n+"", String(n), n.toString() n.to_s
文字列から数値へ "21*"1", s - 0, Number(s) s.to_i, s.to_f
範囲オブジェクト 組み込みなし 式1 .. 式2, 式1 ... 式2。Rangeオブジェクト
関数定義 function square(x){return x*x;}
square=function(x){return x*x;}
Functionコンストラクタで生成
なし。メソッドかコードブロックかProcオブジェクト
メソッド 関数をオブジェクトのプロパティに代入 クラス宣言内で
def 関数名
本体
end
プロパティの参照 image.width
image['width']
クラスにアクセッサメソッドを用意
慣例としてimage.width,image['width']
オブジェクトの生成 var o = new Object(); o = Object.new
連想配列リテラル オブジェクトリテラル{x:2.3, y:-1.2} ハッシュリテラル{:x =>2.3, :y => -1.2}
自動型変換 論理文脈ではnull以外true。文字列文脈では文字列に。あと色々。 なし
配列の生成 var a = new Array(); a = Array.new
配列リテラル [1,2, "JavaScript", true, {x:1, y:3}] [1,2, "JavaScript", true, {:x=>1, :y=>3}]
配列の要素へのアクセス a[0] a[0]
正規表現 Perlと同じ Perlと同じ
文字列に変換 toString() to_s
ラッパーオブジェクト Number, String, Booleanクラス なし
値型に変換 valueOf() なし
同値演算子 ===
値型は値が等しいか否か、参照型は同一オブジェクトの参照か否か
equal?
等値演算子 ==
基本型に変換して変換結果の値が等しいか否か
==
Objectクラスの==は「値」(Hashのキー)が同じか否か。サブクラスが適宜オーバーライドする
文字列 イミュータブル ミュータブル。
イミュータブルな文字列はシンボル
変数宣言 var i;, 宣言しないとグローバル変数 なし。名前で区別
グローバル変数 グローバルオブジェクトのプロパティ $で始まる名前
ローカル変数 Callオブジェクトのプロパティ 小文字で始まる名前
ローカル変数スコープ 関数レベル。宣言位置に無関係 最初の代入があった最も内側のブロック。代入位置に無関係
クラス変数 コンストラクタ関数のプロパティ @@で始まる名前
定数 なし 大文字で始まる名前
グローバルオブジェクト クライアントサイドJavaScriptではWindowオブジェクト。ウィンドウやフレーム毎に存在。 オブジェクトmain(Objectクラスのインスタンス)
if文 if (論理式) 文 [else 文] if 論理式 [:/then/改行]文
[elseif 論理式[:/then/改行]文]
[else 文]
end
unless/else/endも類似
switch文 switch(式) {case 式: 文[break;]...default:} case 式
when 式[:/then/改行] 文 ... [else 文] end
case
when 論理式[:/then/改行] 文 ... [else 文] end
while文 while (論理式) 文 while 論理式 [:/do/改行] 文 end
until/do/endも類似
do/while文 do 文 while (論理式) 文 while 式
文 until 式
for文 for (初期化;条件;増分)文 なし
for/in文 for (変数 in オブジェクト) for 変数 in 式 [:/do/改行] 文 end
.eachイタレータも参照
ラベル文 名前: なし
break文 break [ラベル]; break
continue文 continue [ラベル]; next
retry文 なし retry
function文 function func_name (x) {} def func_name (x) end
return文 return return, メソッドの最後の式の値
throw文 thow Kernel.raise
例外処理 try/catch/finally begin/rescue/ensure
with文 with文は最適化が難しくなる なし
プロパティの削除 delete book.chapter2; なし
連想配列 オブジェクト ハッシュ
Objectのプロパティ constructor, toString(), toLocaleString(), valueOf(), hasOwnProperty(),propertyIsEnumerable(),isPrototype() ==,===,=~,__id__,__send___,class,
clone,display,dub,eql?,equal?,extend,
freeze,frozen?,hash,initialize_copy,inspect,
instance_eval,instance_of?instance_variable_get,instance_variable_set,instance_variables,is_a?,
kind_of?,method,method_missing,methods,nil?,object_id,
private_methods,protected_methods,public_methods,respond_to?,send,singleton_methods,
taint,tainted?,to_a,to_s,untaint
配列のインデックス 0から2^32-2までの整数。それ以外は文字列に変換してプロパティ 制限なし
配列要素の削除 shift(), pop(), splice() clear,compact!,delete,,delete_at,delete_if,slice!,uniq!
配列の長さ lengthプロパティ lengthメソッド
関数リテラル function () {} コードブロック
可変長引数 arguments name引数
引数に名前を付けるには 名前のプロパティを持つオブジェクトを渡すようにする なし
メソッド内でのコンテキストオブジェクトの参照 this self
new a = new Object(); a = Object.new
関数宣言の引数の数 関数のlengthプロパティ なし
クラス なし。new演算子コンストラクタ関数でシミュレート クラス宣言で定義
  すべての関数はprototypeプロパティを持つ なし
スーパークラス コンストラクタチェーンとコンストラクタ関数のprototypeプロパティが参照するオブジェクトの生成 クラス宣言で指定
関数をメソッド apply(), call() なし
インスタンス変数 プロパティ @で始まる名前
インスタンス変数へのアクセス object.property アクセッサメソッドを定義
スタティック変数 関数のプロパティ
クロージャを使って実装
プライベートのインスタンス変数
継承 コンストラクタ関数のプロトタイプオブジェクトのプロパティはすべての「インスタンス」で利用可能 スーパークラス
コンテキストオブジェクト thisはプロトタイプオブジェクトの関数プロパティがコンテキストのオブジェクトを参照する方法 self
プライベートメンバー クロージャで作る。面倒 private宣言
ミックスイン インスタンスプロパティを直接使わないメソッドを持つクラスからコピー include
オブジェクトクラスの判定 instanceof instance_of?
モジュール 空のオブジェクトを作り、プロパティを追加する module モジュール名
本体
end
初期化ルーチン なし BEGINブロック
後始末ルーチン なし ENDブロック
シェルコマンド `で囲まれた文字列
文のグループ化 複数文を{ }で囲む 複数文をbegin endで囲む
オーバーライドしたメソッドのコール なし super
別名 なし alias, メソッドの別名を作成すると、コピーしてから参照する
未定義化 なし undef
クラス定義/拡張 prototypeプロパティが参照するオブジェクトへのプロパティ追加 class [スコープ::]クラス名[< superexpr]本体end
クロージャ 入れ子関数宣言 do |x,y,..| end, {|x,y,...| }、メソッドの呼び出しの直後だけ。ブロックはオブジェクトではないが、Procオブジェクトに変換可能
JavaScript予約語
break do if switch typeof
case else in this var
catch false instanceof throw void
continue finally new true while
default for null try with
delete function return

Object.prototypeに絶対にプロパティを追加しないこと

Ruby予約語
__FILE__ and def end in or self unless
__LINE__ begin defined? ensure module redo super until
BEGIN break do false next rescue then when
END case else for nil retry true while
alias class elsif if not return undef yield

今後の予定

どこが違いかという視点ではなく、同じことをどう表現するかという視点で更新していく予定です。最終的に、動的言語を1つマスタして対比表を手に持っていれば、どの言語でも不自由しないというところに持って行きたいです。
(どの動的言語にも「コンパイル」できる統一言語という野望。それがCoffeeScript?)