スパゲティプログラム
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/11/04 02:40 UTC 版)
しかたなくスパゲティプログラムにしてしまった事例
この節には独自研究が含まれているおそれがあります。 |
現在ではスパゲティプログラムは絶対に書いてはいけないとされている。現在ではメモリ量はふんだんにあり、可読性が重要で、メンテナンスやコードの改変が容易で、システムが安定して動作することが重要だということが理解されているからである。
だが特に1980年代ころまでの、まだ構造化されていないプログラミング言語が横行していていた時代で、構造化前のプログラミング言語しか動かないマシンで限られたメモリにプログラムをおさめなければならなかった状況下では、しかたなくGoto文が使われることがあった。数バイトでも削減したいような、追い詰められた開発環境では、無理やり詰め込むため、現代から見れば「あり得ない」「許容されない」ような、粗野なプログラミング手法ですら使われた。
一部のシステムでは、CPUのバグを突くようなトリッキーなプログラミング手法がしかたなく選ばれていたものがあり、ソースコードやアセンブリコードを普通の読み方で読んだだけではとても理解できないようなジャンプが起き、まさにプログラムのスパゲティ化を招いた。例えばファミコンやApple IIなどのゲームにおいては、65C02の仕様書に記載されていない未定義命令(Undocumented instruction、本来使ってはいけない)を利用することが常套化していた。特にファミコン後期においては、競合機や次世代機の登場によってファミコンのゲームに対する性能への要求が強くなり、また視覚的キャラクタに割り当てられるデータ量・メモリ量の増大によってプログラムのほうに割り当てられるバイト数が減ってしまい、本来してはいけないはずのコーディング手法が、ますます横行するようになってしまった。たとえばファミコン用ゲーム『ファイナルファンタジーIII』の飛行艇の高速移動のプログラミングに関しては、既に退職した当時のメインプログラマのナーシャ・ジベリ以外誰も理解できず、そのため当時の人気ゲームでありながら後継機への移植が難航したという逸話がある。[要出典]
注釈
- ^ 1命令や1行だけを実行させ、命令ごとあるいは行ごとの状態が正常かどうかひとつひとつ確認すること。
- ^ 大規模プロジェクトでは命名規則がコーディング規約で整備されていることが多いが、その命名規則に従っていない一貫性のないコードは可読性の低いプログラムになりやすい。そもそも命名規則自体が現代的なコーディングスタイルに則しておらず不適切であることもある。
- ^ 1つの変数に複数の意味・役割を持たせて使いまわしすると、変数名も不適切・あいまいになりやすく、コードの可読性やメンテナンス性が低下する。
- ^ ただしCには大域ジャンプを可能とする
setjmp()
とlongjmp()
も用意されていた。 - ^ C++やObject Pascalにはデストラクタがあり、C#やJavaではusing文[4]やtry-finally文やtry-with-resources文[5]が使えるため、確実なリソース解放のためにgoto文やラベル付きbreak文などを使用する必要はない。
- ^ 「寝たバグを起こす」「寝ているバグを起こす」とも形容される。
出典
- ^ スパゲッティコード(スパゲッティプログラム)とは - 意味をわかりやすく - IT用語辞典 e-Words
- ^ スパゲッティコードの意味とは?具体例や対策について詳しく解説
- ^ ジャンプ ステートメント - break、continue、return、goto - C# | Microsoft Learn
- ^ using ステートメント - 破棄可能なオブジェクトが正しく使用されるようにする - C# | Microsoft Learn
- ^ try-with-resources 文 | Java SE 7 Documentation | Oracle
- ^ アンチパターンってなに? | Think IT(シンクイット)
- ^ 初期化 - cppreference.com
- ^ memcpy, memcpy_s - cppreference.com
- ^ How to: Define move constructors and move assignment operators (C++) | Microsoft Learn
- ^ Opinion -- 川俣 晶:ソフト開発を成功させる1つの方法 - @IT
- ^ Lecture 4: IPC & Threads / CSE 120: Principles of Operating Systems | Alex C. Snoeren, カリフォルニア大学サンディエゴ校
- ^ JEP 428: javaマルチスレッドプログラミングを容易にする構造化並行性
- ^ Windows with C++ - The Pursuit of Efficient and Composable Asynchronous Systems | Microsoft Learn
- ^ まずコードの可読性を最適化しよう | POSTD
- 1 スパゲティプログラムとは
- 2 スパゲティプログラムの概要
- 3 概要
- 4 スパゲティプログラムの要因
- 5 しかたなくスパゲティプログラムにしてしまった事例
- 6 スパゲティプログラムが許容、放置された具体例
- 7 スパゲティプログラムを修正する方法
- 8 脚注
固有名詞の分類
プログラミング言語の構文 |
ハンガリアン記法 Lint スパゲティプログラム 配列 字下げスタイル |
- スパゲティプログラムのページへのリンク