English
This repository is the original and first repository of the EnderScript project. Other repositories are supporting repositories only and cannot be claimed as the original EnderScript project repository.
EnderScript programs compile straight to machine code, with no interpreter, VM, garbage collector, or large runtime. The compiler also applies optimizations aimed at loops and arithmetic: constant division without idiv, loop counters kept in registers, branchless conditions, SIMD, and loops computed directly with a closed formula.
Benchmark results on Windows x64:
| Workload | EnderScript | Rust | Hand-written assembly |
|---|---|---|---|
| lcg | 345 ms | 531 ms | 1020 ms |
| fizz | 225 ms | 382 ms | - |
| mod7 | 120 ms | 215 ms | - |
| modchain | 259 ms | - | 285 ms |
All four benchmarks are loop and int arithmetic workloads.
- The Windows x64 compiler is only 47 KB.
- The program
print>>"halo"becomes a 2.5 KB exe. - The compiler writes the PE or ELF file itself, so building a program needs no assembler, linker, or other toolchain.
- The type is attached to the name:
umur.int = 17. - Readable words:
is,isnot,and,or,elif.==and!=also work. - Short form:
if a or b is 3:meansa is 3 or b is 3. print>>andshow>>for output, with values inserted through{ }.loops(n):repeats n times without a variable, and staged loops run several blocks in order.- No
main,import, or semicolons.
- Types are checked before the program runs.
- Error messages give the file, line, and column.
- Int overflow always wraps, and division by zero is reported with its line number.
The same syntax and results on Windows and Linux, for x64, x86, and ARM64.
Functions and decimal numbers.
This branch builds the EnderScript compiler for Windows x64. The compiler is written in assembly and produces PE32+ executables directly, without an external assembler or linker.
Requirements: NASM, GCC (MinGW-w64).
.\build.ps1
The result is ender.exe.
.\ender.exe <file.es>
.\ender.exe examine <file.es>
.\ender.exe run <file.es>
.\ender.exe --version
.\ender.exe --help
ender <file.es> builds the program into the .ender folder and runs it. examine checks syntax, semantics, and types and runs code generation without writing a file. run runs the program built earlier in .ender without building it again.
Save as main.es:
nama.str = "Ender"
umur.int = 17
aktif.bool = true
print>>"halo "{nama}", umur "{umur}
if umur >= 17 and aktif is true:
print>>"dewasa"
elif umur > 12:
print>>"remaja"
else :
print>>"anak"
jumlah.int = 0
for i in range(5):
jumlah = jumlah + i
print>>"jumlah "{jumlah}
Run it with ender main.es. Output:
halo Ender, umur 17
dewasa
jumlah 15
A variable is declared with name.type = value. There are three types:
| Type | Contents | Default when empty |
|---|---|---|
int |
Signed 32-bit integer, -2147483648 to 2147483647 | 0 |
str |
Text up to 65535 bytes | null |
bool |
true or false |
false |
a.str = "DATA"
a2.str = 'DATA'
a3.str = `DATA`
b.int = 12
c.int = -7
d.bool = true
z.int =
An existing variable is reassigned without writing its type:
b = 30
b =
k.int = b
b = resets b to its default value. k.int = b copies the value of another variable of the same type. Declaring a variable again with the same type only gives a warning, and the last declaration wins. Declaring it again with a different type is an error.
A variable name starts with a letter or _, followed by letters, digits, or _, up to 64 characters. Keywords cannot be used as names.
| Command | Newline at the end |
|---|---|
print>> |
Yes |
print.s>> |
Yes, same as print>> |
show>> |
No |
print>>"Hello World"
print.s>>'Hello World'
show>>`Hello World`
print>>10
print>>true
print>>b
print>>"umur : "{b}" tahun"
print>>""
- Strings can be written with
"...",'...', or`...`. All three are the same and support the escapes `\n \t \r \0 \ " ' ``. - To combine text and values, write the parts in order and wrap values in
{ }.print>>"a" bis an error; the correct form isprint>>"a"{b}. - An empty
strprints asnull. An empty line is printed withprint>>"".
a.int = 1 + 2 * 3
b.int = (a - 4) * -2
a = a + 1
c.int = a / 2 % 3
print>>"hasil : "{a * b}
- Operators
+ - * / %, unary minus, and parentheses.* / %are evaluated before+ -. - All operands must be
int. Results beyond the 32-bit range wrap around. /and%truncate toward zero:-10 / 3is-3and-10 % 3is-1.- Division by zero found at compile time is an error. If it happens while the program runs, the program prints
runtime error: division by zero on line Nand exits with code 1. - Decimal numbers are not supported yet.
if a is "ka":
print>>"satu"
elif a == "kb" or a == "kc":
print>>"dua"
else :
print>>"lain"
if x > 3 and y <= 10:
print>>"masuk"
if a or b is "Hellowin":
print>>"salah satu"
| Operator | Meaning | Types |
|---|---|---|
is, == |
equal | int, str, bool |
isnot, != |
not equal | int, str, bool |
<, >, <=, >= |
comparison | int |
and |
both sides are true | conditions |
or |
one or both sides are true | conditions |
andbinds tighter thanor. Evaluation stops as soon as the result is known.- Short form:
x or y is Zmeansx is Z or y is Z, andx and y is Zmeansx is Z and y is Z. - Strings are compared by content and can be compared with
null. if,elif, andelselines end with:. The block body is indented deeper. Any number of spaces works as long as it is the same within one block, and tabs cannot be mixed with spaces.elifandelseare written at the same indentation as theirif, right after the previous block.- Inside a block,
intandboolvariables can only be reassigned if they were declared before the block. Declaring a newstrinside a block is not allowed.
for i in range(10):
print>>i
loops(3):
print>>"ulang"
for v in range(n):runs the block withv= 1, 2, up to n. When the loop finishes,vholds n. At the top level,vis created as anintautomatically.loops(n):runs the block n times without a variable.nis evaluated once at the start. If n ≤ 0, the block does not run.- Loops and
ifcan be nested.
loops(adv,
start.adv
100(
print>>"halo"
)
200(
print>>"hello"
)
stop.adv
)
loops(name,opens a staged loop, followed bystart.name. The loop is closed withstop.nameand then).nameis only a label.- Between
startandstoponlyN(to)blocks are allowed. Each block runs N times, in order from the top. The example above printshalo100 times and thenhello200 times. - Block bodies are delimited by parentheses, so indentation is not required.
for i in range(100):
if i is 5:
break
print>>i
for j in range(10):
if j % 2 is 0:
continue
print>>j
breakstops the innermost loop, andcontinuejumps straight to the next iteration. Both work infor,loops, andN(blocks.- After
breakin aforloop, the loop variable holds the value it had when the loop stopped. - In a staged loop,
breakonly stops the runningN(block.break.namestops the whole staged loopname.
loops(adv,
start.adv
3(
print>>adv.takedata
)
2(
print>>"b"{adv.takedata}
break.adv
)
stop.adv
)
name.takedataholds the N of theN(block that is running in the staged loopname. The example above prints3three times, thenb2once beforebreak.adv.- Outside a block, its value is 0.
nama.str = input>>"Siapa namamu? "
umur.int = input>>"Umur: "
print>>"Halo "{nama}", tahun depan umurmu "{umur + 1}
x.str = input>>"text"prints the text without a newline, then reads one line from the keyboard or stdin.x = input>>"text"reassigns an existing variable, andx.str = inputreads without a prompt.- The prompt is written like
show>>, so it can contain values in{ }. - For an
intvariable, the number is read from the start of the line (spaces and a-or+sign are allowed). If there is no number, the result is 0. - An empty line gives
"". When the input has ended, astrgetsnulland anintgets 0. - A
boolvariable cannot be read from input.
nilai.int[5] = 10, 20, 30
nama.str[3] = "Andi", "Budi"
aktif.bool[4] = true.all
print>>nilai[1]
print>>"jumlah elemen: "{nilai.len}
nilai[4] = 40
total.int = 0
for i in range(nilai.len):
total = total + nilai[i]
print>>"total "{total}
nama[3] = input>>"Nama ketiga? "
print>>nama[3]
name.type[N] = valuesdeclares an array with N elements. N is a whole number from 1 to 1048576 and must be written, soa.int[] =is an error.- Elements are numbered from 1:
nilai[1]is the first element andnilai[nilai.len]is the last. - Values are separated by commas and fill the array from the first element. Elements without a value get the default of the type (
0,null, orfalse). More values than elements is an error. - A single value followed by
.all, such astrue.all, goes into every element.aktif.bool[4] = trueonly sets the first element. name[index] = valuechanges one element, andname[index] =resets it to the default.name[index] = input>>"..."reads one element of typeintorstr.- An element can be used anywhere a value of its type is allowed: in arithmetic, in conditions, inside
{ }inprint>>, and as the value of another variable. name.lenis the number of elements. It is known at compile time.- An index written as a number is checked by the compiler, for example
index 6 is outside 1..5 of array 'nilai'. An index computed while the program runs is checked at run time. If it is out of range, the program printsruntime error: array index out of range on line Nto stderr and exits with code 1. - Arrays are declared at the top level, not inside
ifor a loop. Declaring the same array again with the same type and size gives a warning and resets every element. - Inside a
forloop, an index such asithat the compiler can prove is in range is used without the run-time check.
- One statement per line. Empty lines are ignored.
- Comments start with
//and run to the end of the line. - The program runs from the first line to the last, without a
mainfunction. - Keywords:
print show int str bool true false null if elif else is isnot and or for in range loops break continue input.
The compiler stops at the first error with the format file:line:col: kind error: message. Example:
main.es:2:1: semantic error: variable 'a' is already declared as an int variable
Warnings do not stop the build and use the format file:line:col: warning: message.
Apache License 2.0. See LICENSE.
Copyright 2026 iRELDevz
Bahasa Indonesia
Repository ini adalah repository original dan awal dari project EnderScript. Repository lain hanya repository pendukung dan tidak bisa diklaim sebagai repository original project EnderScript.
Program EnderScript dikompilasi langsung ke kode mesin, tanpa interpreter, VM, garbage collector, atau runtime besar. Compiler-nya juga melakukan optimasi khusus untuk loop dan aritmetika: pembagian konstanta tanpa idiv, penghitung loop di register, kondisi tanpa lompatan, SIMD, dan loop yang dihitung langsung dengan rumus.
Hasil benchmark di Windows x64:
| Beban | EnderScript | Rust | Assembly tulisan tangan |
|---|---|---|---|
| lcg | 345 ms | 531 ms | 1020 ms |
| fizz | 225 ms | 382 ms | - |
| mod7 | 120 ms | 215 ms | - |
| modchain | 259 ms | - | 285 ms |
Keempat benchmark ini adalah beban loop dan aritmetika int.
- Compiler Windows x64 hanya 47 KB.
- Program
print>>"halo"menjadi exe 2,5 KB. - Compiler menulis file PE atau ELF sendiri, jadi build program tidak butuh assembler, linker, atau toolchain lain.
- Tipe ditulis menempel pada nama:
umur.int = 17. - Kata yang mudah dibaca:
is,isnot,and,or,elif.==dan!=juga bisa. - Bentuk singkat:
if a or b is 3:artinyaa is 3 or b is 3. print>>danshow>>untuk output, dengan nilai disisipkan lewat{ }.loops(n):untuk mengulang n kali tanpa variabel, dan loop bertahap untuk beberapa blok berurutan.- Tidak perlu
main,import, atau titik koma.
- Tipe dicek sebelum program jalan.
- Pesan error menyebut file, baris, dan kolom.
- Overflow int selalu wrap, dan pembagian dengan nol dilaporkan beserta nomor barisnya.
Sintaks dan hasil yang sama di Windows dan Linux, untuk x64, x86, dan ARM64.
Fungsi dan bilangan desimal belum tersedia.
Branch ini membangun compiler EnderScript untuk Windows x64. Compiler ditulis dalam assembly dan langsung menghasilkan file executable PE32+ tanpa assembler atau linker eksternal.
Kebutuhan: NASM, GCC (MinGW-w64).
.\build.ps1
Hasilnya ender.exe.
.\ender.exe <file.es>
.\ender.exe examine <file.es>
.\ender.exe run <file.es>
.\ender.exe --version
.\ender.exe --help
ender <file.es> membangun program ke folder .ender lalu menjalankannya. examine memeriksa sintaks, semantik, dan tipe, lalu menjalankan pembuatan kode mesin tanpa menulis file. run menjalankan program yang sudah dibangun di .ender tanpa membangun ulang.
Simpan sebagai main.es:
nama.str = "Ender"
umur.int = 17
aktif.bool = true
print>>"halo "{nama}", umur "{umur}
if umur >= 17 and aktif is true:
print>>"dewasa"
elif umur > 12:
print>>"remaja"
else :
print>>"anak"
jumlah.int = 0
for i in range(5):
jumlah = jumlah + i
print>>"jumlah "{jumlah}
Lalu jalankan dengan ender main.es. Outputnya:
halo Ender, umur 17
dewasa
jumlah 15
Variabel dideklarasikan dengan nama.tipe = nilai. Ada tiga tipe:
| Tipe | Isi | Default kalau kosong |
|---|---|---|
int |
Integer 32-bit bertanda, -2147483648 sampai 2147483647 | 0 |
str |
Teks sampai 65535 byte | null |
bool |
true atau false |
false |
a.str = "DATA"
a2.str = 'DATA'
a3.str = `DATA`
b.int = 12
c.int = -7
d.bool = true
z.int =
Variabel yang sudah ada diisi ulang tanpa menulis tipenya:
b = 30
b =
k.int = b
b = mengembalikan b ke nilai default. k.int = b menyalin nilai dari variabel lain yang tipenya sama. Deklarasi ulang dengan tipe yang sama hanya memberi warning, dan deklarasi terakhir yang dipakai. Deklarasi ulang dengan tipe berbeda adalah error.
Nama variabel diawali huruf atau _, lalu boleh diikuti huruf, angka, atau _, maksimal 64 karakter. Keyword tidak bisa dipakai sebagai nama.
| Perintah | Baris baru di akhir |
|---|---|
print>> |
Ya |
print.s>> |
Ya, sama dengan print>> |
show>> |
Tidak |
print>>"Hello World"
print.s>>'Hello World'
show>>`Hello World`
print>>10
print>>true
print>>b
print>>"umur : "{b}" tahun"
print>>""
- String boleh ditulis dengan
"...",'...', atau`...`. Ketiganya sama dan mendukung escape `\n \t \r \0 \ " ' ``. - Untuk menggabungkan teks dan nilai, tulis bagian-bagiannya berurutan dan bungkus nilai dengan
{ }.print>>"a" badalah error, yang benarprint>>"a"{b}. stryang kosong dicetak sebagainull. Baris kosong dicetak denganprint>>"".
a.int = 1 + 2 * 3
b.int = (a - 4) * -2
a = a + 1
c.int = a / 2 % 3
print>>"hasil : "{a * b}
- Operator
+ - * / %, minus unary, dan kurung.* / %dihitung lebih dulu daripada+ -. - Semua operand harus
int. Hasil yang melewati batas 32-bit akan wrap. /dan%memotong ke arah nol:-10 / 3adalah-3dan-10 % 3adalah-1.- Pembagian dengan nol yang ketahuan saat compile adalah error. Kalau terjadi saat program jalan, program mencetak
runtime error: division by zero on line Nlalu keluar dengan exit code 1. - Bilangan pecahan belum didukung.
if a is "ka":
print>>"satu"
elif a == "kb" or a == "kc":
print>>"dua"
else :
print>>"lain"
if x > 3 and y <= 10:
print>>"masuk"
if a or b is "Hellowin":
print>>"salah satu"
| Operator | Arti | Tipe |
|---|---|---|
is, == |
sama | int, str, bool |
isnot, != |
tidak sama | int, str, bool |
<, >, <=, >= |
perbandingan | int |
and |
kedua sisi benar | kondisi |
or |
salah satu atau kedua sisi benar | kondisi |
andlebih kuat darior. Pengecekan berhenti begitu hasilnya sudah pasti.- Bentuk singkat:
x or y is Zartinyax is Z or y is Z, danx and y is Zartinyax is Z and y is Z. - Str dibandingkan isinya, dan boleh dibandingkan dengan
null. - Baris
if,elif, danelsediakhiri:. Isi blok ditulis menjorok lebih dalam. Jumlah spasinya bebas asal sama dalam satu blok, dan tab tidak boleh dicampur dengan spasi. elifdanelseditulis sejajar denganifpasangannya, tepat setelah blok sebelumnya.- Di dalam blok, variabel
intdanboolhanya boleh diisi ulang kalau sudah dideklarasikan sebelum blok. Deklarasistrbaru di dalam blok tidak boleh.
for i in range(10):
print>>i
loops(3):
print>>"ulang"
for v in range(n):menjalankan blok denganv= 1, 2, sampai n. Setelah loop selesai,vberisi n. Di tingkat atas,votomatis dibuat sebagaiint.loops(n):menjalankan blok n kali tanpa variabel.ndihitung sekali di awal. Kalau n ≤ 0, blok tidak dijalankan.- Loop dan
ifboleh bersarang.
loops(adv,
start.adv
100(
print>>"halo"
)
200(
print>>"hello"
)
stop.adv
)
loops(nama,membuka loop bertahap, lalu diikutistart.nama. Loop ditutup denganstop.namalalu).namahanya label.- Di antara
startdanstophanya boleh ada blokN(sampai). Setiap blok dijalankan N kali, berurutan dari atas. Contoh di atas mencetakhalo100 kali laluhello200 kali. - Isi blok dibatasi kurung, jadi tidak wajib menjorok.
for i in range(100):
if i is 5:
break
print>>i
for j in range(10):
if j % 2 is 0:
continue
print>>j
breakmenghentikan loop terdalam, sedangkancontinuelangsung lompat ke putaran berikutnya. Keduanya berlaku untukfor,loops, dan blokN(.- Setelah
breakdifor, variabel loop berisi nilai saat loop dihentikan. - Di loop bertahap,
breakhanya menghentikan blokN(yang sedang jalan.break.namamenghentikan seluruh loop bertahapnama.
loops(adv,
start.adv
3(
print>>adv.takedata
)
2(
print>>"b"{adv.takedata}
break.adv
)
stop.adv
)
nama.takedataberisi N dari blokN(yang sedang jalan di loop bertahapnama. Contoh di atas mencetak3tiga kali, lalub2sekali sebelumbreak.adv.- Di luar blok, nilainya 0.
nama.str = input>>"Siapa namamu? "
umur.int = input>>"Umur: "
print>>"Halo "{nama}", tahun depan umurmu "{umur + 1}
x.str = input>>"teks"mencetak teks tanpa baris baru, lalu membaca satu baris dari keyboard atau stdin.x = input>>"teks"mengisi ulang variabel yang sudah ada, danx.str = inputmembaca tanpa teks.- Teks pertanyaan ditulis seperti
show>>, jadi boleh berisi nilai dalam{ }. - Untuk variabel
int, angka dibaca dari awal baris (spasi dan tanda-atau+boleh). Kalau tidak ada angka, hasilnya 0. - Baris kosong menghasilkan
"". Kalau input sudah habis,strberisinulldanintberisi 0. - Variabel
booltidak bisa diisi dari input.
nilai.int[5] = 10, 20, 30
nama.str[3] = "Andi", "Budi"
aktif.bool[4] = true.all
print>>nilai[1]
print>>"jumlah elemen: "{nilai.len}
nilai[4] = 40
total.int = 0
for i in range(nilai.len):
total = total + nilai[i]
print>>"total "{total}
nama[3] = input>>"Nama ketiga? "
print>>nama[3]
nama.tipe[N] = nilaimembuat array berisi N elemen. N adalah bilangan bulat 1 sampai 1048576 dan wajib ditulis, jadia.int[] =adalah error.- Elemen dinomori mulai dari 1:
nilai[1]adalah elemen pertama dannilai[nilai.len]elemen terakhir. - Nilai dipisah koma dan mengisi array mulai dari elemen pertama. Elemen yang tidak diberi nilai berisi default tipenya (
0,null, ataufalse). Nilai yang lebih banyak dari jumlah elemen adalah error. - Satu nilai yang diikuti
.all, misalnyatrue.all, mengisi semua elemen.aktif.bool[4] = truehanya mengisi elemen pertama. nama[index] = nilaimengubah satu elemen, dannama[index] =mengembalikannya ke default.nama[index] = input>>"..."membaca satu elemen bertipeintataustr.- Elemen boleh dipakai di mana pun nilai bertipe sama boleh dipakai: di aritmetika, di kondisi, di dalam
{ }padaprint>>, dan sebagai isi variabel lain. nama.lenadalah jumlah elemen. Nilainya sudah diketahui saat compile.- Index yang ditulis sebagai angka dicek oleh compiler, misalnya
index 6 is outside 1..5 of array 'nilai'. Index yang dihitung saat program jalan dicek saat program jalan. Kalau di luar batas, program mencetakruntime error: array index out of range on line Nke stderr lalu keluar dengan exit code 1. - Array dideklarasikan di tingkat atas, tidak di dalam
ifatau loop. Deklarasi ulang array yang sama dengan tipe dan ukuran sama memberi warning dan mengosongkan semua elemen. - Di dalam loop
for, index sepertiiyang bisa dibuktikan compiler masih dalam batas dipakai tanpa pengecekan saat program jalan.
- Satu statement per baris. Baris kosong diabaikan.
- Komentar diawali
//sampai akhir baris. - Program berjalan dari baris pertama sampai terakhir, tanpa fungsi
main. - Keyword:
print show int str bool true false null if elif else is isnot and or for in range loops break continue input.
Compiler berhenti di error pertama dengan format file:line:col: jenis error: pesan. Contoh:
main.es:2:1: semantic error: variable 'a' is already declared as an int variable
Warning tidak menghentikan build dan ditulis dengan format file:line:col: warning: pesan.
Apache License 2.0. Lihat LICENSE.
Copyright 2026 iRELDevz
日本語
このリポジトリは EnderScript プロジェクトのオリジナルかつ最初のリポジトリです。他のリポジトリはサポート用のリポジトリにすぎず、EnderScript プロジェクトのオリジナルリポジトリであると主張することはできません。
EnderScript のプログラムはインタプリタ、VM、ガベージコレクタ、大きなランタイムなしで、直接機械語にコンパイルされます。さらにコンパイラはループと算術に特化した最適化を行います: idiv を使わない定数除算、レジスタに置かれるループカウンタ、分岐のない条件、SIMD、そして公式で直接計算されるループです。
Windows x64 でのベンチマーク結果:
| 処理 | EnderScript | Rust | 手書きアセンブリ |
|---|---|---|---|
| lcg | 345 ms | 531 ms | 1020 ms |
| fizz | 225 ms | 382 ms | - |
| mod7 | 120 ms | 215 ms | - |
| modchain | 259 ms | - | 285 ms |
4 つのベンチマークはすべてループと int 算術の処理です。
- Windows x64 版コンパイラはわずか 47 KB です。
print>>"halo"のプログラムは 2.5 KB の exe になります。- コンパイラが PE または ELF ファイルを自分で書き出すため、プログラムのビルドにアセンブラ、リンカ、その他のツールチェーンは不要です。
- 型は名前に付けて書きます:
umur.int = 17。 - 読みやすい単語:
is、isnot、and、or、elif。==と!=も使えます。 - 省略形:
if a or b is 3:はa is 3 or b is 3を意味します。 - 出力は
print>>とshow>>で、値は{ }で埋め込みます。 loops(n):は変数なしで n 回繰り返し、段階ループは複数のブロックを順番に実行します。main、import、セミコロンは不要です。
- 型はプログラムの実行前にチェックされます。
- エラーメッセージはファイル、行、列を示します。
- int のオーバーフローは常にラップし、ゼロ除算は行番号付きで報告されます。
Windows と Linux の x64、x86、ARM64 で、同じ構文と同じ結果になります。
関数と小数。
このブランチは Windows x64 向けの EnderScript コンパイラをビルドします。コンパイラはアセンブリで書かれており、外部のアセンブラやリンカを使わずに PE32+ 実行ファイルを直接生成します。
必要なもの: NASM, GCC (MinGW-w64)。
.\build.ps1
ender.exe が生成されます。
.\ender.exe <file.es>
.\ender.exe examine <file.es>
.\ender.exe run <file.es>
.\ender.exe --version
.\ender.exe --help
ender <file.es> はプログラムを .ender フォルダにビルドしてから実行します。examine は構文、意味、型をチェックし、ファイルを書かずにコード生成まで行います。run は .ender にビルド済みのプログラムを再ビルドせずに実行します。
main.es として保存します:
nama.str = "Ender"
umur.int = 17
aktif.bool = true
print>>"halo "{nama}", umur "{umur}
if umur >= 17 and aktif is true:
print>>"dewasa"
elif umur > 12:
print>>"remaja"
else :
print>>"anak"
jumlah.int = 0
for i in range(5):
jumlah = jumlah + i
print>>"jumlah "{jumlah}
ender main.es で実行します。出力:
halo Ender, umur 17
dewasa
jumlah 15
変数は 名前.型 = 値 で宣言します。型は 3 種類あります:
| 型 | 内容 | 空のときのデフォルト |
|---|---|---|
int |
符号付き 32 ビット整数、-2147483648 から 2147483647 | 0 |
str |
最大 65535 バイトのテキスト | null |
bool |
true または false |
false |
a.str = "DATA"
a2.str = 'DATA'
a3.str = `DATA`
b.int = 12
c.int = -7
d.bool = true
z.int =
既存の変数は型を書かずに再代入できます:
b = 30
b =
k.int = b
b = は b をデフォルト値に戻します。k.int = b は同じ型の別の変数の値をコピーします。同じ型で再宣言すると警告のみで、最後の宣言が使われます。異なる型で再宣言するとエラーになります。
変数名は英字または _ で始まり、その後に英字、数字、_ を続けられます。最大 64 文字です。キーワードは名前に使えません。
| コマンド | 末尾の改行 |
|---|---|
print>> |
あり |
print.s>> |
あり、print>> と同じ |
show>> |
なし |
print>>"Hello World"
print.s>>'Hello World'
show>>`Hello World`
print>>10
print>>true
print>>b
print>>"umur : "{b}" tahun"
print>>""
- 文字列は
"..."、'...'、`...`のいずれかで書けます。3 つとも同じで、エスケープ `\n \t \r \0 \ " ' `` に対応しています。 - テキストと値を組み合わせるには、各部分を順番に書き、値を
{ }で囲みます。print>>"a" bはエラーで、正しくはprint>>"a"{b}です。 - 空の
strはnullと表示されます。空行はprint>>""で表示します。
a.int = 1 + 2 * 3
b.int = (a - 4) * -2
a = a + 1
c.int = a / 2 % 3
print>>"hasil : "{a * b}
- 演算子
+ - * / %、単項マイナス、括弧が使えます。* / %は+ -より先に計算されます。 - すべてのオペランドは
intでなければなりません。32 ビットの範囲を超えた結果はラップアラウンドします。 /と%はゼロ方向に切り捨てます:-10 / 3は-3、-10 % 3は-1です。- コンパイル時に判明したゼロ除算はエラーです。実行中に発生した場合、プログラムは
runtime error: division by zero on line Nを表示して終了コード 1 で終了します。 - 小数はまだサポートされていません。
if a is "ka":
print>>"satu"
elif a == "kb" or a == "kc":
print>>"dua"
else :
print>>"lain"
if x > 3 and y <= 10:
print>>"masuk"
if a or b is "Hellowin":
print>>"salah satu"
| 演算子 | 意味 | 型 |
|---|---|---|
is、== |
等しい | int、str、bool |
isnot、!= |
等しくない | int、str、bool |
<、>、<=、>= |
比較 | int |
and |
両辺が真 | 条件 |
or |
どちらか一方または両方が真 | 条件 |
andはorより優先されます。結果が確定した時点で評価を止めます。- 省略形:
x or y is Zはx is Z or y is Z、x and y is Zはx is Z and y is Zを意味します。 - 文字列は内容で比較され、
nullと比較することもできます。 if、elif、elseの行は:で終わります。ブロックの中身はより深くインデントします。スペースの数は自由ですが、1 つのブロック内では同じにする必要があり、タブとスペースを混在させることはできません。elifとelseは対応するifと同じインデントで、直前のブロックのすぐ後に書きます。- ブロック内では、
intとboolの変数はブロックより前に宣言されている場合のみ再代入できます。ブロック内で新しいstrを宣言することはできません。
for i in range(10):
print>>i
loops(3):
print>>"ulang"
for v in range(n):はv= 1、2、…、n でブロックを実行します。ループが終わるとvは n になります。トップレベルではvは自動的にintとして作成されます。loops(n):は変数なしでブロックを n 回実行します。nは最初に 1 回だけ評価されます。n ≤ 0 の場合、ブロックは実行されません。- ループと
ifは入れ子にできます。
loops(adv,
start.adv
100(
print>>"halo"
)
200(
print>>"hello"
)
stop.adv
)
loops(名前,で段階ループを開始し、続けてstart.名前を書きます。ループはstop.名前の後に)を書いて閉じます。名前はラベルにすぎません。startとstopの間にはN(から)までのブロックのみ書けます。各ブロックは上から順に N 回実行されます。上の例はhaloを 100 回、次にhelloを 200 回表示します。- ブロックの中身は括弧で区切られるため、インデントは必須ではありません。
for i in range(100):
if i is 5:
break
print>>i
for j in range(10):
if j % 2 is 0:
continue
print>>j
breakは最も内側のループを終了し、continueはすぐに次の繰り返しへ進みます。どちらもfor、loops、N(ブロックで使えます。forでbreakした後、ループ変数は終了した時点の値を保持します。- 段階ループでは、
breakは実行中のN(ブロックだけを終了します。break.名前は段階ループ名前全体を終了します。
loops(adv,
start.adv
3(
print>>adv.takedata
)
2(
print>>"b"{adv.takedata}
break.adv
)
stop.adv
)
名前.takedataは段階ループ名前で実行中のN(ブロックの N を持ちます。上の例は3を 3 回表示し、break.advの前にb2を 1 回表示します。- ブロックの外では値は 0 です。
nama.str = input>>"Siapa namamu? "
umur.int = input>>"Umur: "
print>>"Halo "{nama}", tahun depan umurmu "{umur + 1}
x.str = input>>"テキスト"はテキストを改行なしで表示し、キーボードまたは stdin から 1 行読み込みます。x = input>>"テキスト"は既存の変数に再代入し、x.str = inputはプロンプトなしで読み込みます。- プロンプトは
show>>と同じ書き方なので、{ }で値を含められます。 int変数では、行の先頭から数値を読み取ります (空白と-または+の符号は使えます)。数値がなければ結果は 0 です。- 空行は
""になります。入力が終わっている場合、strはnull、intは 0 になります。 bool変数は入力から読み込めません。
nilai.int[5] = 10, 20, 30
nama.str[3] = "Andi", "Budi"
aktif.bool[4] = true.all
print>>nilai[1]
print>>"jumlah elemen: "{nilai.len}
nilai[4] = 40
total.int = 0
for i in range(nilai.len):
total = total + nilai[i]
print>>"total "{total}
nama[3] = input>>"Nama ketiga? "
print>>nama[3]
名前.型[N] = 値は N 個の要素を持つ配列を宣言します。N は 1 から 1048576 までの整数で、必ず書きます。a.int[] =はエラーです。- 要素の番号は 1 から始まります。
nilai[1]が最初の要素、nilai[nilai.len]が最後の要素です。 - 値はカンマで区切り、最初の要素から順に入ります。値のない要素は型のデフォルト (
0、null、false) になります。要素数より多い値はエラーです。 - 1 つの値の後に
.allを付けると (例:true.all)、すべての要素にその値が入ります。aktif.bool[4] = trueは最初の要素だけを設定します。 名前[index] = 値は 1 つの要素を変更し、名前[index] =はデフォルトに戻します。名前[index] = input>>"..."はintまたはstrの要素を 1 つ読み込みます。- 要素は同じ型の値が使える場所ならどこでも使えます。算術、条件、
print>>の{ }の中、別の変数の値などです。 名前.lenは要素数です。コンパイル時に決まります。- 数値で書いた index はコンパイラが検査します。例:
index 6 is outside 1..5 of array 'nilai'。実行中に計算される index は実行時に検査され、範囲外ならruntime error: array index out of range on line Nを stderr に出して終了コード 1 で終了します。 - 配列はトップレベルで宣言します。
ifやループの中では宣言できません。同じ型と同じサイズで同じ配列を再宣言すると warning が出て、すべての要素がリセットされます。 forループの中でiのように範囲内だとコンパイラが証明できる index は、実行時の検査なしで使われます。
- 1 行に 1 文です。空行は無視されます。
- コメントは
//から行末までです。 - プログラムは
main関数なしで、最初の行から最後の行まで実行されます。 - キーワード:
print show int str bool true false null if elif else is isnot and or for in range loops break continue input。
コンパイラは最初のエラーで停止し、file:line:col: 種類 error: メッセージ の形式で表示します。例:
main.es:2:1: semantic error: variable 'a' is already declared as an int variable
警告はビルドを止めず、file:line:col: warning: メッセージ の形式で表示されます。
Apache License 2.0。LICENSE を参照してください。
Copyright 2026 iRELDevz
简体中文
本仓库是 EnderScript 项目的原始和最初的仓库。其他仓库仅为辅助仓库,不能被声称为 EnderScript 项目的原始仓库。
EnderScript 程序直接编译为机器码,没有解释器、虚拟机、垃圾回收器或庞大的运行时。编译器还针对循环和算术做了专门优化: 不使用 idiv 的常量除法、保存在寄存器中的循环计数器、无分支条件、SIMD,以及用公式直接算出结果的循环。
Windows x64 上的基准测试结果:
| 负载 | EnderScript | Rust | 手写汇编 |
|---|---|---|---|
| lcg | 345 ms | 531 ms | 1020 ms |
| fizz | 225 ms | 382 ms | - |
| mod7 | 120 ms | 215 ms | - |
| modchain | 259 ms | - | 285 ms |
这四个基准测试都是循环和 int 算术负载。
- Windows x64 编译器只有 47 KB。
- 程序
print>>"halo"生成的 exe 只有 2.5 KB。 - 编译器自己写出 PE 或 ELF 文件,因此构建程序不需要汇编器、链接器或其他工具链。
- 类型直接写在名称后面:
umur.int = 17。 - 易读的单词:
is、isnot、and、or、elif。也可以用==和!=。 - 简写形式:
if a or b is 3:表示a is 3 or b is 3。 - 用
print>>和show>>输出,用{ }插入值。 loops(n):不用变量即可重复 n 次,分段循环可以按顺序运行多个代码块。- 不需要
main、import或分号。
- 程序运行前先检查类型。
- 错误信息会给出文件、行和列。
- int 溢出总是回绕,除以零会连同行号一起报告。
在 Windows 和 Linux 的 x64、x86、ARM64 上语法和结果都相同。
函数和小数。
此分支构建适用于 Windows x64 的 EnderScript 编译器。编译器用汇编语言编写,无需外部汇编器或链接器即可直接生成 PE32+ 可执行文件。
依赖: NASM, GCC (MinGW-w64)。
.\build.ps1
生成 ender.exe。
.\ender.exe <file.es>
.\ender.exe examine <file.es>
.\ender.exe run <file.es>
.\ender.exe --version
.\ender.exe --help
ender <file.es> 将程序构建到 .ender 文件夹后运行。examine 检查语法、语义和类型,并在不写入文件的情况下完成代码生成。run 运行之前在 .ender 中构建好的程序,不会重新构建。
保存为 main.es:
nama.str = "Ender"
umur.int = 17
aktif.bool = true
print>>"halo "{nama}", umur "{umur}
if umur >= 17 and aktif is true:
print>>"dewasa"
elif umur > 12:
print>>"remaja"
else :
print>>"anak"
jumlah.int = 0
for i in range(5):
jumlah = jumlah + i
print>>"jumlah "{jumlah}
用 ender main.es 运行。输出:
halo Ender, umur 17
dewasa
jumlah 15
变量用 名称.类型 = 值 声明。共有三种类型:
| 类型 | 内容 | 为空时的默认值 |
|---|---|---|
int |
有符号 32 位整数,-2147483648 到 2147483647 | 0 |
str |
最多 65535 字节的文本 | null |
bool |
true 或 false |
false |
a.str = "DATA"
a2.str = 'DATA'
a3.str = `DATA`
b.int = 12
c.int = -7
d.bool = true
z.int =
已有的变量可以不写类型直接重新赋值:
b = 30
b =
k.int = b
b = 将 b 恢复为默认值。k.int = b 复制另一个同类型变量的值。用相同类型重复声明只会产生警告,并使用最后一次声明。用不同类型重复声明是错误。
变量名以字母或 _ 开头,后面可以跟字母、数字或 _,最长 64 个字符。关键字不能用作名称。
| 命令 | 末尾换行 |
|---|---|
print>> |
是 |
print.s>> |
是,与 print>> 相同 |
show>> |
否 |
print>>"Hello World"
print.s>>'Hello World'
show>>`Hello World`
print>>10
print>>true
print>>b
print>>"umur : "{b}" tahun"
print>>""
- 字符串可以用
"..."、'...'或`...`书写。三者完全相同,并支持转义 `\n \t \r \0 \ " ' ``。 - 要组合文本和值,按顺序写出各部分,并用
{ }包裹值。print>>"a" b是错误的,正确写法是print>>"a"{b}。 - 空的
str输出为null。用print>>""输出空行。
a.int = 1 + 2 * 3
b.int = (a - 4) * -2
a = a + 1
c.int = a / 2 % 3
print>>"hasil : "{a * b}
- 运算符
+ - * / %、一元负号和括号。* / %先于+ -计算。 - 所有操作数必须是
int。超出 32 位范围的结果会回绕。 /和%向零截断:-10 / 3为-3,-10 % 3为-1。- 编译时发现的除以零是错误。如果在程序运行时发生,程序会输出
runtime error: division by zero on line N并以退出码 1 结束。 - 暂不支持小数。
if a is "ka":
print>>"satu"
elif a == "kb" or a == "kc":
print>>"dua"
else :
print>>"lain"
if x > 3 and y <= 10:
print>>"masuk"
if a or b is "Hellowin":
print>>"salah satu"
| 运算符 | 含义 | 类型 |
|---|---|---|
is、== |
等于 | int、str、bool |
isnot、!= |
不等于 | int、str、bool |
<、>、<=、>= |
比较 | int |
and |
两边都为真 | 条件 |
or |
一边或两边为真 | 条件 |
and的优先级高于or。结果一旦确定就停止求值。- 简写形式:
x or y is Z表示x is Z or y is Z,x and y is Z表示x is Z and y is Z。 - 字符串按内容比较,也可以与
null比较。 if、elif和else行以:结尾。代码块内容需要更深的缩进。空格数量不限,但同一代码块内必须一致,且不能混用制表符和空格。elif和else与对应的if对齐,紧接在前一个代码块之后。- 在代码块内,
int和bool变量只有在代码块之前已声明时才能重新赋值。不能在代码块内声明新的str。
for i in range(10):
print>>i
loops(3):
print>>"ulang"
for v in range(n):以v= 1、2、…、n 运行代码块。循环结束后,v的值为 n。在顶层,v会自动创建为int。loops(n):不使用变量,运行代码块 n 次。n只在开始时计算一次。如果 n ≤ 0,代码块不会运行。- 循环和
if可以嵌套。
loops(adv,
start.adv
100(
print>>"halo"
)
200(
print>>"hello"
)
stop.adv
)
loops(名称,开启分段循环,后面接start.名称。循环用stop.名称加)关闭。名称只是一个标签。start和stop之间只能有N(到)的代码块。每个代码块从上到下依次运行 N 次。上面的例子先输出halo100 次,再输出hello200 次。- 代码块内容由括号界定,因此不要求缩进。
for i in range(100):
if i is 5:
break
print>>i
for j in range(10):
if j % 2 is 0:
continue
print>>j
break结束最内层的循环,continue直接跳到下一次迭代。两者都可用于for、loops和N(代码块。- 在
for中break之后,循环变量保留循环结束时的值。 - 在分段循环中,
break只结束正在运行的N(代码块。break.名称结束整个分段循环名称。
loops(adv,
start.adv
3(
print>>adv.takedata
)
2(
print>>"b"{adv.takedata}
break.adv
)
stop.adv
)
名称.takedata是分段循环名称中正在运行的N(代码块的 N。上面的例子先输出3三次,然后在break.adv之前输出一次b2。- 在代码块之外,它的值为 0。
nama.str = input>>"Siapa namamu? "
umur.int = input>>"Umur: "
print>>"Halo "{nama}", tahun depan umurmu "{umur + 1}
x.str = input>>"文本"输出文本 (不换行),然后从键盘或 stdin 读取一行。x = input>>"文本"给已有变量重新赋值,x.str = input不带提示直接读取。- 提示的写法与
show>>相同,因此可以用{ }包含值。 - 对于
int变量,从行首读取数字 (允许空格和-或+符号)。如果没有数字,结果为 0。 - 空行得到
""。输入结束后,str得到null,int得到 0。 bool变量不能从输入读取。
nilai.int[5] = 10, 20, 30
nama.str[3] = "Andi", "Budi"
aktif.bool[4] = true.all
print>>nilai[1]
print>>"jumlah elemen: "{nilai.len}
nilai[4] = 40
total.int = 0
for i in range(nilai.len):
total = total + nilai[i]
print>>"total "{total}
nama[3] = input>>"Nama ketiga? "
print>>nama[3]
名称.类型[N] = 值声明一个有 N 个元素的数组。N 是 1 到 1048576 的整数,必须写出,所以a.int[] =是错误。- 元素从 1 开始编号:
nilai[1]是第一个元素,nilai[nilai.len]是最后一个。 - 值用逗号分隔,从第一个元素开始依次填入。没有给值的元素是该类型的默认值 (
0、null或false)。值比元素多是错误。 - 单个值后面加
.all(例如true.all) 会填入所有元素。aktif.bool[4] = true只设置第一个元素。 名称[index] = 值修改一个元素,名称[index] =把它恢复为默认值。名称[index] = input>>"..."读取一个int或str元素。- 元素可以用在任何允许同类型值的地方: 算术、条件、
print>>的{ }中,以及作为另一个变量的值。 名称.len是元素个数,在编译时就已确定。- 写成数字的 index 由编译器检查,例如
index 6 is outside 1..5 of array 'nilai'。运行时计算的 index 在运行时检查,越界时程序向 stderr 输出runtime error: array index out of range on line N并以退出码 1 结束。 - 数组在顶层声明,不能在
if或循环内声明。用相同类型和大小再次声明同一个数组会给出 warning,并重置所有元素。 - 在
for循环中,编译器能证明在范围内的 index (例如i) 不做运行时检查。
- 每行一条语句。空行会被忽略。
- 注释以
//开头,直到行尾。 - 程序从第一行运行到最后一行,不需要
main函数。 - 关键字:
print show int str bool true false null if elif else is isnot and or for in range loops break continue input。
编译器在遇到第一个错误时停止,格式为 file:line:col: 类别 error: 信息。例如:
main.es:2:1: semantic error: variable 'a' is already declared as an int variable
警告不会中止构建,格式为 file:line:col: warning: 信息。
Apache License 2.0。参见 LICENSE。
Copyright 2026 iRELDevz
हिन्दी
यह रिपॉज़िटरी EnderScript प्रोजेक्ट की मूल और पहली रिपॉज़िटरी है। अन्य रिपॉज़िटरी केवल सहायक रिपॉज़िटरी हैं और उन्हें EnderScript प्रोजेक्ट की मूल रिपॉज़िटरी होने का दावा नहीं किया जा सकता।
EnderScript प्रोग्राम बिना इंटरप्रेटर, VM, गार्बेज कलेक्टर या बड़े रनटाइम के सीधे मशीन कोड में कंपाइल होते हैं। कंपाइलर लूप और अंकगणित के लिए ख़ास ऑप्टिमाइज़ेशन भी करता है: idiv के बिना स्थिरांक से भाग, रजिस्टर में रखे लूप काउंटर, बिना ब्रांच वाली शर्तें, SIMD, और सूत्र से सीधे गणना किए जाने वाले लूप।
Windows x64 पर बेंचमार्क परिणाम:
| कार्य | EnderScript | Rust | हाथ से लिखी असेंबली |
|---|---|---|---|
| lcg | 345 ms | 531 ms | 1020 ms |
| fizz | 225 ms | 382 ms | - |
| mod7 | 120 ms | 215 ms | - |
| modchain | 259 ms | - | 285 ms |
चारों बेंचमार्क लूप और int अंकगणित वाले कार्य हैं।
- Windows x64 कंपाइलर केवल 47 KB का है।
- प्रोग्राम
print>>"halo"2.5 KB का exe बनता है। - कंपाइलर PE या ELF फ़ाइल ख़ुद लिखता है, इसलिए प्रोग्राम बिल्ड करने के लिए असेंबलर, लिंकर या किसी और टूलचेन की ज़रूरत नहीं होती।
- टाइप नाम के साथ जुड़ा होता है:
umur.int = 17। - पढ़ने में आसान शब्द:
is,isnot,and,or,elif।==और!=भी चलते हैं। - संक्षिप्त रूप:
if a or b is 3:का अर्थa is 3 or b is 3है। - आउटपुट के लिए
print>>औरshow>>, और मान{ }से जोड़े जाते हैं। loops(n):बिना वेरिएबल के n बार दोहराता है, और चरणबद्ध लूप कई ब्लॉक क्रम से चलाता है।main,importया सेमीकोलन की ज़रूरत नहीं।
- प्रोग्राम चलने से पहले टाइप की जाँच होती है।
- त्रुटि संदेश फ़ाइल, लाइन और कॉलम बताते हैं।
- int ओवरफ़्लो हमेशा रैप होता है, और शून्य से भाग लाइन नंबर के साथ बताया जाता है।
Windows और Linux पर x64, x86 और ARM64 के लिए एक जैसा सिंटैक्स और एक जैसे परिणाम।
फ़ंक्शन और दशमलव संख्याएँ।
यह ब्रांच Windows x64 के लिए EnderScript कंपाइलर बनाती है। कंपाइलर असेंबली में लिखा गया है और बिना किसी बाहरी असेंबलर या लिंकर के सीधे PE32+ एक्ज़िक्यूटेबल बनाता है।
आवश्यकताएँ: NASM, GCC (MinGW-w64)।
.\build.ps1
परिणाम ender.exe है।
.\ender.exe <file.es>
.\ender.exe examine <file.es>
.\ender.exe run <file.es>
.\ender.exe --version
.\ender.exe --help
ender <file.es> प्रोग्राम को .ender फ़ोल्डर में बिल्ड करके चलाता है। examine सिंटैक्स, सिमैंटिक्स और टाइप की जाँच करता है और कोई फ़ाइल लिखे बिना कोड जनरेशन तक चलाता है। run .ender में पहले से बिल्ड किए गए प्रोग्राम को दोबारा बिल्ड किए बिना चलाता है।
main.es के रूप में सहेजें:
nama.str = "Ender"
umur.int = 17
aktif.bool = true
print>>"halo "{nama}", umur "{umur}
if umur >= 17 and aktif is true:
print>>"dewasa"
elif umur > 12:
print>>"remaja"
else :
print>>"anak"
jumlah.int = 0
for i in range(5):
jumlah = jumlah + i
print>>"jumlah "{jumlah}
इसे ender main.es से चलाएँ। आउटपुट:
halo Ender, umur 17
dewasa
jumlah 15
वेरिएबल नाम.टाइप = मान से घोषित किया जाता है। तीन टाइप हैं:
| टाइप | सामग्री | खाली होने पर डिफ़ॉल्ट |
|---|---|---|
int |
साइन वाला 32-बिट पूर्णांक, -2147483648 से 2147483647 | 0 |
str |
65535 बाइट तक का टेक्स्ट | null |
bool |
true या false |
false |
a.str = "DATA"
a2.str = 'DATA'
a3.str = `DATA`
b.int = 12
c.int = -7
d.bool = true
z.int =
मौजूदा वेरिएबल को टाइप लिखे बिना दोबारा मान दिया जा सकता है:
b = 30
b =
k.int = b
b = b को उसके डिफ़ॉल्ट मान पर लौटा देता है। k.int = b उसी टाइप के दूसरे वेरिएबल का मान कॉपी करता है। उसी टाइप से दोबारा घोषित करने पर केवल चेतावनी मिलती है और आख़िरी घोषणा मान्य होती है। अलग टाइप से दोबारा घोषित करना त्रुटि है।
वेरिएबल का नाम अक्षर या _ से शुरू होता है, उसके बाद अक्षर, अंक या _ आ सकते हैं, अधिकतम 64 अक्षर। कीवर्ड को नाम के रूप में इस्तेमाल नहीं किया जा सकता।
| कमांड | अंत में नई लाइन |
|---|---|
print>> |
हाँ |
print.s>> |
हाँ, print>> के समान |
show>> |
नहीं |
print>>"Hello World"
print.s>>'Hello World'
show>>`Hello World`
print>>10
print>>true
print>>b
print>>"umur : "{b}" tahun"
print>>""
- स्ट्रिंग
"...",'...'या`...`से लिखी जा सकती है। तीनों एक समान हैं और एस्केप `\n \t \r \0 \ " ' `` का समर्थन करते हैं। - टेक्स्ट और मान जोड़ने के लिए हिस्सों को क्रम से लिखें और मान को
{ }में रखें।print>>"a" bत्रुटि है, सही रूपprint>>"a"{b}है। - खाली
strnullके रूप में छपता है। खाली लाइनprint>>""से छपती है।
a.int = 1 + 2 * 3
b.int = (a - 4) * -2
a = a + 1
c.int = a / 2 % 3
print>>"hasil : "{a * b}
- ऑपरेटर
+ - * / %, यूनरी माइनस और कोष्ठक।* / %की गणना+ -से पहले होती है। - सभी ऑपरेंड
intहोने चाहिए। 32-बिट सीमा से बाहर के परिणाम रैप हो जाते हैं। /और%शून्य की ओर काटते हैं:-10 / 3का मान-3और-10 % 3का मान-1है।- कंपाइल के समय पता चला शून्य से भाग त्रुटि है। अगर यह प्रोग्राम चलते समय होता है, तो प्रोग्राम
runtime error: division by zero on line Nछापता है और exit code 1 के साथ बंद होता है। - दशमलव संख्याएँ अभी समर्थित नहीं हैं।
if a is "ka":
print>>"satu"
elif a == "kb" or a == "kc":
print>>"dua"
else :
print>>"lain"
if x > 3 and y <= 10:
print>>"masuk"
if a or b is "Hellowin":
print>>"salah satu"
| ऑपरेटर | अर्थ | टाइप |
|---|---|---|
is, == |
बराबर | int, str, bool |
isnot, != |
बराबर नहीं | int, str, bool |
<, >, <=, >= |
तुलना | int |
and |
दोनों पक्ष सही | शर्तें |
or |
एक या दोनों पक्ष सही | शर्तें |
andकी प्राथमिकताorसे अधिक है। परिणाम तय होते ही जाँच रुक जाती है।- संक्षिप्त रूप:
x or y is Zका अर्थx is Z or y is Zहै, औरx and y is Zका अर्थx is Z and y is Zहै। - स्ट्रिंग की तुलना उसकी सामग्री से होती है, और उसकी तुलना
nullसे भी की जा सकती है। if,elifऔरelseकी लाइनें:पर ख़त्म होती हैं। ब्लॉक की सामग्री ज़्यादा इंडेंट की जाती है। स्पेस की संख्या कुछ भी हो सकती है, बशर्ते एक ब्लॉक में समान रहे, और टैब को स्पेस के साथ नहीं मिलाया जा सकता।elifऔरelseअपनेifके समान इंडेंट पर, पिछले ब्लॉक के ठीक बाद लिखे जाते हैं।- ब्लॉक के अंदर
intऔरboolवेरिएबल को तभी दोबारा मान दिया जा सकता है जब वे ब्लॉक से पहले घोषित हों। ब्लॉक के अंदर नयाstrघोषित नहीं किया जा सकता।
for i in range(10):
print>>i
loops(3):
print>>"ulang"
for v in range(n):ब्लॉक कोv= 1, 2, …, n के साथ चलाता है। लूप पूरा होने परvका मान n होता है। शीर्ष स्तर परvअपने-आपintके रूप में बन जाता है।loops(n):बिना वेरिएबल के ब्लॉक को n बार चलाता है।nकी गणना शुरुआत में एक बार होती है। अगर n ≤ 0 है, तो ब्लॉक नहीं चलता।- लूप और
ifएक-दूसरे के अंदर रखे जा सकते हैं।
loops(adv,
start.adv
100(
print>>"halo"
)
200(
print>>"hello"
)
stop.adv
)
loops(नाम,चरणबद्ध लूप खोलता है, उसके बादstart.नामआता है। लूपstop.नामऔर फिर)से बंद होता है।नामकेवल एक लेबल है।startऔरstopके बीच केवलN(से)तक के ब्लॉक हो सकते हैं। हर ब्लॉक ऊपर से क्रम में N बार चलता है। ऊपर का उदाहरणhalo100 बार और फिरhello200 बार छापता है।- ब्लॉक की सामग्री कोष्ठकों से सीमित होती है, इसलिए इंडेंट ज़रूरी नहीं है।
for i in range(100):
if i is 5:
break
print>>i
for j in range(10):
if j % 2 is 0:
continue
print>>j
breakसबसे भीतरी लूप को रोकता है, औरcontinueसीधे अगले चक्र पर जाता है। दोनोंfor,loopsऔरN(ब्लॉक में काम करते हैं।forमेंbreakके बाद लूप वेरिएबल में वही मान रहता है जो लूप रुकते समय था।- चरणबद्ध लूप में
breakकेवल चल रहेN(ब्लॉक को रोकता है।break.नामपूरे चरणबद्ध लूपनामको रोकता है।
loops(adv,
start.adv
3(
print>>adv.takedata
)
2(
print>>"b"{adv.takedata}
break.adv
)
stop.adv
)
नाम.takedataमें चरणबद्ध लूपनाममें चल रहेN(ब्लॉक का N होता है। ऊपर का उदाहरण3तीन बार छापता है, फिरbreak.advसे पहलेb2एक बार।- ब्लॉक के बाहर इसका मान 0 है।
nama.str = input>>"Siapa namamu? "
umur.int = input>>"Umur: "
print>>"Halo "{nama}", tahun depan umurmu "{umur + 1}
x.str = input>>"टेक्स्ट"टेक्स्ट को बिना नई लाइन के छापता है, फिर कीबोर्ड या stdin से एक लाइन पढ़ता है।x = input>>"टेक्स्ट"मौजूदा वेरिएबल को दोबारा मान देता है, औरx.str = inputबिना प्रॉम्प्ट के पढ़ता है।- प्रॉम्प्ट
show>>की तरह लिखा जाता है, इसलिए उसमें{ }में मान हो सकते हैं। intवेरिएबल के लिए संख्या लाइन की शुरुआत से पढ़ी जाती है (स्पेस और-या+चिह्न चलते हैं)। संख्या न हो तो परिणाम 0 है।- खाली लाइन से
""मिलता है। इनपुट ख़त्म होने परstrमेंnullऔरintमें 0 आता है। boolवेरिएबल को इनपुट से नहीं पढ़ा जा सकता।
nilai.int[5] = 10, 20, 30
nama.str[3] = "Andi", "Budi"
aktif.bool[4] = true.all
print>>nilai[1]
print>>"jumlah elemen: "{nilai.len}
nilai[4] = 40
total.int = 0
for i in range(nilai.len):
total = total + nilai[i]
print>>"total "{total}
nama[3] = input>>"Nama ketiga? "
print>>nama[3]
नाम.टाइप[N] = मानN एलिमेंट वाला ऐरे बनाता है। N 1 से 1048576 तक की पूर्ण संख्या है और लिखना ज़रूरी है, इसलिएa.int[] =एक त्रुटि है।- एलिमेंट की गिनती 1 से शुरू होती है:
nilai[1]पहला एलिमेंट है औरnilai[nilai.len]आख़िरी। - मान कॉमा से अलग किए जाते हैं और पहले एलिमेंट से भरे जाते हैं। जिन एलिमेंट को मान नहीं मिलता उनमें टाइप का डिफ़ॉल्ट (
0,nullयाfalse) होता है। एलिमेंट से ज़्यादा मान देना त्रुटि है। - एक मान के बाद
.allलिखने पर (जैसेtrue.all) वह मान हर एलिमेंट में जाता है।aktif.bool[4] = trueसिर्फ़ पहला एलिमेंट सेट करता है। नाम[index] = मानएक एलिमेंट बदलता है, औरनाम[index] =उसे डिफ़ॉल्ट पर लौटाता है।नाम[index] = input>>"..."intयाstrका एक एलिमेंट पढ़ता है।- एलिमेंट हर उस जगह इस्तेमाल हो सकता है जहाँ उसी टाइप का मान चलता है: अंकगणित, शर्तें,
print>>के{ }के अंदर, और किसी दूसरे वेरिएबल के मान के रूप में। नाम.lenएलिमेंट की संख्या है। यह कंपाइल के समय ही तय होती है।- संख्या के रूप में लिखा index कंपाइलर जाँचता है, जैसे
index 6 is outside 1..5 of array 'nilai'। प्रोग्राम चलते समय निकाला गया index चलते समय जाँचा जाता है। सीमा से बाहर होने पर प्रोग्राम stderr परruntime error: array index out of range on line Nछापता है और exit code 1 के साथ बंद होता है। - ऐरे सबसे ऊपरी स्तर पर घोषित होते हैं,
ifया लूप के अंदर नहीं। उसी टाइप और साइज़ के साथ वही ऐरे दोबारा घोषित करने पर warning मिलती है और सारे एलिमेंट रीसेट हो जाते हैं। forलूप के अंदरiजैसा index, जिसे कंपाइलर सीमा के अंदर साबित कर सके, बिना रनटाइम जाँच के इस्तेमाल होता है।
- हर लाइन में एक स्टेटमेंट। खाली लाइनें अनदेखी की जाती हैं।
- टिप्पणी
//से शुरू होकर लाइन के अंत तक चलती है। - प्रोग्राम पहली लाइन से आख़िरी लाइन तक चलता है,
mainफ़ंक्शन के बिना। - कीवर्ड:
print show int str bool true false null if elif else is isnot and or for in range loops break continue input।
कंपाइलर पहली त्रुटि पर रुकता है, प्रारूप file:line:col: प्रकार error: संदेश के साथ। उदाहरण:
main.es:2:1: semantic error: variable 'a' is already declared as an int variable
चेतावनियाँ बिल्ड नहीं रोकतीं और file:line:col: warning: संदेश प्रारूप में लिखी जाती हैं।
Apache License 2.0। LICENSE देखें।
Copyright 2026 iRELDevz