Değişken Ekleme
Değerleri saklayıp geri çağırın.
Değişken Ekleme, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Aritmetiğin Ötesi
x = 5 ve ardından x + 1 ifadelerini desteklemek için yorumlayıcının tanımlayıcılara ve değerlerini depolayacağı bir yere ihtiyacı vardır. Bu depolama alanı ortamdır.
Adları ve atamaları işlemek için sözcük çözümleyiciyi, ayrıştırıcıyı ve değerlendiriciyi genişleteceğiz.
Tanımlayıcıları Sözcüklerine Ayırma
Bir tanımlayıcı bir harf veya alt çizgiyle başlar ve harfler, rakamlar ya da alt çizgilerle devam eder. Adı belirtecin içine kopyalarız.
Sabit boyutlu bir arabellek örneği basit tutar; gerçek sözcük çözümleyiciler adları simgeler.
#include <ctype.h>
#include <string.h>
typedef struct { TokKind kind; int value; char name[32]; } Token;
static Token lex_ident(void) {
Token t; t.kind = TOK_IDENT; int i = 0;
while (isalnum((unsigned char)peek()) || peek() == '_')
if (i < 31) t.name[i++] = advance(); else advance();
t.name[i] = '\0';
return t;
}Bir Değişken Düğümü
AST'ye iki düğüm türü eklenir: değişken başvurusu ve atama. Her biri değişken adını saklar.
Atama ayrıca sakladığı değeri üreten ifadeyi de tutar.
typedef struct Node {
enum { N_NUM, N_BINOP, N_VAR, N_ASSIGN } kind;
int value; char op; char name[32];
struct Node *left, *right; /* assign uses right as value expr */
} Node;Ortam
Ortam, adları değerlere eşler. Küçük bir yorumlayıcı için ad/değer çiftlerinden oluşan basit bir doğrusal dizi yeterlidir.
Daha büyük diller, O(1) arama ve iç içe kapsamlar için karma tabloları kullanır.
#define MAX_VARS 64
typedef struct {
char names[MAX_VARS][32];
int values[MAX_VARS];
int count;
} Env;
static Env env; /* global for this tiny example */Bir Değişkene Değer Atama
Atama işlemi ya mevcut bir yuvayı günceller ya da yeni bir yuva ekler. Doğrusal arama, kodu kısa tutar.
Saklanan değeri döndürmek, atamaların y = (x = 3) örneğinde olduğu gibi ifade olarak kullanılmasını sağlar.
#include <string.h>
static int env_set(const char *name, int v) {
for (int i = 0; i < env.count; i++)
if (strcmp(env.names[i], name) == 0) {
env.values[i] = v; return v;
}
strcpy(env.names[env.count], name);
env.values[env.count] = v;
env.count++;
return v;
}Bir Değişkeni Okuma
Arama, adı tarar ve değerini döndürür. Tanımsız bir değişkene başvurmak çalışma zamanı hatasıdır.
Hatayı burada yakalamak, çöp bir değer döndürmek yerine anlaşılır bir ileti sağlar.
#include <stdio.h>
#include <stdlib.h>
static int env_get(const char *name) {
for (int i = 0; i < env.count; i++)
if (strcmp(env.names[i], name) == 0)
return env.values[i];
fprintf(stderr, "undefined variable: %s\n", name);
exit(1);
}Atamayı Ayrıştırma
Atama en düşük önceliğe sahiptir ve sağdan birleşimlidir. Bir çarpanı ayrıştırırız; bu çarpan tek başına duran bir tanımlayıcıysa ve ardından = geliyorsa bir assign node oluştururuz.
Aksi hâlde tanımlayıcı yalnızca bir değişken okumasıdır.
static Node *parse_assign(void) {
if (cur().kind == TOK_IDENT) {
char saved[32]; strcpy(saved, cur().name);
bump();
if (cur().kind == TOK_ASSIGN) {
bump();
Node *val = parse_assign();
return assign_node(saved, val);
}
return var_node(saved); /* not an assignment */
}
return parse_expr();
}Değişkenleri Değerlendirme
Değerlendiriciye iki durum eklenir. Bir değişken düğümü adını ortamda arar; bir assign node ise değer ifadesini değerlendirip sonucu saklar.
Her ikisi de env_get ve env_set yardımcılarını yeniden kullanır.
int eval(Node *n) {
switch (n->kind) {
case N_NUM: return n->value;
case N_VAR: return env_get(n->name);
case N_ASSIGN: return env_set(n->name, eval(n->right));
case N_BINOP: {
int l = eval(n->left), r = eval(n->right);
switch (n->op) {
case '+': return l + r; case '-': return l - r;
case '*': return l * r; case '/': return l / r;
}
}
}
return 0;
}Çalışan Bir REPL Adımı
Bu program bir değişkeni saklar, ardından onu bir ifade içinde yeniden okur; tüm bunları ortam üzerinden yapar. Gerçek bir yorumlayıcının tek satırını modeller.
Atama ile aramanın birlikte çalıştığını görmek için çalıştırın.
#include <stdio.h>
#include <string.h>
#define MAX_VARS 64
static char names[MAX_VARS][32];
static int values[MAX_VARS];
static int count;
static int env_set(const char *n,int v){
for(int i=0;i<count;i++) if(!strcmp(names[i],n)){values[i]=v;return v;}
strcpy(names[count],n); values[count]=v; count++; return v;
}
static int env_get(const char *n){
for(int i=0;i<count;i++) if(!strcmp(names[i],n)) return values[i];
return 0;
}
int main(void){
env_set("x", 5); /* x = 5 */
int r = env_get("x") + 1; /* x + 1 */
printf("x = %d\n", env_get("x"));
printf("x + 1 = %d\n", r);
return 0;
}Kapsamlar ve Gölgeleme
Tek ve düz bir ortam küreseldir. Gerçek diller, bir işlevin yerel adlarının dış kapsamlardaki adları ezmemesi için iç içe kapsamlar ekler.
Bunu ortamları birbirine bağlayarak uygularsınız: arama en içteki kapsamdan dışarı doğru ilerler.
typedef struct Env {
char names[MAX_VARS][32];
int values[MAX_VARS];
int count;
struct Env *parent; /* enclosing scope */
} Env;Sırada Ne Var
Değişkenleri eklediğinize göre ifadeler, koşullu yapılar ve işlevler ekleyebilirsiniz. Her biri yeni bir düğüm türüyle birlikte bir eval durumu gerektirir.
Buradan sonra aynı sözcük çözümleyici-ayrıştırıcı-değerlendirici işlem hattı, gerçek bir küçük dile ölçeklenebilir.
Hızlı Kontrol
Ortamın hangi sorumluluğu üstlendiğini düşünün.
Özet
Sözcük çözümleyiciye tanımlayıcılar, AST'ye var/assign düğümleri, ayarlama ve alma işlemlerine sahip bir ortam ve okumalar ile atamalar için eval durumları eklediniz.
Yorumlayıcı artık durumu hatırlıyor; bu, ifadeler ve işlevler için temeldir.
Sıkça Sorulan Sorular
“Değişken Ekleme” dersi ücretsiz mi?
Evet — “Değişken Ekleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Değişken Ekleme” dersinde ne öğreneceğim?
Değerleri saklayıp geri çağırın. C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Değişken Ekleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.