リンクフリーを近日中にとりやめる予定です

すでにリンクを貼っていただいている方、ご一報頂きたくお願い申し上げます。


ごく少数ですが、リンクをお断りする場合があります



ブログ内 風景光景カテゴリー

続編記事などをご希望の方は こちらへどうぞ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[未掲載分] 車輪の再発明 (2)

元来、好ましい意味で用いられない「車輪の再発明」。



筆者は、そのような行為を肯定的に捉えている。
なぜならば、新しい技術や文化が芽生えるきっかけは、一見無駄と思われることへの挑戦である・・・


お知らせ
活動休止にともない、この記事を事前に予約投稿してあります。
トップ記事の固定を目的としています


この題目は2012年暮れ頃に掲載しようと下書きし、諸事情により掲載却下とした分です。
前話、「車輪の再発明 (1)」にひきつづき、利用環境を OS はWindows , CPU は Intel 製、いわゆるウィンテル機を前提として綴ります。

いきなり難しいコードを載せるのもアレなので、今回は概論。
コンピュータの中で頻繁に行われる、データの複写 ( コピー ) について。

その前に、
複写と移動の違いが曖昧なヒトもいることでしょう。



場所A、Bがあるとしましょう。
場所Aにあるモノと同じモノを場所Bに作成する。ここまでが「複写」、「コピー」です。
ちなみに、複製を作るに該当する英単語は 「duplicate」。
場所Aにあるモノと同じモノを場所Bに作成し、場所Aにあったモノを消してしまうのが「移動」。
勘の鋭いヒトはお気づきの通り、「場所Aにあったモノを消す」、つまり、かたづける手間が増えます・・・

例えば、ワープロや画像処理アプリ( ソフトウェア )で図形の移動処理を施したとしましょう。図形を移動する前の部分が無になる、つまり、片付けられたように見えます。
「移動」に関して直感的に捉えようとした場合、元の部分 ( ここでは場所A ) がキレイに消えてしまうように想えるでしょう。
コンピュータ内部での処理に限って言えば、元の部分を消さないこともしばしば。
(漠然と綴るとキリが無いので、利用OSをWindows と想定して話を進めています。)

- - - 複写や移動の話から逸れます - - -

アプリで何か処理をしようとした場合
・OSにメモリを割り当ててもらいます。
(ここでは、場所AやBといったメモリの一部を作業場所として借りている状態。)
・ある程度の処理を行い、不要になったメモリを解放することになっています。
(OS から借りていたメモリを返却。)

人間の生活に例えれば、図書館で原本を借りてくる。原本に載っている重要な部分を別のノート等に書き写す、ここまでは複写、コピーです。借りてきた原本はそのまま、すなわち、手を加えずに返却するのがマナー。
いつまでも返却しなかったり、原本に手を加えてしまうのは「お行儀が悪い」。

ただし、資源の再利用として、同じメモリ部分をくり返し利用する例も考えられます。
Windows などのOS 、つまり、複数のアプリを同時に実行できる環境において、ひとつのアプリが「多量にメモリを使いたくても許可されない」事態も発生します。
そのような状況では、不要になった ( 本来ならば OSに返却するのが望ましい ) 部分を再利用するような手法も有効です。
先の図に戻り、「場所Aにあるモノと同じモノを場所Bに作成し・・・」で言うならば、場所Aにあったモノは用済みとなりますので、早めに返却すべきでしょう。が、返却して、再度借りると手間がかかるため、不要になった「場所A」を返却せず別の作業をする場所として使い続けるといった具合に・・・

メモリを作業机に置き換えて考えてみます。
何らかの作業を行いたいとして、作業机が8卓分あると進行がスムーズになるとします。ところが、空いている作業机が2卓しか無い場合どうでしょうか。
その2卓の机の上で、できうる範囲の作業を進め、一度片付け、残りの作業を進めてゆくことでしょう・・・

しばしば、アプリ(ソフトウェア)を組む際には、「データを局所に集ておく」「局所性を高める」ことが良いとされています。広大なメモリ空間を取得して処理するよりも、狭い空間のほうがキャッシュにヒットしやすい傾向にあります。言い換えれば、小回りが効きやすくなります。

- - - 複写や移動の話に戻ります - - -

複写を高速化できるのか???
つまり、
さらに高速にデータを転送できるのか???

まず、誤解を避けるために記しておきます。
USBメモリや外付けHDDを用いてデータをバックアップするのも「データの転送」と呼びます。
今回綴る「データの転送」の主語は「PC 内部において、メモリのある地点から別の地点への・・・」となります。長いので省いています。

少し視野を広げると、古くからのDMA (Direct Memory Access の略) 転送と呼ばれる、データの転送方法もあります。
今回綴るのは、「CPU の演算器を介したデータ転送」。

「演算器」という呼び方は少々堅苦しいかもしれません。別の呼び方では「アキュムレータ」、「レジスタ」などなど。
役割というか、できることを簡単にいえば
・計算するための基の数値データを読み込む、積み込む = ロード
・何らかの演算をする、
・演算結果 ( 数値 ) をどこかへ置く、残す = ストア、セーブ。

しばしば「~~ビットCPU」のような呼び方も用いられます。
例えば、「32ビットCPU」であれば、8ビットが1バイトですので、4バイト分のデータを扱えることになります。
32ビット版のOS を利用しているならば一度に4バイト分、データを積み下ろしができます。
( 64ビット版のOSならば一度に8バイト分 )

ビットとバイトに関しては当ブログ、PCのナゼ!?カテゴリー内、「遅くない除算」中ほどで触れてあります。

ところで、CPU は現在に至るまで、さまざまな機能が拡張、追加されてきました。
( ウィンテル機を前提に綴っています。ここで指しているCPU は Intel 製 の CPU。ただし Itanium シリーズを除く)

浮動小数演算を高速化するための FPU 、マルチメディア処理を高速化しようと MMX や SSE、さらに、SSE2 , SSE3 , SSE4を経て、AVX という拡張機能が追加されてきました。
拡張された機能を用いれば、SSE2 では 16バイト分、AVX では 32バイト分のデータを一度に読み書きすることができます。

本来、SSE2 機能が追加された経緯としては、画像や音声などのデータ処理を効率的に行うためであり、「データ転送の高速化」が主目的ではありません。画像や音声データを加工処理する際、同じような演算が繰り返されます。ベクトル演算や並列化などと呼ばれますが、同じような足し算、乗算を一度に4回分同時実行するなどで高速化を狙うものです。
とはいえ、一度に16バイト分のデータを扱える能力を備えているのに使わないのはモッタイナイ・・・



小難しい用語ばかりで判り辛いかもしれません。
そこで、「データの転送」を「モノを運ぶ」に置き換えて考えてみましょう。

場所は旅館、数百人が集う宴会が催されるとしましょう。
「調理場から宴会場へお食事を運ぶ作業」の効率を図りたいとしましょう。

作業に不慣れな頃、一度に1人分ずつ運んでいました。
その後、作業に慣れてきたのもあり、一度に4人分ずつ運べるようになりました。
これを
「一度に16人分運べるように作業工程を改善してみよう!」
という感じが近いかも。

理屈の上では「一度に運べる量が今までの4倍」に増えます。
さてさて、「作業速度も4倍」となるのでしょうか!?

かつて、「手分けすれば速く済む?」と題し、「同じ量の作業量を手分けすれば速度が向上するのか」を綴ったことがあります。今回はそれとは異なり、「作業員一人当たりの作業効率を向上」がキモとなります・・・

長くなりましたので続きはまた後日・・・

※ これを下書きしたのは2012年暮れです。
2012年暮れ時点で最新の CPU では AVX 機能まで搭載されていました。
AVX 機能を利用するには OS が正式に対応している必要があります。具体的に挙げれば、Windows 7 (SP1 を適用)、Windows 8 以降です。
筆者はAVX 機能を搭載した CPU、対応しているOSを利用しています。当時、この記事の発端となったブロガーさんは Windows XP を利用中とのことでした。Windows XP において、AVX 機能は非対応。よって、AVX 機能ではなく、SSE2 を中心とした話となります。

さらに、下書き時点での AVX は未成熟な部分が残っており、32バイト分を2回に分けてデータを読み書きしているようです。実質、16バイト分転送と大差ない・・・
スポンサーサイト

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : プログラミング
ジャンル : コンピュータ

[未掲載分] 車輪の再発明 (1)

とある若手の方が眠い目をこすりながら、「今までに無い○○を作りあげました」と意気揚々。



側にいた熟練の方々がニヤニヤと・・・


お知らせ
活動休止にともない、この記事を事前に予約投稿してあります。
トップ記事の固定を目的としています


この題目は2012年暮れ頃に掲載しようと下書きし、諸事情により掲載却下とした分です。
当ブログにたびたびお越しいただいたブロガーさんの中で、プログラミング技術の向上を目指している方々もちらほらと。中でも、学生の方々、学業の合間をみて、向上しようという意欲に心を動かされるものがありました。
それらの方々の奮闘にエールを送りたいとの想いを込めて・・・


「Reinventing the wheel」という慣用句がある。日本語では「車輪の再発明」。

意味につての細かい説明は省きます。興味のある方は辞書をひくなり、ネットで検索してください。
以下に検索用のリンクを貼っておきます。
「車輪の再発明」検索へのリンク

さてさて、一見、無駄と思われるような行為、皮肉を込めて「車輪の再発明」と揶揄する場面で用いられるのが多い。
しかし、ドンキホーテ的に何かに猛進する姿、筆者は肯定する。
新しい技術や文化が創られる時、それまでとは異なる手法から派生してゆくものだ・・・

「車輪の再発明」に陥ってしまう要因としては
(1)「既存の (モノゴトの) 存在を知らない」
(2)「既存の (モノゴトの) 意味を誤解している」
が挙げられている。前者は経験不足や勉強不足、後者は学習過程において何らか誤ちが生じるのだ。
現実には、そのスジで詳しいヒトとコミュニケーションするなり、実戦で腕を磨くなり、原因が判ってしまえば解消の道はある。

まず、スムーズに進める、というよりも、手数を減らすためには、「既存の (モノゴトの)」を利用するのが常。
すでに「ライブラリ」や「ひな型」が存在するのであれば、それに従うのが賢明。
たいていの場合、「ライブラリ」や「ひな型」とは多くの先人たちに磨き上げられている。
逆に言えば、使い勝手の悪いモノや、不要なモノは淘汰、つまり排除、廃止されてゆくものだ・・・

ここから少々、冒頭に述べた「プログラミング技術の向上を目指す方々」に対して記します。
ただ漠然とプログラミングを語ってもキリが無いので、
利用環境を OS はWindows , CPU は Intel 製 (いわゆるウィンテル機)と仮定し、開発に用いる言語を C/C++ に絞り込めば、
ライブラリとして「MFC」(Microsoft Foundation Class) や 「ATL」が挙げられる。
また、それらライブラリの軽量化版として「WTL」(Windows Template Library) も有名。

たしかに、暗中模索することも力を養う糧となる。しかし、多くの場合、欲を満たすモノは、これらライブラリの中に含まれている。
(同じような工程を辿っている限りにおいては、同じような探し物をする傾向が強い。)

まずはライブラリをとことん漁り、最終的に見つからなかった段階に至ってから、「一から構築する」「ゼロから構築する」を決意すれば良いのだ。



さらに、話を狭めます。
PC のアプリ ( ソフトウェア ) の中で、利用している際にモタつきを感じる作品もある。利用者としてはストレスを感じる。

視点を替えて、アプリを作成する側に立ってみる。
同じアプリを実行した際、同じ処理に要する時間が短いほど、利用者からの評価が高まる。

同じ処理に要する時間を短縮することを「効果」として捉え、求められるのは効率を上げること。
例えば、何か製造に携わるならば、作業工程の「改善・改良」により、時間の短縮や同じ時間内でより多く生産できるように変わる。
とはいえ、時間短縮やコスト削減にこぎつけたとしても、生み出されるモノの質、精度が下がってしまうのは論外。



数年前まで、( 細かく言えば Pentium4 が主流の間は )「最適化」という言葉がもてはやされていた。
命令の実行順序を手動でチューニングするなどの手法で、ある程度の効果を得ることができた。

ところが、それまで提唱されていた最適化の手法、Core2 Duo , Core2 Quad の登場を境に効果が薄れてきた。
それまでは、プリフェッチ ( データの先読み、下調べ )や命令の実行順序を人間の手で修正することは速度向上、つまり、時間短縮につながった。

※ PC に詳しくないヒト向けに補足。Pentium4 や Core2 Duo と記しているのは CPU の名称。自動車に例えると、CPU はエンジンに相当する。

おおざっぱな言い方をすれば、
Core2 Duo , Quad やそれ以降に登場したCore i7シリーズなどは機械内部である程度の最適化を代行する。
それまで必要だった、「作業効率を向上させるため細々とした指示」を省くことにつながる。
例えば、Hardware prefetcher が強化されたことで、プリフェッチ用のコードを手動で追加しなくとも、先読みしてくれる。
ほかにも、命令の実行順序も機械内部で適切に並び替えて実行する仕組みを備わっている。少し雑に命令の実行順序を与えたとしても遅延が発生する割合が減る。

もちろん、Core2 Duo やそれ以降に登場した CPU においても「最適化済み」のプログラムを実行できる。しかし、「最適化されていない」と「最適化済み」との差が体感できない事例も増えている。

Pentium4 全盛時代にテッパンとされていた最適化手法が、それ以降に登場した CPU では足かせとなることもある。
むしろ、速度向上のための複雑な手法が速度低下をもたらす事例もある・・・

※ Pentium4 シリーズにおいても、終焉近い頃、機能強化されたモデルが発表された。しかし、同時期にCore2 Duo が登場したことにより役割を終えた。



何もかも最適化、効率化すべきか?
答えはノー。頻繁に使われ、時間がかかる部分に絞って最適化すれば、たいてい流れがスムーズになる。

仮に
・プログラミングの学習や
・趣味でのプログラミング
であれば積極的にチャレンジすべきである。
私的な観点で申せば、「最適化作業に要する時間」、言い換えれば、「効率を上げるための準備期間」と、「最適化によって短縮できる時間」を天秤に掛けて決めるのが賢明。

実戦の場、とくに複数人でひとつのアプリを開発する場合は闇雲に最適化すべきではない。
個人で理解している事項が、集団全体、作業に関わる全員に受け入れられないかもしれない。
また、一般的に最適化することは、独自色が濃くなる。
時代を超えて誰かが引き継ぐことを頭に浮かべてみよう。後任者にとっては読解不能になるかもしれない。もしくは、その時点とは異なる効率的な手法が編み出されている可能性もある。

複数で製作に携わる場合、目指すべきは、着実に動くこと。当ブログでは何度も述べてきたことだが、安全と速度は背反二律。新しいモノを取り入れたために、途中で止まってしまう、完走しない等に陥るのは避けたいものだ。

それでも、最適化による改良を施したいのであれば、上長 ( プロジェクトのリーダー )と相談した上での採否が重要・・・

・・・と今回はこの辺までの予定でしたがもう少々。・・・



2013年2月8日分の記事「プログラミングのA・B・C」で述べたように、プログラミング言語は多数ある。

速度を求めるとJava言語 や Basic言語は期待できない。

速度重視で有望な選択肢は機械語、つまりアセンブラ言語。
ただし、64ビットの Windows 環境ではアセンブラ言語を直接扱えない。
それに加え、よほど精通したヒトでない限り、ちょっとしたバグ、不具合を見つけにくい。
( プログラミング時に多かれ少なかれバグ混入は避けられない )

次の候補となるのは C/C++ 言語である。
アセンブラに比べ、32ビット、64ビット間の移植に関しても少し修正を加えるだけで済む。

長くなりましたので続きはまた後日・・・

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : プログラミング
ジャンル : コンピュータ

プログラミングのA・B・C

プログラミングというと難しく聞こえます。言っているほうも格好良さげ・・・



※ 猫ちゃん画像は下の方に載っています。

実際のところ、作業( 命令 ) 手順 を考えてコンピュータに指示しているだけのことです。

料理でも献立、レシピを練るときに順序を考えると思います。
花壇や農園を楽しむとすれば、お花や野菜をいつ植えるのかなどを考えますよね。
手順を決めることができれば、あとは条件判断の基準を与えることがわかれば難しくはないでしょう。

たとえば、運動会。11時にパン喰い競争を予定していたとしましょう。
突然雨が降ってくるかもしれません。
雨が降ってきたら、中止や休憩になりますよね。
これは条件を判断することです。

人間の視点で考えると続行可能か中止かを判断しやすいのです。
しかし、コンピュータ ( などの機械 ) は案外、生真面目。
「もし~~だったら~~しなさい」を厳密に、細かく教えてあげる必要があります。
人間も十人十色で、当然、教え方に上手・下手が出ます。

プログラムを組む、言い換えれば、全体の流れを考える際、設計者の腕を問われることになります。
実生活において、作業手順の流れが悪いと2・3時間で終わる作業が数日かかってしまう場面もあります。
いくら、作業員が熟練さんで素早くこなせるとしても、流れが悪く、どこかで詰まってしまうこともあります。

人間であれば、待っているのも芸がないので、一服休憩したり翌日に持ち越すことでしょう。
「ここの食堂混んでいるから、別の店に行こうぜ~」
といった具合に・・・
一方、( 先ほどの繰り返しになりますが ) 機械は生真面目
流れが詰まっていても、ず~っと待ち続けたり、懸命に繰り返し作業に挑みます。
誰かが「この作業はこの辺で・・・」や「待つのを止めて他の作業をしましょう」と言い出せば済むみます。が、機械にとっては無いのです。
ズバリ言えば「指示待ち」。
一見、「自発的な機械」というのがあります。「自分で考えてお掃除する」など何らかの作業を行ってくれます。
でも、機械の自発的な意思ではないのです。
さも「機械が自発的に動いている」かのように、人間が予めプログラミングして( 指示を与えて )あるのです。

人間ならば「頭が痛い、お腹が痛い」と不調をアピールします( できます ) が、機械は故障するまで指示・命令に従い動き続けます。

この先、「ノイマン型」「非ノイマン型」を綴りだすと長くなるので簡単に進めます・・・

しばしば、調理の「さ・し・す・せ・そ」と言います。
今回は「プログラミング言語に関するA・B・C」について綴ります。

毎度のことですが、これはあくまでもブログです。店長がてきと~に書いていると思って読んでください。本格的な学習は教科書なり専門の学校で!

図形や人間のモーション ( 手足の動き )で指示を出す方法も編み出されていますが、広く用いられているのはプログラミング言語を使って書くこと。
日本語、英語、フランス語といった言語があるように、コンピュータに指示を出すにも何かコトバが必要です。

人間の意志、命令をコンピュータに分かる状態に翻訳することをコンパイルといいます。
インタープリタ、コンパイラに関しては後日触れます。簡単に書くと、同時通訳するか、事前に全て翻訳しておくかの違いです。

スポーツ中継の勝利者インタビューなどでたまに通訳された場面を見て
「あの監督さん、2コト3コトしか喋っていないのに、通訳さんを通すと長いよなぁ・・・」
と思う場面があります。
これは捉え方にもよりますが、通訳さんの親切心なのでしょう。
文化の違いや、独特の言い回しを私たちにわかり易く伝えたいという熱心さかもしれません。
ただ単に不慣れで、ヘタな場合もあります・・・

同じ言語を使うヒト同志で何かを伝えたい時にはあまり意識することはありません。

地球上の各国ごとに異なる言語を持っているように、プログラミングを行う際もたくさんの言語の種類があります。

古くから利用者の多いプログラミング言語の代表格を3つ挙げてみます。わかり易いように A、B、C に分けると
A - アセンブラ言語
B - BASIC 言語
C - C/C++ 言語 もしくは COBOL 言語


結論だけ先に言ってしまうと
習得が簡単な順に並べ替えると B・C・A
実行時の速さから言えば、A・C・B

※ 現在、「ABC」という名称のプログラミング言語が存在します。
※ C 言語の原型となったB言語もあります。

まずはアセンブラ言語。アセンブリ言語とも言います。

利点としては通訳する手間が少ない分、プログラムを実行するときに速いこと。
デメリットは、暗号のような難解さのほかに、ハードウェアの構造を知らなければいけないこと。



コンピュータの命令は、かつてはマシン語と呼びましたが



この図のように16進数の羅列。これはコンピュータにとって母国語
一見、暗号のようです。これらは、数字ごとに意味を持っています。実際のところ、暗記するのは面倒。

