Nasıl betik dilleri değişkenleri okumak / değiştirmek / ayarlarım?

3 Cevap php

Assuming the interpreter for the language (Can be anything from PHP to Ruby) is written in C. How are variables (or more complex data structures not only containg name and value), which are defined by the script that is currently being executed, stored and read out?

Ben, C benim oldukça kötü bilgisine sahip, bu sadece bir dizi ile yapılabilir sonuç ile sona erecekti.

// Variable type definition would go here
var* variables;

var tipi iki dizeleri name ve value içerecektir.

Tamam. Peki senaryo örneğin tanımlar: 30 değişkenleri. Değişkenlerden biri okunacak varsa Şimdi, fonksiyon getVar (veya benzeri) 30 değişkenler ile yürümek ve adı ile name s karşılaştırmak gerekir istenen değişken. Bir döngü ile düşünün ki istekleri

  • Ben tamamen yanlış alıyorum? Eğer evet ise, nasıl (modern mi?) Betik dilleri değişkenleri ele? Nasıl saklanır ve dışarı okunur?

  • In languages where variables are clearly defined by the syntax (PHP: $myVar), the interpreter could replace all variables by numerical values during the parsing process. (Am I right with that?) Is this the case?

3 Cevap

Hashtables, scope linked lists, references ... ona çok şey var.

Ne soruyorsun yarı-soyut ve uygulama değişkendir.

Uygulanmasına bağlı olarak:

  1. Tanıtıcılar bellek adresleri, ya da göreli bellek adresleri, veya byte tarafından başvurulan isimsiz yerle derlenmiş olabilir.
  2. Tanımlayıcılar baktı-up olabilir çalışma zamanında dinamik kapsamında

Temel bir betik dilinde, değişken adları encoutered zaman içine koymak olacak bir scope structure gibi o kapsamda tanımlayıcılarını arayanlar için bir hashtable uygulanmasını içeren bir bağlantılı liste olarak.

Bir değişken referans olarak verildiğinde, zamanı kod hashtable onu arar ve bu değer ile ilgilidir bazı değer (örneğin bir yapı bir bellek adresi) alır. Yapılar scalar değişkenleri uygulamak için de kullanılabilir:

enum stype = { INT, STRING, FLOAT, BOOL };
struct scalar {
    enum stype type;
    generic_blob_t *heap_blob;
};

Ya da benim kötü bir örnek kaynağı bazı farklılıklar.

Bazı iyi kitaplar "Modern Compiler Implementation in C" ve Dragon Book vardır. Bu konuyla ilgili okuma iyi bir fikirdir; Ben herhangi bir programcı bunu tavsiye ederim.

Onlar neredeyse kesinlikle daha gelişmiş bir veri yapısını kullanabilirsiniz.

 struct Var
 {
     char *name;
     int type;
     union value; ....
  };

ve sonra bir ağacın (karma veya ikili) saklayabilirsiniz böylece onlar adına alınabilir

Tipik olarak, betik dili uygulamaları betik dili değişkenleri temsil etmek için oldukça karmaşık C veri yapılarını kullanır. C uzantıları iyi tanımlanmış olan diller için, belgeleri hazır:

[SO editors: feel free to add more references to the above list]