Copyright© Izumo Total Net All Rights Reserved.
PHPPHPからからRubyRubyへの変換ツール開発への変換ツール開発
平成22年2月13日(土)平成22年2月13日(土)
いずもトータルネット株式会社 いずもトータルネット株式会社
松江Ruby会議02 資料松江Ruby会議02 資料
Copyright© Izumo Total Net All Rights Reserved.
contents
1.開発目的
2.範囲
3.開発環境
4.概要
5.詳細
6.検証
7.今後の課題
ご説明内容
Copyright© Izumo Total Net All Rights Reserved.
1 開発目的
1
・プログラミング言語の中で、Rubyのシェアはまだまだ小さい。・Ruby経験者が少ない。・PHPで開発されたプログラム資産は多く存在する。・島根県内の自治体でのシステム開発でRubyでの開発が条件に なっている場合が多々ある。
『PHP⇒Ruby変換ツール』の必要性『PHP⇒Ruby変換ツール』の必要性
・Rubyでの開発数の増加。・Ruby経験者の増加。
◆ 現状
◆ 解決策
◆ 結果
Copyright© Izumo Total Net All Rights Reserved.
2 範囲
2
◆ PHPがカバーする領域とRubyへ変換の対象とする範囲
分類 変換の可否 コメント
言語(構文レベル) ○構文の記述レベルでの変換は可能
組み込み関数 △PHPと同等機能のRuby関数を作成すれば可能
PHPのみで記述されているもの
○ 上記レベルでの変換可能
一部にC言語で記述された箇所を含むもの
C言語レベルのインターフェイスを用意すれば可能
△SmartyのRuby版が存在する。
HTMLへのコード埋め込み
同等の機能を提供するErubyというライブラリが標準で提供されている。特殊タグ <% … %>
フレームワーク
拡張ライブラリ
pearライブラリ、peclライブラリ、その他
Smarty(テンプレートエンジン)
特殊タグ<? … ?>の中にPHPコードを埋め込む形式
ZendFrameWork、Ethna等
変数、式、演算子、制御構造等
PHP
ファイル/DB入出力、配列操作、文字列操作等
Copyright© Izumo Total Net All Rights Reserved.
3 開発環境
3
開発の前提条件
◆ Pure PHPで構成◆ PHP5.2までの構文に対応
• 5.3の新構文は構文解析のみ対応
方針
◆ まずは構文を1対1で変換◆ 問題点の洗い出し◆ 可読性を重視
Copyright© Izumo Total Net All Rights Reserved.
変換
4 概要(現状)
4
PHPソースコード
構文解析 パーサ
構文定義zend_language_parser.y
PHP_ParserGenerator(PEARライブラリより)
生成
PHPの抽象構文木
RubyRubyソースコードソースコード
トランスレータ
token_get_all(標準関数)
字句解析core.y
Copyright© Izumo Total Net All Rights Reserved.
4 概要(予定)
5
PHPソースコード
構文解析 パーサ
構文定義zend_language_parser.y
PHP_ParserGenerator(PEARライブラリより)
生成
PHPの抽象構文木
RubyRubyソースコードソースコード
トランスレータ
token_get_all(標準関数)
字句解析core.y
変換
Rubyの抽象構文木
静的コード解析
※点線部未実装
Copyright© Izumo Total Net All Rights Reserved.
5 詳細
6
Zend_language_parser.y
core.y
Copyright© Izumo Total Net All Rights Reserved.
5 詳細
7
抽象構文木
PHP
Ruby
Copyright© Izumo Total Net All Rights Reserved.
5 変換例(制御構造)
8
PHP Ruby
Copyright© Izumo Total Net All Rights Reserved.
5 変換例(クラス)
9
PHP Ruby
Copyright© Izumo Total Net All Rights Reserved.
5 変換例(Smarty)
10
Smarty
Copyright© Izumo Total Net All Rights Reserved.
5 詳細
11
基本的な構文に対してユニットテストを作成制御構造 変数
if文 ローカル変数unless文 グローバル変数while文 多重代入do~while文 変数への代入until文 変数の破棄do~until文 未定義変数の使用制限for文 スコープforeach文(配列) 定数foreach文(連想配列)switch文ループ制御例外処理
クラス
演算子
定義
代数演算子
コンストラクタ
代入演算子
デストラクタ
ビット演算子
メンバ変数(定義)
比較演算子
メンバ変数(使用)
エラー制御演算子
継承
実行演算子
インスタンス生成
加算子/減算子
クラスメソッド(定義)
論理演算子
クラスメソッド(使用)
文字列演算子
親クラスのメソッド呼出し
配列演算子
アクセス制御
型演算子
interface
キャスト
関数 定義引数デフォルト値呼出し
Copyright© Izumo Total Net All Rights Reserved.
6 検証
12
変換テスト
1. Zend_FrameworkのJson.php(Jsonエンコード/デコードライブラリ)
2. Fpdf(PDFファイル生成ライブラリ)
自動変換したソースが動作するまで、どの程度手動修正が必要か?
※Jsonとは JavaScriptにおけるオブジェクト表記法
Copyright© Izumo Total Net All Rights Reserved.
6 検証(Zend/Json)
13
テスト手順
◆ Zend/JsonをRubyに変換する• Zend/Json.php• Zend/Json/Decoder.php• Zend/Json/Expr.php• Zend/Json/Exception.php• Zend/Json/Encoder.php• Zend/Exception.php
◆ ライブラリの中で使用されている文字列や配列操作などのPHP組み込み関数のうち、約30個をRubyで実装する
◆ ZendFrameworkに同梱されているユニットテストJsonTest.phpをRubyのユニットテスト‘test/unit’用に書き直し、実行
Copyright© Izumo Total Net All Rights Reserved.
6 検証(Zend/Json)
14
テスト手順
実装した関数のリスト:require_once, is_object, isset, function_exists, is_array, is_int, is_float, is_string, str_replace, chr, strlen, ord, count, empty, array_keys, range, implode, dirname, define, basename, substr, in_array, is_numeric, is_bool, intval, floatval, method_exists, get_object_vars, get_class_vars, get_class, pack, bin2hex, extension_loaded, preg_match
Copyright© Izumo Total Net All Rights Reserved.
6 検証(Zend/Json)
15
テスト結果
• 初期化していない変数を使用している部分• 数値と文字列の変換エラーが発生している部分• 数値の1とboolのtrueを比較している部分• エンコーディング→ASCII-8BITに変更
32テスト中 成功:29,失敗:2,エラー:1 ※
エラー箇所を手で修正
※環境に依存するもの、内部構造に依存するもの(リフレクション機能など) 11テストを除く
Copyright© Izumo Total Net All Rights Reserved.
6 検証(Zend/Json)
16
テスト結果
エラー修正箇所の例
def _eatWhitespace()
matches = {} #手で追加
if preg_match('/([¥t¥b¥f¥n¥r ])*/s', @_source, matches, PREG_OFFSET_CAPTURE, @_offset) && matches[0][1] == @_offset
@_offset += strlen(matches[0][0])end
end
def self. _recursiveJsonExprFinder(value, javascriptExpressions, currentKey = nil)
if value.kind_of?(Zend_Json_Expr)magicKey = "____#{currentKey}" + "_" + (count(javascriptExpressions)).to_s #to_s追加
Copyright© Izumo Total Net All Rights Reserved.
6 検証(Zend/Json)
17
比較演算子==の差異
Copyright© Izumo Total Net All Rights Reserved.
6 検証(FPDF)
18
テスト手順
◆ fpdf.phpと、それが依存するPHPファイルをRubyに
変換する
◆ PHP組み込み関数をさらに19個rubyで実装• strtolower, strtoupper, strpos, …
◆ 同梱の7つのサンプル(tutorial/tuto1.php~tuto7.php)を変換して実行
Copyright© Izumo Total Net All Rights Reserved.
6 検証(FPDF)
19
テスト手順
Copyright© Izumo Total Net All Rights Reserved.
6 検証(FPDF)
20
テスト結果
• グローバル変数を認識できていない部分• 初期化していない変数を使用している部分• 数値と文字列の変換エラー• 文字列が空であるかどうか判断している部分• include()→eval('')
エラー箇所を手で修正
Tuto6.php以外表示できた
Copyright© Izumo Total Net All Rights Reserved.
7 今後の課題
21
◆ PHPの型の曖昧さ、動的型付けに起因する
問題
◆ 変換仕様の策定
◆PHP5.3から導入された新しい構文への対応• 名前空間、goto