- RecentDeleted (1236d)
- コラム/言語はなにがいい? (2005d)
- 2015-07-30 (Thu) 21:55:26 by hideyosi
ここはKタンに教えてもらったという名目で書いてますが、Kタンがそっくりそのまま言った言葉ではありません。いろいろ教えてもらったオイラが理解したことを書いてます。なので、Kタンの考えそのものと微妙に違っていたり、あるいはオイラが勘違いしているなんて場合もあるということです。なので、くれぐれも話半分で聞いておいてください。(そうしないと恥をかくのはアナタですヨン♪
ページ内コンテンツ- アセンブラ最高!
- C++最低!
- 結局、OSを作る言語はなにがいいんだ?
- ではKタンはなぜアセンブラとCを使ったのか?
- 他の言語はダメなの?
- まとめ
- 補足
アセンブラ最高!
・・・大間違いである」と考えています。
- おかしいぞ!OS自作本の初期に、Kが自分でそう書いているじゃないか!
- OSASKが機能が少ないといっても面白い性能を出すのはアセンブラのおかげだろう!。普通にCとかで書いたらKが批判?するLinuxと大して変わらない性能になるはずじゃないか!
なるほど!。では説明。
まず、「1」ね。
もう一回よーく読んでみてください。OS自作本でKタンは、「アゼンブラ最強」とは書いていますが、「アセンブラ最高」とは書いてませんね?。
え?単なる言い回しだけだって?。本当に本読みました?。すこし先にちゃーんと書いてありますよね。
- 「これは紙と鉛筆さえあればどんな名作でも書けると言っているのと同じ」
アセンブラを使えばどんなプログラムを書くことも不可能ではないといっているだけです。「不可能ではないのだからこれを使いましょう」などとは一言も言っていないし、「使うと性能が良くなる」などとも言っていません。
次、「2」。
いまだにこういう誤解がはびこっています。(もう何年も前に間違いだということになったのに・・・
- OSASKが小さいのはアセンブラでゴリゴリ書いたからだ
- Linuxは全てCで書かれている
C++最低!
C++と書きましたが、JAVAやD言語等の「高級言語」と呼ばれるものを総称しています。
よくKタンは、C++やJAVAの良くない部分を語ります。なるほど、Kタンはアセンブラとかが好きなので、その対極ともいえるこれら高級言語が好かんと。そういう言語はよくないと。
・・・まずこれは、オイラはともかく、Kタンは間違いなく「大間違いである」と言うでしょう。
以外かもしれませんが、昔オイラはKタンに聞いたことがあります。
- 「非常に大規模。たとえばemacsやモジラのようなソフトをOSASKで作れる環境が整ったとします。オイラがそれをやろうと思ったらどんな言語を薦めますか?」
- 「C++がいいと思いますよ。」
- 「おぉ!以外。せいぜいCかと思ったのですが・・・。なぜですか?」
- 「だって楽でしょ?。そのほうが」
Kタンは「高級言語がキライなので悪口を言う」と思っているのならそれは大間違いですよ。Kタンは「少なくともOSを作る上では不便のほうが多い」と言っているだけです。KタンはOS作成関連の作業やツール作成ばっかりやっているのでそういう発言が目立つだけです。
結局、OSを作る言語はなにがいいんだ?
なるほど。もっともな質問ですね?。では答え。
- 「まずその「何言語がいいか」という発想を捨てることが正解です」
なに?。意味がわからないって?。ではこういう例え話をしましょう。
- アナタは新米の大工さんです。家を作ろうとしています。
- 「大工」という仕事は何百年も前からあるのは知っていますよね?
- 昔。じゃあ江戸時代としましょうか。
- この頃も大工さんはいましたし、家もありました。でも今とはものすごく違います。一番大きな違いは、「電気がなかった」ことですね。
- 昔は電気がなかったので、当然電動工具は使えません。当然そんな工具はありませんでした。
- そんな昔はどうやって家を建てていたのでしょう。そう。ほとんど人力です。
- 使う道具も原始的は人力の物ばかりでした。ノコギリ・ノミ・トンカチ・・・
- こんな原始的な道具でりっぱな家を建てていました。きっととても大変だったでしょう。
- さて。現代です。電気もあります。すばらしい電動工具もあります。トラックもパワーシャベルもありますね。
- さて質問です。あなたはそんな現代の大工さんです。家を建てようとした時、誰かが、「昔は全部人力でやったものだ。プロの大工ならオマエも電動工具など使わずにやってみろ」といいました。アナタならどう答えますか?
- オイラの答え。「修行や習作・趣味ならともかく、電動工具でできることを人力でやるのはアホである」
- さらにこんな質問。「あそこに2mmだけクギが出ている。あっちでは4mmくらい木が出っ張っている。修正してほしいが当然電動ハンマーや電気カンナで削るのだろう?」
- 同じく他の人は知りませんが、オイラなら「人力で簡単にできることを無理に電気でやるのはアホである」
まあ「アホである」というのはちょっと言いすぎかもしれませんが、意味は解りますよね?。つまりなんらかの作業をする場合、先に道具を決定しておくというのは本末転倒ということなのです。上記の例え話をさらに進めると、
- 太さ5mmの木の棒を切りたいが、カッターナイフ・ノコギリ・電動ノコ・レーザーカッター。どれを使うと一番早くて便利?
というふうに、まず作業があって、その作業の実行に一番楽で正確で早いものを考えてから使うのが正解ですよね?。これを、
- とにかく電動ノコギリだ。電動ノコギリを使うのだ!。さあ!作業をもってこい!
・・・これはどう考えてもおかしいですよね?。(初めてすごい機械を買ってもらった子供じゃあるまいし)
最初の、まずその「何言語がいいか」という発想を捨てることが正解ですというのはこういう意味なのです。
割り箸削りから大木切り倒しまで全てこなせる便利な工具など存在しえないのはわかりますよね?。それと同じこと。万能でこれさえ知っていればなにもいらないなんていう言語もまた存在しません。ましてや、OSを作るとなると・・・
もちろん、習作や技術的なチャレンジ・実験などでこれを行うことにはりっぱに意味がありますよ。ちゃんとそう解っていてあえて行うのならば。誤解なきように。
ではKタンはなぜアセンブラとCを使ったのか?
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++しかわかんないなんて方ではないので誤解なきように。
他の言語はダメなの?
とんでもありません。何度も言いますが、向き不向きがあるだけです。逆にそこまで一つの言語にこだわるという理由が私にはわかりません。
上の大工さんの例の通り、「どうしてそこまでなんでもかんでも電動ノコギリでやりたいの?」と質問したいくらいです。
・・・まさかと思いますが、単に「他の言語を勉強するのが面倒くさいから」じゃないでしょうね?
これまで書いた通り、アセンブラをはずすことはまずできません。そうなると、そのアセンブラで書かれた部分とうまく、そしてできるだけ簡単に連携できる言語が必要になります。逆に言えば、JAVAだろうとC++だろうとD言語だろうと、それさえ出来れば決してできないことはないはずです。
・・・ただ、一つ言えること。おそらくネット等ではC言語がもっとも豊富に解説されている言語だろうと思います。そのC言語ですら、アセンブラとの連携の方法を探すのは一苦労でした。
私はJAVA等、他の言語についてあまり詳しくないのですが、どうでしょう?。容易にアセンブラ連携ができるのでしょうか?。そしてそのための解説やサンプルが見つかるのでしょうか?
まとめ
私は別にC言語に詳しいわけではありません。(っていうか、大したスキルは持ってません)
逆に、そんな初心者に毛の生えた程度の私だから言えます。結局はアセンブラ+C言語が一番楽で早くてすぐに学習できるのだと。
JAVAやD言語等の他の言語。興味はありますが、それらをアセンブラと自由に連携できるレベルまで勉強しているウチに、はりぼてOSは出来上がってしまいますよ。きっと。
bayside氏のように高いスキルを既に持っている人がやるのならともかく、「初心者がJAVAを勉強しながらOSを作る」のはとても困難だと考えます。
そんな困難を承知でがんばってみようという方。そりゃあもうすばらしいです。すごいことです。(イヤミとかじゃないですよ念のため。マジにすごいと思う)
・・・でも、「僕はJAVAを勉強してやっと出来るようになってきた。他の言語なんて勉強したくない。面倒なCなど勉強せずにすませたいのでJAVAで!」なーんて考えているのなら、「やめたほうがいいよ。倍時間がかかるから」と進言したいですね。
補足
上記の、「単に面倒なので知ってる言語でなんとかしたい」という理由のほかに、「いまどきは・これからは」というお題目に毒されている人もいるかもしれませんね。
構造化・オブジェクト指向等、確かにこれらは新しい概念です。そしてすばらしいものでもあります。
しかし何度も例に出しますが、電動ノコギリやパワーシャベルは万能ではありません!!。
どんなものでも向き不向きがあります。また、新しいことはすばらしいことですが、それと万能・永続とは別のことです。同じ意味で、古くからあるものが時代遅れだったり無駄なものとも限らないのです。
新しいの古いのだけで物を判断するようでは道具を使いこなすことはきっとできないでしょう。
~
それともう一点。可読性。- CよりC++のほうが。C++よりJAVAのほうが可読性が高い。アセンブラは可読性が悪い。
これは全て、迷信ですよ。
JAVAは知らないけどC++なら何でも作れる!。そんなプログラマはいくらでもいます。なんでも作れてしまうすばらしい実力を持ったプログラマでも、知らない言語はやっぱりわかりません。
- 2015-07-30 (Thu) 21:55:26 by hideyosi
- Linuxでhariboteを (3016d)
- golibcのバグでお勉強 (3016d)
- 2010-02-09 (Tue) 07:34:03 by hideyosi
'b' 'b' 'b' 0x00 szが1なので、whileループは一回だけ処理される
//szは1
while ('\0' != *s) { ↑ if (0 == sz) │ break; │ sz--; │ *d++ = *s++; │ } │ │ //szは0 │ //よーし!ループするぞ! └────────┘
//szは0 ┌──┐ while ('\0' != *s) { │ │ if (0 == sz) │ │ break; │ │ sz--; │ │ *d++ = *s++; │ │ } │ │ │ │ //szは0 │ │ //よーし!ループするぞ! │ └────────┘ └──────────┐ ↓ //なんだSZはもうゼロじゃん。なにもせんで次へ・・・
- 2010-02-09 (Tue) 07:34:03 by hideyosi
- FAT12 (3016d)
- 2009-09-29 (Tue) 13:02:52 by hideyosi
読み取り専用 隠しファイル システムファイル ボリュームラベル ディレクトリ アーカイブ属性 予約 常に 0
- 2009-09-29 (Tue) 13:02:52 by hideyosi
- tolsetをefg形式に! (3016d)
- 2009-01-08 (Thu) 04:36:43 by hideyosi
また、単にできるようにするだけじゃダメ。
.g01形式はまだ全部が全部移植できたわけじゃないし、これからいろいろ入れ替わる可能性が高い。
なので、後からの変更を必要最小限にできるように工夫してみよう。
- 2009-01-08 (Thu) 04:36:43 by hideyosi
- tolset/最新 (3016d)
- 2008-10-17 (Fri) 03:21:49 by hideyosi
Up! obj2bim.exe 2008/5/12 8:18 12,800 Get!
- 2008-10-17 (Fri) 03:21:49 by hideyosi
- tolset/オリジナル (3016d)
- 2008-10-17 (Fri) 02:30:03 by hideyosi
CD-ROM(第7刷添付版)のtolsetの資料
- 最新版はtolset/最新にてチェック!
- 2008-10-17 (Fri) 02:30:03 by hideyosi
- tolset (3016d)
- 2008-10-17 (Fri) 02:28:37 by hideyosi
関連ページ
- 2008-10-17 (Fri) 02:28:37 by hideyosi
- SandBox (3016d)
- 2008-10-09 (Thu) 03:30:32 by hideyosi
ccc
- 2008-10-09 (Thu) 03:30:32 by hideyosi
- ネタ/マスコットとか (3016d)
- 2008-06-17 (Tue) 14:16:47 by hideyosi
あかんようです・・・
自称ヲタクのオイラですが、歳のせいか新しいのはまるっきしです。
しかーし!
なんかテレビ見てたらオイラが妄想してたのにかなり近い雰囲気のアニメが!!!
(なんつったかな。ソールなんとかっての)
当然ですがそっちのほうがずーーっとカコイイと。それにアニメになるくらいでしょうから原作はずっと前からあったんでしょうねぇ。
そんなわけで、「死神」はボツ〜・・・・
- 2008-06-17 (Tue) 14:16:47 by hideyosi
- FormattingRules (3016d)
- 2008-04-25 (Fri) 02:14:41 by hideyosi ページ内コンテンツ
- セル内の行揃えは、1つ以上の空白(半角スペース)や "<" "=" ">" を使って表現することもできます。
| ~Table with alignment |||h | right| center |left | |left | right| center | | xxxxxxxxxxxx | xxxxxxxxxxxx | xxxxxxxxxxxx | |=~Table with alignment |||h |>right |=center |<left | |<left |>right |=center | | xxxxxxxxxxxx | xxxxxxxxxxxx | xxxxxxxxxxxx |
Table with alignment right center left left right center xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx - 空白のセルは、左のセルと連結されます。(左に有効なセルがない時は、右のセルと連結します。)
- セル内に < を単独で記述すると左のセルと連結します(colspan)。
- セル内に ~ または ^ を単独で記述すると上のセルと連結します(rowspan)。
行中で &ref または、{{ }} を記述すると、添付ファイルまたは指定されたURLにあるファイルへのリンクを貼り付けることができます。ファイルが画像ファイルの場合は、その画像を表示します。
&ref(添付ファイル名[,パラメタ]){代替文字列}; {{添付ファイル名[,パラメタ]|代替文字列}} &ref(ファイルのURL[,パラメタ]){代替文字列}; {{ファイルのURL[,パラメタ]|代替文字列}}
- 添付ファイル名を省略すると、ファイルアップロードのためのリンクになります。そのリンクを使ってファイルをアップロードすると、そのリンク部分が添付したファイル表示に置換されます。
- 添付ファイル名を "ページ名/添付ファイル名" とすることもできます。
- セル内の行揃えは、1つ以上の空白(半角スペース)や "<" "=" ">" を使って表現することもできます。
- 2008-04-25 (Fri) 02:14:41 by hideyosi
- svn/なにができる? (3016d)
- 2008-02-13 (Wed) 07:10:16 by hideyosi
svn/バージョン管理
- 2008-02-13 (Wed) 07:10:16 by hideyosi
- FrontPage (3016d)
- 2008-02-13 (Wed) 05:21:52 by hideyosi
- 2008-02-13 (Wed) 05:21:52 by hideyosi
- PukiWiki/1.4/Manual/Plugin/L-N (3016d)
- 2008-02-09 (Sat) 15:50:12 by hideyosi
パターンには表示するページ名の共通部分を指定します。省略時は"設置したページ名/"となります。
また、「ディレクトリ名:ページパターン」と指定して同じシステム上の別のxpWikiの一覧表示をすることもできます。
- 2008-02-09 (Sat) 15:50:12 by hideyosi
- PukiWiki/1.4/Manual/Plugin/O-R (3016d)
- 2008-02-09 (Sat) 15:50:12 by hideyosi
[パターン] [,件数]
指定したパターンで始まるページ名のうち、最新の数件を表示します。
パターンには表示するページ名の共通部分を指定します。省略時は閲覧可能なすべてのページとなります。
また、「ディレクトリ名:ページパターン」と指定して同じシステム上の別のxpWikiの一覧表示をすることもできます。
- 2008-02-09 (Sat) 15:50:12 by hideyosi
- InterWikiName (3016d)
- 2008-01-23 (Wed) 14:44:03 by hideyosi
PukiWiki
InterWikiName
WikiEngines
PukiWiki
- pukiwiki utf8
- pukiwiki.dev euc
Search Engine
- Google utf8
- Yahoo euc
- WikiPedia utf8
- WikiPedia.en utf8
- WikiPedia.ja utf8
拡張InterWikiName
その他
- 2008-01-23 (Wed) 14:44:03 by hideyosi
- BracketName (3016d)
- 2008-01-23 (Wed) 14:44:02 by hideyosi
BracketName
もちろん日本語もOK。
- 2008-01-23 (Wed) 14:44:02 by hideyosi
- Help (3016d)
- 2008-01-23 (Wed) 14:44:02 by hideyosi
PukiWikiヘルプ
- FAQ(PukiWiki-official)(日本語)
- テキスト整形のルール
- プラグインマニュアル
PukiWiki って 何なの?
すべてのページが誰でも編集できます。変更したいページでページ上部の「編集」をクリックするとそのページが編集できます。編集内容は、整形ルールに従って整形されます。 練習用ページは基本的にどのように手を加えても問題ないので、結果を恐れず編集してみてください。
新しいページを作成するには?
すでにあるページ(例えば練習用ページなど)で、ページのどこかにWikiName(大文字と小文字混合)かBracketName([[]]で囲う)を入力すると入力した部分の後ろに ? というリンクがつきます。そこをクリックすると新しいページの編集画面が用意されるので、あとは普通のページ変更と同様に書き込むことができます。
リンクについてる(3m)とかは?
掲示板と違う?
誰かが書き込みを書き換えてしまう?
Wikiとはそういうものです。誰でもどこでも書き加えたり、直したりできます。PukiWikiには定期的にバックアップを取る機能がありますので、バックアップから復旧させることもできます。
ブラウザやプロクシのキャッシュで人の変更を消してしまわないだろうか?
ページを編集する以上、編集時の状態から手を加える形になります。しかし、もし編集中に誰かが更新していてしまっていたらどうします? 安心してください。PukiWikiには、更新時のページの更新日時と元データの更新日時を比較して一緒かどうかチェックします。「更新の衝突」が起きた場合はそのページをリロードし、編集し直してください。
- 2008-01-23 (Wed) 14:44:02 by hideyosi
- InterWiki (3016d)
- 2008-01-23 (Wed) 14:44:02 by hideyosi
InterWiki
InterWiki は、PukiWiki と 他のサーバーを接続する機能です。 InterWikiName のページでサーバー名を定義しています。
InterWikiへのアクセス(InterWikiNameの生成)
サーバリストにある サーバ名:WikiName をBracketNameで作ればInterWikiNameの完成。
これをページに記述すれば、そのサーバのWikiNameへのハイパーリンクが生成されます。[[サーバ名:WikiName]] [[pukiwiki:FrontPage]]
サーバーリストへの追加
InterWikiName のページに以下のようにサーバの定義をすることで サーバーリストに追加することができます。
[URL サーバ名] タイプ [http://pukiwiki.sourceforge.jp/index.php pukiwiki] utf8
WikiNameの挿入位置
要求しようとするURLへのWikiNameの挿入位置を $1 で指定することができます。省略するとお尻にくっつきます。
-[http://pukiwiki.sourceforge.jp/index.php?cmd=backup&page=$1&age=1 pukiwiki] utf8
文字コード変換タイプ
PukiWiki内のページ以外にも飛ばせます。日本語をURLに含む可能性もあるのでその場合のエンコーディングの指定をタイプとして指定できます。
-[http://pukiwiki.sourceforge.jp/index.php?cmd=read&page=$1 somewhere] utf8
- std 省略時
- 内部文字エンコーディング(標準はSJIS)のままURLエンコードします。
- raw asis
- URLエンコードしないでそのまま使用。
- sjis
- 文字列をSJISに変換し、URLエンコードします。(mb_stringのSJISへのエイリアスです)
- euc
- 文字列を日本語EUCに変換し、URLエンコードします。(mb_stringのEUC-JPへのエイリアスです)
- utf8
- 文字列をUTF-8に変換し、URLエンコードします。(mb_stringのUTF-8へのエイリアスです)
- yw
- YukiWiki系へのエンコーディング。
- moin
- MoinMoin
用に変換します。
その他、PHP4のmb_stringでサポートされている以下のエンコード文字が使用できます。
UCS-4, UCS-4BE, UCS-4LE, UCS-2, UCS-2BE, UCS-2LE, UTF-32, UTF-32BE, UTF-32LE, UCS-2LE, UTF-16, UTF-16BE, UTF-16LE, UTF-8, UTF-7, ASCII, EUC-JP, SJIS, eucJP-win, SJIS-win, ISO-2022-JP, JIS, ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-13, ISO-8859-14, ISO-8859-15, byte2be, byte2le, byte4be, byte4le, BASE64, 7bit, 8bit, UTF7-IMAP
YukiWiki系へのエンコーディング
- WikiNameのものへはそのままURLエンコード。
- BracketNameのものは[[ ]]を付加してURLエンコード。
- 2008-01-23 (Wed) 14:44:02 by hideyosi
- 妄想/インベーダー考察 (3016d)
- 妄想/SHEETの二段化 (3016d)
- 妄想/ウィンドゥリサイズ (3016d)
- 仮想86モード (3016d)
- タスクバー白紙問題メモ (3016d)
- コマンドライン引数APIの妄想 (3016d)
- 自作APIメモ (3016d)
- VESA (3016d)
- VESA/はりぼて (3016d)
- VGA (3016d)
- FDアクセスエラー想定 (3016d)
- FDC覚書 (3016d)
- svn/バージョン管理 (3016d)
- svn (3016d)
- 棚上げメモ (3016d)
- GDTへの設定 (3016d)
- IPL研究 (3016d)
- FreeBSDではりぼて! (3016d)
- gcc4でtolsetを! (3016d)
- gcc_error (3016d)
- FreeBSDではりぼて!/tolset移植 (3016d)
- FreeBSDではりぼて!/OLD/aksa1a (3016d)
- FreeBSDではりぼて!/OLD/bim2hrb (3016d)
- FreeBSDではりぼて!/OLD/bim2bi4w (3016d)
- FreeBSDではりぼて!/OLD/makefont (3016d)
- FreeBSDではりぼて!/OLD/bin2obj (3016d)
- FreeBSDではりぼて!/OLD/メイン (3016d)
- FreeBSDではりぼて!/OLD/aska (3016d)
- FreeBSDではりぼて!/OLD/ちと実験 (3016d)
- FreeBSDではりぼて!/OLD (3016d)
- FD制御タスク2 (3016d)
- FD制御タスク (3016d)
- マルチタスク復習2 (3016d)
- マルチタスク復習 (3016d)
- メモリマップ(BBL) (3016d)
- FIFO32進入データ一覧 (3016d)
- 秒待ち関数 (3016d)
- コンソールをでかく! (3016d)
- FDを読んでみる実験3 (3016d)
- FDを読んでみる実験2 (3016d)