cpalc
CPAL derleyicisi. Ara temsili (IR) iki hedefe çevirir: çocuğun okuduğu C kodu ve robotun koştuğu bayt kodu.
İki uygulama, tek davranış
| Uygulama | Dil | Ne zaman koşar |
|---|---|---|
| Referans | Python | Testlerde altın çıktıyı üretir |
| Editör | JavaScript | Senin tarayıcında, internetsiz |
Neden iki tane
Editörün derleyicisi tarayıcıda koşmalı (kurulum yok, internet yok). Python referansı ise okunabilir ve test edilebilir olanı. İkisinin çıktısı karakter karakter aynı olmak zorundadır; testler bunu her koşuda doğrular. Ayrışırlarsa test düşer.
Boru hattı
CPALDerleme hattı
Bloklar ──▶ IR ──┬──▶ C kodu (emit-c)
└──▶ bayt kodu (assembler)
C kodu ──▶ IR (parse-c) ← geri yönC ve bayt kodu aynı IR’den üretilir: ikisi aynı davranışı verir. Geri yön (parse-c) yazılmış kodu bloklara döndürür.
Üretilen C nasıl görünür
CÜretilen program.c
#include "cpal.h"
/* cpalc uretti - elle duzenleme. */
#include <stdint.h>
/* 32-bit sarmali aritmetik: isaretli tasma UB'sine girmez. */
static inline int cpalc_add(int a, int b) { return (int)((unsigned)a + (unsigned)b); }
static int cpal_v0_sayac;
void cpal_setup(void)
{
cpal_v0_sayac = 0;
}
void cpal_loop(void)
{
cpal_forward(55);
cpal_wait(500);
}- Değişkenler
int’tir, çocuğa gösterilen tip sade tutulur. - Aritmetik sarmalı yardımcılardan geçer: tanımsız davranış yok.
- Sıfıra bölme 0 verir; program çökmez.
- Değerler kırpılır ve kırpma sanal makineninkiyle aynıdır.
Testler
- Altın çıktı: JS üretecinin çıktısı Python referansıyla birebir aynı.
- Gerçekten derleniyor mu: üretilen C, gerçek
cpal.hile clang’den geçirilir. - Tur testi: blok → C → blok programı değiştirmez.