[personal profile] notes4myfamily
Оригинал взят у [livejournal.com profile] avva в немного старины
(эта запись может быть интересна программистам)

1. Последняя версия GW-BASIC от Майкрософта - 1987 года - лежит на этом сайте. Там же можно скачать документацию языка и всех встроенных функций, хотя удобнее это читать здесь. Это был мой первый язык программирования, не считая калькуляторов - если точнее, я учился на варианте MSX-BASIC для Ямахи. GW-BASIC прекрасно запускается внутри DosBox. Все работает.

Напомню разницу между ним и гораздо более популярным поздним QBasic: в GW-BASICе обязательны номера строк и нет блоков кода или сабрутин: точнее, последние, конечно, реализуются с помощью команд GOSUB/RETURN, но их невозможно объявить командой SUB или вызывать по имени. QBasic это по сути дела язык структурированного программирования, просто похожий по синтаксику на Бейсик; GW-BASIC по духу есть классический Бейсик как его придумали в середине 60-х.

2. Недавно возник и ширится феномен "фантазийных консолей", среди которых самая заметная - Pico-8. Это как бы эмулятор несуществовавшей на самом деле никогда игровой консоли, с типичными для начала-середины 80-х ограничениями по памяти, резолюции "экрана" и цветам. У него нет, однако, своего вымышленного "процессора" с машинным кодом, вместо этого код пишется на Lua. Я сам еще не пробовал, но собираюсь посмотреть, выглядит симпатично.

3. Несколько лет назад мне попадался код ранней версии Паскаля 1973 г. - исходники компилятора, который в частности сам себя компилирует. Помню, что эти файлы были непричесаные - в них есть несколько мелких ошибок, и даже если поправить их, современный FreePascal их не понимает - несколько идиом в языке изменились. Сегодня мне попался отличный сайт, где во-первых эти файлы доведены до ума (The P2 Compiler), а во-вторых выложена версия еще более раннего варианта Паскаля, упрощенной версии 1972 г. - Pascal-S.

Обе эти версии компилируют Паскаль во внутренний байт-код, который потом интерпретируют. Вторая особенно миниатюрна, и код компилятора легко можно прочитать и понять. Автор страницы рассказывает на ней об очень забавной "ошибке", которую он обнаружил в компиляторе Pascal-S. Численная переменная в исходном коде во время интерпретации байт-кода хранится в виде variant record - паскалевского аналога union в C, т.е. в одном и том же месте хранится либо целое число, либо действительное, либо булевое значение итд. в зависимости от типа. Нужно проверить тип, чтобы знать, что именно хранится и как с ним обходиться. Так вот, когда компилятор видит одноместную операцию - (минус) в применении к целому или действительному типу, он генерирует байткодовую инструкцию 36, которая всегда применяет минус к целому значению переменной, не проверяя ее тип. Т.е. по идее, если определить переменную с плавающей точкой X, и написать -X, то во время интерпретации скомпилированного кода программа должна сгенерировать отрицание целого значения, которое она "прочитает" там, где записано на самом деле действительное, и выйдет бред.

Но при этом все работает!

Оказалось, что в компьютере CDC 6600, для которого это все писалось, было хитрое представление чисел с плавающей точкой. Машинное слово в нем занимало 60 бит, первые 48 была мантисса, потом 11 бит экспоненты, а последний бит - *знак* экспоненты. Кроме того, в этом компьютере отрицательные числа представлялись с помощью ones'-complement, а не two's-complement, как принято сегодня. Для изменения знака числа надо было полностью его инвертировать, и все. В результате число с плавающей точкой вело себя для некоторых операций подобно целому. Если сделать вид, что оно целое, и инвертировать, то мантисса отдельно инвертируется, экспонента отдельно тоже, но и *знак* экспоненты - отдельный бит, специально для этого добавленный - тоже, и поэтому значение экспоненты не изменится. Красиво!

В CDC-6600 было вообще немало интересных вещей. Например, работа с памятью там обычно была устроена так: были регистры X0-X7 и A0-A7. Помещение любого значения в один из регистров A1-A5 автоматически вело к считыванию из памяти по этому адресу в соответствующий регистр X1-X5 - не нужно было отдельной инструкции для работы с памятью. Помещение любого значения в регистры A6,A7 вело соответственно к записи в память по этому адресу содержимого X6 или X7. Это объясняет, почему руководство по ассемблеру CDC-6600 "посвящается A6 и A7, без которых ничего из полученного в данной книге нельзя было бы сохранить". Вся документация есть тут: http://ygdes.com/CDC/cdc6600.html

Это заставило меня задуматься о том, что неплохо бы "фантазийные консоли" подобно упомянутой выше Pico-8 писать также для вымышленных "странных" архитектур. Я никогда не работал с машиной на основе ones'-complement - было бы интересно попробовать. Скажем, с 14-битным машинным словом, что дает 16K ячеек памяти (но в каждой ячейке лежит 14 бит). Настоящим ассемблером, вдохновленным реальными старыми машинами, а не просто Lua. И так далее.

Profile

notes4myfamily

April 2017

S M T W T F S
      1
23 4 5 6 78
9 10 11 12 13 1415
16 17 18 19 20 2122
23 24 25 26 27 2829
30      

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 28th, 2017 09:04 am
Powered by Dreamwidth Studios