Перейти к публикации
Форум - ComputerCraft
Jet

Как грамотно приступить к написанию большой программы

Рекомендованные сообщения

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

 

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

 

Я понимаю тот минимум, который я хочу от своей операционной системы:

  • Многопоточность
  • GUI
  • Файловый менеджер
  • SDK для программ
  • "Эмулятор" OpenOS (для запуска "старых" программ)

 

Сразу еще несколько оговорок: 1)Я не прошу писать за меня, ни в коем случае, я прошу посотрясать со мной форум и подумать как что могло бы быть и какие подводные камни возможны; 2)Я прекрасно понимаю что операционная система относится к разряду бесполезных программ, и лучше написать что то более стоящее, но я хочу написать именно ее;

 

 

Алгоритм работы операционной системы я вижу такой:

  1. eeprom ищет файловую систему на которой есть boot-файл и передает управление ему.
  2. boot-файл загружает все системные библиотеки, после чего создает менеджер процессов, заполняет очередь процессов приложениями, прописанными в autorun, и передает управление ему.
  3. Менеджер процессов обрабатывает очередь событий и очередь процессов.
  4. При завершении менеджера процессов компьютер выключается.

Теперь по порядку по "хотелкам":

  • Многопоточность - реализуется менеджером процессов. Обрабатываются все события ввода (клавиатура, мышь и т.д.), формируется очередь событий, и каждое событие из очереди транслируется каждому потоку до тех пор пока либо все потоки не "просмотрят" это событие, либо какой то из потоков не обработает его (например нажатие клавиши обработает только активное поле в активном окне). Сам Процесс представляет из себя переменную типа thread, которая создается функцией coroutine.create(function), в которую передается функция main самого запускаемого приложения. О том как это реализовать ниже. В менеджере процессов есть таблица активных процессов, в которую добавляются значения и удаляются из нее. Сам по себе менеджер процессов, на мой взгляд, должен являться библиотекой.
  • GUI - тут я до конца не уверен как и что реализовать. По идее должен быть менеджер отрисовки всего и вся, который по велению менеджера процессов рисует изменившиеся части экрана. У такого менеджера должен быть свой буффер экрана, на основе которого и происходит рисование. Самое приложение должно уметь предоставить таблицу своих графических элементов для отрисовки. Или нет? Тут хотелось бы услышать мнение аудитории.
  • Файловый менеджер - это просто графическое приложение, написанное по правилам самой ОС, позволяющее делать очевидные вещи для файлового менеджера (просматривать папки, списки файлов в них, создавать/переименовывать/удалять/копировать/перемещать/искать сами папки и файлы, скрывать скрытые папки и файлы, если такие настройки имеются в ОС, учитывать права доступа к файлам и папкам.) И все это в виде окошка и все мышкой. Ну почти все...
  • SDK для программ - собственно сама среда разработки для программ, с подсветкой синтаксиса, возможностями автозаполнения, а так же применением шаблонов. В идеале хорошо бы еще дописать оптимизатор кода. Это будет такое же графическое приложение, написанное по правилам операционной системы. Но в целом для того чтобы определиться как именно писать SDK нужно определится с правилами операционной системы...
  • "Эмулятор" OpenOS - консольное приложение. Его суть будет заключатся в том что для "обычных" приложений будут переодпределены некоторые функции, такие как print, напимер, и этот эмулятор и будет их реализовывать. Вопрос в том как переопределить функции для одной конкретной программы... Я не досканально знаю луа, но мне кажется это как то связанно с переменными окружения, как то так называется, поправьте меня. В общем тут хотелось бы услышать ваши комментарии. 

 

Красным цветом я пометил моменты, которые вызывают вопросы в реализации и точного понимания как это написать нету.
Оранжевым цветом я пометил моменты, которые в моей голове выглядят более менее продуманными, но просится на взгляд со стороны и подтверждение моих мыслей.
Зеленым цветом я пометил моменты, которые не должны вызывать вопросов. По идее...

 

 

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

 

А теперь по реализациям:

  • Приложение - это содержащий в себе скрипт lua, скелет которого приведен в спойлере. Через dofile выполнив файл такого вида мы получим таблицу, содержащую функцию main, которая и будет передана менеджеру процессов.

    --Таблица для возврата
    local app = {}
    
    function app:main()
    --Приватные переменные и функции
    local private = {}
    
    --Публичные переменные и функции
    local public = {}
    
    --Инициализация
    setmetatable(public, self)
    self.__index = self
    return self
    end
    
    return app

Хотелось бы услышать ваши мысли.

Изменено пользователем Jet
  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я сам сейчас занимаюсь подобным. Точнее занимался. Будет настроение - продолжу. Идея сама по себе очень интересная, но и не менее сложная. Сразу хочу сказать, что eeprom трогать не стоит. Он запускает init.lua и этого вполне достаточно, а изменение БИОСа под свою систему - я в этом не вижу смысла. Да и описывать что и как должно быть я тоже не вижу смысла. Все должно приходить по ходу дела. У тебя есть два компа: один с дискетой OpenOS, чтобы форматировать пустой диск; второй - абсолютно чистый комп с видеокартой. Вставил диск в комп, записал нужные файлы, перекинул диск в тестовый ПК и запустил... Процесс немного подбешивает но так и должно быть. По пути тебя ждет много проблем, аля отсутствие loadfile, dofile, require - и все это придется исправлять самому. Иди поэтапно. Как ты видишь себе запуск своей системы? Красивое окошко приветствия? Ну так создай все, чтобы при запуске это окошко появилось. Дальше идет рабочий стол? Вперед и с песней - создавать свой Desktop.

В многопоточности же я смысла не вижу. Оперативки в местных компах не так много, да и зачем тебе открывать сразу несколько программ? Разве что какой-то контроллер дома, который следит за всем и вся...

В итоге я хочу сказать, что не вижу смысла расписывать свою "стратегию" создания ОС. Если у тебя достаточно времени и нервов - твори. Я далеко не профи программирования, но даже у меня постепенно идет продвижение, когда я не ленюсь. Если хочешь, можем списаться в Вк, например, могу поделиться каким-то базовым опытом.

Изменено пользователем Pofigist

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В многопоточности же я смысла не вижу.

Вот сидишь ты в какой то проге, например пишешь что то в SDK, и тут тебе нужно посмотреть что то в другом файле... Ты будешь закрывать прогу, ради того чтобы глянуть другой файл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пили и не слушай никого, делай как хочешь

  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот сидишь ты в какой то проге, например пишешь что то в SDK, и тут тебе нужно посмотреть что то в другом файле... Ты будешь закрывать прогу, ради того чтобы глянуть другой файл?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Многопоточности не нужно,достаточно переключения между основной программой и фоновые,которые работают всегда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Многопоточности не нужно,достаточно переключения между основной программой и фоновые,которые работают всегда.

А как это сделать без многопоточности?

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как это сделать без многопоточности?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Ну ты мне говоришь сейчас про текстовый редактор...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну ты мне говоришь сейчас про текстовый редактор...

А чем SDK отличается от текстового редактора? Функциональностью и не более. Берешь базовый Виндосовский блокнот, суешь в него всяких наворотов под кодинг и SDK готова. Опять таки если очень серьезно и программа запускается в отдельной среде и т.д. То тут конечно сложнее. Но, опять таки, я не думаю, что нужно будет смотреть на работу программы и попутно что-то редактировать.

Так или иначе, ОС твоя и тебе решать что в ней делать. Считаешь нужным многопоточность - на здоровье. Но до этого нужно решить еще кучу других вопросов и создать хотя бы базу. Собственная ОСь особенно в таких масштабах о которых ты говоришь, достаточно большая, может пока лучше стоит ставить более простые цели? Небольшой редактор, поддержка нескольких дисков/мониторов и т.д.?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Реализовать функции для конкретной программы очень просто

load(код:string,  "пока не разобрался,что это, ставлю всегда nil", "пока не разобрался,что это, ставлю всегда nil", среда:table)

Изменено пользователем Asummonster

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Реализовать функции для конкретной программы очень просто

load(код:string,  "пока не разобрался,что это, ставлю всегда nil", "пока не разобрался,что это, ставлю всегда nil", среда:table)

Что за "среда:table"? Что там должно быть?

 

udp:

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

Теперь вопрос - что за два загадочных параметра? Т.е. есть функция load(arg1, arg2, arg3, arg4), где arg1 - строка с загружаемым кодом, arg2 - строка, непонятного назначения, arg3 - таблица непонятного назначения, arg4 - таблица окружения, в которой переопределенные функции. Интересуют параметры arg2, и arg3.

Изменено пользователем Jet

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Jet, лучше сделай, осserver. В чём суть, есть некое ядро операционной системы, которое умеет создавать несколько потоков по желанию программиста. При количестве ядер в "процессоре" меньшем, чем количество потоков, ос должна сама уметь переключать контекст, чтобы программы не зависали. Так же она должна уметь создавать и останавливать потоки. Потоки должны иметь вложенную структуру, то есть Есть главный поток в нём содержатся несколько переменных и несколько потоков, причём внутренние потоки имеют схожую структуру, что позволит выделить области видимости и дать возможность потокам общаться между собой. Далее должна быть возможность добавления ядер в "процессор", подключением второго компа рядом или сервера. Также в каждом ядре должен иметься стек операций. Общение с этим ядром должно быть посредством программного кода. Сделай некий аналог JVM под open computers.


Как грамотно подойти к разработке большого проекта? 

  1. Нужно найти команду из 3-х и более человек
  2. Нужно найти хорошего лидера
  3. Нужно найти кучу свободного времени, не менее 20-ти часов в неделю
Изменено пользователем Seryoga
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Jet, лучше сделай, осserver. В чём суть, есть некое ядро операционной системы, которое умеет создавать несколько потоков по желанию программиста. При количестве ядер в "процессоре" меньшем, чем количество потоков, ос должна сама уметь переключать контекст, чтобы программы не зависали. Так же она должна уметь создавать и останавливать потоки. Потоки должны иметь вложенную структуру, то есть Есть главный поток в нём содержатся несколько переменных и несколько потоков, причём внутренние потоки имеют схожую структуру, что позволит выделить области видимости и дать возможность потокам общаться между собой. Далее должна быть возможность добавления ядер в "процессор", подключением второго компа рядом или сервера. Также в каждом ядре должен иметься стек операций. Общение с этим ядром должно быть посредством программного кода. Сделай некий аналог JVM под open computers.

Аля Azure... Облачные сервера.. Круто конечно, но очень трудно. В качестве следующих шагов, имея на рука ОСь с многопоточностью можно, но не с нуля.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты ведь понимаешь, что многопоточность на калькуляторе бессмысленна? Да и несколько потоков на одном ядре работают в разы медленнее, чем один поток выполняющий ту же задачу. Как говорится, А игра стоит свеч?

Изменено пользователем Seryoga

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты ведь понимаешь, что многопоточность на калькуляторе бессмысленна? Да и несколько потоков на одном ядре работают в разы медленнее, чем один поток выполняющий ту же задачу. Как говорится, А игра стоит свеч?

Стоит, мне интересно разобраться как работает ОСь, а так же попрактиковаться в lua.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Уважаемый администратор. Возможно ли перенести эту тему в раздел "Разработка проектов и схем", а так же поменять имя на "Разработка операционной системы [OC]"? Если да, то сделай это пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Уважаемый администратор. Возможно ли перенести эту тему в раздел "Разработка проектов и схем", а так же поменять имя на "Разработка операционной системы [OC]"? Если да, то сделай это пожалуйста.

Если ты после всей критики еще одержим своей идеей, то ты, думаю, сможешь сделать то, что тебе нужно. Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если ты после всей критики еще одержим своей идеей, то ты, думаю, сможешь сделать то, что тебе нужно. Удачи!

О да, еще как одержим.))) И есть уже кое какие наработки. Ща определюсь с рисовалкой до конца и уже смогу что то продемонстрировать.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

О да, еще как одержим.))) И есть уже кое какие наработки. Ща определюсь с рисовалкой до конца и уже смогу что то продемонстрировать.

Так держать! Ждем-с... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Где можно посмотреть то, что уже есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Где можно посмотреть то, что уже есть?

Пока нигде, я не выкладывал никуда еще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

Это как минимум полезно для саморазвития

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×