LINUX.ORG.RU

Application для Linux на Swift

 , , ,


0

3

Наткнулся на удачный биндинг новомодного Apple язычка swift к GTK+3 графической библиотеке, что позволяет писать графические приложения примерно так:

let app = Application(applicationId: "com.example.application")
app.run { window in
    window.title = "Hello World"
    window.defaultSize = Size(width: 400, height: 400)
    window.resizable = true

    let button = Button(label: "Press Me")
    button.clicked = { _ in
        let newWindow = Window(windowType: .TopLevel)
        newWindow.title = "Just a window"
        newWindow.defaultSize = Size(width: 200, height: 200)
        let labelPressed = Label(text: "Oh, you pressed the button.")
        newWindow.add(labelPressed)

        newWindow.showAll()
    }

    window.add(button)
}

Результат: https://github.com/TomasLinhart/SwiftGtk/blob/master/Screenshots/Linux.png

Репозиторий с инструкциями по установке: https://github.com/TomasLinhart/SwiftGtk/

★★★★★

Прикольно! Гтк - самая лучшая агломерация библиотек. В отличие от Qt и прочих, позволяет писать биндинги на раз два.

Но зачем свифт, если есть Vala?

hibou ★★★★★
()

Теперь осталось понять, зачем такое извращение нужно?

p.s. Я до сих пор не могу понять целевую аудиторию swift.

andreyu ★★★★★
()

Интересно. Но без GUI-редактора форм никто так софт писать не будет. Для Gtk есть GUI-редакторы форм, стандартный XML-формат и тд?

Legioner ★★★★★
()

На Qt почти так же. Разве что лайоуты нужно прописывать, а в gtk версии их нет.

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w;
    w.resize(400, 400);

    QPushButton btn("Press me");
    QObject::connect(&btn, &QPushButton::clicked, []()
    {
        QDialog diag;
        diag.setLayout(new QVBoxLayout(&diag));
        diag.setWindowTitle("Just a window");

        QLabel lbl("Oh, you pressed the button");
        lbl.resize(200, 200);

        diag.layout()->addWidget(&lbl);
        diag.exec();
    });

    QVBoxLayout lay(&w);
    lay.addWidget(&btn);

    w.show();

    return a.exec();
}

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

Тогда хороший вариант, как альтернатива C++, может выйти в перспективе.

Не выйдет, будет как GTK# никому не нужным. Да и вообще GTK становится все больше тулкитом для Gnome, а не наоборот. Потому с GTK нечасто, но регулярно, переезжают на Qt.

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

Да ладно. Если сравнить цепочку vala -> C -> clang -> LLVM с vala -> LLVM, то во втором случае компилятор может создать более «правильный» LLVM-биткод, тогда как в первом разработчикам нужно методом проб и ошибок вылавливать патеррны на С, которые плохо оптимизируются

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

Если сравнить цепочку vala -> C -> clang -> LLVM с vala -> LLVM, то во втором случае компилятор может создать более «правильный» LLVM-биткод, тогда как в первом разработчикам нужно методом проб и ошибок вылавливать патеррны на С, которые плохо оптимизируются

Как показывает опыт разработчиков GHC, такого не происходит, и C вполне можно использовать как промежуточный язык. Есть лучшие альтернативы (в том же GHC сейчас используется C-- из-за его крайней простоты), но тем не менее C в этой роли тоже неплох.

Проблема с Vala в том, что компилятор Vala не занимается никакими оптимизациями, если исходить из вот этого документа https://wiki.gnome.org/Projects/Vala/Hacking, а просто транслирует код на Vala в соответствующий код на C+GObject без каких-либо действий над ним.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Как показывает опыт разработчиков GHC, такого не происходит, и C вполне можно использовать как промежуточный язык. Есть лучшие альтернативы (в том же GHC сейчас используется C-- из-за его крайней простоты), но тем не менее C в этой роли тоже неплох.

Погоди, а разве компиляция Haskell в Си не признана устаревшей, т.е. deprecated?

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

разве компиляция Haskell в Си не признана устаревшей, т.е. deprecated?

Признана в общем случае, но осталась как средство для портирования самого GHC на новые платформы.

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

Давно признанный уже разработчиками факт - они старались сделать нечто высокоуровневое с поддержкой особенностей GObject для избежания простыней макросов на C для наследования, приватных членов и других фич. Там много чего не реализовано еще, что планировалось. Например генерик функции и переменное количество аргументов.

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

Qt\C++ код выглядит в разы хуже. Я бы даже сказал, отвратительно выглядит

let app = Application(applicationId: "com.example.app")  -   #include <QtWidgets>                                   
app.run { window in                                      -                                                          
    window.title = "Hello World"                         -   int main(int argc, char *argv[])                       
    window.defaultSize = Size(width: 400, height: 400)   -   {                                                      
    window.resizable = true                              -       QApplication a(argc, argv);                        
                                                         -                                                          
    let button = Button(label: "Press Me")               -       QWidget w;                                         
    button.clicked = { _ in                              -       w.resize(400, 400);                                
        let newWindow = Window(windowType: .TopLevel)    -                                                          
        newWindow.title = "Just a window"                -       QPushButton btn("Press me");                       
        newWindow.defaultSize =                          -       QObject::connect(&btn, &QPushButton::clicked, []() 
            Size(width: 200, height: 200)                -       {                                                  
        let labelPressed = Label(text: "Pressed!")       -           QDialog diag;                                  
        newWindow.add(labelPressed)                      -           diag.setLayout(new QVBoxLayout(&diag));        
                                                         -           diag.setWindowTitle("Just a window");          
        newWindow.showAll()                              -                                                          
    }                                                    -           QLabel lbl("Oh, you pressed the button");      
                                                         -           lbl.resize(200, 200);                          
    window.add(button)                                   -                                                          
}                                                        -           diag.layout()->addWidget(&lbl);                
                                                         -           diag.exec();                                   
                                                         -       });                                                
                                                         -                                                          
                                                         -       QVBoxLayout lay(&w);                               
                                                         -       lay.addWidget(&btn);                               
                                                         -                                                          
                                                         -       w.show();                                          
                                                         -                                                          
                                                         -       return a.exec();                                   
                                                         -   }                                                      

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

Вкусовщина же. Тем более swift пример не полный, импортов нет. А количество строк сравнивать - совсем бред. Вы пустые строки также, как и в C++ расставьте, и будет 1в1.

ТС вообще выбрал самый простой пример. Остальные по ссылке вообще ужас.

anonymous
()

Может оно и кому-то нужно, но по мне так gjs и vala исчерпывающие варианты для этих целей.

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

Вполне нормально. По мне так даже winapi ui на С код выглядит неплохо.

Сложные приложения всё равно будут выглядеть сложно)

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

Qt\C++ код выглядит в разы хуже.

А по-моему оба - г..но.

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

целевую аудиторию swift.

радужные мальчики со смузями, кексиками и такими же любовниками

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

Qt\C++ код выглядит в разы хуже. Я бы даже сказал, отвратительно выглядит

Ох уж эти сравниватели теплого и мягкого. Во-первых гуй без лайаутов - это поделка, во-вторых на Qt аналог выглядит так:

#include <QtWidgets>

int main( int argc, char** argv )
{
    QApplication a( argc, argv );

    QPushButton b( "Press Me" );
    b.connect( &b, &QPushButton::clicked, []{ QMessageBox::information( 0, "Just a window", "Oh, you pressed the button." ); } );
    b.show();

    a.exec();
}
anonymous
()
Ответ на: комментарий от anonymous

А точнее:

#include <QtWidgets>

int main( int argc, char** argv )
{
    QApplication a( argc, argv );

    QPushButton b( "Press Me" );
    b.setWindowTitle( "Hello World" );
    b.connect( &b, &QPushButton::clicked, []{ QMessageBox::information( 0, "Just a window", "Oh, you pressed the button." ); } );
    b.show();

    a.exec();
}

Забыл заголовок «Hello World».

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

Ну, если учесть, что раст уже никому не нужен и движуха в их сообществе протухла - то, походу, геи выиграли.

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

Эм, и что из популярного софта на расте написано? Серво? Он разве кому-то нужен? Сколько раст репо на гитхабе, которые имеют хотя бы 500 звёзд и не написаны мозиллой?

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

Эм, и что из популярного софта на расте написано? Серво? Он разве кому-то нужен?

Т.к. это веб-движок, очевидно, что только разработчикам браузеров.

Сколько раст репо на гитхабе, которые имеют хотя бы 500 звёзд

Язык версии 1.0, ему всего-навсего год. Какие тебе звезды на гитхабе? На этом этапе нужно оценивать количество стартующих проектов, а не звезды. Посмотрев на crates.io, например, можно увидеть, что количество пакетов за несколько последних минорных версий выросло в несколько раз.

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

Очевидно, чтобы примкнуться к компании из всяких Ruby, io, Nim...

fix

ados ★★★★★
()

ничё не понял. И как это делается? У свифта интероперабельность с си или как? Покажте мне место склейки сей со свифтом.
import CGtk — это он откуда импортует чего

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

Вот же https://github.com/TomasLinhart/SwiftGtk/blob/master/Sources/module.modulemap

module CGtk {
    header "/usr/local/include/gtk-3.0/gtk/gtk.h"
}

Еще вот:

https://github.com/TomasLinhart/SwiftGtk/blob/master/Package.swift

import PackageDescription

#if os(OSX)
    let gtkUrl = "https://github.com/TomasLinhart/CGtk-OSX"
#elseif os(Linux)
    let gtkUrl = "https://github.com/TomasLinhart/CGtk-Linux"
#else
    fatalError("Unsupported platform.")
#endif

let package = Package(
  name:  "SwiftGtk",
  dependencies: [
    .Package(url: gtkUrl, majorVersion: 1)
  ]
)

https://github.com/TomasLinhart/CGtk-Linux

https://github.com/TomasLinhart/CGtk-Linux/blob/master/module.modulemap

module CGtk [system] {
  header "/usr/include/gtk-3.0/gtk/gtk.h"

  link "gtk-3"
  link "gdk-3"
  link "pangocairo-1.0"
  link "pango-1.0"
  link "atk-1.0"
  link "cairo-gobject"
  link "cairo"
  link "gdk_pixbuf-2.0"
  link "gio-2.0"
  link "gobject-2.0"
  link "glib-2.0"

  export *
}
forCe
()
Последнее исправление: forCe (всего исправлений: 1)
Ответ на: комментарий от forCe

Т.е. вот так просто свифт работает с сями? Неужто эпловцы сделали годный язык. И почему тогда понадобилось столько времени, чтобы запилить биндинги к линуксовым графическим либам.
Выходит этим яблоподелием можно даже пользоваться.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Т.е. вот так просто свифт работает с сями?

Ну типа того. Это, как я понял, называется «системными модулями».

module имя [system] {
    header "путь к хидеру"
    link "библиотека"
    export список_экспорта
}

Но, честно говоря, я это сам только что нашел. Не работал со swift никогда.

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

Только пути там абсолютные и костыля для их поиска пока нет. Кстати, мне кажется или синтаксис один в один синтаксис c++ модулей в clang? А вообще они обещали в 3.0 версии импорт c++ таким же образом.

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

И почему тогда понадобилось столько времени, чтобы запилить биндинги к линуксовым графическим либам.

Потому-что swift еще даже в репах нет.

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

Очевидно, чтобы заменить всякие D, Go, Rust...

Пока очевидно только, что он может стать убийцей Vala, если хорошенько попиарить его среди гномеров

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

С учётом моды на мобилки - сейчас все виртуальные машины не в моде для написания граф софта, который жрёт мало, а работает быстро. Тот же Xamarin, под ios компилирует всё в сишечку с плюсами.

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

Очевидно: для хипстеров создан красивый Qt.

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

Дык пустые строки, как я понял, добавлены для читаемости.
И если импорт добавить — код на swift так и останется более наглядным. Прям смотрю на него и понимаю что он делает (при том что swift вообще никогда в глаза не видел)

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