LINUX.ORG.RU

Релиз F# 4.5

 , ,


0

1

F# — статически типизированный мультипарадигмальный язык программирования из семейства языков .NET от корпорации Microsoft. Во многом F# испытал влияние OCaml, являясь, по сути, его продвинутой реализацией для платформы .NET. Компилятор языка открыт, а его код доступен на GitHub.

Самое заметное изменение в этом релизе — увеличение минорной версии языка сразу на четыре единицы. Это было сделано для синхронизации версий языка и библиотеки FSharp.Core:

  • Было: F# 4.1; FSharp.Core 4.4.1.0
  • Стало: F# 4.5; FSharp.Core 4.5.x.0

Причины этого исторические, но конечный результат заключается в том, что он довольно запутан для пользователей F# в течение длительного времени. Итак, это было исправлено.

Side-by-side развёртка компиляторов F# в Visual Studio

SDK компилятора F# использует для установки глобальное местоположение на вашем компьютере. Любая последующая установка Visual Studio будет перезаписывать это местоположение, если версии были одинаковыми (например, для исправлений ошибок). Кроме того, чтобы не создавать беспорядок на вашем компьютере, Visual Studio удалит установку, которую она разместила там при удалении. Это привело к множеству проблем для людей на протяжении многих лет. Например, при установке бета‐версий Visual Studio рядом с релизной версией, бета‐версия могла перезаписать компилятор F#, что заставляло релизную версию Visual Studio использовать бета‐версию компилятора F#!

Для F# 4.5 версия SDK для компилятора будет 10.2. Дополнительные установки Visual Studio (или другие наборы инструментов) не будут выбирать эту более высокую версию SDK.

Поддержка Span

Самое крупное изменение в F# 4.5 — это набор инструментов для поддержки Span, представленном в .NET Core 2.1. Этот набор включает:

  • Тип voidptr.
  • Функции NativePtr.ofVoidPtr и NativePtr.toVoidPtr в FSharp.Core.
  • Типы inref<'T> и outref<'T>, которые являются read‐only и write‐only версиями byref<'T> соответственно.
  • Возможность создания IsByRefLike структур (например Span<'T> и ReadOnlySpan<'T>).
  • Возможность создания IsReadOnly структур.
  • И другое.

Основными целями этого являются:

  • Предложение способов создания высокопроизводительного кода на F#.
  • Полное совпадение с нововведениями в .NET Core.
  • Улучшение генерации кода.

Правила безопасности для byref’ов

Как упоминалось ранее, byref’ы и byref‐like структуры довольно ограничены в том, как их можно использовать. Это связано с тем, что их цель заключается в том, чтобы сделать код низкого уровня безопасным и предсказуемым. Это возможно только путем ограничения использования определенных типов в соответствующих контекстах и анализа вашего кода для обеспечения надежности и корректности.

Краткое изложение некоторых правил:

  • Значение let-bound не может содержать ссылку на себя.
  • byref‐like структуры не могут быть экземплярами или статическими членами класса или нормальной структуры.
  • byref‐like структуры не могут быть захвачены каким‐либо замыканием.
  • byref‐like структуры не могут использоваться как параметр типа.

Напоминаем, что Span<'T> и ReadOnlySpan<'T> являются byref‐like структурами и подчиняются этим правилам.

Новое ключевое слово: match!

Computation Expressions (аналог do‐нотации) теперь поддерживают ключевое слово match!, убирая этим бойлерплейт, существующий сегодня в большом количестве кода.

Вот этот код:

// Code that returns an asynchronous option
let checkBananaAsync (s: string) =
    async {
        if s = "banana" then
            return Some s
        else
            return None
    }
    
// Need to bind the result of checkBananaAsync before pattern matching
let funcWithString (s: string) =
    async {
        let! r = checkBananaAsync s
        match r with
        | Some bananaString -> printfn "It's banana!"
        | None -> printfn "%s" s
}

Теперь может быть переписан так:

// Code that returns an asynchronous option
let checkBananaAsync (s: string) =
    async {
        if s = "banana" then
            return Some s
        else
            return None
    }
    
// Now you can use 'match!'
let funcWithString (s: string) =
    async { 
        match! checkBananaAsync s with
        | Some bananaString -> printfn "It's banana!"
        | None -> printfn "%s" s
}

Это было реализовано John’ом Wostenberg’ом, членом F# OSS community.

Улучшенный трейсинг Async

В F# 4.5 и FSharp.Core 4.5.0 трейсинг Async в computation expressions улучшен:

  • Отчётные номера строк теперь соответствуют ошибочному коду пользователя.
  • Непользовательский код больше не возвращается.

Дополнительные улучшения в FSharp.Core

