LINUX.ORG.RU

Старые реализации бейсика

 apple ii, , , ,


1

1

Типа Integer BASIC, C64 BASIC и т.д. Интересует их архитектура, исходники на асме не очень интересены, хотя, почитал бы. НО это на крайняк.

Поясните пару вопросов:

  • Как хранятся строки в старых бейсиках? Они же нумерованые все, и например, при последовательном вводе строк 10, 20 и последующем вводе строки 15, должно произойти нечто не тривиальное, что не привело бы к тотальному копированию кусков памяти. Что?
  • Как они получались такими маленькими и быстрым? Я понимаю, ассемблер, но ведь медленно писать можно и на нем.
  • Как они такими маленькими получались? Какие структуры данных использовались?

На этом все, пока.

П.С. Да, родился не в то время.

Deleted

Как хранятся строки в старых бейсиках? Они же нумерованые все, и например, при последовательном вводе строк 10, 20 и последующем вводе строки 15, должно произойти нечто не тривиальное, что не привело бы к тотальному копированию кусков памяти. Что?

Я бы делал связанный список с дополнительными указателями на сотни или тысячи.

Как они получались такими маленькими и быстрым?

Вряд ли они были быстрыми. Быструю графику на Z80 на бейсике не получалось делать.

Какие структуры данных использовались?

Те же, что и сейчас?

i-rinat ★★★★★
()

Как хранятся строки в старых бейсиках?

Список?

Как они получались такими маленькими и быстрым?

Так они и не умели ничерта. А быстрыми... это вряд ли.

А есть какая-нибудь спека на эти басики? У меня валялся где-то ман по спектрумовскому басику, но благополучно канул в лету.

geekless ★★
()
Ответ на: комментарий от geekless

Ну, про быстроту я не так выразился. Я вообще удивлен, что тогда были интерпретируемые языки.

Deleted
()
Ответ на: комментарий от Deleted

bourne shell в 77-м году была написана, чего удивительного :) Хотя машины конечно несопоставимы. 8-битные системы были просто игрушками.

geekless ★★
()
Ответ на: комментарий от Deleted

но что значит доп. указатель на сотни и тысячи

Ну вот надо тебе на строку 1150 перейти. Для этого придётся пройти список от начала. А можно держать указатель на 1100-ую строку (или первую строку с номером >= 1100). Тогда переход можно сделать быстрее. Сами указатели можно в таком же списке держать.

i-rinat ★★★★★
()

Как они такими маленькими получались?

SmallBASIC с исходниками.

Подробности в книжке «С» (PDF):
7.20. Интерпретатор языка SmallBASIC
7.39. Полный файл интерпретатора.

quickquest ★★★★★
()
Ответ на: комментарий от quickquest

Ну, это не совсем то. Но все равно спасибо.

Deleted
()

рекомендую посмотреть qb64

visual ★★★
()

Как хранятся строки в старых бейсиках?

Из журнала Радио №3 1986 г. (внизу): На рис.4 показан формат строки программы на Бейсике в том виде, в каком она хранится в памяти микро-ЭВМ. В начале каждой строки два байта отведены для хранения указателя адреса начала следующей строки программы, следующие два байта хранят номер строки, а заканчивается она байтом, заполненным одними нулями. Таким образом, текст программы хранится в памяти в виде специальной структуры данных. называемой в литературе «односвязным списком».

quickquest ★★★★★
()
Ответ на: комментарий от quickquest

О, спасибо! В принципе, после того, как мы заговорили про списки, я к такому виду и пришел.

Хотя i-rinat тоже предлинтересную идею, но более сложнуую.

Deleted
()
Ответ на: комментарий от geekless

В википедии есть что почитать, как ни странно.

http://en.wikipedia.org/wiki/Commodore_BASIC

+1. Верно :)

The order of execution of Commodore BASIC lines was not determined by line numbering; instead, it followed the order in which the lines were linked in memory.[3] Program lines were stored in memory as a singly linked list with a line number, a pointer, and then the tokenized code for the line. The pointer contained the address in memory of the next program line. While a program was being entered, BASIC would constantly reorder program lines in memory so that the line numbers and pointers were all in ascending order. However after a program was entered, manually altering the line numbers and pointers with the POKE commands could allow for out-of-order execution or even give each line the same line number. In the early days, when software written in BASIC was available commercially, this was a software protection technique used to discourage casual modification of the program.

Zubok ★★★★★
()

http://zxpress.ru/book_articles.php?id=1387

Там про спектрум написано. Правда я там не нашёл о том, что было когда вставляли строку №15. Но если учесть, что строки хранились последовательно, то да - перемещали куски памяти туда сюда при вставке/удалении строк.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

Не, ну с 15 строкой вроде понятно. Там то два указателя поменяь. А вот алгоритм поиска «куда вчставить» я бы почитал.

Deleted
()
Ответ на: комментарий от Deleted

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

Там то два указателя поменяь

Ты не понял, кмк. Строки програмы последовательно хранились. Это как бы не односвязный список, а последовательный набор записей с закодированной длиной записи в 3 и 4 байтах записи. Как-то так. Всмысле таблицы из указателей на строки не было. Известен был только адрес первой строки (или 10ой там).

Кстати в спектруме48 ещё был такой трюк заимплементирован: операторы кодировались одним байтом. Этот байт был сразу после длины строки, емнип. Парсеру не надо было определять что за оператор, а просто делался call по адресу из таблицы в пзу.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

