ZELYRA
ZELYRA / SPRACHVERGLEICH

Zelyra verstehen
im direkten Vergleich.

Entdecke die Ziele eines experimentellen Sprachprojekts für datenbankgestützte Webanwendungen. Funktionsumfang und Prüfungen beschränken sich auf das, was Version 0.3.0 tatsächlich umsetzt.

Der architektonische Kern

Zelyra untersucht, wie Datenmodelle und Webanwendungen enger zusammenarbeiten können. Der Prototyp 0.3.0 macht noch nicht jedes Modell, jede Abfrage, jedes Formular und jede Ansicht zu einer automatisch geprüften gemeinsamen Quelle.

0.3.0 Experimentelles Release Früher Sprachprototyp
CLI Compiler-Werkzeug Installationswege je Release
SQL Datenbankabläufe Prüfumfang in den Release-Dokumenten
T? Optionale Werte Prototyp-Funktion; begrenzte Prüfungen
Vergleichen mit:
01 / ÜBERSICHTSMATRIX

Die große Feature- und
Architektur-Matrix.

Ein ehrlicher und transparenter Überblick über fundamentale Architektureigenschaften von Zelyra im Vergleich zu etablierten Ökosystemen. Klicke oben auf eine Sprache, um Tabelle und Codebeispiele direkt zu fokussieren.

Merkmal / Disziplin Zelyra PHP (Laravel) TypeScript (Prisma) Rust (Axum) Go (net/http) Python (Django)
Single-Source Schema Sprachziel; Umfang je Funktion verschieden ✓ Nativ ✗ 3-4 Dateien ~ Generiert ✗ Macros ✗ Struct Tags ✗ Models+Forms
Nominale Fachtypen Compiler verhindert vertauschte IDs ~ Unterstützte Fälle ✗ Primitive int/str ✗ Nur strukturell ✓ Newtypes ~ Schwacher Alias ✗ Dynamisch
Prüfungen optionaler Werte Prüfumfang hängt von implementierten Fällen ab ~ Prototyp-Konstrukt ✗ Laufzeit TypeError ~ undefined/any ✓ Option<T> ✗ nil Panic ✗ NoneType Error
Compile-geprüftes SQL SQL-Umfang in der Dokumentation zu 0.3.0 ~ Prototyp-Werkzeuge ✗ Laufzeit Strings ✗ ORM / DSL ✓ sqlx Macros ✗ Laufzeit Strings ✗ ORM / DSL
Integrierter Webserver Kein Apache, Nginx oder FPM zwingend ✓ Nativ in Rust ✗ PHP-FPM / Nginx ~ Node.js Engine ~ Crates nötig ✓ net/http ✗ Gunicorn / WSGI
Deployment-Artefakt Ein einzelnes autarkes Binary ✓ Single Binary ✗ Source + Runtime ✗ Source + Node ✓ Single Binary ✓ Single Binary ✗ Source + Python
Abhängigkeiten-Footprint Abhängigkeiten je Installation und Betrieb ~ Je nach Deployment ~ Je nach Deployment ~ Je nach Deployment ~ Je nach Deployment ~ Je nach Deployment ~ Je nach Deployment
Leistungsdaten Kein vergleichender Benchmark veröffentlicht — — — — — —
Minimaler RAM-Verbrauch Speicherbedarf pro Instanz ⚡ ~12 MB ~ 45 - 70 MB ~ 85 - 140 MB ⚡ ~8 MB ⚡ ~15 MB ~ 75 - 120 MB
02 / DATENMODELL & SCHEMA

Ein einziges Schema.
Keine Doppelarbeit.

In Zelyra erzeugt eine einzige Tabellen-Deklaration automatisch die Tabellenstruktur, den Fachtyp, Null-Sicherheit und die Validierungsregeln.

customer.zyl ZELYRA
// 1 Definition: Schema, DDL, Typen & Validierung
table customers {
    id: Id primary auto
    name: String(100) required
    email: Email?
    active: Bool = true
}

