2013年02月19日

素人さんにアセンブラとコンパイラの違いを説明するのは無理か

Yaizawa さんという人が 嘘書いて 高木先生に怒られてたので、彼の云う『初心者に分かりやすいように方便を使った』というのをまじめにやってみた ・ω・

普通の開発では、プログラマが書いたソースコードを「コンパイラ」というプログラムでCPUが理解できる命令に変換します。CPUは素早く動けますが基本はおばかなので、計算とかコピーとかしかできません。コンパイラはソースコードを単純な命令に変換します
コンパイラは危険な動きをするプログラムを作ってしまわないように一応気をつけて作られているので、ウイルスのような変な動きをするプログラムはあんまり作りません。
アセンブラの場合は、コンパイラが作り出すようなCPUに理解させるプログラムを直接書きます。なのでコンパイラのように安全装置がないので危ないことを普通に書けます。

プログラム言語によってコンパイラは別々なので、C++とC#のコンパイラは別物です。アセンブラはCPU命令を書くので、IntelのCPUとモトローラのCPUのアセンブラ命令の書き方は全く別で、片方読めれば他のも何となく分かるなんてものじゃないです
まず、これがツイッターの原文


普通の開発では、プログラマが書いたソースコードを「コンパイラ」というプログラムでCPUが理解できる命令に変換します。CPUは素早く動けますが原始的な命令しかないので、1つの命令で、計算や代入や単純な入出力(画面を1点光らせるとか、プリンタで1文字表示する、キーボードから1文字読む)などしかできません。コンパイラはソースコードをコンピュータのわかる原始的な命令に変換します
特定のことをさせようとしたプログラムはコンパイラに通すと、汎用ライブラリというひな形のようなものがあるので、よく知られた悪意のあるコードをコンパイルに通すと、ヒューリスティックアルゴリズム(あいまい検索のようなもの)があるウィルス対策ソフトならば検出できることがあります。
アセンブラの場合は、コンパイラが作り出すようなCPUに理解させる命令を直接書きます。コンパイラのようなライブラリがないので、同じことをするプログラムを書いても、人が違えば全く別のものになり、危険なプログラムでも、検出することが難しくなります。

一方、コンパイラはプログラムが終わったらちゃんと制御が戻ってくるように (スタックポインタ(プログラムが戻ってくる場所)などの)管理をコンパイラがしているので、安全にプログラムできますが、アセンブラは自分で管理しなくてはいけないので、(おろそかにすると)簡単にパソコンがフリーズするようなプログラムになってしまいます。

プログラム言語によってコンパイラは別モノなので、C++とC#の(ソースは似ていますが)コンパイラ(が出力するプログラム)も別物です。

アセンブラはCPU命令を書くのですが、CPUにも種類(アーキテクチャー)があります。たとえば、代表的なものに Intel 系 と モトローラ系 と ARM 系 があってかなり違います (ただ、片方読めればなんとなくならわかるレベルだとは思う )
とりあえず最初の文章と同じ用語レベルで正しく書き直してみた。

初心者に分かるように…といっても誤解を招くようなことかいちゃだめだと思うんだ。

言いたいことはわかるんだけどね・ω・;

コンパイラは確かにプログラムがちゃんと最初の制御に戻ってくる安全装置のようなものを実装してるのだけど、この文章を見ると、コンパイラを通すと ウィルスは開発できないようにしか見えないよね。



あと、コンパイラの違いについて、C++とC#を例に挙げてるけど

