LINUX.ORG.RU

Вышел релиз связки библиотеки Qt и языка Ada - QtAda-3.0.0

 , , qtada,


0

0

Вышел релиз связки библиотеки Qt и языка Ada - QtAda версии 3.0.0.

Основные изменения:

  • Поддержка Qt4 версии 4.5.1.
  • Добавлена поддержка модулей QtXml, QtSql.
  • Улучшена работа компилятора метаинформации amoc (аналог Qt moc).
  • Существенно упрощен процесс создания программ с использованием связки.
  • Добавлена поддержка системы сборки gnat project files, что значительно упрощает сборку проекта.
  • Связка реализована для более чем 190 классов модулей Qt.

QtAda предоставляет:

  • поддержка создания пользовательских виджетов и их использования в программе Qt Designer;
  • использование «родного» механизма сигналов/слотов - позволяет передавать сигналы между нитями;
  • встроенный компилятор метаинформации с генерацией Ada кода;
  • загрузка созданных Qt Designer форм во время исполнения программы;

В настоящий время ведется ведется разработка компилятора интерфейса пользователя (аналог uic).

Скачать QtAda можно с официального сайта: www.qtada.com

Также запущен проект QtAda Examples, по переносу примеров имеющихся в Qt с языка C++ на язык Ada. Все желающие могут присоединиться.

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



Проверено: hibou ()

Ответ на: комментарий от siberean

> отключающегося GC

(Поправка) Неявную сборку мусора не отключите, безусловно.

> in-out-параметров, опциональной поддержки пойнтеров

Тогда это будет C#.

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

> Аут параметры не нужны. Нужны таплы.

Это подразумевает сборку мусора, что может быть недопустимо в конкретной реализации Ады. Кроме того, Ада - старый язык (старше большинства здесь присуствующих, считая с первых предложений Ишбиа :)).

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

> Это подразумевает сборку мусора,

Почему? При присваисвании вида (a,b,c) = f(); компилятор может сгенерировать удаление возвращаемой структуры сам.

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

> Кроме того, Ада - старый язык (старше большинства здесь присуствующих, считая с первых предложений Ишбиа)

В случае С я это оправдание принимаю, в случае Ады -- нет (хотя у Ады есть что обсудить и может даже позаимствовать).

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

У С имеется определенный принципиальный минимализм, Ада же расширялась сколько раз (и последний -- совсем недавно, 2005), и ее надо сравнивать с С++ и не оправдывать.

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

> А статья та наверняка была: http://www.planetpdf.com/codecuts/pdfs/ooc.pdf

А вот и нет. Труд Шрайнера датируется октябрём 1993-го, а задание на диплом мне было выдано где-то как раз за 6 месяцев до того. Статья была намного короче - видимо, тогда такие идеи носились в воздухе. Я её даже на русский в тетрадку переводил (ибо дома, как ни странно, компа на момент начала диплома не было) - надо поискать.

А руководитель у меня действительно был Ъ :)

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

>>Тогда это будет C#.

>Аут параметры не нужны. Нужны таплы.

А стуктуры уже не подходят для такой задачи? Они как раз создаются в стеке. Если нет боксинга, то GC не будет задействовано.

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

>А стуктуры уже не подходят для такой задачи?

Смысл тапла в том, чтобы _не_ объявлять структуру на каждый чих.

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

> Смысл тапла в том, чтобы _не_ объявлять структуру на каждый чих.

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

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

> Опираюсь на свою практику и с большим трудом представляю себе, когда в C# могут понадобится таплы...

Ммм... а ты программировал на языках с таплами? :)

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

>Опираюсь на свою практику и с большим трудом представляю себе, когда в C# могут понадобится таплы...

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

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

>>>Тогда это будет C#.

>>Аут параметры не нужны. Нужны таплы.

>А стуктуры уже не подходят для такой задачи?

Нет, не подходят. Структура задает некую составную но единую сущность, например "Почтовый адрес" или "Банковский счет". Туплы же позволяют вернуть именно две и более сущности. Использование стукутур в данном случае это ошибка.

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

> Структура задает некую составную но единую сущность, например "Почтовый адрес" или "Банковский счет". Туплы же позволяют вернуть именно две и более сущности. Использование стукутур в данном случае это ошибка.

Чууушь. Ошибка - это использование кортежа при возврате более 3-4 значений.

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

