Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Из чего сделаны типы


Автор: Zero 28.12.2004, 03:17
Народ вот я тут непойму. Почему официально в Delphi и Паскале сделаны типы max размером только 32 бита??? Ведь наверняка, можно сделать их размером с разрядную сетку ОС. Может кто знает как они устроены??? Я сам не верю что в Delphi возможно в разделе Type так сделать, но может обясните почему??? И от чего это зависит???

Автор: Yanis 28.12.2004, 08:55
Если бы можно сделать размер больший чем разрядная сетка, то небыло бы необходимости в 64 битных процессорах.

Автор: Sardar 28.12.2004, 14:19
Регистры в 32 битном процессоре имеют размер 32 бита smile Процессор может также сам оперировать 64 битными числами комбинируя пару регистров. Можно самому быделить в памяти массив байт для скольугодного размера числа и "решать" его самим, но естественно, на каждую операцию ты будешь тратить кучу инструкций, все будет работать медленно. Так например реализованны 16 и 32 битные типы на 8 битных микроконтроллерах.
Вопрос: тебе быстрых 32-64 бита не хватает?

Автор: Zero 28.12.2004, 20:23
Цитата(Sardar @ 28.12.2004, 14:19)
Вопрос: тебе быстрых 32-64 бита не хватает?

Вообще хватает, но просто меня заинтересовал вопрос по типам. Вот в http://forum.vingrad.ru/index.php?showtopic=36836&view=all&hl=%CA%E0%EA+%F1%EE%E7%E4%E0%F2%FC+%F1%F3%EF%E5%F0%F2%E8%EF теме, я задавал вопрос "как создать такой тип", но в результате выяснилось что на Паскале его нельзя создать, а на Си можно, вот я и хочу поглубже разобратся в том как устроены типы и отчего зависят.
Замечание: я не знаю "Си", поэтому если ты знаешь Sardar причину по которой на си можно сделать типы любой длины а на Паскале нельзя, то не мог бы пояснить.
Хотя у меня есть предположение что на "Си" работает как ты описал выше....

Автор: Burich-Caeser 28.12.2004, 21:09
ZeroВ принципе можно, только с pointer оперировать придется. Пример - PChar виндозный. Там хранится только указатель на начало строки, а дальше делай, что хочешь. Или это меня спросонья глючит? 21.13 хорошо проснулся smile

Автор: Sardar 28.12.2004, 21:28
Zero тебе ответитли что такое типы и как сделать свой неограниченный по длине тип, просто ты не совсем догоняешь работу компилятора smile
Компилятор транслирует код под какой-то заданный процессор. Если процессор может работать с условно бесконечными числами, то компилятор будет юзать его возможности. Например код некоторого гипотетического проца:
Код
; допустим у нас N 8 битных очень быстрых регистров
load_long_base R10, 10 ; с R10 по R19 регистр у нас 10 байтное длинное число
clear_long; обнулить
increment_long ; увеличить наше число на единицу, 0 - порядковый номер длинног числа
load_long_base R20, 5 ; 5 байтное длинное число
clear_long
decrement_long; умньшить на единицу, получим максимальное число
swap_long ; поменять местами длинные числа, первое на передний план
unsigned_long_add; сумма боих чисел, результат в первое число(R10)

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

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

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

Теперь о языках. Есть убогие языки типа бейсика где каждая фишка реализованна компилятором, а твоя задача связать все возможности компилера в одну программу. Например печать на экран Print, чтение из файла/консоли Input и т.д. - бесчисленное количество ключевых слов.
Есть расширямые языки, где компилятор имеет минимум базовых возможностей, например поддержка типов и структур в С. Код ты можешь писать действительно с нуля расширяя язык новыми функциями и т.п.
ООП языки тоже расширяемые, где ты можешь расширить множество типов(классы) языка. Правда все эти типы сложные, по сути это структуры, а методы обьектов это функции, которым передается ссылка на структуру. Хотя для интепретируемых языков это утверждение не верно.

Теперь представим язык в котором мы можем расширить примитивы. Для этого нам нужно написать собственный код и перегрузить все операторы этого типа, т.е. при любой операции с таким типом будет вызыватся нашь код. Это не сложно сделать в языках где есть перегрузка операторов.

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

Как видим если язык не расширяемый, то это фатально, иначе расширяем возможности собственным кодом.

Последнее. Зачем тебе большой тип для циклов(я так понял)? Если цикл босльшой, то ты делаешь что то не верное... smile И помни ты всегда можешь вложить несколько циклов получая сколь угодно итераций без всяких типов.

Надеюсь я не зря потратил время набивая всю эту.... smile

Автор: Zero 29.12.2004, 09:34
Цитата(Sardar @ 28.12.2004, 21:28)
Zero тебе ответитли что такое типы и как сделать свой неограниченный по длине тип, просто ты не совсем догоняешь работу компилятора
Впринципе что такое тип я то знаю, а вот работу компилятора, как таковую нет, ведь не я же делал его. А на САПР мы ещё не дошли до этого, но скоро будем (нам наш препод говорил).
Цитата(Sardar @ 28.12.2004, 21:28)
Последнее. Зачем тебе большой тип для циклов(я так понял)? Если цикл босльшой, то ты делаешь что то не верное...

Ладно, не хотел я говорить ну всёже скажу: smile в http://forum.vingrad.ru/index.php?showtopic=36596&view=all теме был задан вопрос связанный с большим числом, я там в конце предложил по моему мнению самый оптимальный код, но Pakshin A.S., тоже предложил мене оптимальный но работающий с польшими числами, вот я и хотел, узнать как доделатьсвою прогу но чтобы она была проще чем у него. smile Но к сожалению этого не получилось, все начали предлагать всякие массивы, и всякую ерунду, которая уже стала бы сложнее чем у Пакшина. А потом мне захотелось просто разобратся почему всё так. До этого на все вопросы я обычно пусть не сразу ну находил отвты, а на этот к сожалению не получилось. smile
Цитата(Sardar @ 28.12.2004, 21:28)
Надеюсь я не зря потратил время набивая всю эту....
Конечно нет, теперь я понял для чего нужны разные языки, т.е. конечно я знал некоторое примерно, но теперь наконец до меня дошло даже "Си", и то чем оно отличается от "Delphi", а раньше думал что Делфи самое лучшее, но оказывается у всех есть свои плюсы и минусы, универсальный язык сделать невозможно... smile
Вобщем спасибо за Даходчевое Обяснение!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)