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
- Pembuat: Elang MRJ
- Username GitHub:
Elang-elang - Email:
elangmuhamad888@gmail.com - Repository IDScript: https://github.com/Elang-elang/IDScript
- Repository Indonesian Script (IS): https://github.com/Elang-elang/indonesian_script
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
.idbcdari format lama masih dibaca sebagai kompatibilitas legacy.
Kebutuhan
- Python 3.13 atau lebih baru.
clickuntuk CLI.larkuntuk parser.typeguarduntuk 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:
publikmembuat simbol dapat diekspor dari module.privatadalah 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.
?Angkaberarti nilai bolehAngkaataukosong.
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 utamadiperketat agar tidak menerima argumen dan mengembalikanAngkaatau?Angka. - Argumen dapat diberi
finaluntuk 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:
varmengimpor nilai biasa.konstanmengimpor sebagai binding konstan.publikpada import membuat binding dapat diekspor ulang.privatpada import membuat binding tidak diekspor ulang.sebagaimemberi 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
publikdapat diakses dari luar. - Field
privathanya 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
iniditulis 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 publikidscript.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.idspada 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
261b1f2a646486a7624de88c86d9b6ad8aa3c4446776cad8d16d560a054eaaa3
|
|
| MD5 |
93ad64954d1ea6b5d118e9fca3a838fc
|
|
| BLAKE2b-256 |
1fe7b70997d4073310527d202c5dde994044c2568a3d2f0384d5468c2eec6940
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65dfae05cd8ab04e82929a473d851e95f2b1391a878124d9b6ba70f46113b5f0
|
|
| MD5 |
b7a07654652fe8a5b95958527d42add6
|
|
| BLAKE2b-256 |
e1b17b27dae21af0da422097f3feea0326ce457f58dd3d0e2423004507c65f2d
|