そこで、少しわかりやすいように



加算 ( 足し算 ) なら ADD



乗算 ( かけ算 ) なら Multiply を略して MUL と命令を書くようにします。
これらはニーモニックコードと呼ばれています。




古くからPCと関わってきたヒトならば、多少はハードウェアの構造も知っていることでしょう。



しかし、Microsoft の Windows ( 3.1 や 95) が普及した後にPCに触れたヒトがハードをウェアを学ぼうとすれば、Pentium 登場前、Intel 386 、486くらいまで遡って学習する必要がありそうです。

Intel 80386 が登場したのは1985年の秋。その頃の書籍は今でも入手可能ですが、駆動可能のハードを一式揃えるのは困難となっています・・・

64ビット版の Windows が登場して以降、Microsoft は 開発ツールでアセンブラ言語を利用できないように制限をかけています。
※ 実際のところ、64ビット版でもアセンブラ言語を利用する手段はあります。

当初言われていたメリットのひとつである高速性が、後述する C/C++言語に劣ることも増えてきました。
プログラム、アルゴリズム ( 作業の仕組みや流れ ) を長時間練ることで高速さを発揮できそうです。しかし、練るための時間が膨大になりがちです。
何かを短縮したいハズが手間取ってしまうのでは、本末転倒なのかもしれません・・・


Basic 言語は、皆さんがお使いの PC に搭載されている Windows を開発・販売している Microsoft 社が提供してきました。
1964年に開発されたとされ、1970年代にMicrosoft が MS BASICを投入したのをきっかけに広まったと言われています。



アセンブラなどに対し高級言語と呼ばれています。
コンピュータ文化は英語圏を主導に発展してきました。
アセンブラに比べ、人間の言語 ( ただし英語 )に近い記述を用いてプログラムが書けるようになりました。



1980年代前半において、PC はメーカーごとに独自の作りになっていました。
Windows 95くらいから各メーカーPCの互換性が進みました・・・
言い換えれば、ハードウェアの共通性、互換性がほぼ無かったと言えます。
人間のコトバも地域によって方言があるように、PC メーカーごとに方言のような独自な命令が追加・拡張されました。



Basic 言語でも単純なテスト向けプログラムならば、どのメーカーのPCに打ち込んでも動きました。

しかし、当時主力な記憶装置だったカセットテープやフロッピーディスクにデータを書き出そうとすれば、各社のPC ごとに独自の( 異なった )命令を入力する必要がありました。



この問題に対処すべく、Microsoft と Ascii 社が中心となりハードウェア、命令をほぼ統一した MSX という規格がはじまりました。その後、MSX2、MSX2+、最終的には、MSX TurboR まで発展しました。各メーカーから、この規格に準じた PC が登場しました。

ただし、各メーカーはMSXではない独自規格の販売も続けていました。
MSX はホビー向け、業務向けにはキューハチっ、98という図式が成りたちそうに思えました。

各社独自規格のうち、ホビー分野でも X68000 や FM-Towns の方が高性能だったこともあり、MSX は 事実上の標準にはなれませんでした・・・

さてさて、Basic 言語の話に戻ります。
マイクロソフトの発展、拡大に繋がったこの言語、今でもサポートされています。
名称はVisual Basic となっています。
Excel のマクロ機能などを VBA と呼ぶことがあります。VBA は Visual Basic の機能削減版です。

Visual Basic は現在マイクロソフトのVisual Studio に関するページで配付されています。
もちろん無料!



入手するにはVisual Studio のダウンロードページ
を開き、中ほどににある
Visual Basic 2010 Express をクリックして日本語を選択、
今すぐインストールをクリックすると、インターネット経由でセットアップが可能です。

ネット上での配付はいつ打ち切られるかわかりません。
一度ディスクに焼きいつでも使えるようにするならば、
Visual Studio 2010 Express All-in-One ISO をダウンロードするのも良いでしょう。
ただし、こちらも利用開始から30日以内にインターネット経由で利用継続の認証手続きが必要になります。


C/C++ 言語と綴っていきますが、



1970年代前半に作られたのがC言語、それから10年くらい後、拡張形として C++言語が作られました。
C++言語は現在でも拡張、発展が行われています。事実上の標準といえます。



また、そこから派生したC#という言語もあります。
C#言語はマイクロソフト独自なもので、Windows の搭載されていないPCでは使えないこともあります。



性格としては、Java 言語に対抗するためのものでしょう。
C/C++ 言語に比べ実行時の速さを期待できません。
今回は省きます。


C/C++ 言語の利点としては Basic言語 に比べ高速なこと。入手しやすいこと、
先人達が残した多くのライブラリが活用できること。学習する際に関連書籍が豊富なこと。
標準規格がしっかりしているので、他のマシンに移植しやすいこと・・・

C/C++ 言語に関してはまた後日。

[ おまけ画像 ]



「店長の話、長いニャ~っ」



「おおっ、終わったぜ~」



「アニキー、遊んでくる~」



「何かあったら呼べよ~」



「すぐ行くからニャ~っ」



今のうちに、眠っておこう。

おやすみ~。

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : プログラミング
ジャンル : コンピュータ

三角関数はもっと遅い

除算が遅いの続きです。



きびしいツッコミが届くかもしれないので、一応、基礎を読んでから綴ります。
文系 なので 算数・理科の専門家ではないからね・・・

一般的に三角関数というと



サイン、コサイン、タンジェント。

これらの計算もPC ( パソコン )では遅い。

例のごとく、おおざっぱに速度を測ってみたところ、
加算、減算 ・・・ 1 ~ 2 クロック、
除算 ・・・ 20 ~ 48
sinやcos ・・・ 30 ~ 110


ちなみに、WindowsXPで32ビット動作させ、
FPU ( と呼ばれる演算の専門係 ) に任せてこんなに遅かった。


Windows Vista / 7などの64ビット動作させる場合は演算を CPU が自力で演算を行うことになる。
とはいっても最近は高速化が図られている。
FPUに演算を任せる場合に比べ1~2割 遅い程度であった。


「なんで三角関数が必要なの ? 」

このお話はRAMディスクは本当に速い ? -2に端を発しています。
倉庫の出し入れが高速になったのに、加工処理がモタモタしている ・・・ からここに至っています。



この図は再掲載です。

音声や動画の伸縮加工をする時には必ず、間引きや補間の問題と直面します。
補完処理を行う際、ある程度の精度の高い処置をしないと - - - 出来上がった作品はノイズだらけになるかもしれないのです。


細かいコトを書けば・・・
元の値に円周率を掛けたり、サイン関数を通し、最後に元の値で割ります。
この解を マイナス 1.0 ~ プラス 1.0 の 間に治めます。

除算が遅い件に関しては逆数を用いた掛け算に変更することで対処できそうだけど、三角関数に関しては有効な高速化手法が確立していないのだ!

ほかにも、音、振動、波などのデジタル変換をする時には pow , exp , log などの基本となる関数を演算する必要がある。
「音量・圧を変更したい」
「グラフィックイコライザーのような音質の変更をしてみたい」
などの目標でPC用のアプリ( ソフト ) を作ろうとすると必ずpow , exp , log など関数とも直面する。

これらの関数の演算も三角関数と同様、すご~く遅い!

高校の中ばから大学の初期で学ぶ「フーリエ」のお話が面白そうなのだけれど、長いのでまた後日。

今回はここまで。

猫でもわかる ?



今回も
さっぱりわかんニャい。



「後で鉄棒で遊びしますか!?」



出欠の点呼が済んだら、



チャイムが鳴るまでニェていよう・・・



お休みなさい。

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : コンピュータ
ジャンル : コンピュータ

エンディアン

「エンディアン」といっても、アメリカ大陸の先住民族ではありません。
今回は、並び方について考えてみます。





お気に入りの写真が




こんな感じや




こんな感じに化けてしまった経験があるヒトもいるのでは ?

最近はそういった体験は滅多にないけれど、Windows ( インテル ) 環境で画像を扱うソフトが出始めた頃、画像データで色素が入れ違ってしまうことがありました。

色データはしばしば、R,G,B ( Red , Green , Blue ) の要素で表される。

画像 ( 写真 ) データは無数の色情報データが方眼紙の網目のように集まっています。
この方眼紙の1マスにあたる部分をピクセルなどと呼びます。
各ピクセルにはR,G,Bの情報が詰まっています。

前回と同様、ビットをオセロゲームの白黒を用いて現してみます。




緑、赤、青のスイッチがあるとして、スイッチのビット ( オン、オフ ) を図で表すとこんな感じ。

話を単純にするため、色数を限定した図です。

PC ( パソコン ) やデジカメの中でもこのRGBを基にデータを構成していることが多いのです。
R,G,B ( 赤・緑・青 ) の 各要素が256段階で収納されます。

色の組み合わせは 256 × 256 × 256となりますから、16777216通り、約1680万色を表すことができます。

ここで、出てきた 256 という数8ビットつまり1バイトと一致します。

2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 = 256

例えば赤の強さ・濃さを256段階、同様に緑、青も数値化されているのです。

8ビットで3原色を表すと24ビットで足ります。
でも、実際には一つのピクセル情報は4バイトつまり32ビットで構成されています。
これは、Windows 95 以来最近まで使われている 32ビット CPU / OS に都合が良いのです。

CPU の立場から見て、
32ビットつまり4バイトがひとかたまりになっているデータのほうが出し入れし易いのです。

32ビットのうち24ビットで色情報を使います。ほか、8ビットにアルファ ( 透過度や 輝度)に関する情報が格納されます。

今回の本題、エンディアンのお話に移ります。
簡単に言えば
並べ方の問題です。

たとえば、8個の製品を4つ1組で箱に詰めるとしましょう。

作業員 A さんは取り出すときのことを考えて
「4、3、2、1」「8、7、6、5」・・・と箱詰めしました。


また、作業員 B さんは単純に
「1、2、3、4」「5、6、7、8」・・・と箱詰めしました。


パソコン や デジカメの中でもこの並べ方の違いが 問題になります。
「4、3、2、1」「8、7、6、5」・・・と逆順に並べた方をリトルエンディアン、
「1、2、3、4」「5、6、7、8」・・・と単純に格納されるのをビッグエンディアンと呼びます。


