インタープリタは「翻訳」しない

http://qiita.com/kantomi/items/747aef968d37b5ebeced

中間言語方式 Java・.Net
(バイトコードなど)中間言語に変換してから、JavaVMなどがネイティブコードで実行する。

インタープリタ言語 PHP/Ruby/JavaScriptなど
1行ずつ、コンパイルしながら実行する。
コンパイラ(コンパイル作業)すら必要ないようにした。

■ 最終的にマシン語(機械語)に翻訳されます

……うへえ。今時こんな文章を読むことになろうとは。

当たり前ですが、JVMを含め、インタプリタはネイティブコードへの変換は行いません*1

今から文章書くにはもう眠いので、昔、拙著「センス・オブ・プログラミング」に書いた文章を貼っておきます。

センス・オブ・プログラミング p.83の補足『インタープリタは「翻訳」しない』より

インタープリタは「翻訳」しない』
どうも、入門書によっては、コンパイラインタープリタについて、以下のような説明をしているものがあるようです。

コンパイラは、ソースプログラム全体を一気に機械語に翻訳して、オブジェクトプログラムを作成する。
それに対し、インタープリタは、事前に一括翻訳するのではなく、実行と同時に、1行づつ部分的に機械語に翻訳する。

はっきりさせましょう。この説明は、完璧に間違っています
インタープリタでは、ソース(または中間形式)を、インタープリタというプログラム自身が解釈しながら実行します。インタープリタが、ソースから機械語への変換を行なうことはありません。
最近のJava仮想マシンは、バイトコード機械語に変換する機能を持っています。しかしこれは「JIT(Just In Time)コンパイラ・・・・・」と呼ばれる技術であり、この部分を指してインタープリタとは呼びません。
この間違いは、私が8ビットパソコンのBASICで遊んでいた頃(もう20年近くも前になりますか---遠い目)にはあちこちで見掛けたものですが、さすがに最近は絶滅したものだと思っていました。
しかし、本書の執筆のため、本屋で各種入門書を見てみると、最近の入門書にも、上のような嘘が書かれているものがちょくちょくあるようです。これが驚異のべすとせらあ?

――困ったものです。

ここで、「これが驚異のべすとせらあ?」と書いている本は、「プログラムはなぜ動くのか 知っておきたいプログラミングの基礎知識」(矢沢久雄著)です*2。当時、「これが驚異のベストセラー!」というアオリが帯に書かれていたのです……
上記の補足を書いた「センス・オブ・プログラミング」が出版されたのが、2004年ですよもう12年も前ですよ。

だいたいプログラマーなら、インタプリタのひとつやふたつみんな作るものだろうに一度でも作ったらこんな勘違いすぐに解消されるだろうに。
はい宣伝。プログラミング言語の作り方に興味が出てきた方はこちら。

関係ないけど今一番売れてほしいのはこの本なので、これも宣伝しておきます。

Webアプリケーション開発を学ぶのに、「Webサーバを作る」という低レベルなところから攻めていこうという本です。低レベルなところから攻めるという点で、プログラミング言語の動く仕組みとかを考えるのと、関係なくはないですね。

ところで、Qittaにはトラックバックとかは飛ばせないようですが、元記事書いた方には、いったいどの本を読んで、インタプリタが「1行ずつ、コンパイルしながら実行する」という(誤った)知識を得たのか、ぜひ教えていただきたいところです。

*1:もちろんJITのような技術はありますが、これはJust In Time コンパイラであって、この部分を指してインタプリタとは呼びません。

*2:私が確認したのは1版7刷 (1刷ともに2001年

「本当の基礎からのWebアプリケーション入門――Webサーバを作ってみよう」書籍版が発売されました!!

連日宣伝ですみませんが、以前よりWebで公開していた「本当の基礎からのWebアプリケーション入門――Webサーバを作ってみよう」の書籍版である「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」本日6/7に発売されました。

技術評論社さんの紹介ページはこちら。
Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門:書籍案内|技術評論社
私のWebサイトにおける紹介ページはこちら。
http://kmaebashi.com/webserver/index.html
amazonはこちらから。

もともとこの本の構想は、記録をたどると2007年2月20日に私のWebサイトの掲示板の書き込みの頃にはあったようです。10年近く前か……

http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=880&range=1

とはいえ、CGIはWebアプリケーションの基本ですから、(Perlでもよいので)一度は 
作っておくべきものかとは思います。最近は、PHPやらJSPやらStrutsやら、果ては 
ASP.NET等いろいろ便利な道具があって、もちろんそれはそれでよいのですが、 
結局下回りを知らないと困ることもありますから。 

「本当の基礎からのWebアプリケーション入門 ―Webサーバを作ってみよう―」 

なんての、誰か書いてくれませんかね… 

その後、このブログでも言及したりしていますが、
「本当の基礎からのWebアプリケーション入門――Webサーバを作ってみよう」って誰か書いてくれませんかね - プログラミング言語を作る日記

1章から5章までは、ほぼ上記の記事にメモした構成のままで、このたび本になりました。

つまり私にしてみれば、10年近く前からずっと、世の中にはこういう本が必要だろうと思い続けていた内容です。

その分、内容が古いように見えるかもしれません。確かに、本書の内容の大半は、15年以上前の本に書いてあってもおかしくありません。というより、15年くらい前にこんな本があったら、私自身がもっと実感を持ってWebアプリケーションを理解できたのに、という思いが本書の出発点です。
ドッグイヤーのIT業界、そんな古臭いことなら今から勉強しなくても、と思う人もいるかもしれませんが、むしろドッグイヤーで新しい技術が次々と現れて消えるこの業界で、15年前から現在まで有効だった内容であれば、今後もそれなりに長期にわたって有効であり続ける可能性が高い、と言うこともできるでしょう。なにしろ、HTTP/2になったって、HTTPのGETやPOSTやリクエストヘッダやレスンポスヘッダが変わったわけでもありません。

本書の対象読者は、Webアプリケーションをこれから作ろうとしている人、または既にWebアプリケーションを作っているがいまひとつ何がどうなっているのか納得できない人です。「もう自分でコードを書くことはめったにないが、お客様との仕様調整は行うアラフォーのおじさん」も、できもしない仕様をお客様と握ってきて現場のプログラマがひどい目にあうことを避けるため、ぜひ読んでいただきたいと思います。

「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」書籍版だけの内容

「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」いよいよ明日が発売日です(書店によってはもう置いてあるのかもしれませんが)。
技術評論社さんの紹介ページはこちら。
Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門:書籍案内|技術評論社
私のWebサイトにおける紹介ページはこちら。
http://kmaebashi.com/webserver/index.html
amazonはこちらから。

さて、書籍「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」は、元々Webで公開していた「本当の基礎からのWebアプリケーション入門――Webサーバを作ってみよう」に対しいろいろ加筆修正していますが、6章、7章は完全に書き下ろしです。
サポートページにも目次を載せていますが、こんなことを書いています。

  • 第 6 章 Webアプリ開発に必要なその他の知識
  • 第 7 章 TIPS
    • 7.1 この章で扱うこと
    • 7.2 ファイルをアップロードする
    • 7.3 画像を動的に生成する
    • 7.4 ファイルをダウンロードさせる(サーバ側)
    • 7.5 ファイルをダウンロードする(クライアント側)
    • 補足:分割ダウンロード
    • 7.6 Web APIを呼び出す

OSI参照モデルは普通にネットワーク関連の文章を読んだりする際にはどうやったって避けられない知識です。プロキシサーバ、SSL(TLS)、認証などの話もそうでしょう。この手の知識についてはあちこちで解説されていますが、本書では、あくまで自分で試してみることを念頭に、プロキシサーバとして試しにsquidをインストールしてみたりとか、BASIC認証やDigest認証についてリクエストとレスポンスを追いかけたりとかしています。
「6.6 クライアントサイドの技術」では、JavaScriptでDOMをいじる例として、「1行追加」ボタンで行を足せる入力フォームを作ってみたり、

Ajaxの例として、郵便番号から住所*1を自動入力する機能を作ったりしています。

こういう機能は、割とあちこちのWebページで実現されている便利な機能であるにもかかわらず、いざ自分でゼロから作れと言われるとちょっと怯む、という人も多いのではないでしょうか。本書では、最低限のサンプルプログラムでこれを実現しています。もちろんjQueryなんぞ使っていません。いやさ最近はてブでもjQuery不要論(You Don't Need jQuery - Qiita)が話題になったりしましたが、jQueryがいくら便利でも結局DOMエレメントを使わずに済むわけじゃなし、だばだばと水漏れする抽象化でしかない以上、まずはjQueryのようなライブラリを使わずに作ってみる必要があるかと思います。ソースを見るとわかりますが、さして難しくもないですし。
セキュリティについては、下手に書くとあちこちからマサカリ飛んできそうで怖いのですが、今時のWebアプリケーションプログラマにとって必須であることは間違いないので、よく問題になる点について触れています*2

さて7章。multipart/form-dataを解釈してファイルをアップロードしたりとか*3、画像を動的に生成して昔ながらのアクセスカウンタを作ったりとか、CSVファイルのダウンロード機能を作ったりとかしています。

こういうことは、ちゃんと「わかった」ベテランプログラマの人にとっては、なんでもないことなのかもしれません。
しかし、Webでぐぐって見つけた断片的なコードをコピペしていても、なかなか体系的には身に着かない知識でもあります。

本書を、最初から通し読みすることで、コピペするにしてもちゃんと「わかって」コピペできるようになります。本書はそういう狙いで書きました。

*1:住所データベースなど持っていないので、ふたつの郵便番号にしか対応しないなんちゃってプログラムですが、Ajaxの例としては十分でしょう

*2:CSRFについて書くべきだったか、と思ったりもしていますが……

*3:そういえばほんの1年くらい前だったか、Androidでmultipart/form-dataを使ってアップロードする側のコードをガリガリ書いた記憶があります。こういう汎用的な機能は何でもライブラリが解決してくれる、と思っていても、意外とあちこちに落とし穴があいているものです。

書籍「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」発売されます

以前よりWebで公開していた「本当の基礎からのWebアプリケーション入門――Webサーバを作ってみよう」が、技術評論社さんから本として発売されます(発売日は6/7です)。

技術評論社さんの紹介ページはこちら。
Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門:書籍案内|技術評論社
私のWebサイトにおける紹介ページはこちら。
http://kmaebashi.com/webserver/index.html
amazonはこちらから。

この本は、タイトルにあるとおり、「基礎からのWebアプリケーション開発入門」です。
その前にある「Webサーバを作りながら学ぶ」のあたりでちょっと待てと思う人がいるかもしれませんが*1、私は、冗談でもなんでもなく、本気で「基礎からのWebアプリケーション開発入門」のつもりで書いています。ただし、プログラミングそのものの初心者は対象ではなく、ふつうにプログラムは書けるけれどWebアプリケーションはやったことがない、あるいはWebアプリケーションをなんとなく書いているけれどいまひとつよくわからない、という人を対象読者としています。言語はJavaを使っていますが、Javaは「ふつうの言語」ですし、特に特殊な機能も使っていないので他の言語のプログラマでも難なく読めるでしょう。

本書において最初にやることは、TCPによるネットワーク通信のプログラムを書くことです。そして、それを元に、Webサーバを作ります。つまり「Webサーバを作る」というのは、PCを買ってきてLinuxをインストールしてApacheを入れて、という意味ではなく、ApacheのようなWebサーバを自作するということです。
その後、Tomcatのへなちょこ版であるサーブレットコンテナ「Henacat」を自作し、Cookieやセッション、ファイルアップロードを実装します。
また、書籍では、「第6章 Webアプリ開発に必要なその他の知識」として、OSI7階層モデルやプロキシのようなネットワークの基礎、JavaScriptによるDOM操作やAjaxといったクライアントサイドの技術、認証やセキュリティについて、また、「第7章 Tips」として、画像を動的生成したりCSVをダウンロードさせたりする方法について記載しています。結構な加筆/修正がありますので、Web版だけ読めばいいやと言わず、ぜひ書籍の方をお買い求めくださいませ。

今時、Webアプリケーションを作るなら、PHPなりRuby on Railsなりでちゃちゃっと作ればいいだろう、いくら「基礎から」といってもWebサーバを作るところから始めるなんて基礎に戻りすぎではないかお前はプログラムを書く時はいつでもアセンブリで書けというのか、といった声が聞こえてきそうです。しかし、今時の普通のアプリケーションプログラマは、まあ当面はアセンブリ言語を知らずとも困らないでしょうが、WebアプリケーションプログラマはWebの基礎であるHTTPを知らないと、結局すぐに困ります。まともなプログラミング言語はうまく機械語を隠蔽していますが、少々頑張ったWebアプリケーションフレームワークでも、HTTPの概念は隠蔽できずだだ漏れです。オープンな標準であるHTTPのもと多様な企業や団体が作ったWebサーバやブラウザを使い、サーバ側のプログラムではサーバ側のフレームワークを、クライアント側では別のJavaScriptライブラリを使っているのだから無理もないのかもしれません。x86のニモニックを知らなくても高級言語(Cでさえ!)のプログラムを書くことはできるでしょうが、HTTPのGETを知らずにWebアプリケーションを書くのは無謀です。最初の3日ぐらいはうまくいくかもしれませんが、すぐに壁にぶち当たります。

  • Ajaxで飛ばしているつもりのリクエストが本当に飛んでいるかを確認するためにWebサーバのログを見るとか、
  • POST時にhiddenで値を引き継いだりとか、
  • ブラウザのF12開発者ツールでGETのクエリストリングを見たり、リダイレクトの挙動を確認したり、Cookieがちゃんと入っていることを確認したりとか、
  • HTTPリクエストヘッダを見てUser-AgentやRefererを確認したりとか、

そういうことができなければ、当たり前ですが一人前のWebアプリケーションプログラマとは言えません。そして、そういうことを知りたければ、一度その仕組みを作ってしまうのが一番だと私は思います。

ベテランプログラマさんからしてみれば、「おいおい、実際にWebサーバやサーブレットコンテナを作るかどうかはともかくとして、この程度のことを知らないWebプログラマがいるのかよ!」と思うかもしれません。もっともです。この程度のことを知らなければ日常のプログラミングに差し支えるでしょう。
しかし、Webで拾った断片的な知識でなんとなくプログラムは書けていても、Webというシステムがなにがどうなって動いているのかを体系的に把握していないWebプログラマは、相当数いると私は踏んでいます。ベテランのプログラマの皆さんも、Webや言語の入門書に記載された断片的な知識から、Webの動作のイメージを組み立ててきたのではないでしょうか。CSVファイルをダウンロードさせたいと思ってぐぐったら、Content-Typeがどうしたという記述が出てきて何のことだかわからなくて困ったりしなかったでしょうか。

この本では、Webサーバとサーブレットコンテナを実際に作ることで、こういったWebの動作原理について順に説明していきます。

Webサーバやサーブレットコンテナを作るというと、「OSを作る」とか「プログラミング言語を作る」といったような、ちょっとマニアックな行為に思えるかもしれません。しかし、本書で扱う程度の知識は、マニアックでもなんでもなく、普通のWebアプリケーション開発者が、当然の常識として知っていなければならないことです。それに、本書で最初に作るWebサーバはJavaで140行ほど、最終的にCookieやセッションも導入したHenacat ver.0.4でも1000行程度のものであり、まったく難しいものではありません。「10分でブログが作れるよ!」と宣伝してるフレームワークの開発環境の構築ではまって1ヵ月、なんてことになるより、こっちのほうがよっぽど簡単というものです。恐れることはありません。

――もうね、会社の仕事と別に本1冊書くなんてプライベートな時間を思いっきり犠牲にしなければできないことですし、私一人の問題ではなく出版社さんも本が売れないとやっていけないわけですし、嫌儲は何も生まないと思うのではっきり書きますが、みなさん買ってください。いますぐポチってください。いやマジで。

*1:正直、表紙の「Webサーバを作りながら学ぶ」の部分が、丸の中にちょっと小さな字で書いてあるのは「いーのかなー」と私自身思わなくもないですが(^^;

バリ島に行ってきました(その5)

完結。前回の記事の続きです。

3/23〜3/24

最終日は、飛行機乗るのは夕方だったのですが、まずは朝ごはん食べて、

飛行機のチケット、eチケットをネットからチェックインし、PDFをダウンロードして(ホテルのWi-FIの品質が非常に悪く、PDFが最後までダウンロードできたのは奇跡のようなものだった)、印刷しといたほうがよかろうとホテル内のサービスでPC借りたら、プリンタの調子が悪くて印刷できない、レギャン通りにネットカフェがあることは知っていたのでそこにも行ってみたけどやっぱりプリンタ壊れてる。Wi-Fiのことといい、こういうことはやっぱり日本のようにはいかないようです。

レギャン通りを歩いていたらトイレに行きたくなって、トイレを借りたサークルKで、義理のつもりで買ったお茶。クソ甘くてどうしても飲めなかった……

で、飛行場に行ってみたら、紙はなくてもPDFをタブレットに表示したら手続きできました。それはさておきバリ滞在中英語がわからないことが結構あって少なからず自信をなくしていたのですが、空港の係の人の英語は、ホテルやレギャン通りの人の英語よりはずっと聞き取りやすかった。あちらの発音が悪かったのではないか疑惑。
紙がないことでもめる可能性を考えてずいぶん早く空港に行っていたので、時間が余ってしまい、タクシーで近くのショッピングモールへ。

ゲームがあっても、プリペイドで結構な金額のカードを買わなければいけないので旅行者としては遊べず。



ショッピングモール内はエアコンは効いていますが、こういう開口部は自動ドアでもなく解放されていて、それでも中は暑くない。エアコンもないようなレギャン通りのカフェでも、日差しは強くても、日陰にさえ入れば涼しい。この気候はやっぱりすばらしかったなあ。


で、飛行機乗って、


シンガポールからの飛行機がうっかり最前列になってしまい、リュックを前席の下に入れることができなくて、荷物棚に入れてしまったリュックから上着を取り出すことができなくて寒い思いをしたりしましたが、無事日本に到着しました。到着してさっそくTwitter見てみたらLTEの速いこと速いこと。
帰宅すると、近所の桜が咲いていました。

1年半前の旅行記事をようやく書き終わりました……

明日からは宣伝するよ!

バリ島に行ってきました(その4)

発売日までにこの日記に書くべきことを書いてしまわないと告知も打てない、というわけで、前回の記事の続きです。

3/22

ニュピが空けたのでレギャン通りをうろうろと。前々日の晩のオゴオゴがいくつか道端に置いてありました。








その後、クタのビーチに足を延ばしました。

海岸に、オゴオゴが大量に置いてありました。
















このあたりの写真を見ると、やっぱり材質は発泡スチロール的な何かに見えます。


その後、またレギャン通りをうろうろしつつお店に入ってビール飲んでたら大雨。でもまあ、ビール飲んでるうちに上がりました。









この日の夜がバリ島最後の夜で、翌日には飛行機乗って日本に帰るわけですが、それはまた次の記事で。

バリ島に行ってきました(その3)

バリ島に行ってからかれこれ1年半経過していて、いまさら続きを書くのもどうかという状態ですが、1年半前の記事の続きです。

3/21

2015年は、3/21がニュピでした。ニュピというのはヒンドゥー教のお正月で、市民は外出禁止、熱心な教徒は食事もせず1日を静かに過ごします。外国人旅行客も、ホテルから出られません。
で、ホテルの部屋にも注意書きが配られて、外出禁止はもちろん、あまりうるさくするなとか音楽をかけるなとかできれば電気を使うなとか(ローソクは貸すから)とか、いろいろ言われたのですが、当日になってみれば、確かに外出禁止ではあるものの、清掃のサービスはやってくるし洗濯もしてくれるし、ホテル内はうろつけるし、ということで、うろうろ。
ホテルと直結している海岸です。

昼ごはんだったかな、ミーゴレン。

これにフィッシュアンドチップスを付けてビール飲んだんだっけ。

ニュピの看板。

その他、ホテル内の写真色々。













ホテル内のプールでは子どもが歓声上げてるし、スパの施設も営業しているし(頼もうかと思ったら予約でいっぱいで断られた)、なんだホテル内は治外法権か、と思っていました。
レストランが18:00で閉まり、その後食事の手段がないというのは気になりましたけど。最後に食べたナシゴレン

で、たらふく食べて部屋にいたら、19:00頃、見回りの人がやってきて、バスルーム以外の照明を消せと。夜はまじめに(?)ニュピをやるみたいです。プールも無人なのだと思います。外は真っ暗で、風の音しかしない。