"Például a Java String objektum char (16 bit) típusú tömbként kezeli lényegében a stringet."
Nem igazán, a String az egy CharSequence. Ami char-ok rendezett, indexelhető (charAt) sorozata. Tárolhatod te ezt láncolt listával is, nem muszáj tömbként tárolni.
Ezért mondom, ez egy absztrakt struktúra, nem konkrét implementáció.
" Viszont vannak karakterek, amik nem férnek el a 16 bites char típusban. Ezért kellene a char típusnak 32 bitesnek lennie"
Nem biztos, hogy a char típusnak X vagy Y bitesnek kell lennie, ez egy implementációs kérdés. A char egy absztrakt dolog, egy Unicode karaktert reprezentál. AZ, hogy ezt fixen 16 biten teszi (így nem lehet minden Unicode karaktert charként tárolni), esetleg nem fixen (pl. UTF-8 kódolású tömbként), vagy fixen 32 biten, az implementációs kérdés.
Például lehet az a char típus definíciója, hogy 1 Unicode karaktert tárol, nem specifikálva a bithosszt. Ennyi. Implementációs kérdés a bithossz. Persze ekkor a char típus nem primitív típus már.
"Ha viszont UTF-32-ben tárolod, akkor a substring skálázódása ideális lesz. Cserébe 4X annyi memóriát használsz egy string tárolásakor."
Épp ezért ez implementációs részlet, nem része a programnyelv definíciójának. Az egyik implementáció így implementálhat, a másik amúgy, amíg az API-t betartja mindkét implementáció, semmi gond. A programnyelved definíciója nem szabad, hogy tartalmazzon implementációs részleteket.
Mondok egy példát, C++ STL. Régebben a GNU libstdc++ eléggé nem hatékony módon implementálta a vector kezelését, például a hossz nem volt cache-lve, hanem mindig végigszámolta azt. Nem hatékony - CPU szempontjából. Hatékony memória szempontjából. Implementációs részlet.
"Plusz, ha megnézel egy unicode konverziós kódot, akkor láthatod, hogy rohadt bonyolult, nem az a fajta cucc, amit egy nyelv core-jában látni szeretnél. "
Igen, rohadt bonyolult, mert emberi dologról (írásról) szól. Az emberi dolgok bonyolultak. Szokj hozzá.
Megcsinálhatod azt is, hogy a nyelvedben nincs beépített String adattípus, meg char adattípus, lehet ilyet is csinálni. Semmi gond.
Fejlesztenek majd hozzá ASCIIString libet, meg UnicodeString libet, no para.
"Eleve garbage kollektoros nyelvet terveztem"
Ez is implementation detail. MOndhatod azt, hogy a memória automatikusan kezelt. Hogy ezt hogyan implementálja egy-egy nyelvi implementáció (garbage collectorral, ARC-vel, stb.), az már implementációs kérdés.
A Java esetén így emlékeznek meg erről a JLS-ben:
"It includes automatic storage management, typically using a garbage collector"
Nem írják elő, hogy garbage collector kell. Csak azt, hogy a memóriát automatikusan kezeli a runtime.