Перейти к содержимому

RccHD

Пользователи
  • Публикации

    142
  • Зарегистрирован

  • Посещение

  • Победитель дней

    13

Сообщения, опубликованные пользователем RccHD


  1.  

     

    есть программы, которые не выполняют sleep/listen, а длительно работать без TLWY им позволяют обращения к периф

    Это что за программы? Есть пример? Я привык, что всегда нужно pullSignal писать в программе, чтобы она работала 

  2.  

     

    Есть третий принципиально отличающийся вариант: обработка нескольких приложений-окон в общем потоке-контейнере

    Есть пример рабочей реализации? Чтобы две-три программы работали, рисовали графику. Я бы посмотрел исходники  :D  

  3. Вот именно, зачем изобретать новый велосипед, когда можно лучше взять и доработать уже что-то существующее и работоспособное (как в общем в 99% случаев с опенсоур проектами и бывает).

    Не нравится стандартная OpenOC, так Plan9 есть. Если хочется графического, то пожалуйста Ось от @ECS. Думаю Игорь не против новых предложений и идей  :rolleyes:

     

    Вот я как раз этим и занимаюсь. Я для грандиозности утверждаю что 'пишу новую офигенную операционку', на самом деле это называется 'дорабатываю/переписываю OpenOS'

    Отсюда и полная совместимость программ на OpenOS с моей операционкой


  4. Вот еще интересный, красочный пример. Запустил две змейки на одном компе:

    vokoscreen-2017-09-02_06-15-30.gif

    Проблема только в том, что обе змейки реагируют на нажатия клавиш, но эта проблема легко решаемая :)

    P.S. Программу "змейка" я скачал с форума и запустил в своей ОС без каких-либо доработок

    • Нравится 4
    • Одобряю 1

  5. но часть механизма обработки коллизий все равно придется вынести в приложения.

    Приведи пример такой коллизии. Я пока не придумал ни одного


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


  7. Реализована возможность запуска нескольких программ одновременно!!!
    В этом примере каждая программа запущена в отдельном окне 10х10 символов.
    agigi.gif


    Это 2 одинаковых программы. Эта программа будучи запущенной в "одиночном" режиме занимает все окно:
    agigi.png


    Примечание: в скиншоты попал мой терминал(фиолетовая область). Я криворукий и мне лень переделывать

    Программы запущены в эмуляторе, так что они работают намного быстрее. Пока еще не тестил в майне

    • Нравится 3

  8. Увы, такой подход крайне нерационален. Безусловно, визуально куда проще выделить локальную переменную под жирную таблицу с множеством вложенных обращений, сэкономив тем самым несколько тиков - однако если бы я использовал такой подход при написании требовательного софта, то он вылетал бы с not enough memory еще до старта. Примером может послужить наш 3D-движок: сборщик мусора банально не успевал очищать локальные переменные-указатели на таблицы векторов при отрисовке сцен, и ошибка о нехватке памяти вылезала как результат. Сократив подобный "некорявый код" до минимума, мы смогли запустить движок всего лишь на 2 МБ RAM. Так что лучше помучиться с лишними буковками, нежели писать неоптимизированное в данном контексте ПО. Имхо, конечно же

    Всегда считал, что переменные(они же указатели на объекты) не могут занимать много памяти...

     

    Хотя бы потому что исходники библиотек OpenOS прямо-таки напичканы переменными. Может дело все-таки не в таких мелочных деталях как переменные, а в самой реализации?

     

     

    function buffer:readLine(chop, timeout)
      self.timeout = timeout or (computer.uptime() + self.readTimeout)
      local start = 1
      while true do
        local buf = self.bufferRead
        local i = buf:find("[\r\n]", start)
        local c = i and buf:sub(i,i)
        local is_cr = c == "\r"
        if i and (not is_cr or i < #buf) then
          local n = buf:sub(i+1,i+1)
          if is_cr and n == "\n" then
            c = c .. n
          end
          local result = buf:sub(1, i - 1) .. (chop and "" or c)
          self.bufferRead = buf:sub(i + #c)
          return result
        else
          start = #self.bufferRead - (is_cr and 1 or 0)
          local result, reason = readChunk(self)
          if not result then
            if reason then
              return nil, reason
            else -- eof
              result = #self.bufferRead > 0 and self.bufferRead or nil
              self.bufferRead = ""
              return result
            end
          end
        end
      end
    end
    

  9. Ну блин, стараешься тут, стараешься, разбивая код на суб-сегменты по классическим идиомам проектирования, минимизируя нагрузку на оперативку и ЦПУ, а потом его "корявым" называют. Обидно  :wacko:

     

    А вообще интересно, каким образом ты уменьшил размер сырцов в 5 раз - уж не путем ли удаления половины "не нужных" для твоей ОС элементов? Го инфу, любопытно стало.

    По поводу моей субъективной оценки твоего кода:

     

    Я вот такие вещи вообще видеть не могу, это вообще не по-человечески так писать:

    changes[buffer.currentFrame[index]] = changes[buffer.currentFrame[index]] or {}
    changes[buffer.currentFrame[index]][buffer.currentFrame[indexPlus1]] = changes[buffer.currentFrame[index]][buffer.currentFrame[indexPlus1]] or {}
    				
    table.insert(changes[buffer.currentFrame[index]][buffer.currentFrame[indexPlus1]], x)
    table.insert(changes[buffer.currentFrame[index]][buffer.currentFrame[indexPlus1]], y)
    table.insert(changes[buffer.currentFrame[index]][buffer.currentFrame[indexPlus1]], table.concat(sameCharArray))
    				
    

     

    Когда я вижу подобный код, я начинаю думать:

    1) У автора этого кода паническая боязнь переменных(или он проспорил кому-то)

    2) Автор думает, что любая созданная переменная занимает гигабайты в оперативке, поэтому их не использует

    3) У автора Крутой Продвинутый Текстовый Редактор ™, который позволяет написать "buffer.currentFrame[index]" сразу в трех местах

     

     

    Так как я не фанат различных навороченных редакторов текстовых редакторов и не боюсь переменных и знака "=", я бы написал этот код вот так:

     

    local el0 = buffer.currentFrame[index],
          el1 = buffer.currentFrame[indexPlus1]
    
    changes[el0] = changes[el0] or {}
    changes[el0][el1] = changes[el0][el1] or {}
    				
    table.insert(changes[el0][el1], x)
    table.insert(changes[el0][el1], y)
    table.insert(changes[el0][el1], table.concat(sameCharArray))
    				
    

    По поводу нагрузки на ЦПУ:

    писать "buffer.currentFrame[index]" плохо так как система будет каждый раз выполняет следующие действия:

    1) получает значение переменной "buffer"

    2) получает поле "currentFrame" объекта "buffer"

    3) получает поле "index" объекта "buffer.currentFrame"

     

    А если хранить это значение в переменной, то будет одно действие:

    1) получает значение переменной "el0"

    • Нравится 1

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

    Во, первых это ты сам решил что "все программы придется адаптировать", я такого не писал :)

    Я постараюсь написать такую ОС, на которой можно будет запустить большинство программ без доработки


  11. Надеюсь, что мне не надоест разрабатывать эту OC, иначе будет еще одна R.I.P операционка

    Планирую закончить разработку максимум через месяц. По истечении этого времени, я либо выложу готовый результат/альфа-версию, либо забью на разработку

     
    P.S. я школьнег и мне кроме написания OC еще учиться надо :)


  12. Чтобы бы там не говорил Fingercomp по поводу написания своих ОС, я таки пишу свою ОС :)

    Планы такие:
    1) разработать операционку с многозадачностью на основе OpenOS с полной совместимостью
    2) запуск нескольких программ одновременно(в том числе графических)
    3) возможность разбивки экрана на прямоугольные зоны для предоставления программам доступа к этим зонам(программы не будут рисовать графику вне предоставленной зоны)
    4) буферизация графики с ускорением отрисовки (как у ECS). Я не стал брать либу от ECS потому что она использует другие либы того же автора и потому что реализована эта библиотека довольно коряво в плане стиля написания кода(мое личное мнение). В общем, я переписал либу ECS с нуля под нужды операционки, кол-во кода сократилось в 5 раз. Все программы написанные на моей OC будут иметь "графическое ускорение" по умолчанию.

    Пункты 2 и 3 фактически уже закончены(по-крайней мере мне так кажется)
    Буферизация(пункт 4) работает прекрасно, отрисовка графики в некоторых случаях может быть в 3-15 раз быстрее(относительно gpu api)

    Также планируется написать несколько очень простых программ для демонстрации возможностей ОС
    В частности, хочу реализовать ОЧЕНЬ сильно урезанную реализацию моего любимого оконного менеджера xmonad


    Важно: все OpenOS-программы можно будет запустить на моей OC


  13. Хочу предложить вариант серверной

     

    Было бы круто если бы был такой улей-серверная(админский приват около спавна). В этом улье стоял бы чанклоадер, а сама серверная была бы оформлена в виде большого футуристичного здания с комнатами внутри(я бы сделал стеклянные перегородки между комнатами).

     

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

    Главное правило пользования серверной: в ней можно ставить только компы и декор. блоки

    Чтобы никто не ставил там лагучие механизмы-печки.

     

    Я считаю, что такая серверная способствовала бы появлению разных публичных сетей и онлайн-сервисов на сервере

     

    Почему просто не купить чанклоадер? Ну потому, что на него игроку придется копить довольно долго(> недели, вроде бы)

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

     

    В случае с серверной все проще, грузится 1 чанк


  14. Это вы рассказываете где нужно наследование, а не о том где не нужно наследовать все методы.

    каждый понимает по-своему

     

    Вы считаете, что нужно все методы наследовать, а я считаю что не обязательно наследовать именно все методы. Лучше выборочно


  15. Чем вам не понравилось стандартное исполнение классов в lua?

    С чего вы взяли что мне оно не нравится? Оно скорее вам не нравится, так как там нет public static protected friendly

     

    Можно ли в runtime узнать является ли объект чьим-либо наследником или нет?

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

     

    Создание приватных полей и методов похоже на один огромный костыль.

    Чего ж вы так не любите Lua, что стандартные области видимости языка вам кажутся костылями?

     

    Почему если вы не понимаете зачем нужны те или иные фишки языка, то человек который их использует -- извращенец? Мне кажется вы никогда и ничего не писали на c++ или java. Основное приимущество слов private, public, protected и тп. это статическая или очень ранняя динамическая проверка наличия ошибок в программе. static нужен для создания общей памяти для всех классов. Также эти маркеры помогают размечать память объекта, но для луа это не актуально.

    Те, кто пишут на C++ и Java пусть используют private и protected и т.п. В таком языке как Lua private и protected выглядят просто по-извращенски

     

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

    Представьте себе, что есть объекты Rect, Triangle и Line. У всех этих объектов может быть общий метод Rotate(x, y, z, angle), который будет унаследован у Figure_prototype.Rotate

     

    Знаете что такое singleton? Как его создать используя вашу библиотеку? Как создать несколько singleton'ов в одном пакете?

     В Lua это не нужно. 

     

    Есть класс MyClass. Нужно создать метод класса, который создаёт новый объект класса MyClass и что-то с ним делает. Как это сделать?

     

    Если коротко, то вот так

    local myClass = Class({
        __init__ = function(self, x) self.x = x end,
        
        strange_method = function(self, y)
            local myObj = self.__new__(y)
            myObj.desc = "Объект типа myClass"
            return myObj
        end
    })
    

  16. И довольно быстро упёрся в разные проблемы с этим: например, я хочу, не создавая инстанс класса, создать кастомный класс, чтобы заменить какую-то константу в исходном классе. Надо унаследоваться и заменить. У меня надо было таскать мета-таблицу, у тебя — прототип. А в той вкусной либе, которую я описывал, достаточно вот такого кода:

    local CustomClass = newClass(BaseClass)
    CustomClass.SOME_CONSTANT = 42
    

    И затем можно юзать кастомный класс с переопределённым атрибутом.

     

    А в чем собственно проблема? Вот так это делается:

     

    local customClass = function(...)
        local obj = BaseClass(...)
        obj.SOME_CONSTANT = 42
        return obj
    end
    

  17. Получается, если у класса-родителя двести пятьдесят методов и класс-наследник хочет их всех унаследовать, все двести пятьдесят нужно перечислить в объявлении наследника? А нельзя это как-то автоматизировать? Например, передавать прототип родителя в функцию Class() вторым параметром, чтобы она занималась наследованием методов.

     

    Хорошая идея. Наверное так и сделаю


  18. АХ, ДА, СОВСЕМ ЗАБЫЛ

    Если вдруг у кого-то возник вопрос "а где private? а где public? а где local private protected?", то вот вам реализация ваших любимых private и public

     
    1. public (публичные параметры, которые доступны другим классам) указываются в функции __init__ . То есть в конструкторе класса(все очень просто)

    2. private (в моей библиотеке не реализованы области видимости для "приватных" параметров, но зато такие области видимости реализованы в Lua)
    Это намек на то, что не нужно усложнять код, а вместо этого стоит использовать уже реализованные области видимости языка Lua
    Для этого нужно обернуть код класса в do..end, таким образом создав для этого класса изолированную область видимости
    Пример:


    local Class = require("class")
    
    local myObject do
        local secretString = "это приватная меременная без всяких заморочек"
    
        myObject = Class({
            -- класс без конструктора
            publicString = "а это публичная переменная!!!"
        })
    end
    
    -- Создание экземпляра класса myObject
    local obj = myObject()
    
    print(obj.publicString) -- Выведет "а это публичная переменная!!!"
    
    print(obj.secretString) -- выведет "nil", так как это приватная переменная класса 

    3. А любителям всяких там "local private protected friendly" и прочих извращенских протектед-статиков (привет Java и C++) я ничего не могу предложить.  :) 
    Так как я не решился реализовывать настолько извращенские вещи, хотя бы потому что я не мазохист и никогда не стану это использовать на практике

    Лично мне простых public и private хватает
    Надеюсь я не задел ни чьи религиозные чувства!

     

×
×
  • Создать...