もちろん、人間にとって直観的にわかりやすいのはビッグエンディアンです。

8月13日の中半で触れた、「インテル」のCPUは伝統的に、リトルエンディアン方式でデータを格納する習慣があります。
リトルエンディアンはコンピュータにとって処理しやすい方式と言われています。

そこで、冒頭で取り上げた画像情報を リトルエンディアン、ビッグエンディアンで、画像データのピクセル ( 色 ) の情報を並べると



こんな感じになります。

冒頭で取り上げた、残念な画像。それらの画像は、情報データの格納・取り出しの順番が正しくないからなのだ!

数年前までのMac ではインテル以外のCPU / MPU が使われていて、データの並びはビッグエンディアンが採用されていたこともあります。

このデータの並び順に気を配らないでアプリ ( ソフトウェア ) を組むと大変なことになります。

ミスを防ぐためには1バイト( 8ビット) 単位で読み書きすれば問題が生じることを防げるのですが、手間は4倍以上掛かります。つまり、処理速度は遅くなります。
今回はここまで。

猫でもわかる ?



今回も
さっぱりわかんニャい。



急に眠気が覚めたようですね・・・



視線の先にはアブラゼミ。



そ~っと近づいて、



あ~あ、逃げられた・・・

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : コンピュータ
ジャンル : コンピュータ

遅くない除算



前回、除算が遅いで、割り算がとても遅いということについて触れました。

特別な場合を除いては遅いです。
今回は
遅くない割り算についてのお話。

具体的には
ローテート、シフトと呼ばれる手法を用います。

整数の2、4、8、16、32・・・といった、2の乗数となる数で割り算するときは以外と速い。
もちろん、掛け算に用いることも可能。

これを理解するには2進数やビットとバイトについて理解してないと辛い。

まず、ビットって何について触れていきます。



しばしば、新しい PC ( パソコン ) を導入する際、カタログなどを見て比べます。

仕様・性能一覧などをよく見ると、
32ビットとか64ビットとか書いてあります。



この「△△ビット」について把握していないヒトも多いのでは ?

自動車のエンジンであれば排気量が大きいほど、坂道とかに強そうです。
燃費は悪いのはおいといて。

「きっと大きい数字の方が強そう!」
というようなイメージで選択しがちです。

もちろん、デザインやお手ごろな価格で決定するのもアリです。

ビットについて簡単に言うと、
電気が流れている ( = ON) 、流れていない ( = OFF ) のどちらかの状態。


ビットが8つ集まるとバイトと呼ばれます。
電子機器を使っていると、~バイトという言葉がよく出てきます。

・ON の状態 を 1
・OFF の状態 を 0
と考えます。


旗の上げ下げにも例えられます。
「フラグが立っている」という表現であれば、
ON の状態 を指します。つまり 1です。

0 = 00000000
1 = 00000001
2 = 00000010
3 = 00000011

私たちが普段用いる10進数を2進数で表記するとこうなります。


電気や数で例えると、ちょっとイメージし辛い。

そこで、電流のオン、オフをオセロゲームの白黒で置き換えてみます。



オセロの石が4個ある場合、白黒の組み合わせが16パターンできます。
- - - 白黒の2通りを4回掛け算すると16通りとなります。


2 × 2 × 2 × 2 = 16

各パターンに番号をふっていきます。
これで数を扱う場合、0 ~ 15 の16通りを表すことができます。
私たちが一般生活する中で始めの数は1ですが、数を考える場合 0 から考えます。


よく言われる 32ビットや64ビット。少し見えてきたでしょうか?

32ビットならば、オセロゲームの石が32個並んでいるのと同じです。
白黒の組み合わせパターンは4294967296通りできます。約43億


実際には、会計ソフトなどでも赤字 ( マイナス )も扱えないと不便です。
よって、扱える範囲はマイナス 2147483648 ~ プラス 2147483647 の約43億となります。

そこで例題。話を単純化するため、マイナスの範囲を省きます。

10進数で 5 , 10 , 15 これをを 2進数で表すと
5 = 00000101
10 = 00001010
20 = 00010100




ピンク色で網掛けしてある部分に注目 !
この図から何か、ひらめいたでしょう。


2倍は左方向に1マスずつずらす・・・
逆に、半分にする場合は右方向に1マスずらす・・・

この移動 ( ずらすこと ) をシフトもしくはローテートと呼びます。

40 割る 8 ならば、右側3つシフトすればOKとなります。
「 3ビット右シフトする」なんて言えるとカッコいいかも!

前回と同じように速度を測ってみたところ、
加算、減算 ・・・ 1 ~ 2 クロック、
乗算 ・・・ 1 ~ 3
除算 ・・・ 20 ~ 48
シフト ・・・ 1 ~ 4

となりました。

除算に比べて、シフト操作は 7倍 ~ 10 倍は効率的。

掛け算はもともと遅くないのであまり高速化は見込めない。
けれども、
2、4、8、16、32・・・で割り算するならば、
ビットのシフトを用いることで、遅さを軽減させることが可能です。


あくまでも、今回は正 ( プラス ) の値に限定したお話です。 
詳しいこと書き出すと 負 ( マイナス ) の 演算に関しても書きたいところです。
が、話が複雑になりそうなので後日。


今回はここまで。

猫でもわかる ?



ニェむい。



そんニャことより
木登りしようぜぇ。



木の上は涼しい ?



鉄棒ではなのだから、枝が折れないようにゆっくり登ってね・・・

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : コンピュータ
ジャンル : コンピュータ

除算が遅い



夏の楽しみといえばスイカ。

スイカを分ける際に、
「スイカを 7割る4 ください。」
って言われると戸惑います。




逆に
「4等分したスイカを7つ ください。」
って頼まれると解かりやすい。


どちらも同じ意味ですが・・・



今回は「速さ」を考えるのではなく、
「なぜ遅い」「モタモタしている」を考えてみます。

RAMディスクは本当に速い ? -2の中半で触れた、
「『音声データの加工処理に手間取る』のはナゼ ?」が気になるヒトもいるのでは !?!?

Mac 、 Windows に限らず、私たち一般のヒトがPC ( パソコン ) を使う場合、
「インテル入ってる」

ってことになる。



パソコンの心臓部には中央演算処理装置( 略してCPU ) と呼ばれる装置が入っていて、
これを製造・販売している企業がインテル。


インテルのCPU ( プロセッサ ) は伝統的というか、クセというか、割り算が苦手。
さすがに、機械だから答えを間違うことはほぼ無いけれど、遅い。


(* 1) かつて、ごく稀に誤算する欠陥を持った製品がそのまま流通したことがあります。

CPUの出発点は計算機に毛の生えたもの。
現在でもそれは変わらず、CPUが担っていることはおおまかに
・数値を出す、入れる ( しまう )
・演算
・条件判断、分岐


3年ほど前のインテル製CPUを搭載した PC で
演算の速度を確かめてみたところ、
加算、減算 ・・・ 1 ~ 2 クロック、
乗算 ・・・ 1 ~ 3
除算 ・・・ 20 ~ 48


割り算を一回行う間に、掛け算や引き算なら、何度も行える・・・



冒頭に挙げたスイカの例で考えてみましょう。

人間のアタマで考える場合、
「4等分したスイカを7」つまり
「4分の1 掛ける 7」のほうがわかり易い。つまり、てっとり速い。


演算装置であるCPUにとっても、割り算より掛け算の命令を出したほうがスムーズ。

同じ意味の計算をさせるのであれば、割り算の指示を与えるのではなく、
逆数を掛けてあげるように人間が指示を与えれば、速く処理できる。
7 ÷ 4 ではなく
7 × 0.25


この手法は
分母が定数であることと同時に、割り切れる場合 - - - つまり分母が4、5、8など - - - に限られる。

分母が計算の度に異なるのでは、その都度逆数を計算する手間が増える。
割り切れない数、例えば 分母が3、6、7などの場合、演算結果に誤差が出るので好ましくない!

動画や音声データを加工する際、綺麗な出来上がりを期待するヒトが多いハズ。
その場合は厳密さが重要。


キッチリ一致した数値が算出できない ( 多少の誤差 ) も許容すべきだが、できれるだけ正解に近い演算結果を求めたいのだ!

ちなみに、
「スイカを7等分に切れ!」とか命令されても難しい・・・


まとめると
「適切な指示・命令を出すことが重要。」
「不適切な指示・命令は待たされる、遅くなる原因。」


「あ~、店長が勉強してる!」で載せた書籍やMicrosoftが配布してた開発者向け資料によると、

Windows Vista / 7 以降 で アプリ ( ソフトウェア ) を作成する場合、
FPU や MMX といったWindowsXP ( 32ビット ) 時代に普通に使えた高速化手法を利用しない規約
になっている。

演算処理は得意な FPU に任せ、演算結果の待ち時間を使って CPU は他の処理をこなすのが理想的。しかし、現在は、CPU が 自力で演算することになっている。近い将来、グラフィクスを担当する半導体が細かい演算を担うようになると言われています。

今回はここまで。

猫でもわかる ?



今回も
さっぱりわかんニャい。



そんニャことより



ぼうぜぇ。



・・・ ケガしないようにね ・・・

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : コンピュータ
ジャンル : コンピュータ

検索サイトからお越しの方へ
検索サイトからお越しの方は、ブラウザのアドレス欄vitalaboloveおよび、fc2.comが含まれているかご確認ください。
含まれていない場合、偽サイトを閲覧なされている可能性があります。

偽サイトは、当ブログの文字部分や画像部分が有害サイトへのバナーと置き換わっているようです。
プロフィール

Author:Vitalabolove
ご訪問ありがとうございます。
店長を任されておりますVitalaboloveです。

コメントはお気軽に。
今のところリンクフリーですが、あと数日でとりやめます。

画像データ、文言の引用は事前連絡くださるようお願い申し上げます。事前連絡の際は、左下、メールフォームを経由をご利用ください。

最新記事
カレンダー
01 | 2017/02 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 - - - -
カテゴリ
ランキング
いつも応援いただきありがとうございました。ただいま休養中につきランキングへ参加していません・・・

フリーエリア
内緒話などはおきてがみをご利用ください。
月別アーカイブ
メールフォーム
掲載された記事について、ご不明な点はここからお問い合わせください

名前:
メール:
件名:
本文:

最新コメント
最新トラックバック
スパムと思われるトラックバックは削除しました
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。