>> Структура задает некую составную но единую сущность, например "Почтовый адрес" или "Банковский счет". Туплы же позволяют вернуть именно две и более сущности. Использование стукутур в данном случае это ошибка.

>Чууушь. Ошибка - это использование кортежа при возврате более 3-4 значений.

А как в пистоне резалтсеты из SQL запросов возвращаются?

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

> А как в пистоне резалтсеты из SQL запросов возвращаются?

ХЗ. А ты распаковываешь резалтсеты? Типа:

r1, r2, r3 = resultset

? :D

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

Да хз, как-то так делаю. Не уверен что это правильно.


    def __select_posting_by_number_impl(self, c, number):
        ret_val = None
        result = c.execute("""
        select messageno,
                newsgroups,
                msgid,
                path,
                subject,
                refs,
                in_reply_to,
                author,
                date,
                unrecognized_headers,
                line_count,
                byte_count,
                body
        from threads
        where messageno = ?
        """, (number,))
        for messageno, newsgroups, msgid, path, subject, refs, \
                in_reply_to, author, date, unrecognized_headers, \
                line_count, byte_count, body in result:
            posting = Posting()
            posting.messageno = messageno
            posting.newsgroups = unpack_seq(newsgroups)
            posting.msgid = msgid
            posting.path = unpack_seq(path)
            posting.subject = subject
            posting.in_reply_to = in_reply_to
            posting.author = author
            posting.date = date
            posting.line_count = line_count
            posting.byte_count = byte_count
            posting.body = body.split(u'\n')
            posting.unrecognized_headers = unpack_header(unrecognized_headers)
            posting.references = unpack_seq(refs)
            ret_val = posting
            self.current_posting = ret_val
        return ret_val   

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

> Ммм... а ты программировал на языках с таплами? :)

Немного на питоне. Небольшой скрипт на 12 килобайт на заказ.

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

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

Все равно не могу придумать. Наклепал более 200 тысяч строк на C# за несколько последних лет... и никак не приходит в голову. Может быть, дело в том, что я стараюсь использовать объектно-ориентированный метод проектирования. Причем новые объекты создаю редко.

Кстати, KeyValuePair - плохой пример. Только недавно обсуждали на rsdn. Я там привел пример из явы, где можно менять свойство Value у java.lang.Map<K,V>.Entry. KeyValuePair не позволяет делать это. То есть, _иногда_ было бы хорошо, если бы это была не структура, а объект с обратной связью с коллекцией (чтобы можно было менять Value). Таплы тут не причем.

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

Хотя это скорее SQL, чем Питон, он вполне показывает, почему в кортеже не должно быть много элементов - их порядок приходится держать в голове. Представь, что в select и for перепутаны порядок line_count и byte_count.

И кстати, если этот код работает правильно, то c.execute вернул список (или кортеж) кортежей.

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

>> Ммм... а ты программировал на языках с таплами? :)

> Немного на питоне.

Я вообще первые пару лет программирования на Питоне не использовал кортежи :)

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

>Хотя это скорее SQL, чем Питон, он вполне показывает, почему в кортеже не должно быть много элементов - их порядок приходится держать в голове.

Ну в жабе был бы тут Object[] и пришлось бы иметь дело не с читаемыми именами переменных а с индексами. Предлагаешь тут гибернейт какой-то прикрутить?

>И кстати, если этот код работает правильно, то c.execute вернул список (или кортеж) кортежей.

Насколько я понимаю он возвращает итератор по кортежам.

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

>Все равно не могу придумать.

С ходу - запрос по N урл с результатами в мультимапе по коду ответа .

Будет что-то вроде (для получения успешных ответов):

multimap( list("http://google.com", "http://yandex.ru").<String, T2<Integer, String>>collect(Http.getF())).get(200)

//пример на жабе:)))

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

>> Хотя это скорее SQL, чем Питон, он вполне показывает, почему в кортеже не должно быть много элементов - их порядок приходится держать в голове.

> Ну в жабе был бы тут Object[]

И причем тут Ява? Речь о том, что в случае возвращения функцией большого кортежа приходится помнить порядок полей. Проблема усугубляется динамической типизацией в Питоне.

> Насколько я понимаю он возвращает итератор по кортежам.

Возможно, но уж точно не кортеж.

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

>И причем тут Ява?

Пример языка без кортежей, где надо городить POJO на каждый чих.

>Речь о том, что в случае возвращения функцией большого кортежа приходится помнить порядок полей.

А что еще из функций типа dbconn.execute() можно вернуть? Ничего кроме кортежа или массива вариантов тут не придумать.

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

> А что еще из функций типа dbconn.execute() можно вернуть?

В Питоне? Массив dict. В строго типизированном языке, в случае, если execute - макрос, надо возвращать как раз массив структур, строгая типизация и всё такое.

Другое дело, что пример не особо удачен - количество возвращаемых значений неизвестно. А обычно оно как раз известно, и можно сделать разумный выбор между кортежом и структурой/dict/kvlist.

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

>С ходу - запрос по N урл с результатами в мультимапе по коду ответа .

>Будет что-то вроде (для получения успешных ответов):

>multimap( list("http://google.com", "http://yandex.ru").<String, T2<Integer, String>>collect(Http.getF())).get(200)

/me ничего не понял...

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

>/me ничего не понял...

:)))

Тип функции которую возвращает Http.getF: String -> (Integer,String) - принимает строку URL, возвращает HTTP response code и контент. Коллект (аналог функции map) создает список таких пар. Этот список передается в метод которы создает из этих пар мультимапу, из которой беруется список контентов по ключу 200 - успешнй респонс.

Суть в том что обощенный Map (Multimap) фреймворка коллекций умеет строиться из таплов-пар. Таплы - офигенная штука для связываний такого рода - струтура (особенно учитывая отсутствие струтурных типов) тут поможет как мертвому припарка - будет туча кода по выгонянию данных из одних ненужных объектов и загонянию в другие кучами бессмысленны хциклов с присваиваниями.

К стати используя упомянутый подход можно вообще реализовать ленивые структуры. Даст бог допилю отдельную нефирмварную версию фреймворка для жабы - положу обществу.

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

По своему красиво, конечно. Все уместилось в одну строчку. Но чую, что реализация будет неэффективна с точки зрения исполнения кода. С точки зрения написания кода, она может быть очень даже эффективна. Да, и похоже, что это все ближе к функциональщине. А я, как уже писал, отдаю предпочтение объектно-ориентированному подходу, иногда процедурному. И там такие вещие, действительно, приходится расписывать руками. Но зато получается быстрый эффективный код, пусть более многословный.

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

>А как в пистоне резалтсеты из SQL запросов возвращаются?

в объекте Row. Который предоставляет интерфейс tuple и доступ к полям по имени

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

> Но чую, что реализация будет неэффективна с точки зрения исполнения кода

Очень зря.

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


Как же он получается быстрый и эффективный если там надо делать лишние операции и создавать ненужные объекты? В моем коде если list заменить на seq или сделать ему toSeq() наличествует всего один цикл внутри мультимапы - остальные структуры - ленивые.

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

> Как же он получается быстрый и эффективный если там надо делать лишние операции и создавать ненужные объекты? В моем коде если list заменить на seq или сделать ему toSeq() наличествует всего один цикл внутри мультимапы - остальные структуры - ленивые.

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

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

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

Этот пример объектный по самое нехочу. На самом объектном языке смолтолке он бы выглядел также с точностью до синтаксиса:

что-то вроде:

