শব্দ · Shobdo — Product Requirements Document

A modern, flexible and strong programming language and application framework written entirely in Bangla — keywords, identifiers, digits, errors, docs and tooling.

PRD v1.0 (Draft)2026-11-09Working name: Shobdo / শব্দ

1Overview & Problem

Problem. Mainstream programming languages use English keywords and documentation. Many Bangla-speaking learners must learn English vocabulary and programming concepts at the same time, which raises the barrier to entry.

Product. Shobdo is a general-purpose, modern language where every user-facing surface is Bangla: keywords, standard library names, error messages, REPL, docs and CLI. A companion framework, Shobdo Web, builds web apps and APIs in the same language.

Positioning. A real language, not a toy: optional static types, modules, closures, pattern matching, async, and a path to a fast bytecode VM, while staying easy for first-time learners.

Note. "Shobdo" (শব্দ, "word") is a working name only; check trademark, domain and package-registry availability before committing. Numeric targets here are proposed goals, not measured facts.

2Goals, Non-Goals & Metrics

🎯 Goals

  • Full Bangla surface: keywords, identifiers, digits (০–৯), errors, docs
  • Modern feature set (see §4)
  • Beginner-friendly yet capable of real apps
  • Transliterated keyword aliases for easy typing
  • JS/Python interop for fast adoption
  • Open source with a welcoming contribution model

🚫 Non-Goals (v1)

  • Replacing English-based languages
  • Own native optimizing compiler (post-1.0)
  • Systems/OS-level programming
  • Mobile UI toolkit (later)
  • Free-form natural-language parsing: the grammar is formal and deterministic

📊 Success Metrics (proposed)

  • A beginner completes the first tutorial in one sitting
  • Spec conformance test coverage ≥ 95%
  • REPL cold start target set after first benchmark
  • Parser throughput target set after first benchmark
  • First external contributors and packages by 1.0

3Users & Use Cases

PersonaNeedKey features
School / college studentLearn logic without an English barrierBangla errors, REPL, playground, লেখো/পড়ো
TeacherTeach programming in Bangla mediumCurriculum, docs, exercises
Hobbyist / freelancerBuild small real apps quicklyShobdo Web, package manager, interop
Professional developerStrong, safe, fast languageOptional types, modules, async, LSP, tests
ContributorExtend the languageClear architecture, RFC process, tests

4Language Specification

4.1 Design principles

Readable

Natural Bangla words, short enough to type.

Flexible

Multi-paradigm, optional types, keyword aliases.

Strong

No silent coercions, null-safety, exhaustive matching, immutability option.

Modern

Closures, modules, async/await, pattern matching, interpolation, destructuring.

4.2 Keywords (proposed; final spellings need review by Bangla linguists and teachers)

ConceptBanglaAlias (Latin)Meaning
Variableধরিdhorilet
Constantধ্রুবdhrubaconst
If / else if / elseযদি / নাহলে যদি / নাহলেjodi / nahole jodi / naholeconditionals
Whileযতক্ষণjotokkhonwhile
For eachপ্রতিটি … এর মধ্যেprotiti … er moddhefor-in
Break / continueথামো / এগোওthamo / egaoloop control
Function / returnকাজ / ফেরতkaj / ferotfn / return
Class / structশ্রেণি / গঠনshreni / gothonclass / struct
Selfএটিetithis
Matchমেলাওmelaopattern match
True / false / nullসত্য / মিথ্যা / শূন্যshotto / mittha / shunnoliterals
And / or / notএবং / অথবা / নাebong / othoba / nalogic
Import / from / exportআনো / থেকে / দাওano / theke / daomodules
Try / catch / throwচেষ্টা / ধরো / ছোড়োchesta / dhoro / chhoroerrors
Async / awaitঅসমকালীন / অপেক্ষাosomokalin / opekkhaasync
Print / inputলেখো / পড়োlekho / poroI/O builtins
Constructorতৈরিtoiriconstructor
Parentউর্ধ্বurdhwosuper
Overrideপুনঃলেখpunolekhoverride
Privateগোপনgoponprivate member
Staticস্থিরsthirstatic member
Trait / implementsআচরণ / বাস্তবায়নachoron / bastobayontrait / implements
Membership operatorভিতরেbhitorein
Design decision. Aliases map to the same token at lex time, so users can type Latin transliteration and a formatter normalizes to Bangla. This addresses slow Bangla typing on non-Bangla keyboards.

4.3 Feature set

FeaturePriorityNotes
Variables, constants, Bangla & Latin digitsP0০–৯ and 0–9 both accepted
Types: সংখ্যা, দশমিক, লেখা, সত্যমিথ্যা, তালিকা, মানচিত্র, শূন্যP0int, float, string, bool, list, map, null
Control flow, functions, closuresP0First-class functions, default and named args
String interpolation "নাম: {নাম}"P0Unicode-safe
Modules / importsP0File-based, explicit exports
Bangla error messages and stack tracesP0Line/column, snippet, suggestion
Classes / structs, traitsP1Composition-first
Pattern matching + destructuringP1Exhaustiveness checks
Optional static typing + inferenceP1Gradual: untyped code still runs
Null safetyP1No implicit null access
Async / awaitP2Event-loop first
GenericsP2After type checker is stable
MacrosP3Evaluate after 1.0

4.4 Sample programs (illustrative syntax)

// ভেরিয়েবল ও শর্ত
ধরি বয়স = ২৫
যদি বয়স >= ১৮ {
    লেখো("প্রাপ্তবয়স্ক")
} নাহলে {
    লেখো("অপ্রাপ্তবয়স্ক")
}

// ফাংশন ও রিকার্শন
কাজ ফ্যাক্টরিয়াল(ন: সংখ্যা): সংখ্যা {
    যদি ন <= ১ { ফেরত ১ }
    ফেরত ন * ফ্যাক্টরিয়াল(ন - ১)
}
লেখো("৫! = {ফ্যাক্টরিয়াল(৫)}")

// তালিকা, লুপ ও ক্লোজার
ধরি সংখ্যাগুলো = [১, ২, ৩, ৪]
ধরি বর্গ = সংখ্যাগুলো.রূপান্তর(ক => ক * ক)
প্রতিটি ম এর মধ্যে বর্গ { লেখো(ম) }

// শ্রেণি
শ্রেণি ছাত্র {
    নাম: লেখা
    রোল: সংখ্যা
    কাজ পরিচয়() { ফেরত "{এটি.নাম} (রোল {এটি.রোল})" }
}

// প্যাটার্ন ম্যাচ
মেলাও ফলাফল {
    সফল(মান)    => লেখো("পাওয়া গেছে: {মান}")
    ব্যর্থ(কারণ) => লেখো("ভুল: {কারণ}")
}

// অসমকালীন
অসমকালীন কাজ তথ্য_নামাও(ঠিকানা) {
    ধরি উত্তর = অপেক্ষা নেটওয়ার্ক.নামাও(ঠিকানা)
    ফেরত উত্তর.json()
}

4ALanguage Basics: Syntax, Operators, Functions, Classes

Note. Everything here is a proposed design with illustrative syntax. Exact spellings will be fixed during keyword review and spec v0.1.

A. Basic syntax rules

RuleDesignExample
StatementsOne per line; semicolon optionalধরি ক = ১
BlocksCurly bracesযদি ক > ০ { … }
Comments// single line, /* */ multi-line, /// doc comment// মন্তব্য
IdentifiersBangla or Latin letters, digits, _; cannot start with a digit; cannot be a keywordমোট_দাম, total2
NumbersBangla or Latin digits; _ separator; decimal point১২৩, 3.14, ১_০০০
StringsDouble quotes; {expr} interpolation; escapes \n \t \" \{"নাম: {নাম}"
Variablesধরি is mutable; ধ্রুব is constant (cannot be reassigned)ধ্রুব পাই = ৩.১৪
TypesOptional annotation after :; inferred if omittedধরি বয়স: সংখ্যা = ২৫
// মূল ধরন (types)
ধরি ক: সংখ্যা = ১০          // integer
ধরি খ: দশমিক = ৩.৫         // float
ধরি গ: লেখা = "হ্যালো"      // string
ধরি ঘ: সত্যমিথ্যা = সত্য   // bool
ধরি ঙ = [১, ২, ৩]          // list
ধরি চ = {"নাম": "রিমা", "বয়স": ২০}  // map
ধরি ছ = শূন্য              // null

B. Operators

Arithmetic

OpMeaningExample
+add / join strings৫ + ২ → ৭
-subtract / negate৫ - ২ → ৩
*multiply৫ * ২ → ১০
/divide (decimal result)৫ / ২ → ২.৫
//integer division৫ // ২ → ২
%remainder৫ % ২ → ১
**power (right-assoc.)২ ** ৩ → ৮

Comparison

OpMeaning
== !=equal / not equal (no implicit coercion)
< <=less / less or equal
> >=greater / greater or equal
ভিতরেmembership: ৩ ভিতরে [১,২,৩]

Logical

OpMeaning
এবংand (short-circuit)
অথবাor (short-circuit)
নাnot

Conditions accept only সত্যমিথ্যা values; there is no implicit truthiness.

Assignment

OpMeaning
=assign
+= -= *= /= %= **=compound assign

Assignment is a statement, not an expression, which prevents if (a = b) bugs.

Null-safety & other

OpMeaning
?.safe member access
??default if null
.. ..=range (exclusive / inclusive)
? :ternary: শর্ত ? ক : খ
=>lambda / match arm

Precedence (high → low)

  1. () . ?. [] call
  2. **
  3. unary -, না
  4. * / // %
  5. + -
  6. .. ..=
  7. < <= > >= ভিতরে
  8. == !=
  9. এবং
  10. অথবা
  11. ??
  12. ? :
ধরি ফল = (২ + ৩) * ৪ ** ২          // ৮০
ধরি ভাগশেষ = ১৭ // ৫ + ১৭ % ৫       // ৩ + ২ = ৫
ধরি যোগ্য = বয়স >= ১৮ এবং না নিষিদ্ধ
ধরি নাম = ব্যবহারকারী?.নাম ?? "অতিথি"
ধরি মান = বয়স >= ১৮ ? "প্রাপ্তবয়স্ক" : "অপ্রাপ্তবয়স্ক"
গণনা += ১

C. Control flow

// শর্ত
যদি নম্বর >= ৮০ { লেখো("A+") }
নাহলে যদি নম্বর >= ৬০ { লেখো("A") }
নাহলে { লেখো("B") }

// while
ধরি i = ১
যতক্ষণ i <= ৫ { লেখো(i); i += ১ }

// for-each ও range
প্রতিটি i এর মধ্যে ১..=৫ {
    যদি i % ২ == ০ { এগোও }   // continue
    যদি i > ৪ { থামো }       // break
    লেখো(i)
}

D. Functions

FeatureExplanation
Declarationকাজ নাম(প্যারামিটার: ধরন): ফেরতধরন { … }; types are optional
Returnফেরত মান; a function without it returns শূন্য
Default paramsকাজ f(ক, খ = ১)
Named argsf(খ: ৫, ক: ২)
Variadicকাজ f(...সব) collects extra arguments into a list
Lambda(ক, খ) => ক + খ
First-classFunctions are values: store, pass and return them
ClosuresInner functions capture variables from the enclosing scope
RecursionSupported; tail-call optimization is a post-1.0 consideration
Multiple resultsReturn a list and destructure: ধরি [ক, খ] = f()
কাজ যোগ(ক: সংখ্যা, খ: সংখ্যা = ০): সংখ্যা {
    ফেরত ক + খ
}
লেখো(যোগ(২, ৩))          // ৫
লেখো(যোগ(খ: ৫, ক: ১))    // ৬ (named arguments)

কাজ সমষ্টি(...সংখ্যাগুলো) {
    ধরি মোট = ০
    প্রতিটি ন এর মধ্যে সংখ্যাগুলো { মোট += ন }
    ফেরত মোট
}

// ক্লোজার: কাউন্টার
কাজ কাউন্টার() {
    ধরি গণনা = ০
    ফেরত () => { গণনা += ১; ফেরত গণনা }
}
ধরি পরের = কাউন্টার()
লেখো(পরের(), পরের())    // ১ ২

// উচ্চক্রম ফাংশন
ধরি ফল = [১,২,৩,৪].ছাঁকো(ক => ক % ২ == ০).রূপান্তর(ক => ক * ১০)  // [২০, ৪০]

E. Classes & objects

ConceptKeyword (proposed)Explanation
Classশ্রেণিBlueprint holding fields and methods
ConstructorতৈরিRuns when an object is created: ছাত্র("রিমা", ১)
Current objectএটিThe instance inside methods
Inheritanceশ্রেণি ক : খSingle inheritance; the child gets the parent's members
Parent accessউর্ধ্বCall a parent constructor or method
OverrideপুনঃলেখMarks a method replacing a parent method (compiler-checked)
PrivateগোপনAccessible only inside the class; public by default
Staticস্থিরBelongs to the class, not an instance
Trait / interfaceআচরণ / বাস্তবায়নMethods a class promises to implement
StructগঠনLightweight data type with value semantics
আচরণ পরিচয়যোগ্য {
    কাজ পরিচয়(): লেখা
}

শ্রেণি প্রাণী {
    নাম: লেখা
    গোপন বয়স: সংখ্যা
    স্থির মোট = ০

    তৈরি(নাম, বয়স) {
        এটি.নাম = নাম
        এটি.বয়স = বয়স
        প্রাণী.মোট += ১
    }

    কাজ শব্দ(): লেখা { ফেরত "..." }
    কাজ বয়স_দেখো(): সংখ্যা { ফেরত এটি.বয়স }
}

শ্রেণি কুকুর : প্রাণী বাস্তবায়ন পরিচয়যোগ্য {
    তৈরি(নাম, বয়স) { উর্ধ্ব(নাম, বয়স) }
    পুনঃলেখ কাজ শব্দ(): লেখা { ফেরত "ঘেউ ঘেউ" }
    কাজ পরিচয়(): লেখা { ফেরত "কুকুর {এটি.নাম}" }
}

ধরি টমি = কুকুর("টমি", ৩)
লেখো(টমি.শব্দ())      // ঘেউ ঘেউ
লেখো(টমি.পরিচয়())    // কুকুর টমি
লেখো(প্রাণী.মোট)      // ১
// টমি.বয়স → ত্রুটি: 'বয়স' গোপন সদস্য
Design stance. Single inheritance plus traits, with composition preferred. This avoids multiple-inheritance ambiguity and keeps classes simple for beginners.

F. Errors & modules

চেষ্টা {
    ধরি ফল = বিভাজন(১০, ০)
} ধরো ত্রুটি {
    লেখো("সমস্যা: {ত্রুটি.বার্তা}")
}
কাজ বিভাজন(ক, খ) {
    যদি খ == ০ { ছোড়ো ত্রুটি("শূন্য দিয়ে ভাগ") }
    ফেরত ক / খ
}

// গণিত.শব্দ ফাইলে
দাও কাজ বর্গ(ন) { ফেরত ন * ন }
// অন্য ফাইলে
আনো বর্গ থেকে "./গণিত"

G. Complete mini-program

শ্রেণি ব্যাংকহিসাব {
    গোপন জমা: দশমিক = ০
    তৈরি(মালিক: লেখা) { এটি.মালিক = মালিক }
    কাজ জমা_দাও(টাকা: দশমিক) {
        যদি টাকা <= ০ { ছোড়ো ত্রুটি("টাকার পরিমাণ ভুল") }
        এটি.জমা += টাকা
    }
    কাজ উঠাও(টাকা: দশমিক) {
        যদি টাকা > এটি.জমা { ছোড়ো ত্রুটি("পর্যাপ্ত টাকা নেই") }
        এটি.জমা -= টাকা
    }
    কাজ স্থিতি(): দশমিক { ফেরত এটি.জমা }
}

ধরি হিসাব = ব্যাংকহিসাব("রিমা")
হিসাব.জমা_দাও(৫০০০)
চেষ্টা { হিসাব.উঠাও(৭০০০) } ধরো ত্রুটি { লেখো(ত্রুটি.বার্তা) }
লেখো("বর্তমান স্থিতি: {হিসাব.স্থিতি()} টাকা")

5Formal Grammar (EBNF, simplified draft)

program      = { statement } ;
statement    = varDecl | constDecl | funcDecl | classDecl | ifStmt | whileStmt
             | forStmt | matchStmt | tryStmt | returnStmt | importStmt
             | exportStmt | traitDecl | structDecl | throwStmt
             | "থামো" | "এগোও" | exprStmt ;
varDecl      = "ধরি" ident [ ":" type ] "=" expr ;
constDecl    = "ধ্রুব" ident [ ":" type ] "=" expr ;
funcDecl     = [ "অসমকালীন" ] "কাজ" ident "(" [ params ] ")" [ ":" type ] block ;
ifStmt       = "যদি" expr block { "নাহলে" "যদি" expr block } [ "নাহলে" block ] ;
whileStmt    = "যতক্ষণ" expr block ;
forStmt      = "প্রতিটি" ident "এর" "মধ্যে" expr block ;
matchStmt    = "মেলাও" expr "{" { pattern "=>" (expr | block) } "}" ;
tryStmt      = "চেষ্টা" block "ধরো" ident block ;
importStmt   = "আনো" ident "থেকে" string ;
classDecl    = "শ্রেণি" ident [ ":" ident ] [ "বাস্তবায়ন" ident { "," ident } ] "{" { member } "}" ;
member       = fieldDecl | ctorDecl | methodDecl ;
fieldDecl    = [ "গোপন" ] [ "স্থির" ] ident [ ":" type ] [ "=" expr ] ;
ctorDecl     = "তৈরি" "(" [ params ] ")" block ;
methodDecl   = [ "গোপন" ] [ "স্থির" ] [ "পুনঃলেখ" ] [ "অসমকালীন" ] "কাজ" ident "(" [ params ] ")" [ ":" type ] block ;
traitDecl    = "আচরণ" ident "{" { "কাজ" ident "(" [ params ] ")" [ ":" type ] [ block ] } "}" ;
structDecl   = "গঠন" ident "{" { ident ":" type } "}" ;
throwStmt    = "ছোড়ো" expr ;
params       = param { "," param } ;
param        = ident [ ":" type ] [ "=" expr ] | "..." ident ;
args         = arg { "," arg } ;
arg          = [ ident ":" ] expr ;          // named arguments
lambda       = ( ident | "(" [ params ] ")" ) "=>" ( expr | block ) ;
block        = "{" { statement } "}" ;
expr         = assignment ;
assignment   = ternary [ ("=" | "+=" | "-=" | "*=" | "/=" | "%=" | "**=") assignment ] ;   // statement-level only
ternary      = nullish [ "?" expr ":" expr ] ;
nullish      = logicOr { "??" logicOr } ;
logicOr      = logicAnd { "অথবা" logicAnd } ;
logicAnd     = equality { "এবং" equality } ;
equality     = comparison { ("==" | "!=") comparison } ;
comparison   = range { ("<" | "<=" | ">" | ">=" | "ভিতরে") range } ;
range        = term [ (".." | "..=") term ] ;
term         = factor { ("+" | "-") factor } ;
factor       = unary { ("*" | "/" | "//" | "%") unary } ;
unary        = ("না" | "-") unary | power ;
power        = call [ "**" unary ] ;          // right-associative
call         = primary { "(" [ args ] ")" | ("." | "?.") ident | "[" expr "]" } ;
primary      = number | string | "সত্য" | "মিথ্যা" | "শূন্য" | ident
             | "(" expr ")" | list | map | lambda | "এটি" | "উর্ধ্ব" ;
ident        = identStart { identPart } ;   // letters incl. Bengali block U+0980–U+09FF, plus combining marks
number       = digit { digit } [ "." digit { digit } ] ;  // digits 0-9 or ০-৯

6Core Algorithms

6.1 Normalization

  1. Read UTF-8; reject invalid bytes with a clear error.
  2. Apply Unicode NFC to identifiers and keywords (string-literal contents only if configured).
  3. Canonicalize Bangla variants such as য় (U+09DF) vs য + ় (U+09AF U+09BC).
  4. Map digits ০–৯ to 0–9 during number scanning.
  5. Report suspicious ZWJ/ZWNJ with a diagnostic rather than silently dropping them, since they can be meaningful in Bangla spelling.

6.2 Lexer

  1. Iterate by code point with line/column tracking; grapheme-aware carets in errors.
  2. Identifier: letter or _ start; continue with letters, combining marks (vowel signs, hasanta), digits.
  3. Look up finished words in the keyword table (Bangla + Latin aliases).
  4. Scan numbers, strings with {…} interpolation (nested lexing), operators, comments.
  5. Emit tokens with spans.

6.3 Parser

  1. Recursive descent for statements.
  2. Pratt / precedence climbing for expressions.
  3. Error recovery at statement boundaries to report multiple errors per run.
  4. Typed AST with source spans for formatter and LSP.

6.4 Semantic analysis

  1. Scope chain and a resolver pass.
  2. Detect undefined names, duplicates, misplaced ফেরত/থামো.
  3. Optional local type inference with a gradual যেকোনো type.
  4. Exhaustiveness check for মেলাও.

6.5 Execution

  1. Phase A: tree-walking interpreter with environments and closures.
  2. Phase B: AST to bytecode; stack VM with call frames and upvalues.
  3. Phase C: optional JavaScript emitter for web targets.

6.6 Bangla diagnostics

  1. Error code + Bangla message + snippet + caret.
  2. "Did you mean" via edit distance over keywords and in-scope names.
  3. Hint the Bangla keyword when an English one is typed (e.g. if → যদি).
// Pseudocode: lexer
function scan(src):
    tokens = []
    while not atEnd():
        ch = peek()
        if isWhitespace(ch): advance(); continue
        if ch == '/' and next == '/': skipLineComment(); continue
        if isDigit(ch):           tokens.add(number())      // 0-9 or ০-৯
        else if isIdentStart(ch): w = word(); tokens.add(keywords.get(w) ?? Ident(w))
        else if ch == '"':        tokens.add(string())      // with {interpolation}
        else:                     tokens.add(operatorOrError())
    tokens.add(EOF)
    return tokens

// Pseudocode: Pratt parser
function parseExpr(minPrec):
    left = parsePrefix()
    while prec(peek()) >= minPrec:
        op = next()
        right = parseExpr(prec(op) + (isRightAssoc(op) ? 0 : 1))
        left = Binary(op, left, right)
    return left

7System Architecture

Source .শব্দ→Normalizer→Lexer→Parser (AST)→Resolver / Types→Interpreter / VM / JS emitter

Implementation language

Recommended: TypeScript for v1 (browser playground and Node, easy JS interop). Alternative: Rust for a later fast VM. Confirm in an architecture review.

Repo layout (proposed)

/spec · /core · /stdlib · /web · /cli · /lsp · /playground · /docs · /tests

File extension

Proposed .শব্দ with ASCII fallback .shobdo for tools that mishandle non-ASCII names.

8Standard Library

ModulePurposePriority
গণিতArithmetic, trig, random, constantsP0
লেখাSplit, join, replace, grapheme-aware length, Bangla digit conversionP0
তালিকা / মানচিত্রCollections and functional helpersP0
ফাইলFiles and pathsP1
সময়Dates, times, durationsP1
jsonParse / serializeP1
নেটওয়ার্কHTTP clientP1
পরীক্ষাBuilt-in test frameworkP1
ডাটাবেসSQLite first, then PostgreSQLP2
সংখ্যা-রূপNumber to Bangla words, currency formattingP2

9Framework — Shobdo Web

  • Routing: declarative Bangla routes with params.
  • Templates: HTML templates with Bangla directives, auto-escaping by default.
  • Middleware: logging, auth, CORS, rate limiting.
  • ORM-lite: models, migrations, query builder.
  • Security defaults: CSRF protection, secure headers, input validation, password hashing via vetted libraries (no custom crypto).
  • Dev experience: hot reload, Bangla error overlay, scaffolding CLI.
আনো ওয়েব থেকে "শব্দ/ওয়েব"

ধরি অ্যাপ = ওয়েব.নতুন()

অ্যাপ.পথ("/", কাজ(অনুরোধ) {
    ফেরত ওয়েব.পাতা("স্বাগতম, শব্দ ওয়েবে!")
})

অ্যাপ.পথ("/ব্যবহারকারী/:আইডি", কাজ(অনুরোধ) {
    ধরি ব্যবহারকারী = ডাটাবেস.খোঁজো("ব্যবহারকারী", অনুরোধ.প্যারাম.আইডি)
    ফেরত ওয়েব.json(ব্যবহারকারী)
})

