БК-0010 старца

БК-0010 старца

Сообщение Fouras » Пт сен 01, 2017 3:19 pm

Кидаю сюда на случай если кому-то придет в голову замечание по теме. И даже такой вариант: если никому ничего не придет в голову, сам факт того, что мне могли бы что-то сказать может подвигнуть на любопытные идеи.

Я как-то кидал лексический анализатор.

Теперь мысли о парсере.

  1. Синтаксис грамматики должен быть описан явно в максимально читаемом виде, максимально близко к erbnf. Самый простой путь: задавать сырые строки и описывать там. Но это сомнительно в связи с пунктом 3.
  2. Использование парсера как при чтении конфигов, текстовых данных (типа VRML, XML), при построении языков программирования, в особенности небольших встроенных, но и крупные проекты для реализации некоторых мыслей о расширении С++.
  3. Максимальное количество проверок на этапе компиляции.
  4. Возможность создавать библиотеки парсинга. Подключение библиотек, быстрое их использование. Вероятно, оптимизация, если позволяет концепция. Оптимизация подразумевает использование для обработки гагабайт данных в текстовой форме.
  5. Создание максимально эффективного парсера, который позволяет в том числе работать и как сканер (лексический анализатор) без потери эффективности.
  6. Возможно экспорт библиотек парсера в JS. Пока это кажется набором слов, потом поясню.

Размышляя об этом я рассматривал несколько стратегий построения парсера:
  1. Описание строками. Такое описание само надо разбирать, вероятно как альтернативный метод он войдет и в другие.
  2. Шаблонное построение. Пример парсера на шаблонах я кидал при демонстрации сканера на регэкспах. Этот вариант привлекал меня для максимального анализа согласованности данных на этапе компиляции. Например: данные в Абстрактом Синтаксическом Дереве AST должны соответствовать по числу и типам функций-обработчиков задаваемых пользователем.
  3. Написать объекты, которые синтаксически соответствуют конструкциям С++, но при этом выглядят как конструкции erbnf. Этот метод меня смущал тем, что мне казалось в нем отсекается возможность статической проверки согласованности на этапе компиляции. Но потом я вспомнил, что когда-то написал библиотеку tuple-сов, в которых вызывались функции, и тип результата этих функций порождался в зависимости от аргумента! То есть был такой эффект:
    Код: Выделить всё
    tuple<int,float> t0;
    tuple<char,std::string> t1;
    результат применения merge объединяет эти типы:
    tuple<int,float,char,std::string> tres = t0.merge(t1); // шаблонная функция merge порождает разные типы!

    Таким образом я остановился на этом варианте, как наиболее перспективном.
Рабочий набросок построения BNF, который порождает граф, по которому можно уже ходить и что-то делать. Предполагается, что граф будет будет строиться один раз при построении константной части парсера. Она будет представлена синглтоном или просто статичных объектом. Смотреть на пример задания в конструкторе ParseTest(). В нем вся соль. Пока шаблонных вычислений тут нет, но они уже не будут простыми, там будет вывих мозга. Но внешне все сохранится. Плюс будут добавлены унарные операции: "*" 0 или больше, "+" 1 или больше, наверное скобками [] - 0 или 1.

Код: Выделить всё
#include <memory>
#include <stdlib.h>
#include <string>
#include <regex>
#include <set>

struct parser
{
     enum class TDECL
     {
          INT, WORD, STR, FLOAT, SYM, THE_SYM, THE_WORD
          , RULE, RULE_REF, ERROR
     };
     struct TDeclPool;

     // объект, который появляется в стеке, потом будет превращаться в объект в памяти TDeclItem
     struct TD
     {
          TDECL       type;
          int         sym;
          const char *name;
          TDeclPool  *pool; // дерево должно порождаться непосредственно из взаимодействия констант
     };

     template<TDECL ID>
     struct TDecl : public TD
     {
          enum { TYPE = ID };
          TDecl(TDeclPool &declPool) { type = ID; sym = 0; name = 0; pool = &declPool; }
     };

     struct TDeclItem : public TD
     {
          TDeclItem *prev, *next, *lnext, *lprev;

          TDeclItem(TD td, TDeclItem *_prev, TDeclItem *_next)
          {
               type = td.type;
               pool = td.pool;
               sym  = td.sym;
               name = td.name;
               prev = _prev;
               next = _next;
               lnext = this; // last container next
               lprev = this;
          }
     protected: // избегаем создания в стеке
          TDeclItem(const TDeclItem&) = delete;
          void operator = (const TDeclItem&) = delete;
          ~TDeclItem() {}
          friend TDeclPool;
     };

     struct TDeclPool
     {
          std::vector<TDeclItem*> data;

          TDeclItem *create(TD td, TDeclItem* _prev, TDeclItem* _next)
          {
               TDeclItem *item = new TDeclItem(
                                       TD{ td.type == TDECL::RULE ? TDECL::RULE_REF : td.type
                                         , td.sym, td.name, this
                                       }
                                       , _prev, _next
                                    );

               data.push_back(item);
               return item;
          }
          TDeclItem &create_sym(int c)
          {
               return *create(TD{ TDECL::THE_SYM, c, 0, this }, 0, 0);
          }
          ~TDeclPool()
          {
               for ( auto i : data )
                    delete i;
          }
     };
     struct TRule : public TD
     {
          TDeclItem *next;

          TRule(const char *_name, TDeclPool  *_pool)  { type = TDECL::RULE, sym = 0, name = _name, pool = _pool;  next = 0; }
          void operator = (TDeclItem &item) { next = &item;   }
          void operator = (const TD    &td) { next = pool->create(td,0,0);   }
     };

     TDeclPool m_declPool;
     // константы, однако содержат вс. необходимую информацию как для конструирования в реал-тайме, так и при компиляции
     const TDecl<TDECL::INT>    INT  = m_declPool;
     const TDecl<TDECL::WORD>   WORD = m_declPool;
     const TDecl<TDECL::STR>    STR  = m_declPool;
     const TDecl<TDECL::FLOAT>  FLOAT= m_declPool;
     const TDecl<TDECL::SYM>    SYM  = m_declPool;

     TDeclItem &Sym(int c)
     {
          return *m_declPool.create(TD{ TDECL::THE_SYM, c, 0, &m_declPool }, 0, 0);
     }

     TDeclItem &Error(const char *msg, int code=0)
     {
          return *m_declPool.create(TD{ TDECL::ERROR, code, msg, &m_declPool }, 0, 0);
     }

     // для отладки, не расставляет скобки
     void print_item(const TDeclItem &item)
     {
          switch ( item.type )
          {
          case TDECL::INT:       printf("INT"    ); break;
          case TDECL::WORD:      printf("WORD"   ); break;
          case TDECL::STR:       printf("STR"    ); break;
          case TDECL::FLOAT:     printf("FLOAT"  ); break;
          case TDECL::SYM:       printf("SYM"    ); break;
          case TDECL::THE_SYM:   printf("Sym('%c')"       ,item.sym); break;
          case TDECL::THE_WORD:  printf("Word(\"'%s\")"   , item.name); break;
          case TDECL::RULE_REF:  printf("%s"              , item.name); break;
          case TDECL::ERROR:     printf("Error(\"%s\",%i)", item.name, item.sym); break;

          case TDECL::RULE:break;
          }
          if ( item.next != 0 )
          {
               printf(", ");
               print_item(*item.next);
          }
          if ( item.prev != 0 )
          {
               printf(" | ");
               print_item(*item.prev);
          }
     }
     void print(const TRule &item)
     {
          printf("%s = ", item.name);
          if ( item.next != 0 )
               print_item(*item.next);
          printf("\n");
     }

     friend parser::TDeclItem &operator , (parser::TD td0, parser::TD td1)
     {
          parser::TDeclPool *pool = td0.pool;
          TDeclItem *td1_item = pool->create(td1, 0, 0);     
          TDeclItem *td0_item = pool->create(td0, 0, td1_item);
          td0_item->lnext = td1_item;
          return *td0_item;
     }
     friend parser::TDeclItem &operator , (parser::TDeclItem &td0_item, parser::TD td1)
     {
          parser::TDeclPool *pool = td0_item.pool;
          TDeclItem *td1_item = pool->create(td1, 0, 0);
          td0_item.lnext->next = td1_item;
          td0_item.lnext = td1_item;
          return td0_item;
     }
     friend parser::TDeclItem &operator , (parser::TD td0, parser::TDeclItem &td1_item)
     {
          parser::TDeclPool *pool = td0.pool;
          TDeclItem  *td0_item = pool->create(td0, 0, &td1_item);
          td0_item->next  = &td1_item;
          td0_item->lnext = td1_item.lnext;
          return *td0_item;
     }
     friend parser::TDeclItem &operator , (parser::TDeclItem &td0_item, parser::TDeclItem &td1_item)
     {
          parser::TDeclPool *pool = td0_item.pool;
          td0_item.lnext->next = &td1_item;
          td0_item.lnext = td1_item.lnext;
          return td0_item;
     }
     //--------------------------------------------------- | --------------
     friend parser::TDeclItem &operator | (parser::TD td0, parser::TD td1)
     {
          parser::TDeclPool *pool = td0.pool;
          TDeclItem *td1_item = pool->create(td1, 0, 0);
          TDeclItem *td0_item = pool->create(td0, td1_item, 0);
          td0_item->lprev = td1_item;
          return *td0_item;
     }
     friend parser::TDeclItem &operator | (parser::TDeclItem &td0_item, parser::TD td1)
     {
          parser::TDeclPool *pool = td0_item.pool;
          TDeclItem *td1_item = pool->create(td1, 0, 0);
          td0_item.lprev->prev = td1_item;
          td0_item.lprev = td1_item;
          return td0_item;
     }
     friend parser::TDeclItem &operator | (parser::TD td0, parser::TDeclItem &td1_item)
     {
          parser::TDeclPool *pool = td0.pool;
          TDeclItem  *td0_item = pool->create(td0, &td1_item, 0);
          td0_item->prev = &td1_item;
          td0_item->lprev = td1_item.lprev;
          return *td0_item;
     }
     friend parser::TDeclItem &operator | (parser::TDeclItem &td0_item, parser::TDeclItem &td1_item)
     {
          parser::TDeclPool *pool = td0_item.pool;
          td0_item.lprev->prev = &td1_item;
          td0_item.lprev = td1_item.lprev;
          return td0_item;
     }
};

#define DECL_RULE(R) TRule R(#R,&m_declPool)
struct ParseTest : public parser
{
     ParseTest()
     {
          DECL_RULE( num   );
          DECL_RULE( atom  );
          DECL_RULE( unar  );
          DECL_RULE( mul   );
          DECL_RULE( sum   );
          DECL_RULE( expr  );

          num = INT | FLOAT;

          atom = num
               | WORD
               | (Sym('('), expr, (Sym(')')| Error("Expected ')'",0)))
               ;

          unar = ((Sym('+') | Sym('-')), unar)
               | atom
               ;

          mul  = (unar, Sym('*'), mul)
               | (unar, Sym('/'), mul)
               | unar
               ;

          sum =  (mul, Sym('*'), sum)
               | (mul, Sym('/'), sum)
               | mul
               ;

          expr = sum;

          print(atom);
          printf("\n");
     }
};

//-----------------------------------
void main()
{
     ParseTest test0;

}



Что потом будет происходить с этим графом? Я буду компилировать его некий язык, интерпретация которого соответствует разбору. Причем язык этот будет максимально типизированный, то есть это типизированный ERBNF со встроенной возможностью подключения функций-обработчиков. У меня даже есть уже готовая реализация, но не до конца оттестированная и она мне сейчас не нравится. Там есть свой ассемблер, дизасемблер. Но идея хороша, я возьму его как базис. Под катом дизассемблированный фрагмент парсера арифметических выражений. Кто сталкивался с P-кодом, Java-кодом и прочими подобными системами, узнает о чем речь, хоть и без подробностей.

