Pull to refresh

Comments 18

Я прошу прощения, но protothreads — это жуткое, грязное, страшное извращение, опасное, неудобное и неотлаживаемое, как и вся макросная магия в C, которое нельзя использовать ни в коем случае.
Выглядит убедительней, чем целая статья, если быть честным.
В эмбедде вполне себе используют это извращение ( на 8-ми битном камне с 500 байтами ОЗУ мало какая RTOS взлетит).
В эмбеддеде на 8-битном камне надо не лениться писать машины состояний на switch. Самому же легче будет, правда.
Отлаживать автомат на пару сотен состояний будет легче? Не сказал бы…
static
char example(struct pt *pt)
{
  switch(pt->lc) { case 0:
 
  while(1) {
    pt->lc = 12; case 12:
    if(!(counter == 1000)) return 0;
    printf("Threshold reached\n");
    counter = 0;
  }
 
  } pt->lc = 0; return 2;
}
Разве конструкция case может разрывать цикл?
«case» это метка, куда переместиться, почему нет?
Да, может, это известная «фича» С.
Device в Duff's device это все-таки «прием» (как, например, rhetorical device — риторический прием), а не «устройство».
Как альтернатива — «метод». Увидев «прием Даффа», мне было бы решительно непонятно, зачем автор хотел бы этого Даффа приесть.
Зря вы так. Слово «приём» используется в русском языке слишком часто, чтобы его можно было путать с будущим временем глагола «приедать».
Вот к таким недоразумениям приводят дурацкие инициативы по избавлению от буквы «ё»
Спасибо, вы правы, в статье исправила.
Машины состоянний, многозадачность на switch (а-ля protothreads), или с помощью проверки флагов очень востребована. Встраиваемые системы, микроконтроллеры, даже оконная функция в виндах это один большой swithc, обрабатывающий события.
Почему же за пол-века эволюции языков программирования ни в одном из них не ввели поддержку машин состояний или легковесных потоков?

p.s.
В ADA есть task (на на МК, по-видимому, не работают)
В C# есть yield
Но это все сделано совсем недавно.
В C++ вот-вот добавят co_yield и co_await, причем некоторые компиляторы уже поддерживают их экспериментальную версию.
думаю, что в C++ для МК мы этого никогда не дождемся.
Если там используются необычные компиляторы — то, вероятно, так и есть. А если обычные gcc или clang — то никуда МК не денутся.
В си есть setjmp/longjmp, очень во многих языках через них это и сделано.
Sign up to leave a comment.