元底辺エンジニアが語る、エンジニアとしての生き様、そしてこれからの生き方

生き様170. プログラマはメモリの意識が必要か?

»

Windowsの設定全部飛んだ人の話

Windowsのユーザーフォルダが太ってきたので、大容量のディスクへの引っ越しを行いました。
SSDを使用している場合は、書き込み頻度が減り寿命の増加にも繋がります。

その結果、ユーザー設定がすべて吹き飛びました。
デスクトップの設定も、ブラウザをはじめとしたアプリの設定も、全滅です。
なんてことだっ!!

参考にしたサイトには「そのままコピーできる」風に書いてあったのに……。
アレか?MSアカウントで設定し直したのがアカンかったんかっ!!??

ブックマーク設定やパスワード設定は、Chromeに同期していたので難を逃れました。
この記事は、毎度Firefoxで書いています。ほんの致命傷でした。


メモリについて考える

たまに起こる議論に【メモリ管理】の話題があります。
曰く「メモリの意識ができない様ではプログラマとは言えない」的な。
両論がかなりヒートアップする印象を受けます。

白栁は、これについて「その通りだ」と思う部分もあります。
ですが、大半は最新技術についていけない古株のマウントと感じます。
最新の技術や考え方についていかないからそうやって対抗するのだと。

今回は、プログラミングにおいて、メモリを意識する必要の有無について考えます。
歴史的な背景や、今でも意識する必要がある部分についてお話していきます。


メモリとは

そもそも、メモリってなんでしょう?
ITパスポート的な解説をするなら【主記憶装置】となります。
CPU(中央演算装置)で計算する為の情報を記憶しておく部分です。

広義では「メモリ」は記憶装置全体を指します。
一般的なメモリも、HDDもSSDも全部「メモリ」です。
ですが今回は一般的な「主記憶装置」としてのメモリを指します。

主記憶装置の主な特徴は

  • アクセスがはやい
  • データの永続性はない
  • 容量当たりの価格が高い

となります。

この辺りの詳しい説明は、ITパスポートや基本情報のテキストに任せます。
大事なのは、コンピュータにとってHDDDは副次的な記憶装置でしかないことです。
つまり、CPUが参照できるのはメモリの情報なのだということなのです。

余談ですが、最近のCPUの多くは内部にキャッシュメモリを搭載しています。
これは、メモリよりも高速ですが、主記憶装置としては扱われないそうです。
CPUの機能の一部として扱われるのだそうです。
白栁が勉強していた20余年前には無かった概念でした。


「メモリ」に関する2つの【管理】

実は、1口に【メモリ管理】といっても2つの意味を持ちます。
これは使っている人もあまり意識できていないことかもしれません。
ですが改めて考えてみると明確に異なります。

1つ目は「メモリ容量」に対する管理です。
全体としてどれぐらいのメモリを扱うことができるのか。
その容量の限界を超えることがないのか?という観点です。

2つ目は「メモリアドレス」に対する管理です。
所謂「ポインタ」に類される、アドレスを扱う機能について。
どこのデータにアクセスしているか?という観点です。

これらはそれぞれ、意識するべきケースが異なります。

「メモリ容量」は、アプリケーションの動作を考える際に意識します。
推奨スペックや多重起動、他のアプリケーションとの相互影響など。
ユースケースや、実行環境に紐付いて考える内容ということです。

「メモリアドレス」は、アプリケーションの製造時に強く意識します。
実行時にどの様なデータを扱うか、どこからどこまでのデータを切り出すのか。
実体なのか、複製なのか、一時的なものなのかetc…

考えるだけで頭が痛くなってくる内容です。
数多のC言語ニュービーを叩きのめしへし折ってきた「ポインタ」ですね!


【メモリ管理】は必須か?

2つに分類した【メモリ管理】。
ですが、現代のシステム開発/プログラミング環境において意識する必要はありません
どっちも、です。

その理由は単純明白です。
「現代的な開発言語でメモリ管理がサポートされていない」からです。
むしろ、メモリに関する意識はさせないように言語が進化しています。
現代の高速なCPUと豊富なメモリ領域では容量の意識の必要もないでしょう。

コンピューターの黎明期において、もっとメモリは高く貴重なものでした。
調べてみたら、1996年に発売されたPC-98V13の初期メモリは16MBだと。
1980年に発売された汎用機となると、キロバイトの単位でした。

その限られた範囲内で何万件、何十万件というデータを読み込んだり計算をしたり書き込んだりと様々な演算をしているわけです。
ですから、当時はメモリを管理することが必要で、メモリの意識ができないことは恥ずかしいことでした。
「メモリを節約する」は重要な技術だったのです。

当時の開発環境も当然このメモリの少なさの影響を受けています。
1行の文字数の上限や、1つのアプリケーションに書けるコードの行数にも制限がありました。
変数名を短くしたり、使い回すのも当時必要とされた技術です。

未だに変数名の短さに拘ったり、使い回す利便性を大上段に語る人は、この時代に生まれた文化を引きずっているのでしょう。
ですが、彼らは新しいプログラミング文化に対応できていない、ということを自ら喧伝してるわけです。


【メモリ管理】が必要な人たち

最初に「『その通りだ』と思う部分もある」と書きました。
前項で「メモリ管理は必要ない」とも書きました。
どういうことやねん!ってなりますよね。

実際の所「【メモリ管理】が必要」となる人々も居ます。
現代でも。

1つの例が、未だ現役な汎用機や古いPCを扱う業務をしている人たちです。
これは仕方がありません。
そういう時代の作法で開発をしなければいけないからです。

もう1つの例が、スマホアプリやIoTに関わる人たちです。
昨今のスマホはメモリも潤沢ですが、PCに比べると制限が厳しいでしょう。
もっと小型のIoT機器になると、処理性能も容量もより制限されます。
そういった中で開発する為には、当然メモリ管理が必要です。

他にも、ゲーム開発で1フレーム内での処理量との戦いや、通信で低レイヤーの部分を扱うケースなど、メモリ管理を必要とされる場面は多々あります。
ですから、全く必要がないとは言いません。
できないより、できた方が仕事の幅は広がります。
もしくは、なにかのトラブルでメモリ管理の知識が役立つこともあります。
ですが、必須とまではいかないだろう、というのが白栁の考えです。

どちらにせよ、できることでマウント取りに行くのは恥ずかしいことですよね。

以上!

Comment(6)

コメント

感想

組み込み系でいるんじゃないでしょうか?

お年寄り

メモリ管理=メモリアドレスの管理という先入観があるのではないでしょうか。
他にも管理する要素はあると思います。
下記はメモリ使用量に関する例ですが、ガーベージコレクションを円滑に行うための設計の工夫などもあるかと思います。

(1)
1万~10万個くらいのデータやオブジェクトインスタンスをメモリ上で扱う必要があるときは、メモリが枯渇したりスラッシングが起きないように設計を工夫する必要があります。
1要素=1MBだと、1万個で10GB近くになったりするので、物理メモリが圧迫されます。

実際に開発されることはなかったですが、一つのフォルダに数億個のファイルが格納されるシステムで、ファイル管理プログラムを作ろうという話があり、メモリ使用量を抑える設計を考えたことがあります。

(2)
フリーのテキストエディタの多くは、編集対象をメモリ上に展開する設計になっているらしく、大きなファイルや行数の多いテキストを開くのに失敗することがあります。
秀丸エディタなどは数十億行のテキストを編集できる設計になっており、実際プリンタへ出力される巨大なPostScriptデータを開くのに役立ちました。
メモリ管理がすぐれているのだと思います。

匿名

組み込み屋です。
メモリを管理しない、などというとぶん殴られます^^;

冗談はさておき、組み込み屋でメモリというとROM(ざっくりプログラムの格納領域)と
RAM(ざっくりプログラムの実行領域)でしょう。

組み込み機器のSoC、マイコンシステムではROM/RAMは数キロ~数十メガくらいしかありません。
SoCが積んでいるROM/RAMの量もいろいろありますが、
容量の大きいものは値段が高くなります。
1個当たり数百円程度の違いであっても大量生産例えば一万個でも数百万から
コストが違ってきます。

なので家電をはじめとする組み込み機器では、
プログラムサイズが小さくなるように、メモリ使用量が小さくなるように腐心し、
どこのROMアドレスにどのプログラムコードを置くか考え、
いつどのコードがどれだけRAMを使っているかをある程度意識しておく必要があります。
(ROMもRAMもじゃぶじゃぶ・・・ならいいんですけど)

コメントを投稿する