Код: Выделить всё
------------------2
0000   rule entry [0008] ;---------mul
0004   branch entry [0008]
0006     get_int
0007   ret_true
0008   ret_fail
0009   rule entry [0022] ;---------sum
000d   branch entry [0019]
000f     call rule mul[0000]
0011     exp_chr '+'
0013     call rule mul[0000]
0015     call action [0000]
0017   branch leave true[0021]
0019   branch entry [0022]
001b     call rule mul[0000]
001d     exp_chr '-'
001f     call rule mul[0000]
0021   ret_true
0022   ret_fail

------------------1
0000   rule entry [0011] ;---------atom
0004   branch entry [0007]
0006   get int
0007   branch leave
0008   branch entry [0010]
000a   expected char [(]
000c   call rule [ffffffff]
000e   expected char [)]
0010   branch leave
0011   return
0012   rule entry [0029] ;---------unar
0016   branch entry [001a]
0018   call rule [0000]
001a   branch leave
001b   branch entry [0021]
001d   expected char [+]
001f   call rule [0000]
0021   branch leave
0022   branch entry [0028]
0024   expected char [-]
0026   call rule [0000]
0028   branch leave
0029   return
002a   rule entry [0049] ;---------mul
002e   branch entry [0036]
0030   call rule unar[0012]
0032   expected char [*]
0034   call rule mul[002a]
0036   branch leave
0037   branch entry [003f]
0039   call rule unar[0012]
003b   expected char [/]
003d   call rule mul[002a]
003f   branch leave
0040   branch entry [0048]
0042   call rule unar[0012]
0044   expected char [%]
0046   call rule mul[002a]
0048   branch leave
0049   return
004a   rule entry [0062] ;---------sum
004e   branch entry [0058]
0050   call rule mul[002a]
0052   expected char [+]
0054   call rule sum[004a]
0056   call action [0000]
0058   branch leave
0059   branch entry [0061]
005b   call rule mul[002a]
005d   expected char [-]
005f   call rule sum[004a]
0061   branch leave
0062   return
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение const » Пт сен 01, 2017 7:09 pm

Ты что ли?
Изображение
кто у меня в друзьях по мордакниге
Привет участникам естественного отбора!

Комендант крепости по имени Верность - ЭСИ
Аватара пользователя
const
Гуру
Гуру
 
Сообщения: 13895
Зарегистрирован: Пт май 29, 2009 8:53 pm
Медали: 3
Тип по психе-йоге: Бухарин (ЭФЛВ)

БК-0010 старца

Сообщение Fouras » Пт сен 01, 2017 7:59 pm

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

Решил вот поднимать темы, которые мне интересны. Отклик пока почти нулевой, но кто знает к чему приведет. Вдруг. В старые времена можно было в любой конфе и любом форуме начинать про программирование. 50% были программисты, 30% админы и остальные случайно в сеть забрели.

Побочный плюс в том, что снимутся претензии почему я не говорю на технические темы. Вот говорю, только что-то не видать кто поддержит. Один только недовольный студент тут бегает, может он постепенно поймет что к чему.
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение const » Пт сен 01, 2017 8:18 pm

Я рада.
Достойная аватара получилась. То-то я как-то резко вчиталась :add14 Обычно мало что вызывает интерес достойный траты свободного времени, о мудрый старец!
Помнишь: Однажды Кришна решил проинспектировать свои аватары :D
Привет участникам естественного отбора!

Комендант крепости по имени Верность - ЭСИ
Аватара пользователя
const
Гуру
Гуру
 
Сообщения: 13895
Зарегистрирован: Пт май 29, 2009 8:53 pm
Медали: 3
Тип по психе-йоге: Бухарин (ЭФЛВ)

БК-0010 старца

Сообщение Fouras » Пт сен 01, 2017 9:01 pm

Что-то не припоминаю ничего такого за Кришной. Это тот, который Харе Рама? Синенький такой?
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение Fouras » Пт сен 01, 2017 10:14 pm

Студент опять ничего по делу не написал. Хотя бы почитал что я пишу, прежде чем выеживаться тут.

Несколько слов:
Мной написаны несколько языков, некоторые имеют практическое использование. Были и компиляторы и интерпретаторы. "Пойди почитай" - ну да, читаю ежедневно.

Преобразовать AST в код стековой машины - это довольно элементарная операция, никакого достижения тут нет. KLR-обход, ок. Стековая машина - куда ж без нее.

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

Выше показан пример построения графа содержащего описание грамматики. Задание графа выглядит в привычной форме близкой к erbnf. Потом можно и стековым автоматом обойти, или, как я собираюсь, генерировать код анализатора. Кстати, стековая машина и пример дизассемблированной программы там есть под катом. Обычная такая стековая машина, узнаваемая. Чего выпедриваться, сложно вначале посмотреть о чем речь?
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение Fouras » Сб сен 02, 2017 12:17 am

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

Студент, еще раз напоминаю, что я не твой отец, и мне доказывать что-то личного плана не нужно.

Здесь приветствуются:
  • Идеи, приемы и фокусы программирования.
  • Парадигмы программирования. Особенный плюс к логическому программированию, если у кого есть желание обсудить.
  • Построение компиляторов и интерпретаторов.
  • Обработка изображений.
  • История программирования.
  • Оригинальные и интересные алгоритмы.
  • Нейросети.
  • Сравнение конструкций и эффективности языков.
  • Из языков предпочтение дается C++ и JS, но пойдет любой язык.
  • Программистский юмор.
  • Все остальное, что связано с программированием.
  • Дружественные разговоры, чтобы не засохнуть.

Дружественный стиль соблюдать не обязательно. Можно так: "Твой С++ сосет, поскольку Кобол ближе к естественному языку". Важно, чтобы прочитав это сообщение кто-то мог получить новую информацию, пусть и спорную. В данном случае, что "Кобол ближе естественному языку".

Нападки на меня лично типа "а ты докажи, что ты написал, что ты прочитал, а я умнее" - у меня вызывают недоумение. Я ничего не удаляю, в конце концов я могу быть в чем-то неправ. Переношу в специальные темы.
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение Eiffel » Сб сен 02, 2017 12:44 am

Ох, ну у меня есть исключительно много чего сказать по следующим темам:
-- архитектура компьютера как таковая. Создание своих компьютеров. Мало нормального софта для собственного интереса есть, к сожалению, где бы еще все уровни затрагивались, в основном на бумаге рисую, и понятно, что без учета множества факторов, хотя бы с питанием связанных (ну оно и в симуляторах зачастую игнорируется). Но и то очень забавно и интересно получается. Здесь -- проектирование цифровой электроники, проектирование внутренней архитектуры ЦП с позиции исполнения команд, проектирование системы машинных команд, проектирование ОС (см. далее) и прочая;
-- архитектура защищенного режима x86 и то, как бы я ее изменил (а много чего бы изменил) и почему;
-- архитектура операционных систем и ядра UNIX в частности; я, кстати, осенью допишу и выложу небольшую книгу, которая как иллюстрирует основные идеи, так и разбирает мой пример для x86 (аналогичной доки еще не видел, кроме древней Львиной книги, описывающей ядро v6 для pdp11 и в основном именно как мануал, ближе всего к такому доки по xv6 -- но они очень сокращенные и беглые, и книга Таненбаума по Minix -- но она не построчна);
-- распределенные ОС и интерфейс к ним (пока на эту тему очень мало материалов, некоторые лекции дает Каашоек в MIT);
-- история программирования, философии MIT и Нью-Джерси, их комбинация;
-- программирование и соционика, как с позиции семантики предмета, например, статика vs динамика в декларативных и императивных языках (внутри последних статика усилена в контексте формирования архитектуры, например, ядра ОС, а динамики много в работе устройств (но стандарт взаимодействия с ними уже в языке БЛ обычно изложен)), так и с позиции типных предпочтений. Тут вообще говоря тема попсовая, но очень много тонких и интересных моментов есть тоже.

Хотя писать тут нужно много и как следует, а мне откровенно не до того, столько каши в голове разгребать еще, систематизировать что интересно по CS, учить математику и физику, и так далее, просто гигантские объемы материала, как чисто фактологического характера, так и касаемо понимания и устаканивания фундаментальных понятий (как у меня было с архитектурой компьютера и как будет с математикой и физикой). И это при том, что я иррационал, которому нужны списки самоограничений и сознательный энергозатратный самоконтроль, с которого легко срываться (что у меня регулярно и происходит :) ).
Так что желаемой систематичности, охвата всех тем, охвата всего, что хотел, в затронутой теме и пр. может и не быть, но отдельные мысли точно будут.

Старец Фур писал(а):Нападки на меня лично типа "а ты докажи, что ты написал, что ты прочитал, а я умнее" - у меня вызывают недоумение.


Ну, это вполне понятное требование (ну, просто запрос), Старец. Так становится более-менее ясен твой уровень в теме (это зачастую достаточно, но никогда не необходимо -- дискуссии с vadimr в моем случае тому пример). И помимо этого -- просто интересно посмотреть.
Если у тебя есть хранилище проектов -- ссылочку дать труда не составит. Если нет (ты писал свои творения, скажем, в начале 1980х годов, на том же БК-0010, как вариант) -- ладно, это не так принципиально.

--

И очень много чего в Башне я и так уже излагал, но ты в основном отвечал в стиле "он старается отвести внимание от критики Таланова" (по которой я тоже, помимо того, отписывал, но ты скатывался в игнор и сливал в бак, надоел этим уже).
Eiffel
Местный
Местный
 
Сообщения: 1288
Зарегистрирован: Чт июн 29, 2017 5:27 pm
Медали: 1

БК-0010 старца

Сообщение Fouras » Сб сен 02, 2017 1:37 am

Проектирование машинных команд - это задача практически совпадает с задачей построения команд интерпретатора.

В стародавние времена многие были практически одержимы построением компьютера под язык программирования. Началось с того, что Вирт описал P-code, и спаял компьютер под него. Потом много было разных идей такого рода: у меня была книга, например, в которой описывались Лисп-компьютеры. Девид Варрен (дон сто пудов) описал Пролог-машину и в своей статье "An abstract Prolog instruction set". Тогда фантасты упивались идеей искусственного интеллекта, всем казалось вот-вот и его создадут и в мире начались два течения, которые связывали с ИИ: Лисп против Пролога (Европа против Японии). Лисп тогда считали функциональным языком, но потом понятие несколько сменилось. Сейчас уже ясно, что ИИ с языком мало связан, и комп под язык делать не самая перспективная затея. Сейчас вот на нейросети все думают, что за ними ИИ. А ведь нейросети - это если вдуматься, лишь инструмент, построение интерполирующей функции в пространствах больших мерностей.

Но вот зато две части Пролог-машины и две части SECD (ее я не реализовывал) - мне кажется очень красивыми, в них присутствует какая-то своя магия. Выход за пределы обычных стековых или регистровых машин.

А на счет ИИ есть такая байка. Однажды на конгресс кибернетиков позвали видного русского нейрофизиолога, профессора, к сожалению не помню его фамилии. Тогда кибернетика была какой-то смесью ТАУ и дискретной математики. Шеннон, Эшби, Тьринг и прочие светила. Профессора посадили в первый ряд. После зачитывания докладов к нему подошли и спросили как ему, не потрясен он развитием науки? На что тот ответил:
- Вы знаете, во времена моей молодости порнографические романы писали старые девы, чей полет фантазии не был стеснен рамками личного опыта.
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение Eiffel » Сб сен 02, 2017 1:45 am

Fouras писал(а):Проектирование машинных команд - это задача практически совпадает с задачей построения команд интерпретатора.


Эта задача НАМНОГО шире, математизированнее и посложнее в общем-то (ну, большинства интерпретаторов символического языка, естественно, вряд ли речь про микрокод в CISC-архитектурах). :)
Ну я позже отпишу.
Последний раз редактировалось Eiffel Сб сен 02, 2017 1:48 am, всего редактировалось 1 раз.
Eiffel
Местный
Местный
 
Сообщения: 1288
Зарегистрирован: Чт июн 29, 2017 5:27 pm
Медали: 1

БК-0010 старца

Сообщение Fouras » Сб сен 02, 2017 1:46 am

sng писал(а):И очень много чего в Башне я и так уже излагал, но ты в основном отвечал в стиле "он старается отвести внимание от критики Таланова" (по которой я тоже, помимо того, отписывал, но ты скатывался в игнор и сливал в бак, надоел этим уже).

Я ничего не удалил, все твои тексты сохранены в чистом виде. Вижу там личные нападки, ничего интересного не нашел. Если кто найдет - ради бога. Но ты их писал, не копипастил, это самый трудоемкий вариант вайпа, и потому не мне решать удалять или не удалять, туда был вложен труд, хоть мне он и неинтересен.
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение Eiffel » Сб сен 02, 2017 1:49 am

Fouras писал(а):Вижу там личные нападки, ничего интересного не нашел.


Плохо искал значит (либо у тебя пропал интерес к тому, что ты сам писал по программированию или соционике), что тут еще сказать. :)
Eiffel
Местный
Местный
 
Сообщения: 1288
Зарегистрирован: Чт июн 29, 2017 5:27 pm
Медали: 1

БК-0010 старца

Сообщение Fouras » Сб сен 02, 2017 2:01 am

sng писал(а):
Fouras писал(а):Вижу там личные нападки, ничего интересного не нашел.


Плохо искал значит (либо у тебя пропал интерес к тому, что ты сам писал по программированию или соционике), что тут еще сказать. :)

Кинь сюда цитаты, которые не содержат личных нападок, но содержат интересные мысли по программированию. На твой вкус интересные.
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение Fouras » Сб сен 02, 2017 3:47 am

sng писал(а):Fouras
Все по архитектуре x86 (в частности, я там расписал обработку прерываний в защищенном 32-битном режиме -- как на стороне ЦП, так и на стороне системного кода), семантика и примеры с volatile, все по ядру, если мы его касались, возможно, еще что-то. Сам копайся. :)
Ну и про нападки просто смешно слышать -- они все были в ответ на ложь и передергивание в той или иной форме.

Ты не привел цитаты, кстати. Их трудновато искать в этом потоке, верно?
Копаться в дерьме у меня нет желания, найти с тобой общий язык уже тоже нет.
Аватара пользователя
Fouras
Старожил
Старожил
 
Сообщения: 7249
Зарегистрирован: Пн июн 12, 2017 1:23 am
Медали: 11
Пол: Мужской

БК-0010 старца

Сообщение Буран » Вс сен 03, 2017 2:03 am

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

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

Интерпретируемую программу не надо компилировать: написал - и сразу запускай. Это преимущество номер раз. Преимущество номер два: интерпретируемые языки более гибкие, потому что... и тут я подвис. Почему они более гибкие? Как это объяснить в двух словах? :add14
Аватара пользователя
Буран
КБ 'Грядущее'
КБ 'Грядущее'
 
Сообщения: 33333
Зарегистрирован: Чт сен 03, 2015 5:29 pm
Медали: 15
Пол: Мужской
Тип по психе-йоге: Лао-цзы (ЛВФЭ)
Профессия: проповедник неокосмизма

След.

  • { SIMILAR_TOPICS }
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в Башня старца Фура

Кто сейчас на конференции

Зарегистрированные пользователи: GoGo [Bot], Google [Bot], Google Search Appliance, Java [Bad bot], vadimr, Yandex 3.0 [Bot], Yandex [Bot], Феликс