User Tag List

Страница 2 из 18 ПерваяПервая 123456 ... ПоследняяПоследняя
Показано с 11 по 20 из 180

Тема: Почему компилированный Бейсик выполняется быстро?

  1. #11
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,058
    Спасибо Благодарностей отдано 
    224
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо за хорошие отзывы. Хочу немного уточнить, сразу не все вспомнилось.
    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    На отдельную (не первую) команду в строке прямо перейти нельзя - нет таких команд. Хотя можно вернуться на вторую и последующие команды в строке с помощью RETURN.
    Не только RETURN, а еще NEXT и CONTINUE.
    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Да, есть и еще причины.
    Еще одна причина - это поиск переменных. Бейсик по сути хранит базу данных всех переменных, с которыми работает программа. При каждом обращении к переменной происходит ее поиск по имени в этой базе. Уже забыл, какой там используется алгоритм, как бы не линейный поиск. Чем больше переменных, тем медленнее работает программа. И скорость ее работы зависит от того, какие дать имена переменным, которые часто используются.
    Последний раз редактировалось Barmaley_m; 05.12.2022 в 23:57.

  2. Этот пользователь поблагодарил Barmaley_m за это полезное сообщение:

    Reobne (06.12.2022)

  3. #12
    Guru
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    13,810
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    149
    Спасибо Благодарностей получено 
    1,194
    Поблагодарили
    787 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    В компилированной программе можно заранее (на этапе компиляции) рассчитать в памяти место программы, откуда надо продолжить исполнение. Кроме случая "косвенного перехода", когда параметром GOTO или GOSUB является не константа, а переменная или математическое выражение с переменными. Но последний случай не поддерживается большинством компиляторов бейсика. Его поддержка обошлась бы сложно и дорого (по времени исполнения).
    первый-же проверенный компилятор (от Hisoft1988г.) спокойно поддерживает такой приём.
    Последний раз редактировалось goodboy; 06.12.2022 в 00:13.

  4. Эти 2 пользователя(ей) поблагодарили goodboy за это полезное сообщение:

    Barmaley_m (20.12.2022), Reobne (06.12.2022)

  5. #13
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,587
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    284
    Спасибо Благодарностей получено 
    237
    Поблагодарили
    186 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Конечно, там сделали таблицу.
    аж два уровня, и это еще до разбора выражений-параметров

    собс-но вот, страница 84 -
    http://www.primrosebank.net/computer...ssemblyThe.pdf
    Прихожу без разрешения, сею смерть и разрушение...

  6. Эти 2 пользователя(ей) поблагодарили Lethargeek за это полезное сообщение:

    Barmaley_m (07.12.2022), mastermind (11.12.2022)

  7. #14
    Member
    Регистрация
    06.11.2020
    Адрес
    г. Санкт-Петербург
    Сообщений
    144
    Спасибо Благодарностей отдано 
    72
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Ну, к примеру, простая команда в ассемблере - jp на нужный адрес выполняется мгновенно.

    В бейсике пускай, будет goto 1000. Но... чтобы узнать, где находится строка, на которую требуется переход - нужно взять адрес начала программы из системных переменных, и в цикле пробежаться по тексту программы, разбирая номера строк, и адреса следующей строки.
    Для не сильно большой программы чтобы найти номер 1000, может потребоваться перелопатить сотню строк.
    дополню, здесь аналогичные вопросы и аналогичные выводы о тормознутости бейсика
    https://zx-pk.ru/threads/3548-operat...ll=1#post55863

  8. #15
    Guru Аватар для null_device
    Регистрация
    26.09.2009
    Адрес
    г. Красноярск
    Сообщений
    3,107
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    70 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    goodboy, Тут как бы, палка о двух концах. Быстродействие или полнота поддержки синтаксиса. Плюс, размер библиотек компилятора в памяти.
    Последний раз редактировалось null_device; 01.11.2023 в 07:57.
    Когда есть, но не знаешь где - это все равно, что нету.

  9. Этот пользователь поблагодарил null_device за это полезное сообщение:

    Barmaley_m (04.11.2023)

  10. #16
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,058
    Спасибо Благодарностей отдано 
    224
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    А именно: можно без POKE, USR и прочих запрещенных приемов, заставить бейсик исполнять команды, стоящие за REM.

    Ошибка происходит при попытке пропустить исполнение цикла FOR, если его условие сразу не выполнено. Например, при запуске следующей программы:
    10 FOR i=1 TO 0
    20 PRINT "loop"
    30 REM hihi: NEXT i: PRINT "gotcha"
    40 PRINT "end"
    Будет напечатано:
    gotcha
    end

    Также можно заставить бейсик ошибочно читать данные из команд DATA, стоящих за REM. Например:
    10 READ a$: PRINT a$
    20 REM aaa: DATA "gotcha"
    30 DATA "ok"
    При исполнении этой программы будет напечатано "gotcha".

    Ошибка связана с тем, что при поиске команд NEXT и DATA интерпретатор ошибочно считает, что команда REM, как и прочие, заканчивается двоеточием, и за ней в строке могут следовать другие команды.

    Особые эффекты будут наблюдаться, если в интерпретируемых за REM командах встречаются числовые константы (как если бы было не DATA "gotcha", а DATA 1 в строке 20). Ведь при проверке синтаксиса интерпретатор внедряет во внутреннее представление программы двоичное представление чисел. А тут числа стоят за REM, и они не интерпретируются, и их двоичное представление не внедряется. Но при попытке исполнения таких команд интерпретатор ищет это представление. У меня программа из первого примера, когда я в команде PRINT поставил не "gotcha", а 1, интерпретатор надолго задумался и напечатал C Nonsense in BASIC. Не помню уже, какие там возможны варианты, и может ли наступить серьезный сбой.

    Также в случае с FOR/NEXT, логика пропуска тела цикла все равно реализована неверно. Например:
    10 GO TO 30
    20 NEXT i
    25 STOP
    30 FOR i=1 TO 2
    40 PRINT i
    50 GO TO 20
    При запуске этой программы, как и должно быть, будут напечатаны числе 1 и 2.

    Однако, если в строке 30 записать 30 FOR i=1 to 0

    То при запуске программы интерпретатор не сможет понять, что цикл оканчивается командой NEXT i в строке 20, и пропустить его. Будет выведено сообщение I FOR without NEXT, 30:1.

    На мой взгляд, из-за нелинейности хода исполнения бейсик-программы, отследить, где заканчивается тот или иной цикл, очень сложно. Авторам следовало бы просто убрать функцию пропуска тела цикла из интерпретатора, чтобы не морочить себе голову. Тем более, что в других диалектах бейсика тоже не делается попыток пропустить цикл.
    Последний раз редактировалось Barmaley_m; 04.11.2023 в 15:44.

  11. Эти 3 пользователя(ей) поблагодарили Barmaley_m за это полезное сообщение:

    Bedazzle (05.11.2023), null_device (04.11.2023), Spectramine (04.11.2023)

  12. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  13. #17
    Guru Аватар для null_device
    Регистрация
    26.09.2009
    Адрес
    г. Красноярск
    Сообщений
    3,107
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    70 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Одной из особенностей переменных в циклах, командой NEXT n, можно продолжить его выполнение при выходе из середины тела (т.е. команд NEXT n) может быть больше одной.
    Последний раз редактировалось null_device; 05.11.2023 в 05:27.
    Когда есть, но не знаешь где - это все равно, что нету.

  14. #18
    Master
    Регистрация
    27.01.2005
    Сообщений
    917
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    180
    Поблагодарили
    145 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Эх, поумничать хочу))

    Я, с высоты теперешнего опыта, понимаю, что Спектрум-бейсик, очень неэффективен.

    При создании переменных и строк там огромные куски памяти (по меркам спека) двигаются. Там же стековая организация. Реализация кучи была бы куда более быстрой. По памяти плюс-минус тоже.
    Алгоритмы вывода на экран линий и окружностей - тоже совсем не быстрые.
    Числа с плавающей запятой - вообще крайне медленно реализованы.
    Поиск строки перебором при переходе - это жесть.
    И так далее и тому подобное.

    Я не хочу нисколько умалять заслуг создателей спектрум бейсика. У них куда хуже условия были для работы, чем у меня. И технически. И сроки. И не было тогда такого обилия информации по тому, "как писать языки" и "как организовывать системы".

  15. #19
    Guru Аватар для null_device
    Регистрация
    26.09.2009
    Адрес
    г. Красноярск
    Сообщений
    3,107
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    70 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    SfS, поиск номера строки, даже перебором их, реализован вполне быстро (прибавив к адресу текущей строки, ее длину, находится номер следующей строки и так от строки к строке, до нужной).

    Памяти, в спектруме, не так чтобы много. Стек, вполне приемлем по многим критериям оптимального использования свободного пространства.
    Когда есть, но не знаешь где - это все равно, что нету.

  16. #20
    Master
    Регистрация
    27.01.2005
    Сообщений
    917
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    180
    Поблагодарили
    145 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от null_device Посмотреть сообщение
    SfS, поиск номера строки, даже перебором их, реализован вполне быстро (прибавив к адресу текущей строки, ее длину, находится номер следующей строки и так от строки к строке, до нужной).

    Памяти, в спектруме, не так чтобы много. Стек, вполне приемлем по многим критериям оптимального использования свободного пространства.
    Оно все "по отдельности" вполне. А все вместе существенно медленно работает.

    Нет, для задач обучения вполне. Но для игр не вполне.
    Есть же всякие мега бета Бейсики. И там многие вещи, в основном графика, куда быстрее.

Страница 2 из 18 ПерваяПервая 123456 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 47
    Последнее: 02.02.2021, 14:06
  2. Как быстро летит время.
    от Mick в разделе Новости
    Ответов: 18
    Последнее: 25.02.2020, 08:43
  3. Почему Спектрум-бейсик такой медленный?
    от mmxdmv в разделе ZX Концепции
    Ответов: 53
    Последнее: 07.07.2018, 19:39
  4. Как быстро добраться до мыши?
    от TomCaT в разделе Для начинающих
    Ответов: 38
    Последнее: 02.03.2010, 11:00
  5. Быстро переместить 384b
    от Aprisobal в разделе Программирование
    Ответов: 6
    Последнее: 23.01.2005, 15:23

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •