The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

10.10.2025 22:16

Опубликован релиз языка программирования 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.
  • Множественные улучшению среды выполнения, кодогенерации, около тридцати новых функций в стандартной библиотеке, почти дюжина улучшенных сообщений об ошибках, более пятидесяти исправлений ошибок.


  1. Главная ссылка к новости (https://ocaml.org/releases/5.4...)
  2. OpenNews: Выпуск языка программирования OCaml 4.14.2
Автор новости: ocamlportal.ru
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/64035-ocaml
Ключевые слова: ocaml
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (40) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Аноним (2), 23:32, 10/10/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Начало новостной заметки звучит как сказка Андерсена
     
     
  • 2.9, Аноним (9), 00:50, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +5 +/
    особенно "с акцентом на выразительность" - вырвиглазность
     
     
  • 3.19, Аноним (-), 07:23, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > особенно "с акцентом на выразительность" - вырвиглазность

    Что делать, в новостях бывают опечатки :)

     
  • 3.26, Хайль_тоталитарный_Либерализм_РФиНАТО (ok), 09:28, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > особенно "с акцентом на выразительность" - вырвиглазность

    Меня почти дословно опередил ;)

    Хоть там при этой "выразительности" - ещё и безопасность же "повышенна"...

     

  • 1.5, Аноним (5), 00:06, 11/10/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    > с акцентом на выразительность
    > let ( * ) (x,~dx) (y, ~dx:dy) = x*.y, ~dx:(x *. dy +. y *. dx )

    Хотелось бы услышать экспертное мнение о сабже от сишников, которые при каждой возможности воют о том, какой у Раста нечеловеческий синтаксис.

     
     
  • 2.6, Аноним (6), 00:15, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +19 +/
    Все верно, с акцентом на выразительность
    Вот как тут не выразиться, глядя на такой код?
     
  • 2.7, Аноним (-), 00:19, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Хотелось бы услышать экспертное мнение о сабже от сишников,

    Сейчас тебе расскажут что "все просто и понятно" :)
    С другой местные кекспертные сишники обычно еще и яростно наяривают на lisp и scheme, а иногда даже на перловку.

     
     
  • 3.20, Аноним (-), 07:24, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Сейчас тебе расскажут что "все просто и понятно" :)

    Да вообще элементарщина. Ящеры совсем не палятся...

     
  • 3.22, Аноним (22), 07:48, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    В Lisp и Sсheme нет синтакиса в общем случае. Нет синтаксиса - нет проблем. Так что все действительно просто и понятно. Так что наяривали, наяриваем, и будем наяривать.
     
     
  • 4.36, Bottle (?), 13:59, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вы эти сказки неофитам оставьте, тут конечно не сидят прожжёные самовары, но люди понимают, что это піздѣж чистой воды.
     
     
  • 5.44, freehck (ok), 16:56, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Вы эти сказки неофитам оставьте, тут конечно не сидят прожжёные самовары, но
    > люди понимают, что это ###### чистой воды.

    Справедливости ради стоит отметить, что базовый синтаксический анализатор для лиспа  действительно можно написать настолько компактно и коротко, что с некоторой натяжкой, если сравнивать его со всеми остальными языками в мире, можно сказать, что у лиспа "нет синтаксиса". Так, правда, никто естественно не делает, потому что не хотят жертвовать производительностью. )

    Однако конечно же, утверждать, что синтаксиса в лиспах нет совсем -- не верно по определению.

     
  • 2.8, Аноним (8), 00:30, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +7 +/
    Как сишник, не вижу противоречий, что у раста, что окамл, синтаксис непонятный.
     
     
  • 3.10, Аноним (10), 00:58, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Функциональные языки в целом не от мира сего, более-менее адекватно выглядят только созданные под конкреьные задачи Erlang (телеком) и F# (банкинг).
     
     
  • 4.13, Аноним (13), 01:48, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    >F# (банкинг).

    Только вот F# это почти Ocaml, подобно тому, как C# почти Java.

     
  • 2.12, Аноним (13), 01:48, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +4 +/
    На всякий случай сообщаю, что первые версии раста были написаны на окамле.

    ЗЫ интересно, кто-то кроме меня на опеннете в состоянии понять, что здесь написано?

     
     
  • 3.21, Аноним (-), 07:25, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > На всякий случай сообщаю, что первые версии раста были написаны на окамле.

    А первые версии си - вообще на ассемблере, вероятно. Не означает что толпа народа с энтузиазмом возьмется на ассемблере писать.

     
     
  • 4.37, Аноним (37), 14:53, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Первые версии GCC, который тогда умел только C компилять, на каком-то Паскале.
     
  • 2.15, Аноним (-), 04:58, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Всё ещё понятнее растосинтаксиса. Да даже у хаскеля синтаксис понятнее.
     
  • 2.17, Сосиска (?), 06:53, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Выразительнее только у Perl
     
     
  • 3.38, Аноним (37), 14:55, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    В смысле, вызывает поток выражений из уст программиста?
     
  • 2.24, Vkni (ok), 08:19, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Наверное это троллинг. Если хочется на Камле писать код с плавающей точкой, то надо в преамбуле модуля написать

    let (+) = Float.(+)

    и т.д., а дальше писать с нормальными +-. Увы, нормально это в системах типов Хиндли-Милнера без классов типов не делается, а OCaml вынужден идти другим путём.

    Зачем тащить эти +. *. в учебный пример? В оригинальном PR'е пример значительно разумнее:

    let sum_and_product ints =
      let init = ~sum:0, ~product:1 in
      List.fold_left (fun (~sum, ~product) elem ->
        let sum = elem + sum in
        let product = elem * product in
        ~sum, ~product
      ) init ints

    См https://github.com/ocaml/ocaml/pull/13498

    И, в общем, понятно, что это идёт из кровавого ынтерпрайза (Улицы тёти Жени). И да, там оно имеет смысел.

     
     
  • 3.34, freehck (ok), 13:52, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Наверное это троллинг.

    Скорее дань традиции.

    > Если хочется на Камле писать код с плавающей точкой, то надо в преамбуле модуля написать
    > let (+) = Float.(+)

    Да в целом можно даже лучше[1], заменив сразу все операторы:

    open Core.Float.O

    [1] https://ocaml.org/p/core/v0.17.1/doc/core/Core/Float/O/index.html

    > и т.д., а дальше писать с нормальными +-. Увы, нормально это в системах типов Хиндли-Милнера
    > без классов типов не делается, а OCaml вынужден идти другим путём.

    Ну, нормально или нет -- это всё же вкусовщина. Вот мне например больше нравится с модулями заданных сигнатур работать.
    Это ведь нагляднее: в 99.999% случаев мы в рамках заданного контекста один фиг работаем только с одним типом данных.

    Впрочем, я не стану отрицать, что когда я впервые столкнулся с тайпклассами, Haskell изрядно подпортил общее впечатление умолчательной ленивостью.
    Вполне возможно, что мой тезис более говорит о том, что я выбираю OCaml вместо Haskell, а не общие сигнатуры модулей вместо тайпклассов.

    > Зачем тащить эти +. *. в учебный пример? В оригинальном PR'е пример
    > значительно разумнее:
    > let sum_and_product ints =
    >   let init = ~sum:0, ~product:1 in
    >   List.fold_left (fun (~sum, ~product) elem ->
    >     let sum = elem + sum in
    >     let product = elem * product in
    >     ~sum, ~product
    >   ) init ints

    Дружище, при всём уважении, суть не в точке. Я подозреваю, что местным комментаторам List.fold_left сам по себе мозг вынесет куда больше, нежели она.
    Это только для опытных функциональщиков навроде нас с тобой данный пример выглядит проще и понятнее.

    > И, в общем, понятно, что это идёт из кровавого ынтерпрайза.

    Думаю, что проще. Когда писали SML концепция модуля уже была, а вот концепции тайпкласса -- ещё не было.

     
  • 2.25, Аноним (-), 08:27, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Выразительность ≠ Читабельность. У чистой сишки одновременно имеются оба эти качества: выразитеьность и читабельность.
     
     
  • 3.27, Аноним (27), 11:46, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Выразительность ≠ Читабельность. У чистой сишки одновременно имеются оба эти качества:
    > выразитеьность и читабельность.

    Угу, угу
    https://www.ioccc.org/2005/aidan/aidan.c
    [CODE]
    if(!C) {
        l=(o=S].O)?S].I:0; I=o?S].l%9+1:(S].O=i%9+1);
        for(;l<81;l++,I=S].O,o=0) if(!(s]>>10)) {
    for(;;I=I%9+1,o=1) {
        l0=0; if(o&&I==S].O) goto O;
        if(s]>>I&1) {
    S].l=I; S++].I=l; S]=S-1];
    N(I,); O>w&&(w=O); goto lO;
        }
    }
        }
    }
    lO: S].O=0; goto l0; l: if(!(l0=O)) { L=0; goto O; } O--;
    s,S].I] &=~ (1<<S].l);
    [/CODE]


     
  • 2.30, freehck (ok), 13:03, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    >> с акцентом на выразительность
    >> let ( * ) (x,~dx) (y, ~dx:dy) = x*.y, ~dx:(x *. dy +. y *. dx )

    Ну, как человек хорошо знакомый с OCaml я скажу, что мне тут всё понятно без пояснений, так что да: выразительность (и читабельность) тут налицо.

    > Хотелось бы услышать экспертное мнение о сабже от сишников, которые при каждой
    > возможности воют о том, какой у Раста нечеловеческий синтаксис.

    Зачем вообще говорить с людьми, которые судят язык по синтаксису, не зная его?

    Посмотри комментаторов величайшего уровня экспертизы выше и ниже. У них на лице написано, что им синтаксис глаз режет исключительно тем, что они никогда ни с чем подобным не сталкивались.
    А тем временем, синтаксис OCaml -- это вообще-то синтаксис строго типизированного языка с автоматическим выводом типов, и так-то он является продуктом весьма серьёзной работы инженеров и математиматиков в течение последних нескольких десятков лет.

     
  • 2.43, NonRumata (?), 16:15, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Я, конечно, извиняюсь.

    Но напишите, как в вашем понимании будет понятно и выразительно (неважно на чем, Си, OCaml, Python, Erlang).

    P.S. Я вот просто смотрю и явно вижу знакомую формулу и даже не представляю, как можно было понятнее написать.

     
     
  • 3.45, Аноним (9), 16:56, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    не выразительного языка по определению быть не должно, то что не читабельно для среднестатистического императивщика - да!!! Любой ЯК подвержен "синтаксическому диабету" и OCaml болеет этим.

    > P.S. Я вот просто смотрю и явно вижу знакомую формулу и даже не представляю, как можно было понятнее написать.

    Ну и китаец смотрит на свои закорючки и ему все понятно, а какой-нибудь европеец будет "плеваться" до тех пор, пока не поймет смысл этих закорючек, думаю естественная реакция людей, которые с ходу чисто логически не уловили смысл синтаксической конструкции.

     

  • 1.11, Аноним (11), 01:07, 11/10/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    я верю что окамл может лучше!
    https://github.com/jinyus/related_post_gen
     
  • 1.18, Аноним (-), 07:22, 11/10/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > В OCaml гармонично сочетается функциональное ядро,
    > императивные возможности, продвинутая объектная
    > система и неповторимая модульная система.

    ...и абсолютно отбитый синтаксис, после которого Rust и C++ кажутся не такими уж и плохими.




           let ( * ) (x,~dx) (y, ~dx:dy) =
             x*.y, ~dx:(x *. dy +. y *. dx )



    Все очень читаемо и понятно, разве нет? :). Блин даже автоцензор на такой код агрится. На что же это похоже?...

     
     
  • 2.28, Аноним (28), 13:01, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    И что же тут непонятного? Простая перезагрузка оператора для дифференцирования. Матан 1 курс, алло!

     
     
  • 3.35, freehck (ok), 13:58, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > И что же тут непонятного? Простая перезагрузка оператора для дифференцирования.

    Да, вот только не перегрузка, а переопределение. Это важно.

     

  • 1.23, cheburnator9000 (ok), 07:50, 11/10/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Теперь понятно с какой дичи срисовывали раст.
     
     
  • 2.29, Аноним (28), 13:03, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Окамлу 100 лет в обед, вы удивитесь что только с него срисовывали. А на деле - чего тут срисовывать? Окамл просто предоставляет строгую семантику для математических функций. То есть зная математику окамл учится за вечер.
     
     
  • 3.31, Аноним (9), 13:11, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > То есть зная математику окамл учится за вечер.

    жонглируя предметами, вы не познаете силу притяжения.

     
  • 3.32, freehck (ok), 13:23, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > То есть зная математику окамл учится за вечер.

    Вот кстати поддерживаю на 100%. Берёшь RealWorldOcaml, за день читаешь первые несколько глав -- и базовый OCaml уже освоен.
    А дальше будет уже исключительно изучение усиливающих разработчика абстракций.

     
  • 3.40, Аноним (37), 15:06, 11/10/2025 [^] [^^] [^^^] [ответить]  
  • +/
    100 лет в обед это вообще ML-ям, а конкретно OCaml появился в 1996.
     

  • 1.33, Аноним (33), 13:44, 11/10/2025 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     
  • 1.39, blevakagmail.com (?), 15:04, 11/10/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ocaml for.net aka F#
    Rust via ocaml
    Fabel fsharp компилируется в Раст. Кстати ребята делают на f# fidelity fw компилируется в mlir натив. У оригинала также классный компилятор
     
  • 1.42, Аноним (-), 15:15, 11/10/2025 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     
  • 1.46, Аноним (46), 17:12, 11/10/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    ....и эти люди ещё ругают Перл!
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру