プログラミング言語-5 name、binding、scopes
TOY言語の例
あぶらいんさつぶつlips-like->関数言語
言語がどのように生成され拡張されたのか、bnfでどのように表現されているのか.
関数言語
関数(function)->ドメインの定義-関数-値ドメインマッピング
toyという言語は用語で構成されている.
演算のターゲットはここで整数しかありません.
FUNは言語の関数集合である.minus,ifには2つの関数が存在する
Zノイズは整数の集合を意味する.ZxZ to Z
用語は3種類ある.
t1: variable
t2: constant
t3: (minus t1 t2) (IF t1 t2)
M((If 1 2)(M 3 4)) -> 3
2- (-1)
言語の文法を考えてみましょう.syntaxstart symbol: TOY
<TOY> -> <term>
<term>-><var>|<term>
| (minus <term><term>)
| (IF <term> <term>)
<var>-> <char>{<char>|<digits>}
<char>->a|b|c...
<digits>-> 0|1|2|3...
<const>->[-]<digits>{digits}
%3、%sum、%(if 1 2)などはsematics(意味)である.
5.1 intro
命令式言語(命令型言語)、主流言語はフォンノイマン構造に基づいている.メモリ内の命令、データはcpuに昇格して演算される.
変数についてお話しします.
5.2 Names
そのプログラムに特殊な意味を持つ名前はkeywordです.
変数名、関数名.
case sensitive->大文字と小文字を区別しますか?
word->keywordの特殊な意味を保持する文字列
5.3 variables
機械言語では変数はアドレスであり,ヘレベルでは変数を名前で指すことができる.
225p
変数の6つの属性
start symbol: TOY
<TOY> -> <term>
<term>-><var>|<term>
| (minus <term><term>)
| (IF <term> <term>)
<var>-> <char>{<char>|<digits>}
<char>->a|b|c...
<digits>-> 0|1|2|3...
<const>->[-]<digits>{digits}
命令式言語(命令型言語)、主流言語はフォンノイマン構造に基づいている.メモリ内の命令、データはcpuに昇格して演算される.
変数についてお話しします.
5.2 Names
そのプログラムに特殊な意味を持つ名前はkeywordです.
変数名、関数名.
case sensitive->大文字と小文字を区別しますか?
word->keywordの特殊な意味を保持する文字列
5.3 variables
機械言語では変数はアドレスであり,ヘレベルでは変数を名前で指すことができる.
225p
変数の6つの属性
機械言語では変数はアドレスであり,ヘレベルでは変数を名前で指すことができる.
225p
変数の6つの属性
name
address //l-value
value //r-value
タイプ//6章
ライフサイクル//変数メモリの割り当て時間
scope//変数はプログラム内の任意の場所でアクセスできます
5.3.2 address
変数のアドレスをl-valueと呼びます.変数の値をr-valueと呼びます.
(left-right)
エイリアス(エイリアス)->複数の名前でアドレスにアクセス
3つのケース-26 p
p=q
ポインタ変数は別名で、2つの変数は同じアドレスを指します.
5.4 binding
Bingとは?entity、属性を変数にマージします.
sumは変数のintタイプ、sumは100です.
この属性が結合する時点はbinding timeです
2種類
コンパイル
5.4.1 binding of attributes to variables
static binding vs dynamic binding
コンパイル時バインド-実行時バインド
5.4.2 Type binding
int sum;
ほとんどの言語では静的バインドが使用されます.
3歳で80歳に慣れる.
-dynamic type binding
typeは、実行時に変更を続行できます.
そのため、変数は最終的にポインタとして機能します.
寸法が不明->時間とともに変化
主に関数言語で使用されます.
最初はstatic bindingが主に使われていました.
90年代半ば以降、Python、luby、JavaScript、PHPなどはダイナミックバインドを使用
230,231p
ダイナミックバインドの問題
-タイプチェックは行われていません.
-ポインタ変数を使用して実装->実行時にコストがかかり、実行時間が遅い
主に純粋な解釈器方式を採用している.
5.4.3 storage binding and lifetime
メモリ容量
コード空間//静的空間//動的空間
静的変数/グローバル変数
stack-ダイナミック//領域変数-stack領域
明示heapダイナミック//ダイナミックデータ構造-heap領域
暗黙heap dynamic//dynamic type bindingで使用
storage binding
メモリに変数を割り当てる
命令はメモリにアップロードされ、データ領域が割り当てられます.
一部の変数は静的および動的に割り当てられます.
グローバル変数は静的に割り当てられます->メモリに固定
逆に、領域変数は、関数の実行中に動的に割り当てられます.
動的割当ては大きく2種類ある.
地域変数として、歴史に敏感なことがある.
関数の呼び出しごとに変数を蓄積する必要がある場合は、領域変数をstaticとして宣言することもできます.
JAvaの静態は少し違います.クラスにクラス変数があることを示します.
ゾーン変数とスタック
main->A関数->
Aの領域変数をスタックに割り当て、Bの領域変数をスタックに割り当てる
戻るときに上部から消える->stack
ダイナミックデータ構造
mallocメモリに必要なスペースは動的に割り当てられます.
234p
JAvaの基本タイプ以外のすべてのデータ構造はobjectであるため,動的に割り当てられる.
これはポインタ変数を使用します->2つの問題
5.5 scope
変数はプログラムのどの部分に表示されますか(アクセス可能).
global:プログラム全体で
local:関数
関数の目的:繰り返し使用する単位
処理の抽象
情報の非表示
プログラムの構造によって異なります(関数の作成方法)
2種類あります->ネストされた静的scope
non-loacal
nesting:sub関数は親関数の変数にアクセスできます->
親はサブ関数変数にアクセスできません.
5.6 scope and lifetime
グローバル変数の役割ドメインは随所に見られ、静的に割り当てられています.
領域変数関数でのみ表示され、激しく割り当てられます.
静的識別子を使用して変数を宣言する場合は、関数で置換できます.
ライフサイクルはプログラム全体に拡張されます.
5.7 referencing environments
サブルーチンがアクティブです.アクティブ化されます.
始まりましたが、終わりませんでした.
main->A->B->Cステータスの場合
実行中はCで、アクティブなのは関数のすべてです.
領域変数は、関数がアクティブな場合にのみ空間が割り当てられます.
構造ではなく、アクティブな状態にあるかどうかによって変数に近づくことができます.
5.8 named constant
値に一度だけ割り当てられる変数.
Reference
この問題について(プログラミング言語-5 name、binding、scopes), 我々は、より多くの情報をここで見つけました https://velog.io/@ttomy/플밍언어-5-namebindingscopesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol