📚

[Flutter]定数final/constの違いまとめとコンパイルとはなんぞや(編譯是什麼)

2022/08/27に公開

コンパイルとは(電腦編譯是什麼)

  • コード文(人間語/ソースコード)をオブジェクトコード(コンピュータ語)に翻訳すること

いつも書いているvoid()的なやつはソースコードで、ソースコード(人間語)→翻訳(コンパイル)→オブジェクトコード(コンピュータ語)の順番で流れる。

オブジェクトコードのところでプログラムを実行することになる。

コードをコンピュータの分かる言語にしないとあかん。ってこと

コンピュータ上で実行される命令はオブジェクトコード(機械語)ですが、人間には意味のわからない数字の羅列であり、機械語でプログラムを作成するのは困難です。逆を言えば、もちろんコンピュータも人間の言葉はわかりません。 コンパイルは通常、ソフトウェアを開発する上で必要な作業です。ソースコードはテキスト形式であるため、人間は読んで理解することができます。しかし、オブジェクトコードはコンピュータが理解できる2進数もしくはそれに準じた形式(バイナリ)になっているため、人間は普通理解できません。そのため、コンパイラを用いてソースコードを解析し変換したり、必要があれば外部のライブラリやオブジェクトコードを使って変換作業を行いコンピュータにソースコードを伝える必要があるのです。
参考記事

また、「プログラムを実行する」ということはほぼ「コンパイル(翻訳)」することに近い認識。

ここまでの前提を踏まえてfinalとconstの違いについて考える。

定数final/const の違い(定數fianl/const 的差異是什麼))

同じ定数でも違いがある。その違いは

定数の値が決まるタイミング

  • const:コンパイルに値を定義
  • final:コンパイルに値を定義

constはコンパイル(コードを実行)時に明確な値が決まっている時しか使えない。
「別の変数」(別の変数で参照)や「DateTimeメソッド」などを代入していると「コンパイルエラー」になる。
finalはそれが許される(参照値なども使える)

要は
実行前から明確な値を設置しているならconstが使えるのに対し、実行時に初めて参照値などが入ってくる(一回きりの再代入って呼んでる)ができるのがfinal。

考察

色などの、定数として明確な値を設置して他変数の参照などもしない定数値const定数として定義し、
クラスのインスタンスなど、参照値を許すけど外部からの再代入を許さない定数値final定数として定義するのがいいのかと思ふ。

sample code

//const
const total = 1 + 2;
const time = DateTime.now(); // <- エラー

//final
var num1 = 1;
var num2 = 2;
final total = num1 + num2; //ok
final time = DateTime.now(); //ok


以上です。間違えが見つかり次第、或いは知識がアップデートされ次第改訂していきます。🙏
中国語でもちょっとずつ書いてみました。謝謝你的瀏覽

GitHubで編集を提案

Discussion