MenuBar (zakki)
雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。

ここはKタンに教えてもらったという名目で書いてますが、Kタンがそっくりそのまま言った言葉ではありません。いろいろ教えてもらったオイラが理解したことを書いてます。なので、Kタンの考えそのものと微妙に違っていたり、あるいはオイラが勘違いしているなんて場合もあるということです。なので、くれぐれも話半分で聞いておいてください。(そうしないと恥をかくのはアナタですヨン♪


アセンブラ最高! anchor.png

・・・大間違いである」と考えています。

  1. おかしいぞ!OS自作本の初期に、Kが自分でそう書いているじゃないか!
  2. OSASKが機能が少ないといっても面白い性能を出すのはアセンブラのおかげだろう!。普通にCとかで書いたらKが批判?するLinuxと大して変わらない性能になるはずじゃないか!

なるほど!。では説明。

まず、「1」ね。

もう一回よーく読んでみてください。OS自作本でKタンは、「アゼンブラ最」とは書いていますが、「アセンブラ最」とは書いてませんね?。

え?単なる言い回しだけだって?。本当に本読みました?。すこし先にちゃーんと書いてありますよね。

  • 「これは紙と鉛筆さえあればどんな名作でも書けると言っているのと同じ」

アセンブラを使えばどんなプログラムを書くことも不可能ではないといっているだけです。「不可能ではないのだからこれを使いましょう」などとは一言も言っていないし、「使うと性能が良くなる」などとも言っていません。

次、「2」。

いまだにこういう誤解がはびこっています。(もう何年も前に間違いだということになったのに・・・

  • OSASKが小さいのはアセンブラでゴリゴリ書いたからだ
  • Linuxは全てCで書かれている
Page Top

C++最低! anchor.png

C++と書きましたが、JAVAやD言語等の「高級言語」と呼ばれるものを総称しています。

よくKタンは、C++やJAVAの良くない部分を語ります。なるほど、Kタンはアセンブラとかが好きなので、その対極ともいえるこれら高級言語が好かんと。そういう言語はよくないと。

・・・まずこれは、オイラはともかく、Kタンは間違いなく「大間違いである」と言うでしょう。

以外かもしれませんが、昔オイラはKタンに聞いたことがあります。

  • 「非常に大規模。たとえばemacsやモジラのようなソフトをOSASKで作れる環境が整ったとします。オイラがそれをやろうと思ったらどんな言語を薦めますか?」
  • 「C++がいいと思いますよ。」
  • 「おぉ!以外。せいぜいCかと思ったのですが・・・。なぜですか?」
  • 「だって楽でしょ?。そのほうが」

Kタンは「高級言語がキライなので悪口を言う」と思っているのならそれは大間違いですよ。Kタンは「少なくともOSを作る上では不便のほうが多い」と言っているだけです。KタンはOS作成関連の作業やツール作成ばっかりやっているのでそういう発言が目立つだけです。

Page Top

結局、OSを作る言語はなにがいいんだ? anchor.png

なるほど。もっともな質問ですね?。では答え。

  • 「まずその「何言語がいいか」という発想を捨てることが正解です」

なに?。意味がわからないって?。ではこういう例え話をしましょう。

  • アナタは新米の大工さんです。家を作ろうとしています。
  • 「大工」という仕事は何百年も前からあるのは知っていますよね?
  • 昔。じゃあ江戸時代としましょうか。
  • この頃も大工さんはいましたし、家もありました。でも今とはものすごく違います。一番大きな違いは、「電気がなかった」ことですね。
  • 昔は電気がなかったので、当然電動工具は使えません。当然そんな工具はありませんでした。
  • そんな昔はどうやって家を建てていたのでしょう。そう。ほとんど人力です。
  • 使う道具も原始的は人力の物ばかりでした。ノコギリ・ノミ・トンカチ・・・
  • こんな原始的な道具でりっぱな家を建てていました。きっととても大変だったでしょう。
  • さて。現代です。電気もあります。すばらしい電動工具もあります。トラックもパワーシャベルもありますね。
  • さて質問です。あなたはそんな現代の大工さんです。家を建てようとした時、誰かが、「昔は全部人力でやったものだ。プロの大工ならオマエも電動工具など使わずにやってみろ」といいました。アナタならどう答えますか?
  • オイラの答え。「修行や習作・趣味ならともかく、電動工具でできることを人力でやるのはアホである」
  • さらにこんな質問。「あそこに2mmだけクギが出ている。あっちでは4mmくらい木が出っ張っている。修正してほしいが当然電動ハンマーや電気カンナで削るのだろう?」
  • 同じく他の人は知りませんが、オイラなら「人力で簡単にできることを無理に電気でやるのはアホである」

まあ「アホである」というのはちょっと言いすぎかもしれませんが、意味は解りますよね?。つまりなんらかの作業をする場合、先に道具を決定しておくというのは本末転倒ということなのです。上記の例え話をさらに進めると、

  • 太さ5mmの木の棒を切りたいが、カッターナイフ・ノコギリ・電動ノコ・レーザーカッター。どれを使うと一番早くて便利?

というふうに、まず作業があって、その作業の実行に一番楽で正確で早いものを考えてから使うのが正解ですよね?。これを、

  • とにかく電動ノコギリだ。電動ノコギリを使うのだ!。さあ!作業をもってこい!

・・・これはどう考えてもおかしいですよね?。(初めてすごい機械を買ってもらった子供じゃあるまいし)

最初の、まずその「何言語がいいか」という発想を捨てることが正解ですというのはこういう意味なのです。

割り箸削りから大木切り倒しまで全てこなせる便利な工具など存在しえないのはわかりますよね?。それと同じこと。万能でこれさえ知っていればなにもいらないなんていう言語もまた存在しません。ましてや、OSを作るとなると・・・

もちろん、習作や技術的なチャレンジ・実験などでこれを行うことにはりっぱに意味がありますよ。ちゃんとそう解っていてあえて行うのならば。誤解なきように。

Page Top

ではKタンはなぜアセンブラとCを使ったのか? anchor.png

OS自作入門のはりぼてOS。これは主にアセンブラとC言語で作られています。(OSASKなんかもそうですね)。では、なぜアセンブラ+Cなのでしょうか?。VB+JAVAではダメでしょうか?。C++だけで作ることはできないでしょうか???。

まず結論から言うと、

  • アセンブラなしでOSを作ることは、少なくとも現在ではできない

となります。理由はとても簡単で、

  • アセンブラ以外にレジスタや周辺機器にアクセスできる言語がないから

です。(もしあればきっと使われていることでしょう)

え?LinuxはCで書かれているって?。ほんとにLinuxのソースやブートの仕組み見てみました?

そしてCを使っている理由ですが、これは本にちゃんと書いてありますよ?

  • 1番説明が少なくて済むので(読むほうも少ない説明で済む)楽だから

です。それだけのことです。もしC++が同じように少ない説明で済む言語なら、もしかしたらKタンもC++で書いていたかもしれませんよ?

ウソだ!オレはC++のほうが簡単に感じた!

人間は最初に触れたものを良しとする傾向があります。Machintoshを最初に触った人は「マックは簡単だ」と言い張り、Windowsから入った人は「マックは不便だ!」といいます。英語は難しい、いや日本語のほうがむずかしい。・・・どっちも、その国で生まれ育った人なら5歳児でもしゃべれます。それだけのことです。なんなら試しに、はりぼてOSのCの部分を全てC++に置き換えてみてください。そしてその解説を、700ページ以内に収めることができるのなら、きっとKタンも「もっといい方法があった。」と認めることでしょう。


余談ですが、bayside氏という方がこのC++による実装を実現されています。(ここです)。間違えないでほしいのは、氏は少なくともはりぼてOSのアセンブラを読み、同じくCで書かれた部分を読み解き、さらにそれをC++に置換できるという、非常に高いレベルの実力を持った方です。C++しかわかんないなんて方ではないので誤解なきように。

Page Top

他の言語はダメなの? anchor.png

とんでもありません。何度も言いますが、向き不向きがあるだけです。逆にそこまで一つの言語にこだわるという理由が私にはわかりません。

上の大工さんの例の通り、「どうしてそこまでなんでもかんでも電動ノコギリでやりたいの?」と質問したいくらいです。

・・・まさかと思いますが、単に「他の言語を勉強するのが面倒くさいから」じゃないでしょうね?

これまで書いた通り、アセンブラをはずすことはまずできません。そうなると、そのアセンブラで書かれた部分とうまく、そしてできるだけ簡単に連携できる言語が必要になります。逆に言えば、JAVAだろうとC++だろうとD言語だろうと、それさえ出来れば決してできないことはないはずです。

・・・ただ、一つ言えること。おそらくネット等ではC言語がもっとも豊富に解説されている言語だろうと思います。そのC言語ですら、アセンブラとの連携の方法を探すのは一苦労でした。

私はJAVA等、他の言語についてあまり詳しくないのですが、どうでしょう?。容易にアセンブラ連携ができるのでしょうか?。そしてそのための解説やサンプルが見つかるのでしょうか?

Page Top

まとめ anchor.png

私は別にC言語に詳しいわけではありません。(っていうか、大したスキルは持ってません)

逆に、そんな初心者に毛の生えた程度の私だから言えます。結局はアセンブラ+C言語が一番楽で早くてすぐに学習できるのだと。

JAVAやD言語等の他の言語。興味はありますが、それらをアセンブラと自由に連携できるレベルまで勉強しているウチに、はりぼてOSは出来上がってしまいますよ。きっと。

bayside氏のように高いスキルを既に持っている人がやるのならともかく、「初心者がJAVAを勉強しながらOSを作る」のはとても困難だと考えます。

そんな困難を承知でがんばってみようという方。そりゃあもうすばらしいです。すごいことです。(イヤミとかじゃないですよ念のため。マジにすごいと思う)

・・・でも、「僕はJAVAを勉強してやっと出来るようになってきた。他の言語なんて勉強したくない。面倒なCなど勉強せずにすませたいのでJAVAで!」なーんて考えているのなら、「やめたほうがいいよ。倍時間がかかるから」と進言したいですね。

Page Top

補足 anchor.png

上記の、「単に面倒なので知ってる言語でなんとかしたい」という理由のほかに、「いまどきは・これからは」というお題目に毒されている人もいるかもしれませんね。

構造化・オブジェクト指向等、確かにこれらは新しい概念です。そしてすばらしいものでもあります。

しかし何度も例に出しますが、電動ノコギリやパワーシャベルは万能ではありません!!。

どんなものでも向き不向きがあります。また、新しいことはすばらしいことですが、それと万能・永続とは別のことです。同じ意味で、古くからあるものが時代遅れだったり無駄なものとも限らないのです。

新しいの古いのだけで物を判断するようでは道具を使いこなすことはきっとできないでしょう。

~
それともう一点。可読性

  • CよりC++のほうが。C++よりJAVAのほうが可読性が高い。アセンブラは可読性が悪い。

これは全て、迷信ですよ。

JAVAは知らないけどC++なら何でも作れる!。そんなプログラマはいくらでもいます。なんでも作れてしまうすばらしい実力を持ったプログラマでも、知らない言語はやっぱりわかりません。


Last-modified: 2015-07-30 (Thu) 21:55:26 (GMT) (1810d) by hideyosi