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ış

UygulamaDilNe zaman koşar
ReferansPythonTestlerde altın çıktıyı üretir
EditörJavaScriptSenin 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ön

C 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.h ile clang’den geçirilir.
  • Tur testi: blok → C → blok programı değiştirmez.