[Flutter]定数final/constの違いまとめとコンパイルとはなんぞや(編譯是什麼)
コンパイルとは(電腦編譯是什麼)
- コード文(人間語/ソースコード)をオブジェクトコード(コンピュータ語)に翻訳すること
いつも書いている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
以上です。間違えが見つかり次第、或いは知識がアップデートされ次第改訂していきます。🙏
中国語でもちょっとずつ書いてみました。謝謝你的瀏覽
Discussion