LINUX.ORG.RU

Ada95 vs C++


0

0

Доброго времени суток. Хотелось бы услышать ваши мнения по subj. Речь идет о приложениях из плюсового сегмента: там где нужна скорость и высокоуровневость. Возможно кто-то исползует Ada профессионально. Как обстоят дела с совместным использованием ее с CL (например sbcl)? Скажем приложение на CL, узкие места на Ada (судя по тестам шутаут.дебиан она быстрее C? 0_o)?

anonymous

Судя по тестам на шутаут.дебиан кто-то нашел пару более экономичных к памяти решений на Ada. Тогда может сразу Паскаль?

А по быстродействию С/C++ - первые.

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

> А по быстродействию С/C++ - первые.

Хех, напутал немного, но тем не менее Ada почти не уступает Си/Си++. В общем, ждем мнений.

anonymous
()

рекомендую fortran, остальное от лукавого

anonymous
()

Ada95 по возможностям не уступает C++, но по скорости будет чуток помедленнее. Зато благодаря жесткости типизации, и прочей заточенности ADA на стабильность и безопасность, код на ADA будет надежнее ;) По факту, ADA активно используется только в своем узком секторе, и наверное нет смысла пытатся притащить ее еще куда-то.

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

>> А по быстродействию С/C++ - первые

> Вроде всегда считалось, что фортран первый. )

И фортран и C, практически 1-в-1 в машинные инструкции транслируются, так что пофиг.

fmj
()

>Скажем приложение на CL, узкие места на Ada (судя по тестам шутаут.дебиан она быстрее C? 0_o)?

хм ... вроде лор - это неместо для обсуждения серьезныех вопросов. по теме - почему Ada95 когда уже давно есть Ada2005? (gpl-ный компилятор например gnat можно взять на http://libre.adacore.com/ ) узкие места переписать на Ada вполне даже можно.

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

>Ada95 по возможностям не уступает C++,

даже Ada95 (есть 2005) по возможностям ПРЕВОСХОДИТ C++. по скорости сгенеренного кода, она не уступает С и С++. Ada - язык общего назначения и может быть использована где угодно.

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

Как она может не уступать по скорости, если там проверки на каждый чих ставятся. Вроде даже на переполнение Integer-а проверяется. Тормозит небось пуще джавы.

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

> Как она может не уступать по скорости, если там проверки на каждый чих ставятся. Вроде даже на переполнение Integer-а проверяется. Тормозит небось пуще джавы.

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

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

> И фортран и C, практически 1-в-1 в машинные инструкции транслируются, так что пофиг.

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

Что может действительно приблизиться к фотрану, так это С++ c хитроумными использованием шаблонов (so called a compile-time optimization technique), но на практике это сделать очень сложно.

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

Если не определять свои диапазоны (range), то, наверное, реальных проверок будет не так много.

P.S. Мне нравится, что в Ada есть защита от тупого memory leak. Как только, класс выходит за пределы видимости, все его объекты удаляются из кучи, если, конечно, они там были.

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

> P.S. Мне нравится, что в Ada есть защита от тупого memory leak. Как только, класс выходит за пределы видимости, все его объекты удаляются из кучи, если, конечно, они там были.

Мне помнилось, что там implementation-depended, какие-то реализации могут поддерживать, какие-то реализации могут не поддерживать garbage collector. GNAT например не поддерживает, и по этому если ты вручную не впишешь дополнительно 10 строк кода, что-бы получить аналог free(void*) (я не помню точно, нужно просто подключить Unmanaged_Dellocation какой-то), то ничего удалятся вообще не будет :)

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

К сожалению, я в свое время запускал только небольшие примеры с помощью gnat. Дело дальше так и не пошло. Поэтому такие детали мне не известны.

Но я тоже присматриваюсь к Ada, и время от времени подумываю что-нибудь сделать на ней, вероятно, opensource. А то, знаете ли, порядком устал от C/C++/Java/C#, с которыми постоянно приходилось и приходится иметь дело по работе :)

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

>По _некоторым_ возможностям 8)

почти по всем и имеет кучу таких, которых в С++ просто нет, на вскидку:

крутейшая система типов - например можно спокойно объявить тип 5-битных целых и все арифметические операции над этим типом будут работать, а кроме того, будет работать и контроль преполнения и выхода за границы интервалов и т.п. в С++ даже елементарного контроля переполнения нет не говоря уже о всяких там интервальный типах (range-ах).

встроенная сериализация типов.

для любого типа "указателя" (не только на класс) возможность назначения отдельного allocation pool-а ( аля С++ аллокатора )

value type-ы, размер которых не известен на момент компиляции.

полиморфные value type-ы (в C++ полиморфным поведением обладают только reference type-ы)

implicit conversions, в отличие от С++ нет.

встроенная в язык многозадачность task-и и protected типы.

мне очень нравятся keyword arguments в процедурах и функциях ( без лишних телодвижений типа корявого boost::parameter )

встроенные в язык средства для системного программирования (Annex Systems Programming ) например специальные функции для обработки прерываний и доступа к железу на низком уровне.

встроенные в язык средства для RealTime программирования (Annex RealTime Programming ) например приоритеты, очереди, политики планирования, монотонное время, специализированная модель многозадачности.

встроенные в язык средства для программирования распределенных систем ( Annex Distributed Systems ) разбиение приложения на "партиции", работающие на удаленных узлах, маршаллинг и RPC.

ASIS - Ada Semantic Interface Specification стандартная библиотека для семантического анализа Ada программ - используется как основа для построения всяческих систем для доказательства корректности программ, комплетшн-а в IDE и т.п.

и это только те фичи, что мне вспомнились. на самом деле их гораздо больше.

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

>Как она может не уступать по скорости, если там проверки на каждый чих ставятся. Вроде даже на переполнение Integer-а проверяется.

чеки отключаются Pragma-ми или опциями компилатора.

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

>С оказывается медленнее из-за указателей. Они уменьшают маневр для оптимизатора. Причем, гнутый фортран здесь не является примером скорости.

C БЫЛ медленнее Fortran-а изза проблем с alias-ингом. в новом стандарте есть restrict.

>Что может действительно приблизиться к фотрану, так это С++ c хитроумными использованием шаблонов (so called a compile-time optimization technique), но на практике это сделать очень сложно.

Expression Templates - ничего сложного. однако проблемы с алиасингом остаются ( С++ не потдерживает последний С стандарт )

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

Аннексы - это, по сути, библиотеки. Такие есть и для Си++, так что преимуществом _языка_ я их не считаю (так же, как нельзя считать огромные библиотеки Явы перимуществом _языка_ Ява). Так что остается одно - гораздо более строгая система типов. С другой стороны, в Аде множественное наследование отсуствует совсем.

Ну а вообще, Ада - это такой Лисп :D

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

>Если не определять свои диапазоны (range), то, наверное, реальных 
проверок будет не так много.


procedure x( a : in out sameArray, lo : integer, up: integer ) is 
  i : integer := lo;
begin
  loop
    exit when i = up; 
    ada.text_io.put_line( a(i)'img ); -- проверка всякий раз
  end loop;
end procedure;


procedure x( a : in out sameArrayType, r : sameRangeType ) is 
  i : integer;
begin
  -- проверяется 1 раз: входит ли r в a'range
  for i in r loop 
    a(i) := a(i) ** 2;
    ada.text_io.put_line( a(i)'img ); -- не проверяется ниразу
  end loop;
end procedure;

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

>GNAT например не поддерживает,

легко прикручивается BoehmGC - например http://adacl.sourceforge.net/

>и по этому если ты вручную не впишешь дополнительно 10 строк кода, что-бы получить аналог free(void*) (я не помню точно, нужно просто подключить Unmanaged_Dellocation какой-то), то ничего удалятся вообще не будет :)

на самом деле 1 строка -

MyFree is new Unchecked_deallocation( MyType, MyTypePtr );

это определение ( instantiation ) специализированного экземпляря обопщенной ( generic ) процедуры. затем используем как:

MyFree( accessToVariableOfMyType )

единой деаллокалки нет потому, что а Ada нет implicit conversion для несовместимых типов ( указателя на MyType в void*).

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

>Аннексы - это, по сути, библиотеки. Такие есть и для Си++, так что преимуществом _языка_ я их не считаю

и без Annex-ов полным-полно преимуществ, а если не считать Annex-ы, прописанные в стандарте как часть языка за часть языка, тогда вполне можно выкинуть и stl из С++ и в нем не окажется даже элементарных строк. и вообще язык без стандартизованных библиотек - это как х*й без яиц - в наличие есть, а применить на практике невозможно.

>Так что остается одно - гораздо более строгая система типов

ну это конечно нетак. из 12 пунктов, которые я перечислил Annex-ы составляют только 4.

>С другой стороны, в Аде множественное наследование отсуствует совсем.

там есть множественное наследование интерфейсов ( появилось в 2005-м стандарте ), а больше ничего и ненадо. в С++, единственно для чего в С++ оправдано использование МН, так это для наследования реализации в template метапрограммировании.

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

> и вообще язык без стандартизованных библиотек - это как х*й без яиц - в наличие есть, а применить на практике невозможно.

И как люди на нем пишут :D

>>С другой стороны, в Аде множественное наследование отсуствует совсем.

>там есть множественное наследование интерфейсов ( появилось в 2005-м стандарте )

C Ada05 не знаком, да и в топике речь об Ada95

> единственно для чего в С++ оправдано использование МН, так это для наследования реализации в template метапрограммировании.

"Множественное наследование - это как парашют: обычно ненужно, но когда нужно, хорошо иметь его под рукой" (c) Г.Буч :)

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

> там есть множественное наследование интерфейсов ( появилось в 2005-м стандарте )

Это очень важное нововведение. Уже не помню точно, что мне не понравилось в ada'95, но кажется именно отсутствие этой фичи. Будучи избалованным современными managed языками, я уже не представляю себе, как можно обойтись без множественного наследования интерфейсов в сложном проекте :)

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

> C БЫЛ медленнее Fortran-а изза проблем с alias-ингом. в новом стандарте есть restrict.

AFAIK, таких причин отставания множество. В ранних версиях фортрана даже рекурсии не было. Каждая локальная переменная имела фиксированный адрес в памяти. Стек не предполагался вовсе.

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

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

dave ★★★★★
()

Вопрос к специалистам. А как дружит Ada с объектными базами данных?

Вопрос в сторону CAD/CAE. Желательно открытые или бесплатные средства. Понимаю, что в крайнем случае можно забацать что-нибудь свое через Berkeley Database, но хотелось бы иметь готовые отлаженные средства. "Горячий кеш", возможно OQL, ну и развитое API. Или только за деньги? Или, может быть, я уже несовременен, и придумано что-то принципиально новое в этой области? Интересует ответ именно в контексте Ada.

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