Multimap new: (#("google.com", "yandex.ru") collect: [ :u | Http get: u)] )

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

просто в жабе коллекции очень с++сные - результат того на что пытались сделать язык + отсутствие лямбд. В результате при обработке тучи внешних циклов и стейтфул обработок.

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

> Этот пример объектный по самое нехочу. На самом объектном языке смолтолке он бы выглядел также с точностью до синтаксиса:

> что-то вроде:

> Multimap new: (#("google.com", "yandex.ru") collect: [ :u | Http get: u)] )

По-моему, это все таки функциональный подход. Хотя разные подходы могут пересекаться.

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

>По-моему, это все таки функциональный подход.

Функциональный подход не противоположен объектному. Он противоположен императивному.

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

> Функциональный подход не противоположен объектному. Он противоположен императивному.

Тогда поставим вопрос по другому. Когда могут понадобиться тьюплы при императивном подходе?

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

>Когда могут понадобиться тьюплы при императивном подходе?

Когда надо возвращать более одного результата. Найти все аутпраметры и стурктуры типа KeyValuePair.

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

> Народ, проясните ситуацию плз (сори за возможно тупой вопрос).

Очень хороший вопрос.

> Для того чтобы сделать бинд к плюсовой либе допустим для пистона/ады надо написать С-прослойку, и потом к ней уже прибивать - так ведь?

Это один из двух подходов. Это универсальный подход (1). Кроме него есть возможность привязаться напрямую к C++, зная манглинг и устройство VMT (2). Наконец, самый неуниверсальный подход — это использовать возможность интеграции GNAT и G++ (3). Неуниверсальный, зато практически без оверхеда.

Универсальный подход (1) — это:

GNAT-SWIG http://wiki.auroraux.blastwave.org/index.php/Swig

C2Ada http://sourceforge.net/projects/c2ada/

Ярким представителем подхода (2) является Ada Foundation Classes: http://www.jswalker.demon.co.uk/afcfaq.htm Описание CPP2Ada на этом же сайте. Генератор не в открытом доступе.

Ну и, наконец, (3) — это недавно анонсированная фича GNAT GPL 2009. В нём G++ православно пропатчен, чтобы уметь генерировать адские привязки. Эти привязки, если используется C++, становятся GNAT&G++ специфичными. Сишных хедеров это не касается.

Выше упомянутый GNAT-SWIG имеет два бекенда: 'ada' и 'gnat' — (1) и (3), соответственно.

> Если так, то как обстоит дело в проектах-биндингах - каждый сам себе пишет C-layer, или есть готовые проекты?

Когда как. Дело в том, что не все C и C++ библиотеки сделаны из одного теста. Скажем, для Qt обобщённый подход не подошёл бы. У Qt есть дополнительная смысловая нагрузка, не входящая в C++. То же можно сказать про GTK+, XPCOM и UNO. Для нормальной привязки нужно уделить внимание каркасу. Кстати, каркас–специфичные генераторы привязок делать легче, чем делать обобщённое решение. При использовании каркасов метаинформация более высокого уровня. SWIG тоже становится немного каркасом. С interfacer файлами иметь дело удобнее.

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

> Но все же мне кажется, что объектная модель в Аде несколько уступает тому, что принято в C++, Java и С#.

А в чём уступает?

http://www.adaic.org/learn/tech/multin.html

Способ 2 — это mix-in, нормальная альтернатива множественному наследованию. Учитывая, что в 2005ой Аде в явном виде появились интерфейсы, по сравнению с C++ здесь недостатков нет. В объектной модели, по крайней мере.

Если вглядеться в способ 3, можно обнаружить, что это самый обычный DI/IoC из мира Java/C#, вот только статья раза в два старше, чем эта аббревиатура.

P. S. По части ОО особенно критикует Аду Дмитрий Казаков. Мол, надо нормальное множественное наследование и множественный dispatch. Правда, я так до конца и не понял, чего же он хочет, потому что на вопросы типа это как в CLOS? он отвечает нет, это как в Аде :) Наверняка, самые подробности следует искать в Ada-Comment, но я этот список рассылки не читал.

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

> У С имеется определенный принципиальный минимализм, Ада же расширялась сколько раз (и последний -- совсем недавно, 2005), и ее надо сравнивать с С++ и не оправдывать.

Негласный девиз C++ — пропустить неинтересный шаг 1 и перейти к интересному шагу 2. Строительство небоскрёба на пластилиновом фундаменте. Он сочетает мощь compile-time программирования на шаблонах с опасностями низкоуровневого программирования.

А в Аде приоритет наоборот. За это она и нравится. Какие бы у неё ни были продвинутые фичи типа синхронных интерфейсов, всем этим можно пользоваться, не опасаясь проблем с сишного тыла.

Что касается минимализма, для меня любимым компактным языком является Modula-2+. Не M2, не M3 и не Oberon, а именно M2+. Относительно хороший вариант, если нужно в ограниченные сроки реализовать компилятор для своего оборудования. Как вариант, можно взять существующий компилятор M2 и расширить его до M2+.

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

оттуда нашлась хорошая вещь (ada 2005 rationale) http://www.adaic.org/standards/05rat/html/Rat-TOC.html

А оттуда же насчет объектной модели -- In Ada 95, a derived type can really only have one immediate ancestor. This means that true multiple inheritance is not possible although curious techniques involving discriminants and generics can be used in some circumstances.

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

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

Есть и более банальная причина: то, что попадает в язык, вытащить гораздо сложнее.

Да и я бы не сказал, про программирование на mix-in, что это выдранные зубы. LOR на Java написан, в которой нет МН, .NETчики живут себе поживают.

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