В дополнение к улучшенному трейсингу Async имеются некоторые небольшие улучшения в FSharp.Core:

  • Map.TryGetValue (RFC).
  • ValueOption<'T> (RFC).
  • FuncConvert.FromFunc и FuncConvert.FromAction, принимающие экземпляры Func<'A,' B> и Action<'A,' B> из C#‐кода (RFC).

Этот код иллюстрирует первые два улучшения:

//
// Map.TryGetValue
//
let mp = Map.ofList [("doot", 1); ("beef", 2); ("hoopty", 3)]

match mp.TryGetValue "doot" with
| (true, value) -> printfn "Value: %A" value
| (false, _) -> printfn "No value found!"


//
// ValueOption
//
let isBanana (str: string) =
    if str = "banana" then
        ValueSome str
    else
        ValueNone
        
match isBanana "banana" with
| ValueSome s -> printfn s
| ValueNone -> printfn "Not a banana :("

Добавление API FuncConvert не так полезно для F#‐only кода, но оно помогает во взаимодействии C# и F#, позволяя использовать «современные» C#‐структуры: например, Action и Func.

Улучшения производительности

В этом выпуске были сделаны улучшения производительности F# и инструментов для F#, на некоторые из которых очень сильно повлияло сообщество. Некоторые из этих улучшений включают:

  • Удаление ≈2.2% от memory allocations в компиляторе F#.
  • Сравнение bools (используемое везде) теперь использует быстрый вариант сравнения. Это было реализовано Василием Кириченко.
  • Значительные улучшения производительности IntelliSense в Visual Studio.
  • Производительность IntelliSense для очень больших файлов F# (≥10k строк кода) улучшилась примерно в два раза, благодаря усилиям сообщества во главе с Василием Кириченко, Steffen’ом Forkmann’ом и Gauthier’ом Segay’ем.

Как обновиться

Получить F# 4.5 можно двумя путями:

>>> Подробности

Читал и думал: на каком языке это написано?

Virtuos86 ★★★★★ ()

Долго приглядывался к нему и решил, что лучше просто использовать Окамл, тем более что батарейки активно развиваются.

Vudod ★★★★★ ()
Ответ на: комментарий от Vudod

F# это такой OCaml для .Net? Я так понимаю, его имел бы смысл использовать, если нужен интероп с .Net.

theNamelessOne ★★★★★ ()

Это тот самый ненужнокамл для шиндузоидов? Уносите.

anonymous ()

Получить F# 4.5 можно двумя путями:
Вместе с последним .NET SDK (≥2.1.400).
С обновлением Visual Studio 2017 версии 15.8.

А при чем здесь опенсорс и Линукс? М.б. я чего-то не знаю, но студия - виндоус-онли проприетарщина.

seiken ★★★★★ ()
Ответ на: комментарий от seiken

.NET Core и mono же есть под линукс. А сам F# опенсорсный.

В Visual Studio Code c Ionide-fsharp прекрасная поддержка F#. В емаксе fsharp-mode тоже неплохой.

Guest_1488 ()

«Во многом испытал влияние OCaml»? Бгг. Это и есть окамл, с элементами C# и Haskell. Впрочем, теперь идет своим путем, как и C# в сравнении с java.

anonymous ()
Ответ на: комментарий от Vudod

лучше просто использовать Окамл, тем более что батарейки активно развиваются

Развиваются в какой-то отдельной области? А то у меня обратное впечатление.

anonymous ()
Ответ на: комментарий от Vudod

Надо обладать очень альтернативным восприятием, чтобы всерьёз сравнивать батарейки окамла и дотнета.

anonymous ()
Ответ на: комментарий от Vudod

многопоток и shared memory уже подвезли?

Deleted ()
Ответ на: комментарий от seiken

.NET Core кроссплатформенный и под лицензией MIT, F# кроссплатформенный и под лицензией Apache. А студия тут как бы и не при чём, для полноценного использования F# не нужна. Язык приятный и в отличие от Haskell и OCaml имеет достаточное число зрелых библиотек.

anonymous ()
Ответ на: комментарий от anonymous

в отличие от Haskell

Штангисты достают попкорн.

Зрелые библиотеки есть у CLR. Так и к хаскелю через FFI можно что угодно прикрутить.

Deleted ()
Ответ на: комментарий от seiken

М.б. я чего-то не знаю, но студия - виндоус-онли проприетарщина.

Да, не знаешь: https://gpo.zugaina.org/app-editors/visual-studio-code

но в целом, конечно, студия эта мерзкая и уродливая проприетарщина, поставил её чтоб псевдокод посмотреть, но, кажется, в монодевелопе это сделать было проще. а от вида студии проблевался

anonymous ()

Это чтобы для винды что-то платное клепать?

