ДоступСн язык программирования OCaml 5.4.0

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Ρ€Π΅Π»ΠΈΠ· языка программирования OCaml 5.4.0, ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ языка программирования с Π°ΠΊΡ†Π΅Π½Ρ‚ΠΎΠΌ Π½Π° Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния. Π’ OCaml Π³Π°Ρ€ΠΌΠΎΠ½ΠΈΡ‡Π½ΠΎ сочСтаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ядро, ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ возмоТности, продвинутая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ систСма ΠΈ нСповторимая ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма. Код инструмСнтария для языка OCaml распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ LGPL.

Π‘Ρ€Π΅Π΄ΠΈ мноТСства языков программирования OCaml выдСляСтся своСй ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, дСлая Ρ‚Π΅ΠΌ самым Π΅Π³ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ слоТных систСм. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ особСнности OCaml Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ автоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса, ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ нСизмСняСмых структур Π΄Π°Π½Π½Ρ‹Ρ…, автоматичСский Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΌΠΎΡ‰Π½Ρ‹Π΅ алгСбраичСскиС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… с сопоставлСниСм шаблонов, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ измСнСния ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² OCaml 5.4.0:

  • Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ (Labelled tuples), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ‡Π»Π΅Π½Π°ΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для обращСния ΠΊ Π½ΠΈΠΌ. let point = ~x:1, ~y:2 (* val point : x:int * y:int = (~x:1, ~y:2) *) let ( * ) (x,~dx) (y, ~dx:dy) = x*.y, ~dx:(x *. dy +. y *. dx ) (* val ( * ) : float * dx:float -> float * dx:float -> float * dx:float *) let mult_dx x y = let ~dx, .. = x * y in dx
  • НСизмСняСмыС массивы ΠΈ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ синтаксис для Β«_ arrayΒ», Β«_ iarrayΒ» ΠΈ Β«floatarrayΒ». [|1; 2; 3|] ([|1; 2; 3|] : _ iarray) ([|1.; 2.; 3.|] : floatarray)
  • ВстроСнный Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Β«atomicΒ» для ΠΏΠΎΠ»Π΅ΠΉ записСй, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ использования Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ нСю. type β€˜a mpsc_list = { mutable head:’a list; mutable tail: β€˜a list [@atomic] } let rec push t x = let before = Atomic.Loc.get [%atomic.loc t.tail] in let after = x :: before in if not (Atomic.Loc.compare_and_set [%atomic.loc t.tail] before after) then push t x …
  • НовыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅: Pair, Pqueue, Repr, Iarray.
    • ΠœΠΎΠ΄ΡƒΠ»ΡŒ Pair для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°Ρ€Π°ΠΌΠΈ; let ones = Pair.map_fst succ (0,1)
    • ΠœΠΎΠ΄ΡƒΠ»ΡŒ Pqueue β€” ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ; module Int_pqueue = Pqueue.MakeMin(Int) let q = Int_pqueue.of_list [4;0;5;7] let some_zero = Int_pqueue.pop_min q
    • ΠœΠΎΠ΄ΡƒΠ»ΡŒ Repr содСрТит физичСскоС ΠΈ структурноС равСнство, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сравнСния; let f = Repr.phys_equal (ref 0) (ref 0)
    • ΠœΠΎΠ΄ΡƒΠ»ΡŒ Iarray для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСизмСняСмыми массивами; let a = Iarray.init 10 Fun.id let b = Iarray.map succ a
  • ВосстановлСн Ρ€Π΅ΠΆΠΈΠΌ β€œΠΎΡ‡ΠΈΡΡ‚ΠΊΠΈ памяти ΠΏΡ€ΠΈ выходС”. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ позволяСт ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ срСду выполнСния OCaml Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° языкС C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ OCaml. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ ΡˆΡƒΠΌΠ° ΠΏΡ€ΠΈ отслСТивании ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти Π² ΠΊΠΎΠ΄Π΅ C, выполняСмого Π² срСдС OCaml.Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Β«cancellationΒ», всС Π΄ΠΎΠΌΠ΅Π½Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ· срСды выполнСния OCaml.
  • Новый Ρ€Π°Π·Π΄Π΅Π» Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ OCaml ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² срСдС Linux ΠΈ MacOS.
  • ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ срСды выполнСния, ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΠΊΠΎΠ»ΠΎ Ρ‚Ρ€ΠΈΠ΄Ρ†Π°Ρ‚ΠΈ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, ΠΏΠΎΡ‡Ρ‚ΠΈ дюТина ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Ρ‹Ρ… сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π±ΠΎΠ»Π΅Π΅ пятидСсяти исправлСний ошибок.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