Skip to main content

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

Reason this release was yanked:

Because Has MisInformation

Project description

IDScript

IDScript

Bahasa pemrograman berbahasa Indonesia dengan interpreter, compiler VM, dan bytecode resmi.

IDScript / IDS = I[n]D[onesian] Script atau ringkasnya I[n]D[o] Script.

Mulai CepatCLIFormat FileSintaksVMLisensi


Tentang

Info Nilai
Pembuat Elang MRJ
GitHub Elang-elang
Email elangmuhamad888@gmail.com
Repository https://github.com/Elang-elang/IDScript
Pendahulu Indonesian Script / IS
Status Prototype / pre-alpha
Python >=3.13
Latar Belakang Singkat

IDScript lahir sebagai kelanjutan dari Indonesian Script atau IS, sebuah proyek bahasa pemrograman berbahasa Indonesia yang sebelumnya dibuat sebagai prototype dan kemudian terbengkalai. IS membuktikan 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 itu dengan fondasi baru: grammar Lark, AST, interpreter normal, compiler VM resmi, format module .idsm, format compiled bytecode .idsc, builtin runtime, dan CLI publik bernama idscript.


Mulai Cepat

Instalasi Lokal
python -m pip install -e .

Dengan dependency pengembangan:

python -m pip install -e .[dev]
Program Pertama
fungsi utama(): Angka {
    println("Halo dari IDScript");
    kembalikan 0;
}

Jalankan:

idscript main.ids

CLI idscript

Format utama:

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

Tanpa flag compile, idscript menjalankan interpreter normal dan tidak membuat .idsm atau .idsc.

idscript program.ids

Entrypoint default adalah utama. Entrypoint lain dapat dipilih dengan --main.

idscript program.ids --main jalankan
Mode Module `.idsm`
idscript program.ids -m build/program
idscript program.ids --module build/program.idsm

Jika outputFile tidak punya suffix, CLI otomatis memakai .idsm.

Mode Bytecode `.idsc`
idscript program.ids -c build/program
idscript program.ids --bytecode build/program.idsc

Mode ini menulis .idsc saja dan tidak membuat .idsm sebagai side effect.

Mode Both
idscript program.ids --both build/program

Output:

build/program.idsm
build/program.idsc
Menjalankan Bytecode

File .idsm, .idsc, dan .idbc dapat diberikan langsung ke CLI.

idscript build/program.idsc

Format File

Format Fungsi
.ids Source IDScript yang ditulis manusia.
.idsm IDScript Module, format module VM yang masih deskriptif/readable.
.idsc IDScript Compiled, bytecode final yang opcode-nya dikodekan.
.idbc Bytecode legacy dari VMCompiler lama, hanya kompatibilitas baca.
Alur Compile
program.ids -> program.idsm -> program.idsc -> VM

Contoh:

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

Aturan Import

Bentuk Import Resolusi Path
dari "./mod.ids" impor ... Relatif ke file pemanggil.
dari "../mod.ids" impor ... Relatif ke file pemanggil.
dari "iterasi.ids" impor ... Folder builtin IDScript/builtins.
dari "atribut.ids" impor ... Folder builtin IDScript/builtins.
dari "./math.ids" impor { var tambah, konstan VERSI };
dari "./math.ids" impor { var tambah sebagai plus };
dari "iterasi.ids" impor { var panjang, var Daftar };

Panduan Sintaks

Bagian ini dibuat sebagai referensi cepat. Buka bagian yang dibutuhkan saja.

Tipe Bawaan
Tipe IDScript Makna Runtime
Teks String
Angka Integer
Float Float
Boolean Boolean
Kosong kosong / None
Apapun Nilai bebas
OBJEK Alias object Python untuk kebutuhan builtin
var nama: Teks = "Budi";
var umur: Angka = 20;
var rasio: Float = 1.5;
var aktif: Boolean = benar;
var nihil: Kosong = kosong;
var bebas: Apapun = [1, "dua", benar];
Komentar
// komentar satu baris

/*
   komentar banyak baris
*/
Konstanta `KONSTANTA`
KONSTANTA NILAI: Angka = 10;
publik KONSTANTA VERSI: Teks = "0.1.0";
privat KONSTANTA RAHASIA: Teks = "internal";

Catatan:

  • KONSTANTA hanya ada di top-level.
  • publik berarti dapat diekspor dari module.
  • Default visibility adalah privat.
Variabel `var` dan Final `final`
var nilai: Angka = 1;
nilai = nilai + 1;

final total: Angka = 100;

Optional type:

var mungkin: ?Angka = kosong;
Return, Throw, Break, Continue
fungsi ambil(): Angka {
    kembalikan 7;
}

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

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 tambah(a: Angka, b: Angka): Angka {
    kembalikan a + b;
}

fungsi kali(final a: Angka, final b: Angka): Angka {
    kembalikan a * b;
}

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

Catatan:

  • Entrypoint default adalah fungsi utama().
  • Interpreter normal memperketat utama agar tidak menerima argumen dan mengembalikan Angka atau ?Angka.
If / Elif / Else
fungsi 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;
}

Di VM, jika (bukan x) dikompilasi ke TO_BOOL lalu POP_JUMP_IF_TRUE.

Loop `selama` dan `untuk`
fungsi sampai_lima(): Angka {
    var angka: Angka = 0;
    selama (angka < 5) {
        angka = angka + 1;
    }
    kembalikan angka;
}
fungsi jumlah(): Angka {
    var total: Angka = 0;
    untuk (var angka dari dalam [1, 2, 3]) {
        total = total + angka;
    }
    kembalikan total;
}

Destructuring target:

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 / Else / Finally
fungsi aman(): Angka {
    var nilai: Angka = 0;

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

    kembalikan nilai;
}

Semantik mengikuti model Python:

  • Blok coba dijalankan lebih dulu.
  • Blok tangkap berjalan jika ada error.
  • Blok jika tidak berjalan hanya jika tidak ada error.
  • Blok diakhiri selalu berjalan, termasuk sebelum kembalikan keluar dari blok coba.

Catatan VM:

  • VM resmi sudah mendukung coba/tangkap/jika tidak/diakhiri melalui opcode SETUP_TRY.
  • Handler pertama menangani error yang dilempar oleh kesalahan atau exception runtime.
Switch / Match `pilah`
fungsi pilih(x: Angka): Teks {
    pilah (x) {
        kasus 1:
            kembalikan "satu";
        kasus 2:
            kembalikan "dua";
        kasus bawaan:
            kembalikan "lain";
    }
}

Pattern sequence:

fungsi total_data(): Angka {
    var total: Angka = 0;
    pilah ([1, 2, 3]) {
        kasus [kepala, ...ekor]:
            total = kepala + ekor[0] + ekor[1];
    }
    kembalikan total;
}
Type Alias `tipe`
tipe ID = Angka
tipe Nama = Teks

fungsi ambil_id(): ID {
    kembalikan 7;
}

Dynamic alias:

tipe Kotak[T] = daftar[T]
var angka: Kotak[Angka] = [1, 2, 3];
Antarmuka `antarmuka`
antarmuka User {
    nama: Teks,
    umur: Angka,
}

fungsi ambil_umur(user: User): Angka {
    kembalikan user["umur"];
}
Struktur, Turunan, Implementasi, dan Sifat

Struktur:

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

Turunan:

struktur Makhluk {
    publik nama: Teks,
}

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

Implementasi metode:

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

Sifat / trait:

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

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

Aturan penting:

  • Field default privat.
  • Duplicate field saat turunan menghasilkan error.
  • Duplicate method saat turunan menghasilkan error.
  • Tidak ada override implicit.
  • Trait memvalidasi nama argumen, tipe argumen, dan return type.
Enum

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,
}

Metode enum:

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

Literal:

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

List dan kamus:

var angka: daftar[Angka] = [1, 2, 3];
var user: kamus[Teks, Apapun] = {"nama": "Budi", "umur": 20};

Call, attribute, dan index:

println("Halo");
var nama: Teks = user.nama;
var pertama: Angka = [1, 2, 3][0];

Operator:

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

Boolean dan comparison:

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

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

identifikasi dan info:

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

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

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

Type Annotation Lanjutan
var mungkin: ?Angka = kosong;
var angka: daftar[Angka] = [1, 2, 3];
var data: kamus[Teks, Angka] = {"a": 1};
var operasi: fungsi[[Angka, Angka], Angka];
var hasil_operasi: hasil[Angka, Teks];
var nilai: [Angka, Teks] = 1;
var mode: ["dev", "prod"] = "dev";

Contoh Program Lengkap

Buka contoh
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;
}

Compiler VM

Opcode bergaya Python

VM resmi memakai opcode eksplisit agar mudah dibaca dan didebug.

Lama Baru
CONST LOAD_CONST
LOAD LOAD_NAME
STORE STORE_NAME
STORE_LOCAL STORE_FAST
POP POP_TOP
BINARY BINARY_OP
COMPARE COMPARE_OP
JUMP JUMP_ABSOLUTE
JUMP_IF_FALSE POP_JUMP_IF_FALSE
CALL CALL_FUNCTION
RETURN RETURN_VALUE

Opcode lama tetap didukung sebagai alias untuk kompatibilitas.

Contoh bytecode konseptual if/else
LOAD_NAME pi
TO_BOOL
POP_JUMP_IF_FALSE L_else

LOAD_NAME pi
STORE_NAME Pi
JUMP_ABSOLUTE L_end

L_else:
LOAD_CONST 0
STORE_NAME Pi

L_end:
LOAD_CONST None
RETURN_VALUE

Catatan: label seperti L_else hanya simbol disassembler/compiler. Runtime tetap memakai offset angka.


Struktur Project

Path Fungsi
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.

Verifikasi

Jalankan 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:

  • 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

IDScript menggunakan MIT License.

Ringkasan Lisensi
  • Kamu boleh memakai, menyalin, memodifikasi, menggabungkan, mempublish, mendistribusikan, sublicense, dan menjual IDScript.
  • Kamu boleh memakai IDScript untuk proyek pribadi, pendidikan, riset, maupun komersial.
  • Copyright notice dan permission notice MIT harus tetap disertakan pada salinan atau bagian substantial dari software.
  • IDScript diberikan apa adanya, tanpa garansi apa pun.
  • Pembuat dan pemegang hak cipta tidak bertanggung jawab atas klaim, kerusakan, atau masalah lain dari penggunaan IDScript.

Lihat file LICENSE.md untuk teks lengkap.

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.3.tar.gz (117.1 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.3-py3-none-any.whl (124.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: idscript-0.1.3.tar.gz
  • Upload date:
  • Size: 117.1 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.3.tar.gz
Algorithm Hash digest
SHA256 75d85adb574d8d8298dda9537ebf1d38c24963d0757cbca0b5f209f1363f28bf
MD5 17f23ca62a0c4a9c1880038f818f8039
BLAKE2b-256 b345d0dfba244f8804e1c6b7efe4d326679ea9e63870c91005374c73c44a3dd9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: idscript-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 124.3 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 9c019374a93e02ca688943b083fb43e854a31803fe57b4196c508310098d0b61
MD5 c3edaea457f2858b293cabae7a02813c
BLAKE2b-256 0a58db2242eae0676ca596fb920b76f50520cb133e673af1587501b514f7fed6

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