できるプログラムは、VBと C++ 、および VB.NET と C#は 似てるけど、 C++とC#で別物だったり、ソースは C++とC、および VB と VB.NET では似てるって 関係も 説明しないと、コンパイラが別物って説明も不十分なのかも
(基本的にVB やC/C++はあまり、Runtime(実行するときに必要なライブラリファイル)に依存しないプログラムをつくれますが、C#やVB.NET は.Net Framework専用のプログラムを作るコンパイラ)


コンピュータ以外を例に説明するなら、新しい薬を開発するのに、原子をひとつひとつを組み合わせて、ウィルスに効くか試すのがアセンブラ、 アミノ酸単位で組み合わせて試すのが コンパイラという感じだろうか ・ω・


アセンブル使うコンピュータウィルスの製作者って、全部アセンブラで書くわけじゃなくて、コアの部分をインラインアセンブラという、C言語などへのアセンブラを埋め込む技術を使って、汎用的な部分はC言語で書いてると思うので、「ウィルス製作者はアセンブラで書く」って関連ツイートも見かけたけどちょっと違うと思う


おまけ
では「コンパイラ」「アセンブラ」という言葉に初めて触れた江川紹子さんに、「標準ライブラリ」「リンカ」などを交えてgets()とfgets()の違いをどのように説明すればよいかご指導頂けますか? 私には無理でしたので、あえて方便を使いました
「標準入力」じゃなくて「標準ライブラリ」なのだろうかとか思ったり
なんで、gets と fgets なんだろう …。
(gets は昔標準入出力ライブラリ関数だったけど削除されたとかいう話?)

gets に データを入れる 箱の大きさと 入れる方法 を(ファイルやキーボードから)指定できるのが fgets。
逆に fgets のデータを入れるサイズを指定せず、標準入力(通常キーボード)からデータを受け取るのが gets 命令。

だったと思うのだけど、初心者に gets と fgets の違いを説明するというシチュエーションがよくわからないのだった・ω・;




blackwingcat at 08:30│Comments(4)TrackBack(0) | このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote |
このエントリーをはてなブックマークに追加
時事NEWS | 小ネタ

Twitter Feedback

トラックバックURL

この記事へのコメント

1. Posted by 名無し   2013年02月19日 16:27
ニーモニックだのマシン語だの、やったこと無い人には判りません。
そうなってくると、インラインアセンブラなんて分からないだろうし、(今の開発環境は判りませんが)やれデバッガて云々や逆アセンブル(今はもう無いのかな)して・・・なんて説明しても疲れます。

相手せずに黙っているのが無難だと、私個人は思います。
2. Posted by 元教育実習生   2013年02月19日 21:27
厳密には正しくなくても、初めて聞く人間でも分かるように教える、というのが現代の教育の姿ではないでしょうか…。
過剰に高度化した専門分野を、多少正確性は犠牲にしても、その目的や内容を一般人に分かりやすく伝える、というのも専門家に求められる役割かと思います。大変ですが。
3. Posted by 名無し   2013年02月20日 01:05
コンピュータウィルスの話が出ているってことは、
「バッファオーバーランアタックを防ぐためには、gets 関数ではなく fgets 関数を使うべき」
というような発言をして、
「どう違うの?」って聞かれたんじゃないですかね?
4. Posted by 名無し   2013年02月24日 13:17
一連のやりとり、Twitter上をリアルタイムで閲覧していました。
どうも、Yaizawaさんはトロイとワームを区別せずにご説明されているようでした。
gets()とfgets()の説明が必要となり、コンパイラが気をつけるというのはワームへの対策でしょう。
分からなければ聞き直すことができる環境において、分かりやすくするために嘘を交えるというのは不適当であると考えます。
たとえ話を用いるなら、それこそよく使われる、日本語と英語、それと翻訳者の例を挙げた方が分かりやすいのではないでしょうか。

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
livedoor プロフィール
My PC
SNOWSTORM(P5E3 Premium)
OS:Win2000AdvancedSv
CPU:Xeon(4Core) 2.83G
Memory:8G
VGA:NVIDIA GTX 780Ti
HDD:SSD(32G)
    +SATA(540G+180G)
Crystal SCR:244765
SNOWFOX2(W860CU)
CPU:Core i5-540M(2.53G)
OS:Win2000Pro
Memory:4G
VGA:Geforce GTX285M
HDD:SSD(160G)
Crystal SCR:176460
SNOWMOBILE3(CF-J10S)
CPU:Core i5-2410M(2.3G)
VGA:Intel HD Graphics
HDD:SSD(128G)
Windows2000
Memory:6G
Crystal SCR:133495
SNOWMOBILE(N10Jc/故障)
Windows2000/XP Home
Crystal SCR:38316
SNOWLEO(MA206J/A/休止)
OS:OSX 10.4 +
Windows2000Pro(Solo動作)
Crystal SCR:24061
Windows 2000の セキュリティ対策について
FFR yarai(脆弱性防御)
SymantecEndpointSecurity 11 MR7
Windows Defender
記事検索
訪問者数

    最近のアクセス数

    Win2000お勧め
    お勧め記事
    Twitter Client Mo-Footer
    .NET FrameworkのUninstall
    lolifox 0.3.8.x
    WindowsのシャットダウンTips
    Fox Launcher
    ウィルス感染を手動で見つける方法
    Unknown Hard Errorとサルベージ
    Dependency Walker 日本語化
    Ultra VNC 1.0.6/1.0.8 を日本語化
    IME補完計画
    BSoD(ブルースクリーン)特集
    デフラグ時の4つの心得
    不明なデバイス探し
    SETUPAPI/NTDLLBugFix
    DNSデボルブ用更新[KB957579]
    最新 update.sys!
    4Thread以上のCPU最適化
    Win2000マルチコアで最適化
    Windows 2000の通信速度改善1
    Windows 2000の通信速度改善2
    内蔵簡易FireWallを使う
    ワームに感染しないインストール
    Remote Desktop Client
    IME 辞書 Tips
    Win2000用セキュリティSOFT
    不要なファイルの削除
    Win2000カスタマイズ
    便利なキーボードショートカット
    6月末まで使える体験版セキュリティ

    非対応ハード動作編
    HTC NDIS Driver
    Intel HD Graphic Driver
    VMWare Player 3.1.x
    Conexant HD Audio Driver
    NVIDIA WHQL Driver
    Intel Chipset 最新 INF
    Sentelic Finger Pad Driver
    ATI Legacy Driver 10.2
    AMD Radeon Driver 8〜11
    ATI Ahci/Raid Driver
    Intel SATA AHCI Driver
    D21LC(eMobile)
    USB-WSIM
    UVC カメラ
    Logicool Webcam
    Logicool ゲームパッド
    XBOX360用コントローラー
    Logicool Mouse
    Microsoft IntelliPoint
    iPod Touch/iPhone Driver

    非対応アプリ動作編
    Flash Player 10.3
    Java 6 JRE
    Java 7.0 JRE
    ティルズウィーバー
    Natal Online
    コンチェルトゲートフォルテ
    シルクロードオンライン
    東方幻想麻雀
    IME2010 Installer
    Adobe Reader X for Win2000
    Baidu IME 2.x
    MMORPG ドルアーガーの塔
    Adobe Air for Windows 2000
    Baidu IME
    iTunes 10.x installer
    Evernote 4
    Janetter
    Second Life
    雀龍門
    Media Manager for PSP 2.5a
    .NET Framework 3.5SP1
    ATOK 月額版(2010/2011)
    Leaf 愛佳でいくの!!
    VistaのScreenSaver
    会計ソフト弥生シリーズ 10
    Vegas Movie Studio 9
    EyeBall Chat
    ・CanonPowerShot[Soft/DPP]
    Google SketchUp Pro 7
    dance mixer
    Lismo Port
    DivX
    SONY ScreenSaver
    mixi アプリ
    DivX v7.x
    ニコニコムービーメーカー(動画)
    RC-S330 PaSoRi
    Finale 2009
    ZoneAlarm 8.0
    ルナティア Online
    ストリートギアーズ
    xfy Blog Editor
    Photoshop Elements 7
    Premiere Elements 7
    PowerShell 1.0
    ai sp@ce
    電脳フィギュアARis
    VOCALOID2 ミク・リンレン
    Google Chrome/SRW Iron
    Media Player 10
    ・iTunes 7.6.2を使う方法
    QuickTime 7.5x/7.6x
    foobar2000 9.5.x/9.6.x
    RealPlayer11
    Safari3/4.0
    ShockwavePlayer10/11
    Windows Live Writer
    Live Messenger
    Veoh Web Player / Web TV
    Level-R

    追加機能・カスタマイズ編
    W2K Kernel32 改造計画【BM】
    W2K Update Rollup v2
    XNA/SlimDX
    CPU Core数リミット解除
    OutLook Express 6SP3
    MDAC 2.8 SP2
    GIF/PNGを使えるMSPAINT
    IE5でWindowsUpdate
    MSXML 4.0SP3
    DirectX9.0c(2010/Feb)+拡張
    MS09-062(Gdiplus.dll)更新
    Unicode 制御文字
    Internet Explorer6 Bonus Pack
    夏時間(DaylightSavingTime)
    レジストリバックアップを取る
    IME2007
    Windows Media Bonus Pack
    XPSファイルビューア
    Windows Defender
    文字化け対策(FontLink)
    Meirio(KB927489)
    msconfig
    圧縮フォルダ
    Windows Movie Maker
    IE5.01/5.5/6タブ化
    MediaTypeChanger(EISA構成)
    Win2000 SP4 Support Tool
    kill/tlist with Debugging Tools
    sc.exe with Resource kit
    reg.exe
    TaskTray 256色化
    ISO仮想CD/DVDドライバ
    IE6高速化とWSH 5.7/5.8
    MS Baseline Security Analyzer
    音声認識 API 5.1
    Text Service

    Win2000インストール編
    CF-J10S
    N10Jc
    ThinkPad X200(7454)
    Quad Core/X48/P5E3
    VAIO VGN Type S
    E6850搭載 サポートPC
    Let'snote CF-R6
    MacMini
    Dell LATITUDE D630
    Core i7 + X58 +ICH10R
    790FX + SB750
    Clevo W860CU
    最新コメント
    Categories
    アーカイブ
    Information
    Google広告




    Translate


    このサイトはIE5.x/IE6
    IE5.x Internet Explorer 6.x

    Firefox Firefox ブラウザ無料ダウンロード
    で最適化されています。
    Technorati
    Add to iGoogle
    Amazon GIFTでカンパ

    Donation