Ada_Ru форум

Обсуждение языка Ада

Битовые операции

Оставить новое сообщение

Сообщения

rainbow-2000
Битовые операции
2006-03-30 17:08:12

Всем привет!

 

Друзья, у меня такой вопрос к знатокам языка.

Я так понял, что набор битовых операций в Ada не так богат, как в C/C++, но может быть есть способы добиться подобного эффекта, как, скажем в случае с операциями побитовых сдвигов в C/C++ >> и << или этот подход в Ada в принципе не работает?

 

 

Алексей

rainbow-2000 wrote:

 

Всем привет!

 

Друзья, у меня такой вопрос к знатокам языка.

Я так понял, что набор битовых операций в Ada не так богат, как в C/C++, но может быть есть способы добиться подобного эффекта, как, скажем в случае с операциями побитовых сдвигов в C/C++ >> и << или этот подход в Ada в принципе не работает?

 

Вроде как пакет Interfaces именно это и содержит. Нет?

rainbow-2000 wrote:

 

>Всем привет!

 

>Друзья, у меня такой вопрос к знатокам языка.

>Я так понял, что набор битовых операций в Ada не так богат, как в C/C++,

 

Есть в C/C++ операция циклического сдвига и исключающего "или" ? Я что то забыл.

А вот в Ада есть.

Набор битовых операций в Ада по крайней мере не беднее. Он там просто сильнее типизирован.

Посмотри модуль Interfaces.

rainbow-2000 wrote:

Друзья, у меня такой вопрос к знатокам языка.

Я так понял, что набор битовых операций в Ada не так богат, как в C/C++, но может быть есть способы добиться подобного эффекта, как, скажем в случае с операциями побитовых сдвигов в C/C++ >> и << или этот подход в Ada в принципе не работает?

 

Это не так. Суть вот в чем. Ada в отличии от C нет привязки

целочисленных типов к их внутреннему представлению программистом. Т.е. в

C программист задавая целочисленный тип сразу определяется и его

внутреннее представление. В Аде просто указывается диапазон и задача

компилятора подобрать подходящее внутреннее представление. Т.к. диапазон

типа целого числа может быть задан меньше, чем диапазон регистра

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

числам Ады не возможно.

 

Есть такой пакет Interfaces. Там во вложенных пакетах, например

Interfaces.C, лежат типы данных позволяющие обмениваться информацией с

программным кодом написанным на других языках программирования. В

корневом же пакете Interfaces лежат типы данных общего пользования и по

сути корень Interfaces является интерфейсом к ассемблеру. Там есть

целочисленные типы привязанные к разрядности регистров процессора и для

них определены операции побитового сдвига.

-- Olleg Samoylov

Dmitriy Anisimkov wrote:

rainbow-2000 wrote:

 

 

Всем привет!

 

Друзья, у меня такой вопрос к знатокам языка.

Я так понял, что набор битовых операций в Ada не так богат, как в C/C++,

 

 

Есть в C/C++ операция циклического сдвига и исключающего "или" ? Я что

то забыл.

А вот в Ада есть.

Набор битовых операций в Ада по крайней мере не беднее. Он там просто

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

Посмотри модуль Interfaces.

 

 

Olleg wrote:

Это не так. Суть вот в чем. Ada в отличии от C нет привязки

целочисленных типов к их внутреннему представлению программистом. Т.е. в

C программист задавая целочисленный тип сразу определяется и его

внутреннее представление. В Аде просто указывается диапазон и задача

компилятора подобрать подходящее внутреннее представление. Т.к. диапазон

типа целого числа может быть задан меньше, чем диапазон регистра

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

числам Ады не возможно.

 

Есть такой пакет Interfaces. Там во вложенных пакетах, например

Interfaces.C, лежат типы данных позволяющие обмениваться информацией с

программным кодом написанным на других языках программирования. В

корневом же пакете Interfaces лежат типы данных общего пользования и по

сути корень Interfaces является интерфейсом к ассемблеру. Там есть

целочисленные типы привязанные к разрядности регистров процессора и для

 

Sergey I. Rybin wrote:

Вроде как пакет Interfaces именно это и содержит. Нет?

 

 

Друзья, спасибо большое. Да, действительно пакет Interfaces позволяет делать такие вещи.

 

Вот маленькая программка, демонстрирующая, как это может выглядеть (если кому интересно:

 

-- shift_demo.adb - bitshifting in Ada

 

with Ada.Text_IO; use Ada.Text_IO;

with Interfaces; use Interfaces;

 

 

procedure Shift_Demo is

---------------------------Declarations------------------------------

Number : Interfaces.Unsigned_32 := 2#10#;

---------------------------Shift_Demo body---------------------------

begin

Put("Initial number: ");

Put_Line(Number'Img);

Number := Shift_Left(Value => Number, Amount => 1);

Put("Shifting 1 bit left first time: ");

Put_Line(Number'Img);

Number := Shift_Left(Value => Number, Amount => 1);

Put("Shifting 1 bit left second time: ");

Put_Line(Number'Img);

Number := Shift_Left(Value => Number, Amount => 1);

Put("Shifting 1 bit left third time: ");

Put_Line(Number'Img);

end Shift_Demo;

---------------------------------------------------------------------

 

Output:

 

Initial number: 2

Shifting 1 bit left first time: 4

Shifting 1 bit left second time: 8

Shifting 1 bit left third time: 16

 

 

 

 

Однако, стоит заметить, что в C/C++ подобные вещи как-то проще (и быстрее) делаются. Или я не прав?

 

 

Алексей

rainbow-2000 wrote:

 

>Однако, стоит заметить, что в C/C++ подобные вещи как-то проще (и >быстрее) делаются. Или я не прав?

 

 

Проще, но эта "простота, хуже воровства".

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

Dmitriy Anisimkov wrote:

 

rainbow-2000 wrote:

 

 

Однако, стоит заметить, что в C/C++ подобные вещи как-то проще (и быстрее) делаются. Или я не прав?

 

 

 

Проще, но эта "простота, хуже воровства".

Не думаю что быстрее, скорость зависит от компилятора. Думаю GNAT делает

это ассемблерной инструкцией, без вызова процедуры.

 

Что касается простоты, то главное не то, чтобы программу было просто

писать. Главное то, чтобы программу было просто понимать и сопровождать.

А в этом смысле Ада однозначно проще, чем С/С++.

 

А быстрее... Может быть, но вот вопрос - а кого и когда это волнует

в реальных программах? (Если речь, конечно, не идет о встроенном

ПО для мобильного телефона, но там Жаба обычно так тормозит, что

просто ужос!)

Думаю GNAT делает это ассемблерной инструкцией, без вызова процедуры.

 

Естественно. Более того, ассемблерный код в случае Ады и Си *абсолютно* идентичен :)

 

Ада:

Number := Shift_Left (Value => Number, Amount => 1);

Ассемблер:

movl $2, -4(%ebp) #, number

leal -4(%ebp), %eax #, tmp59

sall (%eax) # number

 

Си:

number = number << 1;

Ассемблер:

movl $2, -4(%ebp) #, number

leal -4(%ebp), %eax #, tmp64

sall (%eax) # number

 

:))))))))

 

ВФ

On Fri, Mar 31, 2006 at 04:23:43PM +0700, Dmitriy Anisimkov wrote:

rainbow-2000 wrote:

 

>Однако, стоит заметить, что в C/C++ подобные вещи как-то проще (и >быстрее) делаются. Или я не прав?

 

 

Проще, но эта "простота, хуже воровства".

 

У Ады цель не легкое и быстрое написание кода, а легкое его чтение.

Иным только дай криптованный синтаксис, они тебе в одну строку

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

английским тестом написание + толковые наименования переменных

существенно облегчают понимание и сопровождение, хоть и занимаю больше места.

 

У нас тут на подходе перевод нескольких глав книги Ada Quality & Style, очень рекомендую ознакомиться. Хотябы чтоб не использовать Аду как Си с другим синтаксисом.

 

--

Maxim Reznik

А быстрее... Может быть, но

 

Богохульство!!! *НЕ* может быть этого! :)

 

ВФ

rainbow-2000 wrote:

Однако, стоит заметить, что в C/C++ подобные вещи как-то проще (и быстрее) делаются. Или я не прав?

 

Учитывая что в C++ операция побитового сдвига синтаксический совпадает с

операцией вывода в поток, я бы не сказал что проще. К тому же не определено, сдвиг будет логический или арифметический (что будет с битом знака), на усмотрение реализации. В общем не проще, запутаннее.

-- Olleg Samoylov

Maxim Reznik wrote:

On Fri, Mar 31, 2006 at 04:23:43PM +0700, Dmitriy Anisimkov wrote:

 

rainbow-2000 wrote:

 

 

Однако, стоит заметить, что в C/C++ подобные вещи как-то проще (и быстрее) делаются. Или я не прав?

 

 

 

Проще, но эта "простота, хуже воровства".

 

 

У Ады цель не легкое и быстрое написание кода, а легкое его чтение.

 

Иным только дай криптованный синтаксис, они тебе в одну строку

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

к чему оно, как и зачем. В то время как развернутое, сходное с

английским тестом написание + толковые наименования переменных

существенно облегчают понимание и сопровождение, хоть и занимаю больше

места.

 

У нас тут на подходе перевод нескольких глав книги Ada Quality & Style,

очень рекомендую ознакомиться. Хотябы чтоб не использовать Аду как Си

с другим синтаксисом.

 

 

Имеется ввиду

 

Ada 95 Quality and Style:

Guidelines for Professional Programmers

Department of Defense Ada Joint Program Office ?

 

Да, это очень хорошая книжка. У меня она есть и я её почитываю периодически.

Вообще, единоообразный синтаксис -- это великая вещь, особенно при работе в команде. А то один пишет MYNAMESPACE, другой пишет MyNamespace и MyClass -- и поди тут разберись сразу класс это или структура или ещё чего нибудь :) Если только не ввести в приказном порядке какой-то один стиль кодирования, то это может создать определённые неудобства. На самом деле в С/С++ можно писать понятно, но "классики жанра" этого не поймут :)

 

Алексей

Vasiliy Fofanov wrote:

А быстрее... Может быть, но

 

 

Богохульство!!! *НЕ* может быть этого! :)

 

ВФ

 

 

Да, да, Василий, похоже, что вы правы. Конечно, в любом случае, надо понимать как работает сам GNAT, иначе картинка не очень полная.

 

 

Алексей

Olleg wrote:

rainbow-2000 wrote:

 

Однако, стоит заметить, что в C/C++ подобные вещи как-то проще (и быстрее) делаются. Или я не прав?

 

 

Учитывая что в C++ операция побитового сдвига синтаксический совпадает с

операцией вывода в поток, я бы не сказал что проще.

Да нет, std::cout << "Я печтатю ваш вывод" << std::endl; -- это как раз-таки (на мой взгляд) удачный пример перегрузки оператора.

 

К тому же не

определено, сдвиг будет логический или арифметический (что будет с битом знака), на усмотрение реализации.

А что с ним может быть, если двигается, например, число типа int ?

 

 

Алексей

Здравствуйте!

 

Где можно скачать (или купить) эту книгу?

 

Ada 95 Quality and Style:

Guidelines for Professional Programmers

Department of Defense Ada Joint Program Office ?

 

-- Vladimir

Да, да, Василий, похоже, что вы правы. Конечно, в любом случае, надо понимать как работает сам GNAT, иначе картинка не очень полная.

 

