Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: представление чисел |
|
|
В простейшей Forth-реализации львиная доля чисел требуется на обслуживание адресной арифметики и естественным является стек, содержащий вперемешку числа и адреса (понятно, одинаковой длины). Если требуется работа с "другими" числами, то, за исключением популярных трюков с двойными числами, проще создать отдельный стек. Если же шитый код сам требует "странных" чисел, например, упакованных, то имеет смысл сразу отказаться от "обычного" способа построения Forth системы, разделив "логическую" и "физическую" организацию компилируемого кода. (Т.е. Forth будет думать, что работает с обычными числами/адресами или, даже, методами/сообщениями, а слова работы со словарем будут переводить их в требуемый вид - относительный, упакованный или еще какой).
В простейшей Forth-реализации львиная доля чисел требуется на обслуживание адресной арифметики и естественным является стек, содержащий вперемешку числа и адреса (понятно, одинаковой длины). Если требуется работа с "другими" числами, то, за исключением популярных трюков с двойными числами, проще создать отдельный стек. Если же шитый код сам требует "странных" чисел, например, упакованных, то имеет смысл сразу отказаться от "обычного" способа построения Forth системы, разделив "логическую" и "физическую" организацию компилируемого кода. (Т.е. Forth будет думать, что работает с обычными числами/адресами или, даже, методами/сообщениями, а слова работы со словарем будут переводить их в требуемый вид - относительный, упакованный или еще какой).
|
|
|
|
Добавлено: Ср май 29, 2013 11:19 |
|
|
|
|
|
Заголовок сообщения: |
Re: представление чисел |
|
|
Majestio писал(а): Конечная программа может (должна) работать на процессорах различной разрядности. Я считаю, что имеет смысл разделить вычисления на "родные" и "зарубежные" (читаем "за рубежом"). в Форте обычно так: Есть базовая разрядность, с которой работает ФВМ (обычно, но не всегда, соответствует разрядности АЛУ процессора); все операции без префиксов работают с числами данной разрядности; если появляется новый тип данных, появляются операции с префиксами, т.е.: @ ! - это работа со значениям базовой разрядности; 2@ 2! (или D@ D!) - работа со значениями двойной длины; F@ F! - работа с числами в формате с плавающей точкой, и т.д. Такой формат вобщем достаточно универсален, но, при портировании кода на другие системы с другой разрядностью возможны проблемы, но аналогичные проблемы у того же Си с типом int. Возможно, стоит забить на CELL (то есть ячейку базовой разрядности) и явно указывать для каждой операции разрядность операндов, т.е., к примеру, убрать @ и ! заменив их на Q@ Q! (вобщем префикс ввести обязательный). Последнее будет нормально работать для чисел базовой разрядности и ниже, а вот с числами, не влезающими в CELL проблема не уйдет.
[quote="Majestio"]Конечная программа может (должна) работать на процессорах различной разрядности. Я считаю, что имеет смысл разделить вычисления на "родные" и "зарубежные" (читаем "за рубежом").[/quote] в Форте обычно так: Есть базовая разрядность, с которой работает ФВМ (обычно, но не всегда, соответствует разрядности АЛУ процессора); все операции без префиксов работают с числами данной разрядности; если появляется новый тип данных, появляются операции с префиксами, т.е.: @ ! - это работа со значениям базовой разрядности; 2@ 2! (или D@ D!) - работа со значениями двойной длины; F@ F! - работа с числами в формате с плавающей точкой, и т.д. Такой формат вобщем достаточно универсален, но, при портировании кода на другие системы с другой разрядностью возможны проблемы, но аналогичные проблемы у того же Си с типом int. Возможно, стоит забить на CELL (то есть ячейку базовой разрядности) и явно указывать для каждой операции разрядность операндов, т.е., к примеру, убрать @ и ! заменив их на Q@ Q! (вобщем префикс ввести обязательный). Последнее будет нормально работать для чисел базовой разрядности и ниже, а вот с числами, не влезающими в CELL проблема не уйдет.
|
|
|
|
Добавлено: Ср май 29, 2013 10:53 |
|
|
|
|
|
Заголовок сообщения: |
Re: |
|
|
mOleg писал(а): то есть предлагаете формат записи чисел двойной длины: 1231:3423 ? тогда если просто число типа; 1234313478 не влазит в CELL, то ошибку выдавать? я правильно понял? Сорри за некропостинг. Посчитал данную тему для себя крайне важной, хочется высказаться. Скорее пост себе - в качестве размышления. Конечная программа может (должна) работать на процессорах различной разрядности. Я считаю, что имеет смысл разделить вычисления на "родные" и "зарубежные" (читаем "за рубежом"). Буквально это должно означать следующее: 1) Компилируется/интерпретируется код, он изначально знает о своей разрядности целевой платформы 2) Создается некая библиотека - в заголовка/настройках программист обязан указать желаемую разрядность 3) "Линкер" обязан подключить одну из библиотек - "родной" разрядности или "повышенной" в зависимости от двух факторов - спецификация разрядности в коде, анализ неопределенной разрядности в процессе разбора исходного кода Примеры: работаем с числом xEF0D - Для 8-битного процессора это число "не родное", нужно использование библиотеки "повышенной разрядности";
- Для 16-,32-,64-битного - оно вмещается в "битность" - используем "родную" библиотеку;
Есть ряд задач, где необходимо манипулировать сверх-большими числами. Порядка n*10^100. Как поступить? ИМХО - это адекватно ложится в мою концепцию "родное/не родное" вычисление. Резюме: релиз библиотеки предусматривает обязательное уточнение целевой таргет-разрядности. Для гибкости можно предусмотреть "библиотечный" и "словарный" описатель (если слово оперирует другой, отличной разрядностью) .
[quote="mOleg"]то есть предлагаете формат записи чисел двойной длины: 1231:3423 ? тогда если просто число типа; 1234313478 не влазит в CELL, то ошибку выдавать? я правильно понял?[/quote] Сорри за некропостинг. Посчитал данную тему для себя крайне важной, хочется высказаться. Скорее пост себе - в качестве размышления.
Конечная программа может (должна) работать на процессорах различной разрядности. Я считаю, что имеет смысл разделить вычисления на "родные" и "зарубежные" (читаем "за рубежом"). Буквально это должно означать следующее:
1) Компилируется/интерпретируется код, он изначально знает о своей разрядности целевой платформы 2) Создается некая библиотека - в заголовка/настройках программист обязан указать желаемую разрядность 3) "Линкер" обязан подключить одну из библиотек - "родной" разрядности или "повышенной" в зависимости от двух факторов - спецификация разрядности в коде, анализ неопределенной разрядности в процессе разбора исходного кода
Примеры:
работаем с числом xEF0D
[list] [*] Для 8-битного процессора это число "не родное", нужно использование библиотеки "повышенной разрядности"; [*] Для 16-,32-,64-битного - оно вмещается в "битность" - используем "родную" библиотеку;[/list]
Есть ряд задач, где необходимо манипулировать сверх-большими числами. Порядка n*10^100. Как поступить? ИМХО - это адекватно ложится в мою концепцию "родное/не родное" вычисление.
[b][u]Резюме:[/u][/b] релиз библиотеки предусматривает обязательное уточнение целевой таргет-разрядности. Для гибкости можно предусмотреть "библиотечный" и "словарный" описатель (если слово оперирует другой, отличной разрядностью) .
|
|
|
|
Добавлено: Вт май 28, 2013 11:39 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Wlad писал(а): Зачем явно указывать для чисел двойной длины какая часть числа в какой элемент стека пойдёт??? это вообще-то определяется используемой архитектурой процессора BIG vs LITTLE endian Wlad писал(а): НО! В подавляющем большинстве случаев прикладных программ программист абстрагируется от представления чисел в вычислительном механизме. я не акцентировал то, как хранятся числа в памяти. Я просто показал, в чем отличе в записи: 123`123 и 123:123 если есть идея, как это сделать без показывания как оно в памяти будет лежать, то говори я исправлю(сь) Wlad писал(а): как только вы устанавливаете правило какая часть байтов в какой элементов стека уходит, то при смене разрядности у вас это будет уже ДРУГОЕ число ( в середину числа внесены доп элементы - нулевые байты). А большинство алгоритмов работают с ЯЧЕЙКАМИ. И если двойное число это ДВЕ ячейки, то, при упомянутом мною случае, вы автоматом получаете ошибки и головняк.
эм, не совсем так. Собственно две ячейки и есть две ячейки.
[quote="Wlad"]Зачем явно указывать для чисел двойной длины какая часть числа в какой элемент стека пойдёт???[/quote] это вообще-то определяется используемой архитектурой процессора BIG vs LITTLE endian
[quote="Wlad"]НО! В подавляющем большинстве случаев прикладных программ программист абстрагируется от представления чисел в вычислительном механизме.[/quote] я не акцентировал то, как хранятся числа в памяти. Я просто показал, в чем отличе в записи: 123`123 и 123:123 если есть идея, как это сделать без показывания как оно в памяти будет лежать, то говори 8) я исправлю(сь)
[quote="Wlad"]как только вы устанавливаете правило какая часть байтов в какой элементов стека уходит, то при смене разрядности у вас это будет уже ДРУГОЕ число ( в середину числа внесены доп элементы - нулевые байты). А большинство алгоритмов работают с ЯЧЕЙКАМИ. И если двойное число это ДВЕ ячейки, то, при упомянутом мною случае, вы автоматом получаете ошибки и головняк.[/quote]
эм, не совсем так. Собственно две ячейки и есть две ячейки.
|
|
|
|
Добавлено: Ср авг 12, 2009 20:12 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Очередные мои пять копеек:
Зачем явно указывать для чисел двойной длины какая часть числа в какой элемент стека пойдёт???
Я согласен: конечно, в Форте особенности вычислительного механизма (стек) ЯВНО присутствуют в языке.
НО! В подавляющем большинстве случаев прикладных программ программист абстрагируется от представления чисел в вычислительном механизме.
Знание распределение (количества) байтов по элементам стека может быть полезным, но мы можем попасть в просак при переносе фортовых исходников с платформы на платформу.
есть число 0х123456 - все прекрасно понимают, что это за число
как только вы устанавливаете правило какая часть байтов в какой элементов стека уходит, то при смене разрядности у вас это будет уже ДРУГОЕ число ( в середину числа внесены доп элементы - нулевые байты). А большинство алгоритмов работают с ЯЧЕЙКАМИ. И если двойное число это ДВЕ ячейки, то, при упомянутом мною случае, вы автоматом получаете ошибки и головняк.
Очередные мои пять копеек:
Зачем явно указывать для чисел двойной длины какая часть числа в какой элемент стека пойдёт???
Я согласен: конечно, в Форте особенности вычислительного механизма (стек) ЯВНО присутствуют в языке.
НО! В подавляющем большинстве случаев прикладных программ программист абстрагируется от представления чисел в вычислительном механизме.
Знание распределение (количества) байтов по элементам стека может быть полезным, но мы можем попасть в просак при переносе фортовых исходников с платформы на платформу.
есть число 0х123456 - все прекрасно понимают, что это за число
как только вы устанавливаете правило какая часть байтов в какой элементов стека уходит, то при смене разрядности у вас это будет уже ДРУГОЕ число ( в середину числа внесены доп элементы - нулевые байты). А большинство алгоритмов работают с ЯЧЕЙКАМИ. И если двойное число это ДВЕ ячейки, то, при упомянутом мною случае, вы автоматом получаете ошибки и головняк.
|
|
|
|
Добавлено: Вт авг 11, 2009 23:02 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
_Harry писал(а): А когда еще длиннее надо бы предупредить или выдать ошибку.
а вот это сложно ловить. Я подумаю как сделать проще, но переполнение двойной разрядност ловить сложнее.
[quote="_Harry"]А когда еще длиннее надо бы предупредить или выдать ошибку.[/quote]
а вот это сложно ловить. Я подумаю как сделать проще, но переполнение двойной разрядност ловить сложнее.
|
|
|
|
Добавлено: Вт авг 11, 2009 21:27 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): Источник: D:\fork\src-102\lib\util\envir.fts
В строке: 35 :52
: MAX-UD ( --> dconst ) 0xFFFFFFFFFFFFFFFF
Число двойной длины!
вот так выглядит предупреждение
Это когда число двойной длины тут понятно.
А когда еще длиннее надо бы предупредить или выдать ошибку.?
[quote="mOleg"] Источник: D:\fork\src-102\lib\util\envir.fts
В строке: 35 :52
: MAX-UD ( --> dconst ) 0xFFFFFFFFFFFFFFFF
Число двойной длины!
вот так выглядит предупреждение [/quote]
Это когда число двойной длины тут понятно.
А когда еще длиннее надо бы предупредить или выдать ошибку.?
|
|
|
|
Добавлено: Вт авг 11, 2009 17:45 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
_Harry писал(а): Несовсем понятно что получится если введена строка определяющая число больше чем двойное. Источник: D:\fork\src-102\lib\util\envir.fts В строке: 35 :52 : MAX-UD ( --> dconst ) 0xFFFFFFFFFFFFFFFF Число двойной длины! вот так выглядит предупреждение _Harry писал(а): А также мне кажется ' это уже слишком, : достаточно. они разные, если ты наберешь в строке: 123:456 то на стеке получишь два числа: 456 123 123`456 на стеке оставит два числа: 0 123456 однако, самое интересное происходит с отрицательными числами: -123:456 = -456 -124 -123`456 = -1 -123456
[quote="_Harry"]Несовсем понятно что получится если введена строка определяющая число больше чем двойное.[/quote] [pre]Источник: D:\fork\src-102\lib\util\envir.fts В строке: 35 :52 : MAX-UD ( --> dconst ) 0xFFFFFFFFFFFFFFFF Число двойной длины![/pre] вот так выглядит предупреждение :)
[quote="_Harry"]А также мне кажется ' это уже слишком, : достаточно.[/quote] они разные, если ты наберешь в строке: 123:456 то на стеке получишь два числа: 456 123 123`456 на стеке оставит два числа: 0 123456
однако, самое интересное происходит с отрицательными числами: -123:456 = -456 -124 -123`456 = -1 -123456
|
|
|
|
Добавлено: Пн авг 10, 2009 17:15 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
вопрос писал(а): Забыл спросить, чему в реальности соответствуют отрицательные шестнадцатеричные числа
вопрос логичный. Но иногда проще записать: -0x2 а не 0xFFFFFFE
вобщем дополнительный код
кстати, замечу, что запись -0x2 гораздо универсальнее, чем 0xFF... потому, что не завязана на разрядность числа
[quote="вопрос"]Забыл спросить, чему в реальности соответствуют отрицательные шестнадцатеричные числа[/quote]
:) вопрос логичный. Но иногда проще записать: -0x2 а не 0xFFFFFFE
вобщем дополнительный код
кстати, замечу, что запись -0x2 гораздо универсальнее, чем 0xFF... потому, что не завязана на разрядность числа
|
|
|
|
Добавлено: Пн авг 10, 2009 17:11 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): В данной Форт-системе есть ряд отличий и в том, как распознаются числа, и в том, какой формат записи чисел принят (по сравнению с ANSI94).
Несовсем понятно что получится если введена строка определяющая число больше чем двойное.
А также мне кажется ' это уже слишком,
: достаточно.
[quote="mOleg"]В данной Форт-системе есть ряд отличий и в том, как распознаются числа, и в том, какой формат записи чисел принят (по сравнению с ANSI94). [/quote]
Несовсем понятно что получится если введена [u]строка[/u] определяющая число больше чем двойное.
А также мне кажется [color=green] [b] ' [/b][/color] это уже слишком,
[b] [color=green]:[/color] [/b]достаточно.
|
|
|
|
Добавлено: Пн авг 10, 2009 10:52 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: 0xABCDEF положительное число одинарной длины в шестндцатиричной системе счисления, 4) -0x42DF0 отрицательное число одинарной длины в шестнадцатиричной системе счисления. Заглавные и прописные символы не различаются, то есть можно писать как: 0x1DEC, так и: 0x1dEc . Надо отметить, что число может быть и двойной длины, но тогда в STDERR будет выдаваться предупреждение о том, что вместо числа одинарной длины, введено число двойной длины, но только предупреждение, то есть процесс трансляции прерываться не будет
Забыл спросить, чему в реальности соответствуют отрицательные шестнадцатеричные числа
[quote]0xABCDEF положительное число одинарной длины в шестндцатиричной системе счисления, 4) -0x42DF0 отрицательное число одинарной длины в шестнадцатиричной системе счисления. Заглавные и прописные символы не различаются, то есть можно писать как: 0x1DEC, так и: 0x1dEc . Надо отметить, что число может быть и двойной длины, но тогда в STDERR будет выдаваться предупреждение о том, что вместо числа одинарной длины, введено число двойной длины, но только предупреждение, то есть процесс трансляции прерываться не будет [/quote]Забыл спросить, чему в реальности соответствуют отрицательные шестнадцатеричные числа
|
|
|
|
Добавлено: Пн авг 10, 2009 10:30 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
to Wlad:
вопрос писал(а): Будучи расширяемым, форт имеет совсем непроработанным 2 слой - отсюда эти проблемы - там где можно сделать как угодно, ничего как правило сделано не будет
вот-вот, характерный пример - Perl, например, там до сих пор нет именованных параметров в процедурах/функциях.
т.е. на самом деле они очень легко реализуются библиотечкой в десяток строчек текста, и таких библиотечек
десятки, но нет ни одной стандартной. причём таких моментов (как с параметрами) можно назвать много.
to [b]Wlad[/b]:
[quote="вопрос"]Будучи расширяемым, форт имеет совсем непроработанным 2 слой - отсюда эти проблемы - там где можно сделать как угодно, ничего как правило сделано не будет[/quote]
вот-вот, характерный пример - Perl, например, там до сих пор нет именованных параметров в процедурах/функциях.
т.е. на самом деле они очень легко реализуются библиотечкой в десяток строчек текста, и таких библиотечек
десятки, но нет ни одной стандартной. причём таких моментов (как с параметрами) можно назвать много.
|
|
|
|
Добавлено: Пн авг 10, 2009 10:00 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Wlad писал(а): В данной ветке, как в капле - море, отражается причинность вопроса "почему Форт не столь популярен"...
мне это странно слышать\видеть, так как в данной ветке идет обсуждение как лучше организовать ввод чисел с точки зрения пользователя(программиста) в конкретной Форт-системе (см. раздел).
Поэтому ваш коментарий мне совсем не ясен.
[quote="Wlad"]В данной ветке, как в капле - море, отражается причинность вопроса "почему Форт не столь популярен"...[/quote]
мне это странно слышать\видеть, так как в данной ветке идет обсуждение как лучше организовать ввод чисел с точки зрения пользователя(программиста) в конкретной Форт-системе (см. раздел).
Поэтому ваш коментарий мне совсем не ясен.
|
|
|
|
Добавлено: Сб авг 08, 2009 17:52 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: В данной ветке, как в капле - море, отражается причинность вопроса "почему Форт не столь популярен"...
Любой язык можно поделить на 2-3 слоя
Код: -------------------------------------------------------------- слой собственно пользователя (программиста) -------------------------------------------------------------- слой расширений (готовых решений и средств для удобства) -------------------------------------------------------------- слой ключевых идей (определяет сам язык) --------------------------------------------------------------
слой ключевых идей не подвергается изменениям - это опредление языка и он ограничен в обьёме (иначе язык невозможно было бы выучить)
над ним присутствует слой расширений (для С это библиотеки, подключаемые в h файлах) - что-то, что может быть а может и не быть в языке, что не определяет язык, но делает его намного производительнее.
А программист находится на слое программиста - изучив язык, пользуется доступными решениями, выбирает модификацию языка или компилятор с библиотеками.
Будучи расширяемым, форт имеет совсем непроработанным 2 слой - отсюда эти проблемы - там где можно сделать как угодно, ничего как правило сделано не будет
[quote]В данной ветке, как в капле - море, отражается причинность вопроса "почему Форт не столь популярен"...[/quote]
Любой язык можно поделить на 2-3 слоя
[code]-------------------------------------------------------------- слой собственно пользователя (программиста) -------------------------------------------------------------- слой расширений (готовых решений и средств для удобства) -------------------------------------------------------------- слой ключевых идей (определяет сам язык) --------------------------------------------------------------[/code]
слой ключевых идей не подвергается изменениям - это опредление языка и он ограничен в обьёме (иначе язык невозможно было бы выучить)
над ним присутствует слой расширений (для С это библиотеки, подключаемые в h файлах) - что-то, что может быть а может и не быть в языке, что не определяет язык, но делает его намного производительнее.
А программист находится на слое программиста - изучив язык, пользуется доступными решениями, выбирает модификацию языка или компилятор с библиотеками.
Будучи расширяемым, форт имеет совсем непроработанным 2 слой - отсюда эти проблемы - там где можно сделать как угодно, ничего как правило сделано не будет
|
|
|
|
Добавлено: Сб авг 08, 2009 10:40 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
А уважаемому сообществу не кажется несколько странным обсуждение данной темы в таком количестве сообщений?
Мы же не в 1959 году, вообще-то...
Даже если дело касается Форта, есть уже устоявшиеся "стандарты" (привычные формы) записи чисел в подавляющем большинстве языков программирования.
В конце концов, слово NUMBER можно реализовать по одному в каждом из каких-либо соответствующих словарях/библиотеках...
В данной ветке, как в капле - море, отражается причинность вопроса "почему Форт не столь популярен"...
А уважаемому сообществу не кажется несколько странным обсуждение данной темы в таком количестве сообщений?
Мы же не в 1959 году, вообще-то...
Даже если дело касается Форта, есть уже устоявшиеся "стандарты" (привычные формы) записи чисел в подавляющем большинстве языков программирования.
В конце концов, слово NUMBER можно реализовать по одному в каждом из каких-либо соответствующих словарях/библиотеках...
В данной ветке, как в капле - море, отражается причинность вопроса "почему Форт не столь популярен"...
|
|
|
|
Добавлено: Пт авг 07, 2009 23:38 |
|
|
|
|