- OxCaml एक extension set है जो OCaml में performance-oriented features जोड़ता है
- यह Jane Street का production compiler है और OCaml के भविष्य के features के लिए एक experimental lab की भूमिका निभाता है
- यह सुरक्षा, सुविधा और पूर्वानुमेयता को महत्व देते हुए performance control का विस्तार करने पर केंद्रित है
- यह fearless concurrency, layout control, allocation control जैसे विभिन्न क्षेत्रों की सुविधाएँ प्रदान करता है
- यह open source के रूप में उपलब्ध है, इसलिए experimental users और researchers स्वतंत्र रूप से test कर सकते हैं और feedback दे सकते हैं
OxCaml परिचय
OxCaml क्या है
- OxCaml OCaml प्रोग्रामिंग भाषा के लिए तेज़ी से विकसित हो रहे extension features का एक set है
- यह Jane Street का production compiler है, साथ ही OCaml में performance-centric programming को मज़बूत करने के लिए एक experimental platform भी है
- लक्ष्य यह है कि इन extension features को लंबी अवधि में आधिकारिक OCaml में योगदान किया जाए
OxCaml के प्रमुख design goals
- इसका उद्देश्य ऐसा वातावरण देना है जिसमें program behavior के performance-determining factors को सुरक्षित, सुविधाजनक और पूर्वानुमेय तरीके से नियंत्रित किया जा सके
- यह control केवल तब वैकल्पिक रूप से उपलब्ध कराया जाता है जब सच में ज़रूरत हो
- सब कुछ OCaml environment के भीतर implement किया जाता है
ठोस design approach
-
सुरक्षा: programmer productivity और code correctness सुनिश्चित करने के लिए भाषाई सुरक्षा को मज़बूत करना। व्यापक unsafe languages का उपयोग करना कठिन होता है
-
सुविधा: programming complexity बढ़ाए बिना, type inference के लाभ बनाए रखते हुए control प्रदान करना
-
पूर्वानुमेयता: मुख्य performance characteristics को type system level पर explicitly दिखाना, ताकि code performance के बारे में तर्क करना आसान हो
-
ये extensions pay-as-you-go approach अपनाते हैं, जो केवल ज़रूरी हिस्सों पर लागू होती है। यानी अगर extension features का उपयोग न किया जाए, तो मौजूदा OCaml की सरलता और patterns वैसे ही बनाए रखे जा सकते हैं
-
OxCaml सभी OCaml programs के साथ compatible है, और भीतर से evolved OCaml की दिशा में बढ़ता है। यह मौजूदा OCaml की सुरक्षा, ease of use और productivity को बनाए रखता है
OxCaml extension features परिचय
Fearless concurrency
- सही concurrency programming बहुत कठिन होती है; इसे हल करने के लिए OxCaml type system extensions के ज़रिए data races को statically रोकता है
लेआउट (Layouts)
- programmer memory में data layout को explicitly specify कर सकता है
- यह आधुनिक hardware के SIMD processor extensions के लिए native access भी प्रदान करता है
allocation control
- यह memory allocation को बारीकी से नियंत्रित करने वाले tools देता है, जिससे garbage collection (GC) का भार घटता है और cache efficiency तथा program determinism बेहतर होते हैं
quality of life सुधार
-
system programming के अलावा, यह उन features को भी प्रदान करता है जो व्यक्तिगत कामों में उपयोगी रहे हैं
- Polymorphic parameters
- Include functor
- Labeled tuples
- Immutable arrays
OxCaml का उपयोग और अनुप्रयोग
-
OxCaml open source के रूप में जारी किया गया है, इसलिए researchers, experimental users और developers सभी testing और feedback के माध्यम से योगदान दे सकते हैं
-
हालांकि, OxCaml के extension features stability और backward compatibility की गारंटी नहीं देते (लेकिन मौजूदा OCaml programs के साथ backward compatibility सुनिश्चित है)
-
मानक OCaml tools के OxCaml-अनुकूलित versions उपलब्ध कराए गए हैं
- package management: dune और opam के साथ compatible
- editor integration: LSP-server support
- source code formatting और documentation generation features शामिल
-
Jane Street द्वारा जारी कई libraries और tools दो रूपों में उपलब्ध हैं
- Upstream OCaml के लिए: OxCaml extensions हटाए गए version
- केवल OxCaml के लिए: extension features का उपयोग करने वाला version
-
कुछ extension features हटाए नहीं जा सकते, इसलिए संबंधित libraries केवल OxCaml में ही उपयोग की जा सकती हैं। जब आवश्यक extensions आधिकारिक OCaml में integrate हो जाएँगे, तब OCaml-compatible version भी जारी किया जाएगा
1 टिप्पणियां
Hacker News की राय
मैं यह बताना चाहता हूँ कि Janet Street टीम के इस प्रोजेक्ट से जुड़ा एक podcast episode था, जिसमें OCaml के साथ काम करते समय performance considerations पर दिलचस्प चर्चा हुई थी
GC language को अत्यंत low-latency environment में लागू करने की दुविधा बनी रहती है
उदाहरण के लिए, अगर high-frequency trading के बीच GC pause हो जाए तो यह गंभीर समस्या बन सकती है
podcast लिंक साझा
मैंने वास्तव में Twitter पर Ron Minsky से सीधे पूछा था कि वे low-latency applications के लिए Rust का इस्तेमाल क्यों नहीं करते
Ron के जवाब में Rust की खूबियों को स्वीकार करते हुए भी पूरे codebase को एक ही language में बनाए रखने की अहमियत पर ज़ोर था
types, tools, libraries, idioms आदि को साझा कर पाना और projects के बीच आसानी से जाना एक बड़ा लाभ है
साथ ही OCaml के भीतर Rust के मुख्य फ़ायदों को अच्छी तरह समाहित करके उन्हें धीरे-धीरे अपनाने लायक बनाने की दिशा में भी काम हो रहा है
Rust की कमियों के रूप में लंबे compile times, जटिल type system, और async/await handling को लेकर असंतोष का भी उल्लेख किया गया
सबसे बढ़कर, वे व्यापक कार्य-परिस्थितियों के लिए उपयुक्त एक single-language tool चाहते हैं
संबंधित tweet लिंक
ज़ोर देकर कहा गया कि मूल समस्या GC language होना नहीं है, बल्कि सभी GC languages को एक जैसा मानने वाली सोच में दिक्कत है
असली समस्या तब होती है जब GC language stack और value types के explicit manipulation को support नहीं करती
अगर आप GC language की productivity के साथ system-level coding के लिए fine-grained options भी चाहते हैं, तो Cedar, Oberon परिवार, Modula-3, D, Nim, Eiffel, C#, F#, Swift, Go जैसे विकल्पों का उल्लेख किया गया
GC इस्तेमाल करने वाले runtime environment के बारे में सामान्य तौर पर कहा जाए तो, GC pause को कम करने के लिए JVM के parallel collection algorithms आदि का उपयोग किया जा सकता है
लेकिन यह तरीका समान रूप से guarantee नहीं देता, इसलिए system RAM over-provisioning अतिरिक्त रूप से ज़रूरी हो सकता है
इससे आगे, servers को जानबूझकर over-provision करके कुछ servers को थोड़ी देर के लिए pool से बाहर होने देने वाला "offline GC" तरीका भी है
इस तरह के approach के लिए request router और servers के बीच coordination चाहिए, इसलिए यह तभी अर्थपूर्ण है जब server scaling के लिए पर्याप्त budget हो
JVM parallel GC विवरण
GC compaction issues की वजह से कई systems के परेशान होने का अनुभव साझा किया गया
trading systems में आम तौर पर startup के बाद allocations को न्यूनतम रखने की policy अपनाई जाती है
JS में "Zero" नाम की एक library है, जो non-allocating utilities देती है
मैंने लिंक नहीं देखा, लेकिन trading जैसी ऐसी environments में जहाँ market open/close के phase होते हैं, market hours के दौरान GC को disable करके close के बाद restart करना भी संभव हो सकता है
मैं यह रेखांकित करना चाहता हूँ कि इस fork से पहली बार upstream हुआ feature labeled tuple है
यह OCaml 5.4 में support होने वाला है
upstream PR लिंक
संबंधित चर्चा लिंक
यह feature थोड़ा मामूली लग सकता है, लेकिन इसे लेकर काफ़ी उत्साह है
मैं यह भी जोड़ना चाहता हूँ कि इस feature के author ने ML2024 में एक paper और talk पेश की थी
Youtube वीडियो
paper PDF
labeled tuple का उदाहरण pair order की गलती रोकने के लिए उपयोगी है, लेकिन व्यक्तिगत रूप से मुझे F# के anonymous records ज़्यादा पसंद हैं
उदाहरण के लिए,
{| product = 6; sum = 5 |}में field order का कोई महत्व नहीं होता, इसलिए गलती की गुंजाइश नहीं रहतीइस fork से immutable array भी 5.4 में merge हो गया है, बस syntax थोड़ा अलग है
anonymous labeled struct और enum उन top-tier features में हैं जिन्हें मैं programming languages में देखना चाहता हूँ
उदाहरण के लिए, Rust में labeled और unlabeled दोनों तरह के struct define किए जा सकते हैं, लेकिन
function return type में anonymous labeled struct नहीं लिख सकते, यह थोड़ा खलता है
मुझे पता नहीं था कि यह fork SIMD को support करता है
अगर unboxed type, explicit stack allocation features, और Windows support भी आ जाएँ, तो व्यक्तिगत रूप से मुझे लगता है कि OxCaml F# की जगह game dev जैसे consumer environments में काफ़ी उपयोगी हो सकता है
Windows support रुका हुआ नहीं है, बस थोड़ा काम बाकी है
मैं खास तौर पर यह इंगित करना चाहता हूँ कि OxCaml ने SIMD support जोड़ा है
नए opam switch का उपयोग करने वालों के लिए environment variable setting की एक tip साझा
env OCAMLPARAM="alert=-unsafe_multidomain,_," opam install cohttp-lwt-unixजब alert को error में promote कर दिया जाता है, तो पुराने packages install करते समय अनावश्यक रूप से installation टूटने की समस्या आती है
OCAMLPARAM environment variable से उस alert को disable करके install issues रोके जा सकते हैं
मैं Golang के लिए बेहतरीन vscode plugin का आदी हूँ, इसलिए सोच रहा हूँ कि क्या OCaml ecosystem के लिए भी vscode integration की कोई योजना है
vscode integration ने setup को बहुत आसान बना दिया था
अगर OxCaml की लोकप्रियता बढ़ती है तो integration में प्रगति होना स्वाभाविक है
व्यक्तिगत रूप से मैं emacs इस्तेमाल करता हूँ, इसलिए विस्तार से नहीं कह सकता, लेकिन यह स्वाभाविक दिशा लगती है
मैं OcaML के micro-size version का उल्लेख करना चाहता हूँ
mlite project लिंक
क्या यह संभव है कि इस project को public करने का मकसद LLM को जानकारी index करने देना हो ताकि उसे open model में इस्तेमाल किया जा सके?
LLM सामान्य OCaml के बारे में भी बहुत कमज़ोर है और data भी कम है, इसलिए OxCaml जैसे और भी niche विषय के लिए ऐसा होने की संभावना बिल्कुल नहीं लगती
इस उद्देश्य के लिए अपना documentation MCP बनाना ज़्यादा सार्थक होगा
signal के रूप में इसकी value काफ़ी नहीं है, इसलिए व्यावहारिक रूप से इसका मतलब नहीं बनता
उदाहरण के लिए, Gleam completion में भी LLM का performance बहुत कम है, और साफ़ patterns तथा mistake guidance देने पर भी यह असफल रहता है
इस वजह से OxCaml की जानकारी उपलब्ध कराने का मकसद होने के लिए यह signal बहुत कमज़ोर है
यह देखना रोचक है कि OxCaml, ML परिवार की एक dialect की भी extension है
अगला कदम कैसा होगा, इसे लेकर उत्सुकता है
मैंने कभी सोचा है कि ज़्यादा समस्या उन लोगों में है जो मौजूदा language में लगातार features जोड़ते रहते हैं, या उनमें जो शुरुआत से नई language बना देते हैं
मैं खुद दूसरे समूह में आता हूँ, लेकिन मुझे लगता है कि programmers में tools को जैसा है वैसा न छोड़ पाने का एक आनुवंशिक गुण होता है
क्या F# का भी ज़िक्र कर सकते हैं, यह एक हल्के-फुल्के अंदाज़ में दिया गया सुझाव था
यह पुष्टि की गई कि इस project में "oxidized" नाम का उपयोग Rust जैसे लक्ष्यों—जैसे fearless concurrency, GC से बचाव आदि—से प्रेरित है, न कि इसलिए कि इसमें वास्तव में Rust का उपयोग हो रहा है
यह naming थोड़ी भ्रमित करने वाली लग सकती है
एक छोटा-सा irony point यह भी है कि Rust नाम वास्तव में जंग से नहीं, बल्कि 'Rust' नाम की fungus से आया है
यह भी साझा किया गया कि Jane Street काफ़ी समय से 'Oxidizing OCaml' नाम की blog series चला रही है
वास्तव में "Oxidizing OCaml with Modal Memory Management" नाम के paper में भी यह शब्द इस्तेमाल हुआ था, लेकिन paper के भीतर 'oxidize' शब्द को स्पष्ट रूप से define या cite नहीं किया गया
यह थोड़ा अजीब है, लेकिन नाम काफ़ी चिपकने वाला लगता है
अनुमान है कि custom tracing GC के साथ integration—जो सामान्य graph structures संभालते हुए भी अधिकतम performance दे सकती है—के मामले में Rust पक्ष तब तक अधिक practical रहेगा जब तक यह project Rust के feature parity तक नहीं पहुँच जाता
नहीं तो यह बस इसलिए बनाए रखने जैसा लगता है कि OxCaml से जुड़े codebases पहले से बहुत अधिक हैं