Как Вам такая идея: зашить в микросхему интерпретатор языка?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

SuperProgrammer
Сообщения: 1
Зарегистрирован: 05 июл 2015, 20:06

Я хочу зашить в микросхему интерпретатор языка, Которой будет грузить ОС написанную на С++ например. В корне диска будет лежать что-то вроде BOOT.BDF в котором будет находится начальный код для интерпретации. Почему до меня этого никто не выдумал?

Я напишу подробнее.Будет сделана прошивка,выполняющая функции BIOS и интерпретатора.При запуске ПК он будет искать файл BOOT.BDF на HDD/ODD/FDD и начинать выполнение кода оттуда. Этот файл будет написан на С подобном языке примерно такой:

Код: Выделить всё

#include <System/Main.h>
Int boot()
{
RunCPPFile("System/kernel.cpp");
if error=1 
{
RunCPPFile("Recovery/booterr.cpp");
return 0
}
return 1
}
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Почему до меня этого никто не выдумал?
Что бы человек не подумал, обязательно найдется хотя бы один человек, который думал точно так же.
Это плохая идея хотя бы по одной причине - загрузка будет происходить очень медленно. Хотя это, конечно, зависит от того, что вы понимаете под операционной системой. Стесняюсь спросить, драйверы устройств вы тоже хотите через интерпретатор реализовать? А сам интерпретатор, зашитый в микросхему, стало быть написан на асме? - у вас должна быть очень производительная "микросхема" в данном случае =)
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

SuperProgrammer писал(а):Я хочу зашить в микросхему интерпретатор языка,
Было. ZX-SPECTRUM.
SuperProgrammer писал(а):Которой будет грузить ОС написанную на С++ например. В корне диска будет лежать что-то вроде BOOT.BDF в котором будет находится начальный код для интерпретации.
Интерпретаторы работают медленнее натива. Есть ровно три случая, когда интерпретация оправдана:
1. На очень слабеньких машинах с очень маленькой памятью интерпретатор достаточно простого языка вроде смолбейсика будет работать достаточно быстро, чтоб его отставание от натива на всех программах, которым хватит памяти, не будет заметно. Если при этом машинка ещё и не предназначена для отчуждаемых программ, время на компиляцию лучше не тратить. Но и ZX SPECTRUM 48K, и даже ZX SPECTRUM 16K - слишком мощные для этого машины. До полукибибайта ещё можно, но не больше.
2. Интерпретирующий микрокод для простоты реализации любой системы команд кроме RISC: полностью аппаратная реализация даже CISC операций может быть и тормознее, а что нибудь ещё более сложное в аппаратной реализации будет тормозить гарантированно, при этом не факт, что RISC на уровне процессора в целом а не ядра процессора будет быстрей интерпретатора, так как любая операция должна быть адресована и прочитана, что при работе с основной памятью и даже с кешем второго уровня требует большего времени, чем исполнение на RISC-ядре некоторых фрагментов микрокода: память микрокода и квазирегистры находятся ближе и к АЛУ, и к устройству управления процессором и могут использоваться на более высокой частоте. Сравните

Код: Выделить всё

ADD AX, WORD PTR[x]
и

Код: Выделить всё

MOV BX, WORD PTR[x]
ADD AX, BX
, где квадратные скобки означают обращение в память. Во втором случае надо прочитать код операции ADD, на что может быть израсходовано и 4 такта, и даже 18, и только потом выполнить сложение, а в первом случае код всей цепочки уже прочитан. Но если язык высокого уровня зашит в микрокод, то появляются две дополнительные проблемы, не актуальные лишь для калькуляторов и специлизированных, возможно даже узконишевых машин:
2.1. Старт процесса, старт вторичного потока, загрузка файла операторами языка не реализуются, да и вообще могут быть реализованы только посредством функций, обращающихся к самой ОС, либо непосредственно системных функций. На чём писать их реализацию? Не актуально в случае калькулятора, так как они этим вообще не занимается, и машинно-зависимого языка специализированной узконишевой машины так как его можно дополнить чем угодно, включая и операторную реализацию многопоточности, и системными функциями в виде "чёрных ящиков".
2.2. Как быть с программами с закрытыми исходниками? Опять таки ни программы для калькулятора, ни программы для узконишевой специализированной машины нет смыла отчуждать, так как потребители и разработчики этих программ - не избежно одни и те же люди: если организация владеет одной из сотни специализированных машин на планете, то она скорей наймёт собственный штат программистов, чем станет покупать программы для этого чудоюда в магазине. А раз программисты свои, то от самих себя они исходники прятать точно не будут, а чужое негде взять для копирования, программу же для калькулятора ты дольше будешь искать и изучать её интерфейс, чем изучать язык, чтоб её написать, и непосредственно писать её. И при этом велика вероятность того, что она будет одноразовой.
3. Процессор отвечает только за ввод-вывод, а скорость исполнения лимитирует не электронная, а механическая часть, либо темп диалога.
В остальных случаях делать процессор, способный только интерпретировать язык высокого уровня - по вышеизложенным причинам не лучшая идея, а иное исключает микродовую реализацию интерпретатора.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

somewhere писал(а):Что бы человек не подумал, обязательно найдется хотя бы один человек, который думал точно так же.
Это плохая идея хотя бы по одной причине - загрузка будет происходить очень медленно. Хотя это, конечно, зависит от того, что вы понимаете под операционной системой. Стесняюсь спросить, драйверы устройств вы тоже хотите через интерпретатор реализовать? А сам интерпретатор, зашитый в микросхему, стало быть написан на асме? - у вас должна быть очень производительная "микросхема" в данном случае =)
Z80 вполне справлялся с "драйверами" джойстиков, писанными прямо на бейсике.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Причём, как раз программируемые калькуляторы существуют ровно в двух вариантах: или программирование в опкодах, или в чип зашит интерпретатор стекового языка. А в микросхемы принтеров зашивают интерпретаторы PostScript. Тоже специализированные машины и хоть спрос на их нишу и большой, но задача закрыть PostScript-тексты печатаемых страниц не стоит в принципе даже при переносе на другой принтер.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Z80 вполне справлялся с "драйверами" джойстиков, писанными прямо на бейсике.
Громко сказано. Там весь "драйвер" сводился к чтению установленых битов из порта. А для Sinclair-джойстика это были тупо цифровые клавиши и достаточно было опрашивать состояние клавиш.
Сама операционная система, если ее так можно было называть, написана была на асме.
Было. ZX-SPECTRUM.
На спектруме все таки была прекомпиляция. В памяти не хранился полный текст команд, а только их коды. Для операндов были их вычисленные значения. Примерно с адреса 21700 начинались все программы на бейсике.
Если интерпретатор будет еще и текст парсить, то результат работы будет еще медленнее.
А в микросхемы принтеров зашивают интерпретаторы PostScript.
Давайте вспомним, что тема у нас про ОС через интерпретатор. А вы сравниваете бумажный самолетик и Боинг 747
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Бейсик - один из самых простых языков. При этом спектрумовский диалект дополнительно упрощён:
1. Нет оператора ELSE
2. Нет оператора множественного ветвления.
3. Строковые функции и переменные отличаются символом $ в конце имени.
4. Имя пользовательской функции может состоять только из одной буквы.
5. Пользловательские функции обязаны быть чистыми и реализовывать только функции в их математическом понимании.
6. Процедуры вызываются не по именам, а по меткам оператором GOSUB.
7. Область видимости переменных и подпрограмм ровно одна и она глобальна.
8. Многомерный массив - не синоним массива массивов.
9. Нет ничего, что соответствовало бы не только объектам, но и записям (в терминах языка pascal), или структурам (в терминах языка c).
10. Оператор присваивания - LET, а не знак равенства.
11. Знак равенства самостоятельного значения вообще не имеет, после LET он становится разделителем операнда-назначения и операнда-источника оператора присваивания, а между IF и THEN - оператором сравнения.
12. Меткой является номер строки.
13. Номера имеют все строки.
14. Пометить можно только первый оператор строки.
15. Есть только один вид циклов - циклы со счётчиками.
16. Оператор NEXT имеет операнд - счётчик того цикла, чьё тело завершается перед данным оператором NEXT.
17. В цикл нельзя вложить другой цикл с тем же счётчиком.
Кроме того, исходник набирался сразу на некой смеси текста с байт-кодом, в которой кадый оператор и каждая переменная, литерал, или номер строки кодировались байт-кодом, но литералы и имена переменных дублировались текстом, а операторы и номера строк кодировались только бай-кодом. Но даже такой интерпретатор работал в 50 раз медленнее компилированных в натив Z80 тогдашними откровенно сырыми компиляторами бейсик-программ. И это было заметно даже на

Код: Выделить всё

10 INPUT "y=";f$, "xmin=";xmin; "xmax=";xmax, "Step=";s
20 FOR x=xmin TO xmax STEP s
30 LET y=val(f$)
40 PLOT x*10+128,y*10+96
50 NEXT x
, где val - встроенная функция преобразования строки в число с возможностью парсинга инфиксных арифметических выражений и использования всех встроенных функций спектрумовского бейсика, а PLOT - оператор рисования точки. Ну ладно, это ещё можно ускорить. Но при двух циклах и автоматическом выборе текущего шага на основании оценки производной правой разностью начнёт уже заметно тормозить даже вполне чистый байт-код смолбейсика. Вот если программа, достаточно сложная, чтоб тормоза проявились, или сама не влезет в память, или не сможет разместить в ней данные, тогда можно интерпретировать. Или если сам интерпретатор работает быстрей, чем можно адресовать коды операций основной программы. Или если задача - вывести что нибудь сугубо статическое, дождаться ввода и передать его другому процессору и при этом скорость работы программы лимитируется не возможностями интерпретатора, а внешними факторами вроде быстродействия приводов принтера, или времени реакции пользователя. Или если программа хотябы гарантированно одноразовая и при этом время исполнения компилированного кода в сумме со временем компиляции догоняет время исполнения интерпретируемого исходника, что опять таки ограничено сложностью самой программы и количеством обрабатываемых этой программой данных. И в любом случае лишь при дополнительном условии, что задача закрыть исходный текст от посторонних глаз гарантированно не строит.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

somewhere писал(а):Громко сказано. Там весь "драйвер" сводился к чтению установленых битов из порта.
А теперь вопрос: почему слово "драйвер" уже в моём посте было взято в кавычки?
somewhere писал(а):На спектруме все таки была прекомпиляция. В памяти не хранился полный текст команд, а только их коды.
Прекодирование, ИМХО так будет правильней, так как результат даже близко не валялся с нативом, имел тот же уровень абстракции, что и исходный текст, и исходным текстом всегда был густо нафарширован.
Давайте вспомним, что тема у нас про ОС через интерпретатор. А вы сравниваете бумажный самолетик и Боинг 747
ОС тоже бывают разные, некоторые вполне профессиональные ОС отлично встают даже на контроллеры, управляющие станками. А принтер - что такое, если не печатный станок?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

somewhere писал(а):Если интерпретатор будет еще и текст парсить, то результат работы будет еще медленнее.
Пусть процессор имеет быстродействие один миллион операций в секунду, программа не может содержать ни явных циклов, ни переходов назад и состоит из не более, чем 20-ти операторов, а исполняется со скоростью 300 операторов в секунду. Тогда пользователь не заметит разницы между интерпретацией с такой скоростью и исполнением натива. Да и 20 операторов в секунду при тех же ограничениях могут быть приемлемы, но уже заметны. Если же программа одноразовая, то время исполнения надо в любом случае складывать со временем трансляции, не зависимо от того, компилируется она или интерпретируется. Но интерпретатор потому и тормозит, что транслирует прямо во время исполнения, полное время исполнения с точки зрения пользователя - это и есть та самая сумма. А в сумме со временем компиляции при таких ограничениях ИМХО будет даже медленее. Циклические программы интерпретируются всё равно медленнее из-за того, что каждый оператор тела цикла интерпретируется на каждом шагу, а компилируется лишь однажды. Но при отсутствии циклов как явных, так и построенных на переходах этого фактора не будет. Если программа должна вывести много текста в текстовом диалоге с пользователем, то сразу и факторы длины и цикличности программы теряют значение, так как даже при скорости 2 оператора в секунду лимитировать будет скорость чтения человеком. Графика является более емким представлением, которое человек может воспринимать очень быстро, так что тогда даже натив на процессоре с миллионом операций в секунду может и отставать от скорости восприятия пользователем, особенно при избыточном качестве картинки. А если скорость исполнения лимитируется механической частью? Например, графический язык, интерпретируемый чипом графопостроителя и на нём программа вывода страницы этим графопостроителем и возьмём с потолка, что графопостроитель способен вывести не более 4-х штрихов в секунду. Тогда не имеет значения, может ли электронная часть графопостроителя исполнить за секунду 4 триллиона штрихов, или только 4 штриха, устройство целиком всё равно будет исполнять только 4 штриха в секунду и к тому же процессор вынужден будет работать также медленно. При этом посылать отдельные сигналы в реалтайме и принимать их в реалтайме с датчиков интерпретация ему ни как не помешает, за это отвечает код интерпретатора, а не страницы, а он то в нативе. Всё зависит от назначения и от того, на сколько ограничена сама программа и данные, с которыми она может работать. Если найти нишу, в которой интерпретация гарантирует приемлемую скорость исполнения, а закрывать исходники программ не требуется и достаточно простой язык, чтоб во-первых не интерпретировался ещё медленнее, а во-вторых чтоб сам интерпретатор был мал и не требовал для своего размещения дорогих ПЗУ большого объёма, тогда можно шить интепретатор в ПЗУ. Но при этом назначение языка должно соответствовать назначению устройства, нельзя шить LOGO в калькулятор и форт в принтер. Форт, кстати, отличается тем, что даже его компиляторы часто шили в чипы встраиваемой техники. Но не во всю подряд.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Кстати, что за странная идея интерпретировать текст ОС? Интерпретация бывает нужна ровно в двух целях:
1. Чтоб не тратить время на компиляцию одноразовой программы.
2. Чтоб каждый пользователь мог внести изменения в свой экземпляр программы и для этого не надо было искать исходник и транслятор, так как наличие и того, и другого - обязательное условие возможности исполнения интерпретируемой программы и разбираться со сборкой программы из модулей, так как собирать интерпретируемую программу просто не нужно.
Исходник LINUX открыт. Много пользователей LINUX способно его хотябы прочитать, не говоря о внесение туда своих изменений? Так что шейте уж и компилированную, или писанную прямо на асме ОС в ту же ПЗУ рядом с интерпретатором, как это на спектруме сделано. Ну может физически только в соседний чип в том же устройстве, но и это может быть не обязательно.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить