コンパイラ、型、演算子、メモリ、精度

2024.03.26

良いコード

コードを書くときは以下のことを考慮する。

  • 正しさ・・・コードが意図した通りに動くか。
  • デザイン・・・コードが効率的か。同じコードが繰り返されていないかなど。コメントが記載されているか。
  • スタイル・・・視覚的に読みやすいか。

コマンドターミナル

コマンドターミナル・・・入力された内容をコンピューターに送信し、ハードウェアで実行するためのインタフェース。入力内容はコンピュータに送信、ハードウェアで実行。

コンピュータとは

情報を処理し、データを記憶・取得・操作するための電子機器の総称。プログラムによって指示された処理を実行する(数値計算とか)。具体的には中央処理装置(CPU)、メモリ(RAM)、ストレージ(ハードディスクやSSD)、入力装置(キーボード、マウスなど)、出力装置(ディスプレイ、プリンタなど)から構成

ハードウェアとは

ハードウェアとは、物理的な部品や装置。メモリチップ、ハードディスクなど。

コンパイル

コンパイラ・・・ソースコードをマシーンコードに変換するために設計されたプログラム。

input -> [] -> output

↓

source code -> [] -> machine code

↓

人間が書くコード -> コンパイラ -> コンピュータが理解するバイナリコード。

↓

C -> コンパイラ -> 0と1

hello.cのファイルを実行するためにmake(コンパイル)するとhello*というファイルが作成される。

hello.cはソースコードになり、hello*はマシーンコードになる(バイナリコード)。実行されるのはhello*ファイル。

関数

Function・・・ミニプログラム。動作。アルゴリズムをプログラム化したもの。アルゴリズムをソフトウェアで実装したもの。

下記だとgreetの部分。

def greet
  puts "Hello"
end

greet

関数は出力だけでなく、戻り値を返すことができる。値を変数に格納、再利用が可能になる。

def greet
  return "Hello"
end

# メソッドの戻り値を変数に格納
message = greet

# 格納された値を出力
puts message
arguments -> functions -> return value
引数 -> 関数 -> 戻り値(変数)
値がどこかに保存されている

引数

Arguments・・・関数への入力のこと。パラメータ。(name)の部分。

def greet(name)
  puts "Hello, #{name}!"
end

name = "Alice"
greet(name)

ライブラリ・・・誰かが書いたコードのこと。特定の目的のために機能や機能のセットを提供するために書かれている。

メイン、ヘッダファイル

.hなどで終わるもの、以下だとstdio.h。C言語から自動的に得られる機能よりも多くの機能にアクセスできるようにするためのもの。printfが使えるようになっている。

#include <stdio.h>

int main() {
  printf("Hello");
}

データ型・・・色々な型がある。変数を値に格納するだけでなく、どの型の値を変数に格納したいのかをコンピュータに指示できる。

各データ型は特定のビット数を持っている。

C int -> 32ビット、long -> 64ビット、double -> 64ビット
ビット数の違いとメモリ消費

整数型の int は32ビット。2の32乗(約40億)通りの異なる値を表現できる。long だと64ビットなので2の64乗通りの値を表現できる。ビット数が大きくなるほど表現できる範囲はより多くの異なる値を表現できたり、より高い精度で数値を表現可能。しかしビット数が大きくなるほどメモリ消費量も多くなる。

演算子、制限、抽象化

operator・・・演算子。演算子とは特定の計算を記号を使って表現したもの。算術演算子、比較演算子、論理演算子、ビット演算子、代入演算子等がある。

condition(条件)・・・特定の条件が真であるかをチェックする。条件式には比較演算子や論理演算子が使われる。

branching(分岐)・・・条件に基づいて特定のコードブロックを実行するための構造。if,else,else if等が使われる。

loops(ループ)・・・特定の条件が満たされる間、同じコードブロックを繰り返し実行するための構造。for,while等がある。

abstraction(抽象化)・・・複雑な細部を単純化する問題解決の原則。関数や構造体、列挙型、ポインタという手法がある。

スコープ

スコープ・・・変数のスコープとは、その変数が含まれる(使用出来る)コード範囲のこと。ローカルスコープやグローバルスコープ、ブロックスコープがある。

# ローカルスコープの例
def my_method
  x = 10  # ローカル変数xの定義
  puts x  # xはこのメソッド内でのみ使用可能
end

my_method  # => 10
puts x    # エラー!xはmy_methodの外部からはアクセスできない

メモリ、精度

RAM・・・Ramdom Access Memoryの略。プログラムが実行されている間、そのプログラムやデータを一時的に保存する場所。

近似値・・・メモリは有限。無制限に値を数えられるわけではない。コンピュータはどこかで値を近似する必要がある。数値計算の正確さが必要な場合には注意が必要になる。

0.1 = 1 / 10 -> これは10進数で表したもの。

これを32ビットの浮動小数点数で表すと
0.100000001490116119384765625 = 1 / 10

32ビットの浮動小数点数ではこの値を厳密に表現することはできない。なのでコンピュータは値を近似を行う。

整数オーバーフロー(Integer Overflow)・・・コンピューターの整数型のデータが許容範囲を超えて増加し、その結果、不正確な結果や予期しない動作が発生する現象。

32ビットの符号付き(負も表現)整数型だと-2,147,483,648から2,147,483,647までの範囲の整数を表現することができる。この範囲外の値が計算されると、整数オーバーフローが発生する。