// Generiert typgeprüftes HTML-Formular
form CustomerCreate -> customers {
    fields { name email }
}
Customer.php + migration.php LARAVEL
// 1. Migration, 2. Model, 3. FormRequest (3 Dateien synchron halten!)
class CreateCustomersTable extends Migration {
    public function up() {
        Schema::create('customers', function (Blueprint $t) {
            $t->id();
            $t->string('name', 100);
            $t->string('email')->nullable();
            $t->boolean('active')->default(true);
        });
    }
}
// In Customer.php: protected $fillable = ['name', 'email', 'active'];
// In StoreCustomerRequest.php: rules() => ['name' => 'required|max:100'...]
// 1. schema.prisma + npx prisma generate
model Customer {
  id     Int     @id @default(autoincrement())
  name   String  @db.VarChar(100)
  email  String?
  active Boolean @default(true)
}
// 2. Zod-Validierung muss manuell dupliziert werden:
export const CustomerSchema = z.object({
  name: z.string().min(1).max(100),
  email: z.string().email().optional(),
});
export type CustomerInput = z.infer<typeof CustomerSchema>;
// Diesel: migration.sql + schema.rs + models.rs
#[derive(Queryable, Selectable, Insertable, Serialize, Deserialize)]
#[diesel(table_name = crate::schema::customers)]
pub struct Customer {
    pub id: i32,
    pub name: String,
    pub email: Option<String>,
    pub active: bool,
}
// Validierungs-Crate validator muss zusätzlich implementiert werden:
#[derive(Validate, Deserialize)]
pub struct NewCustomer { ... }
💡
Der architektonische Vorteil: Kein Schema-Drift

In klassischen Projekten erfordert eine neue Spalte das Ändern der Migration, der ORM-Attribute, der FormRequest-Validierungsregeln und der DTO-Klassen. In Zelyra passt du die Tabelle an einer Stelle an – alle abhängigen Typen und Formulare sind sofort atomar synchron.

03 / NOMINALE FACHTYPEN

Fachtypen machen
Unterschiede sichtbar.

Zelyra erprobt benannte Fachtypen. Der Compiler prüft in diesem Prototyp nur unterstützte Typbeziehungen; teste die konkreten Fälle, auf die dein Projekt angewiesen ist.

nominal_safety.zyl ZELYRA
// Nominale Typen: Strikte Trennung im Typensystem
type UserId = Id
type OrderId = Id

fn cancel_order(order: OrderId, user: UserId) {
    // ...
}

// ❌ COMPILE ERROR:
// TypeMismatch: Expected OrderId, but found UserId
cancel_order(current_user_id, current_order_id)
structural_bug.ts TYPESCRIPT
type UserId = string;
type OrderId = string;

// TypeScript verwendet rein strukturelle Typisierung!
function cancelOrder(order: OrderId, user: UserId) { ... }

// ⚠️ KEIN FEHLER: Kompiliert ohne jede Warnung!
// Führt zur Laufzeit zu stiller Datenbeschädigung:
cancelOrder(currentUserId, currentOrderId);
// PHP erlaubt nur primitive Skalare:
function cancelOrder(int $orderId, int $userId): void {
    // ...
}

// ⚠️ Vertauschte Parameter werden klaglos akzeptiert.
// Erst wenn der falsche Kunde oder Auftrag gelöscht wird,
// bemerkt man den Fehler in Produktion!
cancelOrder($currentUserId, $currentOrderId);
// In Rust geht das nur über das Newtype-Pattern:
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct UserId(pub u64);

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct OrderId(pub u64);

fn cancel_order(order: OrderId, user: UserId) { ... }
// Sicher, aber erfordert mühsames Entpacken order.0
🛡️
Warum das in der Unternehmenspraxis entscheidend ist

Strukturelle Typsysteme (wie in TypeScript) können Aliase primitiver Datentypen nicht unterscheiden. Zelyras nominale Typbarrieren garantieren, dass Fachtypen niemals versehentlich vertauscht werden – und verhindern fatale Datenverluste vorab.