Vinni_Pooh ★★★★★ ()
Ответ на: комментарий от anonymous

Да, не знаешь: https://gpo.zugaina.org/app-editors/visual-studio-code

Кто сказал «Visual Studio Code»? В новости указано:

С обновлением Visual Studio 2017 версии 15.8.

Ни о каком vscode речи не идёт. Вот я и спрашиваю, при чём здесь опенсорс или линукс, если это проприетарщина и виндоус?

seiken ★★★★★ ()
Ответ на: комментарий от seiken

.NET Core — опенсорсный
mono — опенсорсный
F# — опенсорсный
Вот я и спрашиваю, при чём здесь опенсорс или линукс, если это проприетарщина и виндоус?

Это троллинг тупостью?

Guest_1488 ()

Отличная новость!

Замечательный язык, человечнее, чем Хаскель (сами создатели признали, что он для экспериментов) и крайне полезный. Задачи бывают разные. C# - ну не интересный. Тут куда больше возможностей

solom ()
Ответ на: комментарий от Guest_1488

Хрен с ним, с .NET Core. Tо, что ты зацитировал - рандомно выбранные фразы, а вопрос о нелинуксовой проприетарщине vs так и остаётся открытым. Но ты предпочитаешь прикидываться шлангом.

seiken ★★★★★ ()
Ответ на: комментарий от seiken

А вот это про что?

Вместе с последним .NET SDK (≥2.1.400).

Шлангуешь тут только ты.

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

Guest_1488 ()

Причины этого исторические, но конечный результат заключается в том, что он довольно запутан для пользователей F# в течение длительного времени

и что исправили ? результат теперь запутан для всех, или запутан более краткое время но для ф-шарпеев

или теперь результат не просто запутан, но закриптован, ключ выброшен, свидетели устранены :-)

MKuznetsov ★★★★★ ()
Ответ на: комментарий от Guest_1488

Тебе говорят про то, что предложение в цитате - галиматья непонятная. Напиши, что «была исправлена путаница в версиях» приведя полужирный твой пример, и не пиши воды.

Deleted ()
Ответ на: комментарий от Deleted

галиматья непонятная

Читать не умеешь? Но это твои проблемы.

Даже если это так, то в

Было: F# 4.1; FSharp.Core 4.4.1.0
Стало: F# 4.5; FSharp.Core 4.5.x.0

Уж точно всё ясно, наглядно и понятно.

Guest_1488 ()
Ответ на: комментарий от Guest_1488

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

В тексте твоей новости vs мелькает столько раз, что непонятно, про что она: про ЯП или про vs. В таком виде новость уже заслуживает тега «vs». И тогда возникает вопрос: а что, для использования фшарп необходима vs? Если да, то это одно дело, а если нет - нафига тогда о ней распространяться? Рекламируешь что ли?

seiken ★★★★★ ()
Ответ на: комментарий от seiken

Десять упоминаний штудии на восемьсот слов

Ага, очень много. Количество упоминаний F# для комического эффекта посчитаешь сам.

а что, для использования фшарп необходима vs?

Нет. Для людей, у которых проблемы со зрением, процитирую ещё раз:

Вместе с последним .NET SDK (≥2.1.400).

Это про опенсорсный .NET Core, да. Про mono тоже не забываем.

Если да, то это одно дело, а если нет - нафига тогда о ней распространяться?

Не нужно забывать, что F# — продукт Microsft, а их IDE — Visual Stduio. Неудивительно, что многие изменения в языке так или иначе связаны с ней. Это всё‐таки ещё и бизнес, да. Нам что, скрыться в манямирок, где штудии и злых пипилитарщиков нет?

Рекламируешь что ли?

Если бы.

Guest_1488 ()
Ответ на: комментарий от seiken

вопрос о нелинуксовой проприетарщине vs так и остаётся открытым

Тебе не пофиг? Лучшая и наименее глючная IDE под винду. Кстати, Community Edition ещё и бесплатная для коммерческого использования. Уж лучше это, чем «швабодные» IDE. Помниццо, пробовал юзать Code::Blocks для компиляции гнутого С++ проекта средствами GCC, так эта самая Code::Blocks через некоторое время стала наглухо зависать при открытии проекта. Переставала реагировать на нажатия кнопок на клавиатуре и клики мышью.

anonymous ()
Ответ на: комментарий от anonymous

Тебе не пофиг? Лучшая и наименее глючная IDE под винду. Кстати, ...

Я очень рад за разрабов для винды, но при чем здесь ЛОР, тем более что F# можно использовать без vs?

Когда C++20 выйдет, тоже нужно будет непременно в описании релевантных новостей расписывать, как круто он в vc++ поддерживается?

seiken ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.