Обговорення четвертої мови - Сторінка 3
Форум для колекціонерів та користувачів старих комп’ютерів

Доступ до бази даних System.cfg
Четверта мовна дискусія
Re: Дискусія на мові Forth
Повідомлення від Домініка »30 березня 2013 р. 12:17 вечора
ось програма Factorial, перекладена для MO05
Ця програма була опублікована в журналі FORTH DIMENSION, але я не зміг знайти ім'я автора
Давайте подивимося подробиці:
1 - Однією з переваг Forth є портативність. Перекласти Далі простіше
наприклад, від машини до іншої, ніж Basic.
Ви все одно повинні бути обережними:
а) Рікардо визначає +! на початку, оскільки цього слова не існує в його словниковому запасі. Для нас це існує, тому немає потреби.
б) Існує ВИЗНАЧЕНИЙ байт-масив. Це одна з великих вад Форту Юпітера, яка пропустила це слово
На щастя, тут переклад простий.
в) Слово? DUP у нашому Forth називається -DUP. Але це те саме (див. Сторінку 4)
г) Слово ASCII не існує у нашому Форті. Оскільки мова йде про випромінювання, ми поставимо безпосередньо 44 (або 46 за бал).
e) У деяких FORTHs, THEN замінюється ENDIF.
f) В оригінальному списку (* BUFF) сталася помилка: читати> замість> 3
- Переконайтеся, що редактор був розміщений, як пояснив Ксав'є 28 березня.
Одягніть К7 "Факто"
Від FORTH виконайте:
1 3 ЗАВАНТАЖИТИ ФАКТО
потім перший тест 10 FACS
Re: Дискусія на мові Forth
Повідомлення від __сат__ »30 березня 2013 р. 12:29
Невеликі пояснення щодо основних програм. Вони виглядають складно, але в основному вони дуже прості. Це процедури для обчислення часу або відображення результату, які "скручені". Самі алгоритми зводяться до додавання великих чисел з перенесенням (що займає лише один цикл "for") у поєднанні з множенням (або діленням) великого числа на невелике число, що також робиться простим циклом for.
Фокус у розумінні цих альгосів та розумінні цього поняття великої кількості. Великі числа схожі на наші маленькі числа, але замість того, щоб писати їх в основі 10, вони знаходяться у великій основі (візьмемо 10 000 для простоти). Кожне число в базі 10000 займає місце масиву. Отже, поле в масиві насправді представляє 4 цифри мого великого числа. Масив розміром 1000 займає близько 2 кб оперативної пам'яті і зможе вмістити 1000 * 4 = 4000 десяткових цифр. Ми бачимо, що з 32 тисячами доступних оперативної пам'яті ми могли б мати багато великих чисел, які мали б багато великих цифр. (Сасфепу здатний зробити набагато більше, ніж ми думаємо, якщо отримати правильні алгоритми). Для алгоритмів додавання/віднімання великих чисел ми робимо те, що навчаємо в малому класі з таблицями додавання та розповсюдження перенесення.
- REM (1) на додаток/віднімання перенесення дорівнює +1 або -1, достатньо простого цілого числа
- REM (2) від низької до високої ваги
- REM (3) додавання двох великих цифр
- REM (4) Наведений вище тест можна виконати арифметично:
- REM (1) Увага, утримання може зрости до BASE-1
- REM (2) від низької до високої ваги
- REM (3) Остерігайтеся переливів. Продукт може досягти BASE * D. Ви повинні знайти тип даних для ACCU, який може їх містити без втрат. Тут я взяв дубль.
Факторний розрахунок F (F [EDIT] Програма, яку Домінік щойно опублікувала, робить саме це з кількома деталями: вона працює на базі 100 із великими цифрами, що зберігаються в байтах. Це, мабуть, найкращий вибір для четвертого, хто працює рідно за 16 біт. Тож не можна очікувати переповнення при множенні.
___
(*), але не дуже складно реалізувати четверту процедуру, яка обчислює mul16 * mul16 з 32-бітним результатом.
Re: Дискусія на мові Forth
Повідомлення від Даніель »02 квітня 2013 17:53
Re: Дискусія на мові Forth
Повідомлення від Ксав'єр31 »03 квітня 2013 00:22
@Domi: чудово, дякую! Я передрукую вашу програму вручну (це не занадто довго), щоб
знайомий з редактором. Як відобразити простий розрахунок 250 * 3000 у форматі Forth ?
@_Sam_: дякую за пояснення: я добре влаштовую Basic, спробую добре
зрозуміти ваші програми, щоб адаптувати їх у Форт, під мій ритм.
@Daniel: Це правда, що ця дискусія показує менш відомий аспект sasfepu. Це було б
чудово бачити ваші програми, якщо ви їх знайдете.
Re: Дискусія на мові Forth
Повідомлення від Домініка »03 квітня 2013 01:26
Щоб швидко відповісти на ваше запитання, відповідь є
Сторінка 7 Forth, ви побачите, що U * виконує множення двох неозначених синглів (16 біт), даючи в стеку результат подвійної точності на 32 біти.
Щоб надрукувати 32-розрядне значення (отже, два етапи стеку даних), ми повинні використовувати команду D (в той час як просту .
друкуйте лише один поверх.
У FORTH є змінна під назвою BASE, яка дозволяє, як випливає з назви, змінити базу. Доступний за замовчуванням словниковий запас включає два слова: ШЕСТИГРИЧНИЙ та ДЕСЯТНИЧНИЙ. Але ніщо не заважає вам створити слово BIN для двійкового файлу, таким чином:
Re: Дискусія на мові Forth
Повідомлення від Ксав'єр31 »03 квітня 2013 09:32
Ідеально, це працює бездоганно: ми можемо показати число в кілька сотень мільйонів.
BIN буде корисний для моєї програми "Калькулятор"
З іншого боку, ваше слово Forth FACTORIAL повертає 0 замість 1 для нуля та одиниці. (оскільки цикл зупиняється, якщо не більше 1)
Я спробував поставити число 1, якщо стек = 0, ось так:
Re: Дискусія на мові Forth
Повідомлення від Даніель »03 квітня 2013 10:47
Re: Дискусія на мові Forth
Повідомлення від Ксав'єр31 »03 квітня 2013 10:54
Це справді був би дуже хороший спосіб для мене вивчити Форт. Тож я теж спробую.
Але Домінік повинен буде виправити мою програму, щоб порівняти Forth та Basic.
Тому що, як каже сам Чарльз Х. Мур (винахідник Форту):
Я був чудовим програмістом Fortran. Мене розчарувало Fortran - це те, що програма, написана дуже хорошим
програміст не дає набагато кращої продуктивності, ніж програма, написана поганим програмістом.
За допомогою Forth я хотів створити мову, де чудовий програміст досягає набагато кращої продуктивності.
Якщо у програмі Forth ви погано програмуєте, ваша програма та її продуктивність будуть поганими.
Якщо ви правильно програмуєте, ваша програма буде швидкою.
Перший компілятор Forth був написаний у Фортрані. Потім це було переписано в Assembler. Потім нарешті переписали. у Форті.
Re: Дискусія на мові Forth
Повідомлення від Домініка »03 квітня 2013 13:24
Щоб відповісти на ваше запитання про FACTORIELLE, ось відповідь, яку ви можете розробити:
Re: Дискусія на мові Forth
Повідомлення від Домініка »03 квітня 2013 14:43
Я дозволю вам зробити переклад програми Даниїла.
1 - Я не впевнений, який рядок 250 "I MOD 2 " .
Це залишок за модулем 2 для перевірки парного чи непарного ?
2 - Визначення масиву вказано у форматі Forth.
використовує програмний шлях FACS.
а) Слово, яке створить сімейство ARRAY, визначається наступним чином
(або будь-яка інша назва, крім DIM-ARRAY)
Потім визначте масив, поставивши розмірність масиву, а потім DIM-ARRAY, а потім ім'я, яке ми надамо масиву.
20 ЗАХОДІВ DIM-ARRAY еквівалентні основним DIM ЗАХОДІВ (20)
і 5 MEASURES дасть вам адресу 5 масиву MEASURES, який ви прочитаєте c @ і збережете c!
3 - Ви будете мати обчислення квадратного кореня. Ось (у простих цілих числах) швидкий розрахунок
Re: Дискусія на мові Forth
Повідомлення від Даніель »03 квітня 2013 16:58
Re: Дискусія на мові Forth
Повідомлення від __сат__ »03 квітня 2013 17:37
На Thomson, в четвертому виділення масивів є динамічним (на malloc) або статичним (на компіляції)?
Якщо це динамічно, як проходить "безкоштовний"? Все-таки для динаміки: який тип альго використовується для пошуку вільної зони (ланцюга сегментів)? І нарешті, чи автоматично таблиці поширюються на кілька банківських спогадів?
Насправді, я хотів би знайти мову високого рівня швидше базової, яка дозволяє обробляти просто "великі" таблиці розміром 32 або 48 тис., Керуючи автоматично розміщенням сторінок.
Визначає крок алгоритму Ньютона для квадратного кореня, так? Але з того, що я розумію, він обчислює: (X - N/X)/2 (з X та N у вхідному стеку). Тепер алго Ньютона говорить, що X (n + 1) = (X (n) + N/X (n))/2. У формулі є "+" замість "-". Чи є хитрість?
В іншому випадку хороший алгоритм для обчислення sqrt () без використання поділу на C (легко адаптується в ASM . а як щодо Forth?)
Re: Дискусія на мові Forth
Повідомлення від Домініка »03 квітня 2013 19:33
сів,
Давайте підемо за стеком
Ми входимо в SQRT-CLOSER зі стеком a, b
2DUP -> a, b, a, b
Потім ми повертаємось до SQRT, де .
ПІД час перевірки, якщо (ЛОР (a/2b) - (b/2))> 0
за + після WHILE ми будемо мати в стеку
Що добре Ньютон
Re: Дискусія на мові Forth
Повідомлення від __сат__ »03 квітня 2013 19:44
О гаразд, бачимо так, це працює. Це все ще дивно Forth, тому що в кінцевому підсумку вам потрібно запустити код на папері, щоб зрозуміти, що він обчислює і як він обчислює. Етапи перегляду коду можуть бути дещо повільнішими, ніж у інших більш символічних мовах.
Це оптимальний код? Допоміжне запитання, чи є символічні оптимізатори, що дозволяють оптимізувати 2DUP, OVER, NIP та інший TUCK, бачити оптимізацію логічно-арифметичних обчислень (усунення констант, встановлення коефіцієнта багаторазового розрахунку тощо), або це - це відповідальність кодера за упорядкування своїх обчислень, щоб завжди знаходити потрібну річ у потрібний час у верхній частині стека?
Re: Дискусія на мові Forth
Повідомлення від Домініка »03 квітня 2013 22:17
Не знаю, чи відповідатимуть мої відповіді точно вашим запитанням.
1 - Що стосується масивів, вони створюються під час компіляції.
Візьмемо стандартне визначення ARRAY.
а) кожного разу, коли ми викликаємо DIM-ARRAY, компіляція пройде між ними .
б) Між нами ми зустрінемо АЛЛО. Це дивне, але просте слово шукає значення в стеку та пересуває покажчик компіляції за кількістю комірок, що зустрічаються в стеці. Приклад: 20 ALLOT збільшує покажчик компіляції на 20 вікон, які залишаться вільними.
в) Після виклику DIM-ARRAY шукатиме ім’я створеного ним об’єкта (ЕКЗАМЕР) і якому він дасть кількість квадратів, яку ми вирішили (тут 20).
20 ВИМІРЮВАННЯ DIM-масиву
г) Після створення об'єкта MEASURE, кожного разу, коли я його викликаю, він поміщає свою адресу в стек І виконує те, що відразу після DOES>.
У нашому випадку це слово +. Отже, 5 ЗАХОДІВ додадуть 5 із початковою адресою МЕРИ, і ми знайдемо 5-те поле МІРКИ.
Морально, таблиця MESURE була створена під час компіляції 20 MESURE DIM-ARRAY у просторі компіляції та інших слів вашої програми, що компілюється пізніше, в принципі не йдеться про будь-які зміни.
2 - Я залишався у FIG FORTH з 80-х років, але я сумніваюся, що існує оптимізатор. До того ж оптимізація вручну - це величезне задоволення.
Я пам’ятаю, я був на автодорозі, я домігся досить розгубленого прогресу, повного DUP, SWAP та. зазначається на аркуші А4.
І ось раптом я побачив, що мій стек даних занадто великий, і тимчасово зберігаючи значення, я виключав купу операцій.
Це внутрішня радість, яку можемо зрозуміти лише ми на цьому форумі.
Щиро дякуємо за ваш інтерес до FORTH. Я впевнений, що алгоритм з C, який ви мені показали, повинен перекласти на Forth.
Де я можу знайти швидкий курс C, який дозволяє мені швидко зрозуміти cnt ++; >> = "% c% d або> це відрізняється від>?)