অ্যাপ.চালাও(পোর্ট: ৩০০০)
Framework API names (পথ, চালাও, …) are illustrative and will be fixed during spec review.

10Developer Tooling

CLI shobdo

run, repl, fmt, test, build, new, add, doc.

REPL

Multi-line, history, Bangla errors, Latin-alias input mode.

Playground

Browser editor + runner, shareable links, built-in lessons.

Language Server

Diagnostics, completion, hover, go-to-definition, rename.

Editor support

VS Code extension first: highlighting, snippets, transliteration helper.

Package manager

Manifest, semver, lockfile; start with git/URL deps, registry later.

Formatter & linter

Canonical style; normalizes aliases to Bangla keywords.

Docs

Full Bangla docs, tutorial book, API reference from doc comments.

11Non-Functional Requirements

AreaRequirement (proposed)
CorrectnessDeterministic spec; conformance suite; tests for every keyword/feature.
PerformanceBenchmarks early; the bytecode VM replaces the tree-walker only after a measured win.
UnicodeNFC, grapheme-aware string ops, correct conjunct/hasanta handling, ZWJ/ZWNJ.
AccessibilityDocs/playground follow WCAG; font stack with good Bangla conjunct rendering.
SecuritySandboxed playground; no host access without explicit permission flags; dependency audit in CI.
PortabilityLinux, macOS, Windows and browser.
StabilitySemantic versioning; RFC process for language changes; deprecation policy.
i18nBangla-first; message catalog design allows other languages later.
LicensingPermissive open-source license (decision pending).

12Roadmap & Milestones (estimates; adjust to team size)

M0 · Foundations

  • Name, license, repo
  • Keyword review
  • Spec v0.1 & EBNF
  • Test corpus

M1 · Core Interpreter

  • Normalizer, lexer, parser
  • Tree-walking interpreter
  • REPL, Bangla errors
  • Core stdlib

M2 · Language Depth

  • Classes/traits, modules
  • Pattern matching
  • Optional types
  • Formatter, test runner

M3 · Perf & Tooling

  • Bytecode VM / JS emitter
  • LSP, VS Code ext.
  • Playground
  • Package manager

M4 · Framework & 1.0

  • Shobdo Web
  • DB layer
  • Docs & tutorial
  • Security review, 1.0

13Risks & Mitigations

RiskImpactMitigation
Slow typing of Bangla codeHighLatin aliases, editor transliteration helper, formatter normalization
Same word, different code pointsHighStrict NFC + variant canonicalization, fuzz tests
Poor font/editor rendering of conjunctsMediumRecommend tested fonts; playground ships a suitable font
Tiny initial ecosystemHighJS/Python interop, transpile target, strong stdlib
Keyword choices dislikedMediumLinguist/teacher review, public RFC, configurable alias table
Scope creepHighStrict P0–P3 priorities; stage gates per milestone
Maintainer burnoutMediumContribution guide, good-first-issues, governance doc

14Master Checklists (interactive; progress saved in this browser)

Overall: 0%

15Decisions (zero-budget)

QuestionDecisionWhy
NameKeep শব্দ / Shobdo as the working nameAvailability is unverified. Before any public launch, check the GitHub org, domain, npm/PyPI names and trademark search. The first checks are free.
Implementation language (v1)TypeScriptFree tooling, runs in Node and the browser (free playground), easy JS interop, large contributor pool. Rust can come later for a fast VM.
Block syntaxBraces { }Bangla text mixes combining marks, so whitespace-sensitive code is fragile. Braces make parser errors clearer and the grammar simpler.
Digit styleBangla digits by default for console display; Latin accepted everywhere in source. JSON, files and network always use Latin.Fits the Bangla-first goal without breaking data interchange. A config flag switches the display style.
Object modelBoth: single inheritance + traits (composition preferred)Familiar to learners, avoids multiple-inheritance ambiguity.
Governance & licenseDeferred. Founders act as maintainers for now; language changes are discussed as public issues (lightweight RFC).No funding. Decide the license before accepting outside contributions or publishing code: without one, others have no legal right to reuse it.
Keyword reviewAll three groups: a volunteer panel of 1–2 linguists, 2 teachers and 2–3 developers, plus public feedback on the keyword RFCLinguists check correctness, teachers check learnability, developers check typing cost. All free to start.