再考ですかーっ！？

JavaScript
SpiderMonkeyといっしょ

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

概要
言語としてのJavaScriptをおさらい
基本的なSyntax
Object Oriented Language JavaScript
JavaScriptの処理系を愉しむ
Mozillaの処理系”SpiderMonkey”概要
JavaScriptを俺色に染める

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

JavaScriptとは？

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

JavaScriptとは？
Netscape社がWebブラウザおよびサーバ用に開発したオブジェクト指向スクリプト言語

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

JavaScriptとは？
Netscape社がWebブラウザおよびサーバ用に開発したオブジェクト指向スクリプト言語
MicrosoftがマネしてJScriptとか結果Webブラウザによって実装ばらばら

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

JavaScriptとは？
Netscape社がWebブラウザおよびサーバ用に開発したオブジェクト指向スクリプト言語
MicrosoftがマネしてJScriptとか結果Webブラウザによって実装ばらばら
ECMAがECMAScript(ECMA-262 Edition3)として標準化し、ISO/IEC 16262に承認
各社ブラウザ、ソフトウェアが準拠
相変わらずDOMまわりは混沌としてるけどmodule.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

C言語系Java風味の構文
var message = “Hello World!”;
if, else, else if, for, while, do while, switch
continue, break, goto
function name(arg1, arg2) { ... },function (args) { ...}
try, throw, catch, finallyeval(...)+, -, *, %, ++, --...
=, +=, -=, *=, %=...
==, <, >, <=, >=, !=...

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

Built-in Objects
Function
Array
StringBoolean
NumberMathDateRegExp

var msg = new String(”Hello World!”);var msg = “Hello” + “ World!”;
var list = new Array(”Perl”, “Java”);
list.length;list[1] += “Script”;
var today = new Date();today.toString();

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object
わりとモダンな正規表現
String Objectにも関連メソッド多数
var reg = new RegExp(”pattern”, “gi”);
var reg = /pattern/gi;¥b, ¥B, ¥s, ¥S¥d, ¥D, ¥w, ¥W, .
[...], [^...]*, +, ?, {n}, {n,}, {n, m}^, $module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

RegExp Object

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

Object Oriented JavaScript
プロトタイプベースのオブジェクト指向言語
継承ではなくて委譲
SubClass.prototype = new SuperClass();function SubClass () {this.myMethod = function () {print(”Hello World!”);}}module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

SpiderMonkey
SpiderMonkey (JavaScript-C) Engine
MozillaのJavaScript実装
単体のパッケージとして利用可能
Netscape Enterprise Server
K-3D (3Dモデリング・アニメーション)
スタンドアローンのインタプリタが付属
Fileオブジェクト(独自拡張Class)
JavaとPerlのBinding付属

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

SpiderMonkey配布元
http://www.mozilla.org/js/spidermonkey/

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

ビルド手順Mozilla用のビルドシステムなので使いにくい
プラットフォーム決め撃ち条件コンパイル
自分でLibtoolを作らない
勝手にGNU Autotools化してしまえ！
configure.in
Makefile.am
aclocal & libtoolize & automake &autoheader& autoconf

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

ビルド手順http://module.jp/blog/
autotoolize_spidermonkey.html
configureでプラットフォー
ムを判定して、#defineしてやる
AC_DEFINE(XP_UNIX)
AC_DEFINE(SYS4)
AC_DEFINE(SYSV)
AC_DEFINE(_BSD_SOURCE)
AC_DEFINE(POSIX_SOURCE)
AC_DEFINE(DARWIN)

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

スタンドアローンのインタプリタ

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

スタンドアローンのインタプリタ

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

スタンドアローンのインタプリタ

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

スタンドアローンのインタプリタ

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

スタンドアローンのインタプリタ

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

とりあえずCから使うには？
jsapi.hをincludeせよ！
ランタイムとコンテキストと標準クラスの初期化
JSRuntime *rt = JS_NewRuntime(RUNTIME_SIZE);
JSContext *ctx = JS_NewContext(rt, STACK_SIZE);
JSObject *global = JS_NewObject(ctx,&GLOBAL_CLASS, NULL, NULL);
JS_InitStandardClasses(ctx, global);libjsをリンクせよ！

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

スクリプトを実行するには？
JSContextとJSObject(のglobal object)を用意して、evalする。戻り値はjsval rvalで取得する。
JS_EvaluateScript(ctx, global,SCRIPT_STR, strlen(SCRIPT_STR), filename, linenum, &rval);

JSString *str = JS_ValueToString(ctx, rval);printf(”result: ʻ%sʼ”, JS_GetStringBytes(str));
JS_DestroyContext(ctx); /* あとしまつ1 */JS_DestroyRuntime(rt); /* あとしまつ2 */module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

CからJavaScriptを呼び出すmodule.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

CからJavaScriptを呼び出す

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

CからJavaScriptを呼び出す

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

独自関数の追加
インタプリタにCの関数を登録してJavaScriptから実行できる。
JSBool myfunc(JSContext *ctx, JSObject *obj,
uintN argc, jsval *argv, jsval *rval);
JSFunctionSpec構造体(の配列)を定義
関数名(JavaScript側での関数名)呼び出す関数のポインタ(myfunc)
引数の数
JS̲DefineFunctions()で、JSFunctionSpec構造体を登録

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

拡張例 - save̲to̲file()

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

利用例
Apache moduleでPHPみたいなやつ
HTML側にJavaScriptで記述したvalidationロジックを、サーバ側で実行・検証する。
アプリケーションのカスタマイズ用埋込言語

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

再考してみると?
ナニゲに面白いぞJavaScript
JavaScript悪くない。悪いはブラウザ
イジリ甲斐があるぞJavaScript
OSSの処理系が手に入るぞJavaScript
拡張し甲斐があるぞJavaScript
組み込みたくなっちゃうぞJavaScript
書ける人 or 書けそうな人って多いよね
JavaScript

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

再考ですかーっ！？

JavaScript
module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

最高ですかーっ！？

JavaScript
module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.

小山浩之 Hiroyuki OYAMA〒177-0053
東京都練馬区関町南4-17-1 106
Mail: oyama@module.jp
Web: http://module.jp/module.jp© 2004 Hiroyuki OYAMA. Japan. All rights reserved.