С одной стороны да, "доверяй но проверяй" и все такое, но с другой стороны можно как правило положиться на то что индустриальный компилятор должен соответствовать достаточно суровым критериям эффективности объектного кода, и такая чудовищная потеря эффективности как явный вызов подпрограммы для битовой

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

 

Конечно в случае GNAT он еще и использует GCCшный бэкенд, поэтому генерация кода и изрядная доля оптимизаций вообще идентичны сишным, отсюда и одинаковый код :)

Где можно скачать (или купить) эту книгу?

 

Ну ведь есть же Google :) Например тут: http://www.grammatech.com/style_guide/cover.html

 

ВФ

Sergey I. Rybin wrote:

 

 

Что касается простоты, то главное не то, чтобы программу было просто

писать. Главное то, чтобы программу было просто понимать и сопровождать.

А в этом смысле Ада однозначно проще, чем С/С++.

 

Да, я с этим полностью согласен.

 

А быстрее... Может быть, но вот вопрос - а кого и когда это волнует

в реальных программах? (Если речь, конечно, не идет о встроенном

ПО для мобильного телефона, но там Жаба обычно так тормозит, что

просто ужос!)

 

 

Да, Жаба - это сила :) ! Хотя, проблема может быть вовсе и не в Жабе.

 

Программы, конечно, разные бывают. Из реальных программ могу привести пример сервера, обслуживающего сеть спутникового интернета.

Знаете, там скорость -- один из важнейших параметров. Прямо, как в авиации -- борьба за каждый "грамм". :)

Кстати, C++ с этой задачей справляется очень хорошо и "интерфейсы" ему не нужны. :)

 

 

Алексей

Да, Жаба - это сила :) ! Хотя, проблема может быть вовсе и не в Жабе.

 

Скорее всего не в ней :)

 

Программы, конечно, разные бывают. Из реальных программ могу привести пример сервера, обслуживающего сеть спутникового интернета.

Знаете, там скорость -- один из важнейших параметров. Прямо, как в авиации -- борьба за каждый "грамм". :)

 

А вот это уже - весьма и весьма спорный вопрос. По поводу авиации.

Кстати, C++ с этой задачей справляется очень хорошо и "интерфейсы" ему не нужны. :)

 

Загадочная фраза. Не разъясните ли подробнее с чем именно хорошо

справляется С++ и что именно ему для этого не нужно.

 

ВФ.

 

ЗЫ. Кто вставляет в заголовок этот дурацкий [OBORONA-SPAM]? Нельзя ли с этим что-нибудь сделать? Заголовок оказывается полностью изуродован.

Sergey I. Rybin wrote:

Да, Жаба - это сила :) ! Хотя, проблема может быть вовсе и не в Жабе.

 

 

Скорее всего не в ней :)

 

 

Программы, конечно, разные бывают. Из реальных программ могу привести пример сервера, обслуживающего сеть спутникового интернета.

Знаете, там скорость -- один из важнейших параметров. Прямо, как в авиации -- борьба за каждый "грамм". :)

 

 

А вот это уже - весьма и весьма спорный вопрос. По поводу авиации.

 

 

Почему спорный? В авиации, действительно, стараются сделать конструкцию как можно более лёгкой (в разумных, естественно, пределах). Если сравнить основные конструктивные узлы самолёта (гидросистему, проводку, электрооборудование и т.д.) с их аналогами на других "не летающих" транспортных средствах сопоставимого размера, то это очень сильно бросается в глаза.

 

Кстати, я недавно очень был удивлён, узнав, что C++ полетел на Марс в качестве ПО автономной системы управления движением Mars rover-а (а также анализа ситуации на трассе и планирования маршрута).

 

А вообще, я давно хотел узнать на каком языке написана real time mission critical OS типа QNX ? Никто случайно не знает?

 

 

Алексей

Новое сообщение:
Страницы: 1 2 3 4

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти