3 पॉइंट द्वारा GN⁺ 2023-07-19 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Hylo value semantics पर आधारित सुरक्षित systems और generic programming को लक्ष्य बनाता है; compiler और standard library अभी शुरुआती चरण में हैं, लेकिन Compiler Explorer पर उदाहरण चलाकर देखे जा सकते हैं
  • भाषा पर शोध Swift subscript के inout projection विस्तार, method bundles, structured concurrency, और value semantics आधारित doubly linked list जैसे विषयों पर केंद्रित है
  • compiler LLVM का उपयोग करता है और coherence के साथ generic compilation, program state की caching/serialization, और C interoperability पर शोध भी शामिल करता है
  • development environment VSCode extension, documentation compiler और Language Server prototype प्रदान करता है, साथ ही SPM/CMake, Ninja/Xcode, Windows/Linux/macOS और Docker development toolchain images को support करता है
  • उदाहरण safe projection और sink method के जरिए ownership और deinitialization rules को code level पर स्पष्ट करते हैं, और दिखाते हैं कि system language safety को कैसे enforce कर सकती है

Hylo का दायरा और वर्तमान स्थिति

  • Hylo का compiler और standard library अभी शुरुआती चरण में हैं
  • advanced Hylo code examples Compiler Explorer पर चलाकर देखे जा सकते हैं
  • पहले पेज पर भी Hylo को Compiler Explorer पर try करने का link दिया गया है

Value semantics और भाषा शोध

  • MVS & Theory value semantics, safe projection, concurrency और data structure representation के इर्द-गिर्द विकसित होता है

Compiler और standard library

  • compiler का काम LLVM-based compilation, generics, state storage और C interoperability तक फैला है
  • standard library की तरफ मौजूदा implementation docs और collection algorithms से जुड़ा काम public किया गया है

Developer experience और build environment

  • editor, documentation और language server के लिए tools साथ में उपलब्ध कराए गए हैं
  • build और development environment कई operating systems और container-based flow को support करता है
    • Development Containers support से शुरुआत की प्रक्रिया कम होती है
    • SPM/CMake, Ninja/Xcode, Windows/Linux/macOS support
    • test generation compiler plugin
    • pre-built Hylo development toolchain Docker image
    • compiler Swift 6.2 में लिखा गया है

Hylo से जुड़े शोध और presentation materials

Code examples: safe projection और explicit deinitialization

  • Subscripts - A Safe Projection Mechanism example दिखाता है कि Angle type radians value store करता है और degrees property को let और inout blocks के रूप में provide करता है
    • degrees का let radians को degree में convert करके return करता है
    • inout temporary degree value d को yield &d से expose करता है, फिर बदली हुई value को वापस radians में convert करके self.radians में reflect करता है
    • main inout d = &a.degrees से projection लेता है, d को 0.0 में बदलता है, और फिर check करता है कि a.radians == 0.0
  • Sink Methods - Capability for Deinitializing example में Computer type shutdown() को sink method के रूप में provide करता है
    • shutdown() memory contents print करने के बाद self.ram को sink process करता है
    • test1 Computer बनाता है और shutdown नहीं करता, जिससे Cannot deinit computer होता है
    • test2 केवल if random_bool() के अंदर shutdown करता है, इसलिए जिस path में if में enter नहीं होता, वहां Cannot deinit computer होता है
    • test3 में while के अंदर shutdown call करने पर पहली iteration के बाद consumed object use की समस्या आती है, और जिस path में while में enter नहीं होता, वहां deinit न कर पाने की स्थिति बनी रहती है
  • अतिरिक्त examples compiler test suite में देखे जा सकते हैं

