プログラミング言語-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)
言語の文法を考えてみましょう.syntax
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}
%3、%sum、%(if 1 2)などはsematics(意味)である.

5.1 intro


命令式言語(命令型言語)、主流言語はフォンノイマン構造に基づいている.メモリ内の命令、データはcpuに昇格して演算される.
変数についてお話しします.

5.2 Names


そのプログラムに特殊な意味を持つ名前はkeywordです.
変数名、関数名.
case sensitive->大文字と小文字を区別しますか?
word->keywordの特殊な意味を保持する文字列

5.3 variables


機械言語では変数はアドレスであり,ヘレベルでは変数を名前で指すことができる.
225p

変数の6つの属性


  • name

  • address //l-value

  • value //r-value

  • タイプ//6章

  • ライフサイクル//変数メモリの割り当て時間

  • scope//変数はプログラム内の任意の場所でアクセスできます
  • 第五章はライフサイクル、範囲に集中する.

    5.3.2 address


    変数のアドレスをl-valueと呼びます.変数の値をr-valueと呼びます.
    (left-right)
    エイリアス(エイリアス)->複数の名前でアドレスにアクセス
    3つのケース-26 p
  • union type
  • は、1つのデータ構造を別の名前またはデータ構造として宣言することができ、1つのメモリ領域が異なる名前でアクセスできるようにする.
  • ポインタ変数
    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種類ある.
  • 地域変数
  • 動的データ構造(mallocなど)
  • 232p
    地域変数として、歴史に敏感なことがある.
    関数の呼び出しごとに変数を蓄積する必要がある場合は、領域変数をstaticとして宣言することもできます.
    JAvaの静態は少し違います.クラスにクラス変数があることを示します.

    ゾーン変数とスタック


    main->A関数->
    Aの領域変数をスタックに割り当て、Bの領域変数をスタックに割り当てる
    戻るときに上部から消える->stack

    ダイナミックデータ構造


    mallocメモリに必要なスペースは動的に割り当てられます.
    234p
    JAvaの基本タイプ以外のすべてのデータ構造はobjectであるため,動的に割り当てられる.
    これはポインタ変数を使用します->2つの問題
  • ポインタが消えてもデータがあります:ゴミ
  • データがなくなり、ポインタの残り/指向エラー:サスペンションポインタ
  • Javaでは,サスペンションポインタを除去するためにプログラマはインスタンスを除去することができず,ゴミ収集器は周期的に循環し,不要なインスタンスを自動的に除去する.
  • implicit heap dynamiv variables
  • 5.5 scope


    変数はプログラムのどの部分に表示されますか(アクセス可能).
    global:プログラム全体で
    local:関数
    関数の目的:繰り返し使用する単位
    処理の抽象
    情報の非表示
  • static scope
    プログラムの構造によって異なります(関数の作成方法)
    2種類あります->ネストされた静的scope
    non-loacal
    nesting:sub関数は親関数の変数にアクセスできます->
    親はサブ関数変数にアクセスできません.
  • 5.6 scope and lifetime


    グローバル変数の役割ドメインは随所に見られ、静的に割り当てられています.
    領域変数関数でのみ表示され、激しく割り当てられます.
    静的識別子を使用して変数を宣言する場合は、関数で置換できます.
    ライフサイクルはプログラム全体に拡張されます.

    5.7 referencing environments

  • active
    サブルーチンがアクティブです.アクティブ化されます.
    始まりましたが、終わりませんでした.
    main->A->B->Cステータスの場合
    実行中はCで、アクティブなのは関数のすべてです.
    領域変数は、関数がアクティブな場合にのみ空間が割り当てられます.
  • ダイナミックレンジメソッドでは、
    構造ではなく、アクティブな状態にあるかどうかによって変数に近づくことができます.

    5.8 named constant

  • named constant
    値に一度だけ割り当てられる変数.