Епт, афигеть, это же медленно... С другой стороны - мы то это во время ввода программы делаем, а не выполнения, так что не так критично, как мне на первыйвзгляд показалось.

Может просто хранить список указателей настроки программы? В нем перестановок меньше прийдется делать. Или мбыть может двусвязный список замутить?

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

Deleted
()
Ответ на: комментарий от nanoolinux

Кстати, про оптимизацию в спектруме. Там все операторы были именно в начале строки? И все они одинаково легко определялись?

Deleted
()
Ответ на: комментарий от Deleted

Одним байтом - точно. А вот с начала ли строки - не помню. Отлично помню, что после ввода номера строки и пробела курсор сразу переходил в режим [К], а это операторы были (если ты спектрум видел, то поймёшь о чём я, если нет то почитать можешь здесь).

upd: Он сразу с новой строки был в режиме [К] пока до оператора не дойдёт. Вот после оператора переходил в [L].

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)

посмотри на реализацию внутреннего интерпретатора форта

для x86 17 байт.

для PDP11 - а его просто нет ибо наличие автоинкремента по произвольному регистру и индексирование перехода по «любому» регистру приводит к размазыванию nxt по коду.

т.е в некотором смысле вариант шитого кода вполне на pdp11 переоткрывался каждым пишущим на асме стремящимся сэкономить битики.

как ни странно в старых басяках структуры были самые базовае тот же FAT в msdos - это наследие бэйсиковского(ms) менеджера свободных «блоков».

ибо микропроцессор после калькулятора настолько быстр , что использование лобовых методов(линейный поиск) на тех обьёмах был «незаметен»

qulinxao ★★☆
()

учитывая ренум там был просто список(одно/двухсвязный) где место вставки определялось номером и сквозным проходом для вставки , а сам ренум делался за 1 проход заменной номеров строк.

на том же спектруме был «байткод» после ввода строки в памяти фиксировались кода команд (да и сам метод ввода был выбором)- на этом экономили на уменьшении парсера.

qulinxao ★★☆
()
Ответ на: комментарий от Deleted

Ну блин. В 21ом веке люди как-то умудряются писать код в текстовом редакторе, а потом скармливать его компилятору/интерпретатору.

Или ты repl для бейсика задумал сделать?

nanoolinux ★★★★
()

Помню как изучал хранение программы на Бейсике на моей Весте. Там все было по порядку (Т.е. вставка/изменение строки копировала весь хвост кода), но самое прикольное, что все названия команд занимали 1 байт. И я даже когда-то записывал соответствие кода-строке.

AlexVR ★★★★★
()
Ответ на: комментарий от Deleted

Списки слишком шикарно было. Тратить память на опустевшие куски кода никому не хотелось. (Не забывай что строки тоже менялись)

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

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

Deleted
()
Ответ на: комментарий от Deleted

Ну жошь, чо )). Запили туда ооп расширение и лямбда ф-и!

А лучше сделай виртуальную машину и для неё образ (типа пзу). Будет олдскульненько, но кроме тебя никому не нужно.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

Угадал! Пишу для своей вм, RISC прдобная, со стеком. Аоифметика только регистр-регистр, переходы и операции с памятью по мимо регистров используют константные значения. Стек только для регистров.

Я не знаю почему, но мне нравятся такие велосипеды. Сюда же можно отнести и компилятор недо-сишки (лол, под другую вм), и ассемблеры для этих вм.

Короче, ни кому не нужно, но для меня писать прожки под свой «компьютер» используя свои инструменты это лютое удовольствие.

Я даже намереваюсь придумать историю для своего будущего софта и железа, все выдумать. А если еще и игру запилить, типа 0х10с, только сами знаете с кем и чем, то... Кажется я чуть-чуть повернут.

Deleted
()
Ответ на: комментарий от qulinxao

А, блин, затупил. Прошу прощенья.

Deleted
()
Ответ на: комментарий от nanoolinux

Ах да, компилятор недо-сишки я писал два года, начал в 16 лет. На конструкторе игр.

Deleted
()
Ответ на: комментарий от AlexVR

но самое прикольное, что все названия команд занимали 1 байт

Это на большинстве систем так было. Даже на МК-85 (а куда деваться, когда всей оперативки, включая системную и переменные — 2кБайт).



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

KRoN73 ★★★★★
()
Ответ на: комментарий от Deleted

Я не знаю почему, но мне нравятся такие велосипеды

Думаю таким многие страдали. И я в том числе.

nanoolinux ★★★★
()
Ответ на: комментарий от KRoN73

Кстати, напомню ещё, что вставка строки обычно по времени была быстрой (условно мгновенной) на большинстве реализаций.

http://ru.wikipedia.org/wiki/ПК8000

Оперативная память 48 КБ
Тактовая частота CPU 1,78 МГц

Как бы сдвинуть один раз кусок памяти не должно занимать много времени

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Как бы сдвинуть один раз кусок памяти не должно занимать много времени

В компах «8080» для копирования/перемещения кусков памяти вместо процессора Intel 8080А (K580ВМ80А) использовался контроллер ПДП Intel 8257 (К580ВТ57), который работал существенно быстрее.

quickquest ★★★★★
()
Последнее исправление: quickquest (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.