Skip to main content

IDScript adalah bahasa pemrograman berbahasa Indonesia penerus Indonesian Script (IS), dengan interpreter dan compiler VM resmi.

Project description

IDScript

IDScript adalah bahasa pemrograman berbahasa Indonesia yang menyediakan interpreter normal dan compiler VM resmi. Nama IDScript/IDS dapat dibaca sebagai I[n]D[onesian] Script, atau secara ringkas I[n]D[o] Script.

Tentang

Latar Belakang

IDScript lahir sebagai kelanjutan dari Indonesian Script atau IS, sebuah proyek bahasa pemrograman berbahasa Indonesia yang sebelumnya dibuat sebagai prototype dan kemudian terbengkalai. IS menjadi bukti awal bahwa sintaks pemrograman dapat dibuat lebih dekat dengan istilah Indonesia, tetapi proyek tersebut belum memiliki struktur compiler, runtime, dan format bytecode yang cukup rapi untuk dilanjutkan sebagai bahasa yang lebih stabil.

IDScript meneruskan gagasan tersebut dengan fondasi baru: grammar Lark, AST yang lebih jelas, interpreter normal, compiler VM resmi, format module .idsm, format compiled bytecode .idsc, builtin runtime, dan CLI publik bernama idscript. Tujuan awalnya bukan menggantikan bahasa pemrograman besar yang sudah ada, melainkan menyediakan ruang eksperimen serius untuk bahasa pemrograman yang lebih mudah dibaca oleh penutur Indonesia.

Status Proyek

  • Status saat ini: prototype / pre-alpha.
  • Interpreter normal tersedia melalui package IDScript.compile.
  • Compiler dan VM resmi tersedia melalui package IDScript.compile.Compiler.
  • CLI publik tersedia melalui command idscript.
  • Beberapa fitur bahasa sudah berjalan di interpreter normal, tetapi belum semuanya stabil di VM resmi.
  • File .idbc dari format lama masih dibaca sebagai kompatibilitas legacy.

Kebutuhan

  • Python 3.13 atau lebih baru.
  • click untuk CLI.
  • lark untuk parser.
  • typeguard untuk validasi tipe runtime.

Instalasi Lokal

python -m pip install -e .

Dengan dependency pengembangan:

python -m pip install -e .[dev]

CLI

Format utama command:

idscript <file> {-m|--module,-c|--bytecode,--both} <outputFile>

Menjalankan source dengan interpreter normal tanpa menghasilkan .idsm atau .idsc:

idscript program.ids

Menulis IDScript Module .idsm:

idscript program.ids -m build/program
idscript program.ids --module build/program.idsm

Menulis IDScript Compiled bytecode .idsc:

idscript program.ids -c build/program
idscript program.ids --bytecode build/program.idsc

Menulis .idsm dan .idsc sekaligus:

idscript program.ids --both build/program

Menjalankan entrypoint selain utama:

idscript program.ids --main jalankan

Menampilkan bantuan CLI:

idscript --help
python -m IDScript --help

Format File

  • .ids: file source IDScript yang ditulis manusia.
  • .idsm: IDScript Module, hasil kompilasi tahap pertama yang masih deskriptif/readable untuk VM resmi.
  • .idsc: IDScript Compiled, bytecode final yang opcode-nya dikodekan memakai token registry VM.
  • .idbc: format bytecode lama dari VMCompiler, hanya dipertahankan untuk kompatibilitas baca.

Contoh alur:

idscript app.ids --module app.idsm
idscript app.ids --bytecode app.idsc
idscript app.idsc

Aturan Import

  • Import path yang diawali . dibaca relatif dari file pemanggil.
  • Import path yang tidak diawali . diarahkan ke folder builtin IDScript.
  • Contoh import file lokal: dari "./math.ids" impor { var tambah };.
  • Contoh import builtin: dari "iterasi.ids" impor { var panjang };.

Sintaks Dasar IDScript

Bagian ini menjelaskan bentuk sintaks utama yang didukung grammar saat ini. Contoh memakai tipe bawaan kapital seperti Angka, Teks, Float, Boolean, Kosong, dan Apapun.

Komentar

Komentar C/C++ diterima oleh grammar.

// komentar satu baris

/*
   komentar banyak baris
*/

Konstanta Global

KONSTANTA hanya boleh berada pada level luar/top-level.

KONSTANTA NILAI: Angka = 10;
publik KONSTANTA VERSI: Teks = "0.1.0";
privat KONSTANTA RAHASIA: Teks = "internal";

Catatan:

  • publik membuat simbol dapat diekspor dari module.
  • privat adalah default jika tidak ditulis.
  • Nilai konstanta tidak boleh diubah ulang.

Variabel Lokal

var membuat binding yang dapat diubah.

var nama: Teks = "Budi";
var umur: Angka = 20;
var kosong_opsional: ?Angka;

Catatan:

  • Jika nilai awal tidak diberikan, runtime mencoba membuat default value dari tipe.
  • ?Angka berarti nilai boleh Angka atau kosong.

Final Lokal

final membuat binding lokal yang tidak boleh diubah ulang.

final total: Angka = 100;
final label: Teks = "selesai";

Assignment

Assignment memakai operator =.

var nilai: Angka = 1;
nilai = nilai + 1;

var data: daftar[Angka] = [1, 2, 3];
data[0] = 9;

Return

kembalikan mengembalikan nilai dari fungsi atau metode.

fungsi ambil(): Angka {
    kembalikan 7;
}

fungsi ambil_lagi(): Angka {
    kembalikan(7);
}

Throw / Kesalahan

kesalahan melempar error dari dalam fungsi.

fungsi gagal(): Teks {
    kesalahan "terjadi kesalahan";
}

Break Dan Continue

berhentikan keluar dari loop. lanjutkan melanjutkan iterasi berikutnya.

fungsi hitung(): Angka {
    var total: Angka = 0;

    untuk (var angka dari dalam [1, 2, 3, 4]) {
        jika (angka == 2) { lanjutkan; }
        jika (angka == 4) { berhentikan; }
        total = total + angka;
    }

    kembalikan total;
}

Fungsi

Fungsi memakai keyword fungsi.

fungsi tambah(a: Angka, b: Angka): Angka {
    kembalikan a + b;
}

publik fungsi utama(): Angka {
    kembalikan tambah(2, 3);
}

Catatan:

  • Entrypoint default adalah fungsi utama().
  • Di interpreter normal, fungsi utama diperketat agar tidak menerima argumen dan mengembalikan Angka atau ?Angka.
  • Argumen dapat diberi final untuk membuatnya tidak dapat diubah ulang.
fungsi kali(final a: Angka, final b: Angka): Angka {
    kembalikan a * b;
}

If / Elif / Else

Percabangan memakai jika, namun jika, dan jika tidak.

fungsi nilai_status(nilai: Angka): Teks {
    jika (nilai > 80) {
        kembalikan "baik";
    } namun jika (nilai > 60) {
        kembalikan "cukup";
    } jika tidak {
        kembalikan "kurang";
    }
}

Negasi memakai bukan.

fungsi cek(flag: Boolean): Angka {
    jika (bukan flag) {
        kembalikan 0;
    }
    kembalikan 1;
}

While

Loop selama berjalan selama kondisi bernilai benar.

fungsi sampai_lima(): Angka {
    var angka: Angka = 0;
    selama (angka < 5) {
        angka = angka + 1;
    }
    kembalikan angka;
}

For

Loop untuk membaca nilai dari iterable dengan pola dari dalam.

fungsi jumlah(): Angka {
    var total: Angka = 0;

    untuk (var angka dari dalam [1, 2, 3]) {
        total = total + angka;
    }

    kembalikan total;
}

Destructuring sederhana juga tersedia untuk target tuple/list.

fungsi jumlah_pasangan(): Angka {
    var total: Angka = 0;

    untuk (var (a, b) dari dalam [[1, 2], [3, 4]]) {
        total = total + a + b;
    }

    kembalikan total;
}

Try / Catch / Finally

Grammar mendukung coba, tangkap, jika tidak, dan diakhiri.

fungsi aman(): Angka {
    var nilai: Angka = 0;

    coba {
        kesalahan 5;
    } tangkap (e) {
        nilai = e;
    } jika tidak {
        nilai = 99;
    } diakhiri {
        nilai = nilai + 1;
    }

    kembalikan nilai;
}

Catatan:

  • Try/catch sudah ada di interpreter normal.
  • VM resmi belum menstabilkan semua perilaku Try.

Switch / Match

pilah digunakan untuk memilih kasus berdasarkan pattern.

fungsi pilih(x: Angka): Teks {
    pilah (x) {
        kasus 1:
            kembalikan "satu";
        kasus 2:
            kembalikan "dua";
        kasus bawaan:
            kembalikan "lain";
    }
}

Pattern sequence, mapping, struct, capture, dan dots tersedia di grammar.

fungsi total_data(): Angka {
    var total: Angka = 0;

    pilah ([1, 2, 3]) {
        kasus [kepala, ...ekor]:
            total = kepala + ekor[0] + ekor[1];
    }

    kembalikan total;
}

Import

Import memakai dari dan impor.

dari "./math.ids" impor { var tambah, konstan VERSI };
dari "./math.ids" impor { var tambah sebagai plus };
dari "./math.ids" impor *Apapun;

Import builtin tidak memakai awalan ./.

dari "iterasi.ids" impor { var panjang, var Daftar };
dari "atribut.ids" impor { var punya_attr };

Catatan:

  • var mengimpor nilai biasa.
  • konstan mengimpor sebagai binding konstan.
  • publik pada import membuat binding dapat diekspor ulang.
  • privat pada import membuat binding tidak diekspor ulang.
  • sebagai memberi alias.

Type Alias

tipe membuat alias tipe.

tipe ID = Angka
tipe Nama = Teks

fungsi ambil_id(): ID {
    kembalikan 7;
}

Alias tipe juga dapat memakai parameter dinamis.

tipe Kotak[T] = daftar[T]

Interface / Antarmuka

antarmuka mendeskripsikan bentuk kamus/object.

antarmuka User {
    nama: Teks,
    umur: Angka,
}

fungsi ambil_umur(user: User): Angka {
    kembalikan user["umur"];
}

Interface dapat dinyatakan publik atau privat.

publik antarmuka Response {
    status: Teks,
    data: Apapun,
}

Struktur

struktur mendefinisikan tipe data dengan field.

struktur Orang {
    publik nama: Teks,
    privat umur: Angka,
}

Catatan:

  • Field default adalah privat.
  • Field publik dapat diakses dari luar.
  • Field privat hanya dapat diakses dari konteks internal struktur.

Membuat instance struktur:

final budi: Orang = Orang { nama: "Budi", umur: 20 };

Struktur Turunan

turunan dari membuat struktur anak mewarisi field dan metode parent.

struktur Makhluk {
    publik nama: Teks,
}

struktur Orang {
    publik umur: Angka,
} turunan dari Makhluk

Catatan:

  • Field parent disalin ke prototype child.
  • Method parent disalin ke prototype child.
  • Field duplicate antara parent dan child menghasilkan error.
  • Method duplicate antara parent dan child menghasilkan error.
  • Tidak ada override implicit.

Implementasi Struktur

implementasi menambahkan metode ke struktur.

implementasi Orang {
    publik metode sapa(ini: Orang): Teks {
        kembalikan "Halo " + ini.nama;
    }
}

Catatan:

  • Parameter ini ditulis eksplisit.
  • Runtime mengikat instance ke parameter pertama saat metode dipanggil.
  • Metode default privat kecuali memakai publik.

Metode statik ditulis dengan statik.

implementasi Orang {
    publik statik metode buat_nama(nama: Teks): Teks {
        kembalikan nama;
    }
}

Sifat / Trait

sifat mendeklarasikan kontrak metode.

sifat BisaSapa {
    metode sapa(ini: Orang): Teks;
}

Implementasi trait ke struktur memakai implementasi Trait untuk Struktur.

implementasi BisaSapa untuk Orang {
    publik metode sapa(ini: Orang): Teks {
        kembalikan ini.nama;
    }
}

Catatan:

  • Runtime memeriksa method yang diwajibkan trait.
  • Nama argumen, tipe argumen, dan tipe return dibandingkan.
  • Method tambahan boleh ada selama method wajib terpenuhi.

Enum

enum mendefinisikan kumpulan variant.

enum Status {
    publik Aktif,
    publik Nonaktif,
}

Unit variant:

enum Gender {
    publik Pria,
    publik Wanita,
}

Tuple variant:

enum Data {
    publik Nomor(Angka),
    publik Pasangan(Teks, Angka),
}

Struct variant:

enum Event {
    publik Login { nama: Teks, umur: Angka },
}

Discriminant variant:

enum Kode {
    publik Oke = 200,
    publik Gagal = 500,
}

Enum juga dapat diberi metode.

implementasi Kode {
    publik metode nilai(ini: Apapun): Angka {
        kembalikan ini.value;
    }
}

Literal Dan Object

Literal dasar:

var teks: Teks = "halo";
var angka: Angka = 10;
var pecahan: Float = 3.14;
var flag: Boolean = benar;
var kosong_nilai: Kosong = kosong;

Daftar/list:

var angka: daftar[Angka] = [1, 2, 3];

Kamus/map:

var user: kamus[Teks, Apapun] = {"nama": "Budi", "umur": 20};

Expression

Call expression:

println("Halo");
var hasil: Angka = tambah(2, 3);

Attribute access:

var nama: Teks = user.nama;

Index access:

var pertama: Angka = [1, 2, 3][0];

Operator arithmetic:

var hasil: Angka = 1 + 2 * 3;
var pangkat: Angka = 2 ** 3;

Comparison:

jika (nilai >= 10) {
    println("besar");
}

Boolean:

jika (benar dan bukan salah) {
    println("oke");
}

Membership dan identity:

jika (2 didalam [1, 2, 3]) {
    println("ada");
}

jika (nilai bukanlah kosong) {
    println("berisi");
}

identifikasi mengambil nilai identifier secara eksplisit.

var angka: Angka = 7;
var salin: Angka = identifikasi angka;

info mengembalikan kategori runtime nilai.

var angka: Angka = 7;
jika (info angka == "Angka") {
    println("ini angka");
}

Kategori info mencakup antara lain Angka, Float, Boolean, Teks, Kosong, Daftar, Kamus, Struktur, Enum, VarianEnum, Tipe, Antarmuka, Fungsi, dan Objek.

Type Annotation

Tipe dasar:

var nama: Teks = "Budi";
var umur: Angka = 20;
var rasio: Float = 1.5;
var aktif: Boolean = benar;
var kosong_nilai: Kosong = kosong;
var bebas: Apapun = "apa saja";

Optional type:

var mungkin: ?Angka = kosong;

List type:

var angka: daftar[Angka] = [1, 2, 3];

Dictionary type:

var data: kamus[Teks, Angka] = {"a": 1};

Function type:

var operasi: fungsi[[Angka, Angka], Angka];

Result type:

var hasil_operasi: hasil[Angka, Teks];

Union type:

var nilai: [Angka, Teks] = 1;

Literal type:

var mode: ["dev", "prod"] = "dev";

Dynamic type alias:

tipe Kotak[T] = daftar[T]
var angka: Kotak[Angka] = [1, 2, 3];

Contoh Program Lengkap

tipe Nama = Teks

struktur Orang {
    publik nama: Nama,
    publik umur: Angka,
}

sifat BisaSapa {
    metode sapa(ini: Orang): Teks;
}

implementasi BisaSapa untuk Orang {
    publik metode sapa(ini: Orang): Teks {
        kembalikan "Halo " + ini.nama;
    }
}

fungsi utama(): Angka {
    final budi: Orang = Orang { nama: "Budi", umur: 20 };
    println(budi.sapa());

    jika (info budi == "Struktur") {
        println("Budi adalah struktur Orang");
    }

    kembalikan budi.umur;
}

Struktur Project

  • src/IDScript/__main__.py: CLI publik idscript.
  • src/IDScript/gramm.lark: grammar utama IDScript.
  • src/IDScript/compile/entrypoint.py: entrypoint interpreter normal.
  • src/IDScript/compile/ids_ast: definisi AST.
  • src/IDScript/compile/parser: transformer parse tree ke AST.
  • src/IDScript/compile/runtime: interpreter normal dan runtime model.
  • src/IDScript/compile/Compiler: compiler VM resmi, bytecode, dan VM runtime.
  • src/IDScript/builtins: builtin yang ditulis dalam IDScript.
  • src/IDScript/compile/testing: test interpreter normal dan CLI.
  • src/IDScript/compile/Compiler/testing: test compiler dan VM resmi.

Verifikasi

Jalankan test dari folder src/IDScript/compile:

python -m pytest testing/test_cli.py Compiler/testing/test_compiler.py -q
python -m pytest testing/test_compile.py testing/test_struct_runtime.py -q -k 'not test_compile_example_file'

Catatan saat ini:

  • Test VM dan CLI berjalan dengan command di atas.
  • Test normal runtime penuh masih membutuhkan Example/main.ids pada root project.
  • Folder Example/ sebaiknya diisi kembali sebelum rilis publik final.

Lisensi

Lisensi belum ditentukan di metadata package. Sebelum publish ke index publik, tentukan lisensi proyek terlebih dahulu.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

idscript-0.1.0.tar.gz (57.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

idscript-0.1.0-py3-none-any.whl (64.5 kB view details)

Uploaded Python 3

File details

Details for the file idscript-0.1.0.tar.gz.

File metadata

  • Download URL: idscript-0.1.0.tar.gz
  • Upload date:
  • Size: 57.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for idscript-0.1.0.tar.gz
Algorithm Hash digest
SHA256 261b1f2a646486a7624de88c86d9b6ad8aa3c4446776cad8d16d560a054eaaa3
MD5 93ad64954d1ea6b5d118e9fca3a838fc
BLAKE2b-256 1fe7b70997d4073310527d202c5dde994044c2568a3d2f0384d5468c2eec6940

See more details on using hashes here.

File details

Details for the file idscript-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: idscript-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 64.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for idscript-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 65dfae05cd8ab04e82929a473d851e95f2b1391a878124d9b6ba70f46113b5f0
MD5 b7a07654652fe8a5b95958527d42add6
BLAKE2b-256 e1b17b27dae21af0da422097f3feea0326ce457f58dd3d0e2423004507c65f2d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page