04 / NULL-SICHERHEIT

Optionale Werte sind sichtbar.
Die Prüfungen haben klare Grenzen.

Der Sprachprototyp bietet Syntax für optionale Werte in unterstützten Zusammenhängen. Das ist keine pauschale Garantie gegen Null-bezogene oder andere Laufzeitfehler.

safe_option.zyl ZELYRA
// T? ist Option<T>. Zugriff ohne Prüfung unmöglich:
user_name: String? = load_user_name(id)

// Compiler erzwingt vollständige Fallunterscheidung
match user_name {
    Some(name) => print("Willkommen, {name}!")
    None       => print("Gast-Benutzer")
}
null_danger.ts TYPESCRIPT
const userName = loadUserName(id);

// Optional Chaining täuscht Sicherheit vor:
const upper = userName?.toUpperCase();

// ⚠️ 'upper' ist jetzt undefined!
// Wandert ohne Compiler-Fehler in die SQL-Datenbank
// oder führt im Template zu 'Hello, undefined'
saveToDatabase({ name: upper });
$userName = loadUserName($id); // gibt ?string zurück

// Vergessenes if ($userName !== null) führt zum Fatal Crash:
echo strtoupper($userName);

// 💥 Fatal error: Uncaught TypeError:
// strtoupper(): Argument #1 ($string) must be of type string, null given
user, err := loadUser(id)
// Ein vergessenes err != nil oder nil-Pointer-Dereferenzierung:
println(user.Name)

// 💥 panic: runtime error: invalid memory address
// or nil pointer dereference
⚡
Option<T> statt trügerisches Optional Chaining

Optional Chaining (?. ) löst das Null-Problem nicht; es verschiebt undefined lediglich weiter nach hinten, bis es in der Datenbank oder im Frontend knallt. Zelyra verlangt zwingend den bewussten Umgang an Ort und Stelle.

05 / DATENBANK-ABFRAGEN

Natives, typgeprüftes SQL.
Ohne ORM-Ballast und N+1-Fallen.

Relationale Datenbanken sind unschlagbar. Zelyra bindet SQL direkt in die Sprache ein – statisch gegen dein Schema typgeprüft, ohne schwere ORMs oder N+1-Laufzeitfallen.

orders_query.zyl ZELYRA
// Direktes SQL: Compile-geprüft & null Overhead
fn get_top_customers(min_spend: Float) -> List<CustomerSummary> {
    sql {
        SELECT c.id, c.name, SUM(o.total) AS total_spent
        FROM customers c
        JOIN orders o ON o.customer_id = c.id
        WHERE c.active = true
        GROUP BY c.id, c.name
        HAVING SUM(o.total) >= :min_spend
        ORDER BY total_spent DESC;
    }
}
EloquentQuery.php LARAVEL
// Eloquent: Verschachtelter Query-Builder mit Reflection
$topCustomers = Customer::query()
    ->selectRaw('customers.id, customers.name, SUM(orders.total) as total_spent')
    ->join('orders', 'orders.customer_id', '=', 'customers.id')
    ->where('customers.active', true)
    ->groupBy('customers.id', 'customers.name')
    ->havingRaw('SUM(orders.total) >= ?', [$minSpend])
    ->orderByDesc('total_spent')
    ->get();
// ⚠️ selectRaw und havingRaw sind ungeprüfte Strings!
// Massiver Speicherverbrauch bei großen Hydrierungen.
// Prisma unterstützt komplexe GROUP BY / HAVING nur eingeschränkt:
const aggregations = await prisma.order.groupBy({
  by: ['customerId'],
  _sum: { total: true },
  having: { total: { _sum: { gte: minSpend } } },
});
// Benötigt anschließende zweite Query für Kundendaten:
// -> Gefahr von N+1 Latenz oder komplexen Raw-Queries!
// SQLx in Rust prüft SQL zur Compile-Zeit:
let customers = sqlx::query_as!(
    CustomerSummary,
    r#"SELECT c.id, c.name, SUM(o.total) as total_spent ... "#,
    min_spend
)
.fetch_all(&pool)
.await?;
// Exzellente Sicherheit, erfordert aber laufende DB beim Build!
📊
Kein ORM-Verschleierungsspiel

ORMs versprechen Abstraktion, doch in der Praxis verbringen Entwickler Stunden damit, generierte N+1 Queries, ineffiziente Joins und ORM-Hydrierung zu optimieren. Zelyra gibt dir volles, schnelles SQL mit Compile-Schutz.

06 / WEBSERVER & ROUTING

Integrierter Webserver.
Kein externer Server-Overhead.

In Zelyra sind HTTP-Routing, Parameterbindung und HTML-Ausgabe Teil des Sprachkerns. Kein Nginx, Apache, PHP-FPM oder Express-Setup erforderlich.

profile_page.zyl ZELYRA
// Nativer Webserver läuft direkt via 'zelyra serve'
page "/users/{id}" {
    let user = find_user(id)?

    // Automatisches XSS-Escaping für alle Werte
    html {
        <h1>Profil: {user.name}</h1>
        <p>E-Mail: {user.email}</p>
    }
}
routes/web.php + Controller LARAVEL
// In routes/web.php:
Route::get('/users/{id}', [UserController::class, 'show']);

// In app/Http/Controllers/UserController.php:
public function show($id) {
    $user = User::findOrFail($id);
    return view('users.show', compact('user'));
}
// In resources/views/users/show.blade.php:
// <h1>Profil: {{ $user->name }}</h1>
// Erfordert Nginx + PHP-FPM Prozessmanagement im Betrieb!
// Next.js App Router:
export default async function UserPage({ params }: { params: { id: string } }) {
  const user = await db.user.findUnique({ where: { id: Number(params.id) } });
  if (!user) notFound();

  return (
    <div>
      <h1>Profil: {user.name}</h1>
      <p>E-Mail: {user.email}</p>
    </div>
  );
}
// Erfordert Node.js Runtime, JSX-Build-Pipeline und npm packages
async fn show_user(Path(id): Path<i32>) -> Response {
    let user = db::find(id).await;
    Html(format!("<h1>Profil: {}</h1>", user.name)).into_response()
}

let app = Router::new().route("/users/:id", get(show_user));
axum::serve(listener, app).await.unwrap();
// Benötigt Tokio Async-Runtime, Lifetimes und HTML-Escaping Crate
🚀
Von Grund auf für das Web konstruiert

In Zelyra ist das Web keine externe Bibliotheks-Erweiterung, sondern ein nativer Sprachbestandteil: Routen, Validierung und HTML-Rendering verschmelzen zu einer homogenen Einheit.

07 / PERFORMANCE & RESSOURCEN

Schlank, schnell & sparsam.
Ressourcen im direkten Vergleich.

Für dieses Release liegen keine reproduzierbaren Benchmarks zu Startzeit, Speicherbedarf oder Image-Größe vor. Messwerte ergänzen wir, sobald ein wiederholbarer Testaufbau verfügbar ist.

08 / ENTSCHEIDUNGSHILFE

Wann wählst du was?
Ehrliche architektonische Leitplanken.

Keine Programmiersprache ist für jede erdenkliche Aufgabe die beste. Hier ist eine ehrliche Einschätzung, wann welches Werkzeug glänzt.

🐘 Bleib bei PHP / Laravel, wenn:

Du auf ein gewaltiges, jahrzehntelang gewachsenes Ökosystem und fertige Fertiglösungen angewiesen bist.

  • Du fertige Admin-Panels wie Filament oder Nova benötigst.
  • Du bestehende Monolithen mit eingespielten Teams weiterentwickelst.
  • Klassisches Webspace- oder Shared-Hosting zwingend vorgeschrieben ist.

🔷 Bleib bei TypeScript, wenn:

Du Code, Typen und Rendering nahtlos zwischen Browser und Backend teilen willst.

  • Du stark interaktive Frontend-Clients mit Next.js, Nuxt oder Svelte baust.
  • Du spezielle Node.js-APIs oder NPM-Visualisierungsbibliotheken nutzt.
  • Dein Team rein aus Frontend-Entwicklern besteht.

🦀 Wähle Rust, wenn:

Du Low-Level-Infrastruktur baust, bei der jedes Byte und Nanosekunden zählen.

  • Datenbank-Engines, Browser-Engines, Treiber oder Kryptografie.
  • Du absolute manuelle Kontrolle über Speicherlayouts und Threads benötigst.
  • Dein Projekt den Aufwand des Borrow-Checkers und langer Build-Zeiten rechtfertigt.

🐹 Wähle Go, wenn:

Du Cloud-Infrastruktur-Tools, Netzwerk-Proxies oder Kubernetes-Operatoren baust.

  • Reine I/O-Netzwerk-Gateways mit vielen parallelen TCP-Verbindungen.
  • Direkte Einbindung in das Kubernetes- und Docker-Ökosystem.
  • Du mit manuellem `if err != nil` und Boilerplate gut leben kannst.

⚡ Wähle Zelyra, wenn:

Du ohne Umwege, ohne Framework-Frust und mit maximaler Einfachheit echte Webanwendungen bauen willst.
Zelyra ist das Werkzeug für Menschen, die schnell greifbare Ergebnisse sehen wollen: Du hast eine Idee für ein Kundenportal, ein internes Firmen-Tool, ein Buchungssystem oder ein datenbankgestütztes Dashboard? Du willst nicht erst Tage damit verbringen, Webserver zu konfigurieren, Docker-Netzwerke zu debuggen oder gegen wuchernde ORM-Schichten zu kämpfen. Mit Zelyra schreibst du deine Datenmodelle auf, bindest deine Routen und die Anwendung läuft – blitzschnell, sicher und wartungsarm über Jahre hinweg.

🚀 Vom Gedanken zur fertigen Seite in Minuten

Keine zeitraubende Vorarbeit: Eine Tabelle deklarieren, ein HTML-Formular anbinden und die Route steht. Wo du in anderen Stacks Migrationen, Models, FormRequests und DTOs synchronisieren musst, erreichst du dein Ziel in Zelyra in einer einzigen, lesbaren Datei.

🛠️ Null Konfigurations-Frust & Kein Server-Zirkus

Version 0.3.0 enthält für das unterstützte Projektformat einen `serve`-Befehl. Diese Seite macht keine Aussage zu Latenz oder Durchsatz; prüfe Lastverhalten und Deployment-Anforderungen selbst.

🧩 Perfekt für pragmatische CRUD- & Daten-Apps

Ob interne Firmen-Werkzeuge, Kundenbereiche, Inventarlisten, Auftragsverwaltungen oder MVPs: Zelyra verbindet relationale Datenbanken und HTML-Ausgabe nahtlos. Echtes, typgeprüftes SQL ohne N+1-Überraschungen und ohne schwerfälligen ORM-Ballast.

🛡️ Sicherheit geschenkt – ohne Bibliotheks-Wahnsinn

Compiler und Laufzeit sind experimentell. Leite Anwendungssicherheit nicht allein aus der Sprachsyntax ab: Prüfe erzeugte Ausgaben, validiere Eingaben, teste Berechtigungen und führe vor dem Deployment eine Sicherheitsprüfung durch.

Der 3-Schritte-Workflow: 1. Tabelle deklarieren ➔ 2. Formular & Route schreiben ➔ 3. zelyra serve ➔ ✓ Fertig & produktiv!

Editor & Tooling einrichten

Hole dir Syntax-Highlighting für .zyl-Dateien in VS Code, Sublime Text oder Neovim mit der offiziellen TextMate-Grammatik.

Schnellstart-Anleitung öffnen →
// Installationsbefehl
git clone https://github.com/sf1976/zelyra.git
cd zelyra && ./install.sh
zelyra run main.zyl