1 टिप्पणियां

 
GN⁺ 2023-07-19
Hacker News की राय
  • C++ के उत्तराधिकारी के तौर पर शायद Herb Sutter के बेहतरीन CppFront से ज़्यादा Val को लेकर उम्मीद हो सकती है। अभी तक नीचे की सिर्फ़ दो presentations देखी हैं, लेकिन static compilation, static types, C++ interoperability, memory safety, type safety, और data races न होना इसके core लगते हैं
    मैं समझाते समय कहता हूं, “मान लें आप नया C++ project शुरू कर रहे हैं और performance की चिंता नहीं कर रहे; अगर pointers या references के बिना सब कुछ value के रूप में pass और return करें, तो side effects या data races की चिंता न होने से अच्छा नहीं होगा?” Val में दिलचस्प बात यह है कि भाषा से pointers और references हटाने पर भी compiler internally const reference passing और return value optimization लागू करके इच्छित semantics और performance दोनों को बचाए रखता है
    Val: A Safe Language to Interoperate with C++ - Dimitri Racordon - CppCon 2022 https://www.youtube.com/watch?v=ws-Z8xKbP4w
    https://cppcast.com/val-and-mutable-value-semantics/

    • Sean Parent के Val पर आधारित ADSP Podcast के हाल के दो episodes सुनना अच्छा रहेगा। Adobe Research Labs इसके development को काफ़ी गंभीरता से support कर रहा है
      https://adspthepodcast.com/
    • “C++ के साथ interoperability” संदिग्ध लगती है। यह मानना मुश्किल है कि कोई दूसरी भाषा C++ के साथ ठीक से interoperable हो सकती है, और C++ compilers के बीच भी binary compatibility टूट जाती है; कभी-कभी तो उसी compiler के versions के बीच भी फर्क होता है
    • यह structure compiler पर बहुत ज़्यादा भरोसा करने जैसा लगता है। चिंता है कि कहीं एक छोटा-सा बदलाव दूर के code की optimization तोड़कर performance खराब न कर दे
    • अगर “दिन भर values pass और return” करेंगे, तो structs के अंदर references को efficiently बदलना या store करना मुश्किल हो जाएगा। अगर program को थोड़ा भी non-standard या complex data structure चाहिए, तो यह घातक constraint जैसा लगता है। बेशक, ऐसे data structures को सही तरीके से implement करना मुश्किल है, यह सोचें तो यह उल्टा फायदा भी हो सकता है
    • मैंने कई सालों तक PHP programs वास्तव में इसी तरह लिखे हैं, और arrays को बिना चिंता किए लगातार pass करता रहा हूं
      मुझे लगता है PHP interpreter असल में copy-on-write इस्तेमाल करने जितना smart है, लेकिन मैंने खुद profiling नहीं की है। फिर भी काफी complex data processing, DSL की character-by-character parsing, dynamic SQL generation, और results को arbitrary structures में massage करने जैसे काम हर page load पर करने के बावजूद महसूस होने वाली performance problem नहीं थी
      PHP 4 के समय objects भी variables में stored values की तरह behave करते थे, लेकिन बाद में object variables को reference semantics में बदलते वक्त “value, variable reference, value का pointer” को storage type से orthogonal variable attributes न बनाना मुझे एक छूटा हुआ मौका लगता है
      $a = $b; // $b की value को $a में copy करें
      $a = &$b; // $a और $b अब वही variable हैं
      $a = *$b; // $a, $b वाले ही object की ओर point करता है, लेकिन $a = &$b के विपरीत variable खुद linked नहीं है
  • एक तरफ़ यह अच्छा है कि zero-cost abstraction वाली इतनी भाषाएं आ रही हैं, लेकिन मन यह भी चाहता है कि systems programmers अब कोई एक winner चुन लें। उम्मीद है कि पहले से ही छोटा systems programmers community Rust, Zig, Val आदि में और छोटे हिस्सों में न बंटे, और systems language war जल्दी खत्म हो

    • शायद हमने बहुत जल्दी एक को चुन लिया था, इसलिए इस क्षेत्र में innovation बहुत लंबे समय तक कम रहा। युद्ध का स्वागत है
    • इस समय मैं Rust को winner मानता हूं। क्योंकि यह Linux और Windows kernels में सचमुच शामिल होने की बहुत बड़ी barrier पहले ही पार कर चुका है। इस मायने में अब नई systems language के लिए ज़्यादा जगह नहीं लगती
    • मुझे नहीं लगता ऐसा होगा। इसलिए तो wasm + wasi support को हर जगह विस्तार देना और भी ज़रूरी हो जाता है
  • आज पहली बार Val के बारे में जानने पर मेरी भावना कुछ ऐसी रही: “ओह, नई systems language है। शायद कुछ खास न हो, लेकिन देख लेते हैं। Docs ठीक हैं। ownership से जुड़े ideas काफ़ी सोच-समझकर बने हैं और syntax भी reasonable है। लेकिन क्या यह अपने स्वतंत्र अस्तित्व की वजह रखने जितनी अलग है? इसे बना कौन रहा है?”
    फिर देखा कि Dave Abrahams इस पर काम कर रहे हैं, तो रुचि बढ़ गई। Apple में उनसे सामना हुआ था और Swift पर Crusty presentation[1] भी याद है। उनके मजबूत viewpoints पसंद आए थे, लेकिन Apple ने बाद में पुराने advice होने की वजह से वह video हटा दिया। अब वे Adobe में हैं, तो लगा क्या यह Adobe language है
    निष्कर्ष यह है कि इसे watch करना worth है, और linked presentation देखने के बाद इंतज़ार करना चाहिए
    [1] Crusty presentation मिल गई: "I don't do Object Oriented!" https://www.youtube.com/watch?v=p3zo4ptMBiQ

    • David Abrahams, Apple में होने से पहले ही Boost के बहुत अहम contributor थे, C++ committee member थे, और Stepanov-style generic programming के मजबूत समर्थक थे। उनका Val project में शामिल होना चौंकाने वाला नहीं है
  • एक compiler developer के तौर पर नीचे दिए गए issues देखकर मैं चौंक गया
    https://github.com/val-lang/val/issues/758
    https://github.com/val-lang/val/issues/711
    implementation की हालत अच्छी नहीं लगती। जितनी जल्दी हो सके self-hosting करना चाहिए, और तब ऐसे basic bugs और ज़्यादा मिलेंगे। फिर भी इसके 500 से ज़्यादा stars हैं

    • दूसरे compiler developer के नज़रिए से देखें, तो बहुत जल्दी self-hosting शुरू कर देना जितनी नुकसानदेह गलती है, वैसी कम ही होती है। भले ही भाषा छोटे और मध्यम programs के लिए net gain हो, compiler जैसे बड़े project के लिए उपयुक्त होने और tooling तैयार होने में कहीं ज़्यादा समय लगता है। अच्छा है कि वे जल्दबाज़ी नहीं कर रहे
    • अगर ऐसे bugs production में चल रहे compiler में हों तो चिंता की बात है, लेकिन अगर यह अभी define हो रही भाषा का compiler है, तो उतनी बड़ी समस्या नहीं। Rust 1.0 और 1.71 की तुलना करें तो “पहली stable release” और “व्यापक real-world use वाली stable भाषा के compiler” के बीच कितना बड़ा अंतर होता है, यह समझ आता है
      self-hosting भी सब कुछ नहीं है। सबसे बढ़कर यह एक symbolic milestone जैसा है, और हासिल हो तो celebrate करने लायक है, लेकिन development cycle में काफ़ी बाद तक इसे उस भाषा की कमजोरी मानने की बात नहीं लगती
    • Swift खुद भी अभी self-hosting नहीं करता और version 6 release के करीब है। मैं compiler developer नहीं हूं, लेकिन Swift community में इस विषय पर हुई चर्चा का निष्कर्ष यही था कि अभी इसका इतना लाभ नहीं है
  • काफ़ी समय से “Val से खेलकर देखना” टाल रहा था, आज आखिर कोशिश की, लेकिन 4,000 से ज़्यादा commits होने के बावजूद यह अभी usable state से काफ़ी दूर है। language tour के ज़्यादातर examples compile नहीं होते, और ऊपर से simple दिखने वाले examples भी fail होते हैं
    Carbon ने अभी तक सच में कुछ ठोस release नहीं किया है, और Sean Baxter Circle compiler में बहुत progress कर रहे हैं, साथ ही Carbon के कई अच्छे हिस्से भी implement कर रहे हैं। अगर इसे अभी भाषा कहना ही मुश्किल है, तो successor बनना भी मुश्किल है

  • अब V, Val, Vala, Vale हैं। क्या कोई और भाषा है जिसे मैं भूल रहा हूं?

    • VAL भी है। 80s की भाषाओं में से एक, जिसने SISAL के ज़रिए Haskell को प्रभावित किया। हालांकि parallel languages community के बाहर उस VAL को जानने वाले लोग शायद ज़्यादा नहीं होंगे
    • मिलते-जुलते नाम उल्टे फ़ायदेमंद हो सकते हैं। ऐसी भाषाएं सीखने वाले लोग संभवतः “नई hot चीज़” खोज रहे होते हैं, और मिलते-जुलते नाम वाली दूसरी भाषाओं के बारे में भी जानकर उन्हें देख सकते हैं। JavaScript के साथ भी ऐसा हुआ था, और नतीजा बुरा नहीं रहा
    • मुझे सच में लगा था कि यह Vale है। नाम का clash काफ़ी अफ़सोसजनक है
    • ऊपर से V को Vlang भी कहा जाता है, और Vale को भी पहले Vlang कहा जाता था
  • हर बार यही बात आती है, लेकिन Val में मुझे सिर्फ़ यही बात पसंद नहीं कि Vale और V भी नई systems languages हैं। नामों की वजह से तीनों में बहुत आसानी से confusion हो जाता है

    • Vala भी है। domain थोड़ा अलग है, लेकिन मिलते-जुलते नाम वाली एक और भाषा है
    • मुझे यह check करने के लिए link तक खोलना पड़ा कि यह projection language है या region language
    • VAL: Variable Assembly Language भी है https://en.m.wikipedia.org/wiki/Variable_Assembly_Language
  • इससे जुड़ा एक लेख है। और भी हैं क्या?
    Val, a new programing language inspired by Swift and Rust - https://news.ycombinator.com/item?id=31788527 - जून 2022, 19 comments

  • “mutable value semantics” paper को सरसरी तौर पर देखा, और मैं जानना चाहता हूं कि क्या मेरा समझना सही है कि authors references और pointers को a) nested structs और Any के ज़रिए कुछ indirection और runtime checks, b) array indices से replace करने का सुझाव दे रहे हैं
    यह वाक्य ध्यान खींचता है: “यह पूछना उचित है कि mutable value types से doubly linked list या directed graph जैसे self-referential data structures को कैसे represent किया जा सकता है। दरअसल arbitrary graph को adjacency list से represent किया जा सकता है…”। implementation के अंदर memory heap और एक तरह का garbage collection फिर से बनाए बिना doubly linked list को reasonable तरीके से implement करने का रास्ता मुझे साफ़ नहीं दिखता
    इसके अलावा https://github.com/orgs/val-lang/discussions/736 पर discussion मिली, और लगता है Rust के unsafe जैसी escape hatch आ जाएगी। तब सारी समस्याएं हल हो जाएंगी, लेकिन “क्या Val का safe subset ही practical applications बनाने के लिए पर्याप्त है” यह सवाल आगे लंबे समय तक बहस का विषय बना रहेगा

    • arrays का इस्तेमाल करके और pointers की जगह array indices का इस्तेमाल करके वास्तव में memory को फिर से बनाया जा सकता है
      यह तरीका जितना सुनने में मूर्खतापूर्ण लगता है, उससे कम है, क्योंकि ये indices किसी specific data structure, जैसे doubly linked list या graph, से बंधे होते हैं, इसलिए इन्हें program के किसी और हिस्से तक पहुंचने के लिए manipulate करना आसान नहीं होता। यह बात compiler द्वारा इसे check करने की स्थिति में भी लागू होती है, और program को तोड़ने की कोशिशों पर भी
  • homepage के उदाहरण की व्याख्या को कैसे पढ़ना चाहिए, समझ नहीं आ रहा। लिखा है: “अनावश्यक allocation नहीं होता। longer_of का result लंबे argument का projection है, इसलिए अगर emphasize z को बदलता है तो y की value में सीधे बदलाव होता है। value न तो copy होती है, न move होती है, लेकिन उसे emphasize में reference के तौर पर pass भी नहीं किया जाता”
    स्थिति यह है कि string argument function में pass हो रहा है और उसमें character जोड़ा जा रहा है; मौजूदा string की शुरुआती length और stack पर कोई खास location/size रही होगी, तो y की नई copy के बिना यह कैसे संभव है, समझ नहीं आ रहा। क्या शायद कोई append करेगा, इस संभावना के लिए string के अंत में extra padding रखी जाती है? अगर ऐसा है, तो padding कितनी रखी जाती है, और कुल मिलाकर यह ज्यादा inefficient क्यों नहीं है?

    • चार spaces वाला prefix quote के लिए नहीं, code/fixed-width block के लिए होता है। HN में आम तौर पर quote करने के लिए > convention इस्तेमाल होता है, और parser के special treatment के बिना भी ठीक चलता है
    • immutable value होने का मतलब यह नहीं कि वह अनिवार्य रूप से stack पर ही हो
      हालांकि मिलता-जुलता सवाल मेरा भी है। अगर 1GB string को modify करें तो क्या होता है? copy-on-write?
      99% cases में optimization से यह हट सकता है, लेकिन बचे हुए 1% में ऐसी performance गिरावट हो सकती है जिसे ढूंढना बहुत मुश्किल होगा, ऐसा लगता है
    • कुछ दिन बाद खुद ही जवाब देने की कोशिश करूं तो, अगर बदले हुए variable name को stack पर किसी लंबे नए value से चुपचाप shadow कर दिया जाए, तो यह संभव लगता है। शायद “projection” का मतलब भी यही हो सकता है। इस case में stack पहले से allocate है, इसलिए नया allocation नहीं होता। मैं language या compiler expert नहीं हूं, इसलिए हो सकता है यह term उस क्षेत्र में अच्छी तरह जानी-पहचानी हो
    • नीचे की तरफ और explanation है। longer_of function नहीं बल्कि subscript है, और कहा गया है कि subscript value return नहीं करता, बल्कि value को project करके caller को temporary read/write access देता है
      यह move के बराबर कैसे नहीं है, यह मुझे ठीक से समझ नहीं आता। string के case में, Rust की तरह variable size allow करने के लिए इसे heap पर रखा जा सकता है