На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! В разделе обсуждаются следующие темы:
1) Процесс разработки программного обеспечения.
2) Определение требований к программному обеспечению.
3) Составные части и процесс проектирования (см. Шаблоны проектирования).
4) Документирование программного продукта(проекта).
5) Руководство разработкой программного обеспечения.
6) Проектирование пользовательского интерфейса.
7) Контроль версий проекта (см. Управление версиями в Subversion, Стратегии использования svn).
Модераторы: ElcnU
Страницы: (4) 1 2 [3] 4  все  ( Перейти к последнему сообщению )  
> пишу компилятор
    Цитата
    В глобальном пр-ве имен это выглядит очень полезным. А как быть внутри функции?
    void f()
    {
       ....
       for(n=0; n<0; n++)
       {
       }
       ...


       // И где нибудь в конце функции:
       int n;
    }  
    Выглядит это как-то неочень

    ну, так у меня ж Паскаль - а там объявления только в начале подпрограммы, в отдельном разделе. А вообще, как я уже говорил - это довольно специфичный язык программирования. Он приспособлен для хранения математических алгоритмов с возможностью автоматического перевода. А всё, что не укладывается в эти две концепции, я просто выкинул из языка :)  Так, нет приведения типов - у меня только три типа - целый, вещественный и булевый. Нечего приводить, по сути дела.


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



    Цитата
    Вобщем-то у меня тоже компилятор пишется помаленьку

    а на какой стадии у тебя процесс сейчас?
    я первую версию своего уже закончил (даже не верится). Теперь надо будет перевод ещё на пару языков добавить. С++ и delphi уже есть, думаю, может взять С# и Visual Basic...


    кстати, всем желающим посмотреть - транслятор лежит на shadeofgray.narod.ru
    Сообщение отредактировано: shadeofgray -
      Цитата shadeofgray, 10.06.03, 00:38:25
      а на какой стадии у тебя процесс сейчас?
      Сначало скажу что он из себя представляет. Компилирует он модули. Нечто немного смахивающее на дллки. В них есть несколько сегментов.
      1. Инфа
      2. Импорт - модули, которые надо подгрузить для работы этого.
      3. Список типов, классов и структур в этом модуле. Про каждый из них есть инфа о названии всех методов, переменных и т.д. Т.е. RTTI
      4. Список функций и методов. Тоже вместе с RTTI
      5. Список переменных и констант. Аналогично.
      6. Данные. Т.е. реальные значения элементов из сегмента 5.
      7. Сегменты кода. На него ссылаются функции из 4.
      Компилируются функции в байт код, который при загрузке модуля переводится в машинный код и линкуется. Сегментов кода у меня несколько видов предусмотрено. Но реализованно пока три.
      1. Байт код который просто переводится в машинный.
      2. Сегмент для специальных математических функций. Это функции такого вида:
      double f(double x,double y) = x*x + y; Здесь функции хранятся в виде польско инверсной записи. По которой либо строится машинный код, либо можно к примеру построить производную этой функции.
      3. Сегмент машинного кода. Перевода при загрузке модуля для него не требуется. Этот сегмент есть, но компиляция для него еще не реализована.

      Переменные как в java - только ссылки на реальные объекты. Экземпляр выглядит так:
      1. Кол-во ссылок на него.
      2. Указатель на RTTI структуру.
      3. Сами даные.
      Есть такая вещь как типы:
      type A
      {
          data(4);
          double f();
      }
      Типы имеют только методы, но не имеют членов. Зато внутри типа можно указать размер его данных - например data(8); Cделано это чтобы реализовать классы стандартных типов. Т.е. double, int и т.д.
      Например:
      type double
      {
          data(8);
          string ToStr();
      }
      Удобно использовать такие переменные (т.е. double d) как классы. Например:
      string str = d.ToStr(); Но переменные в них запрещены.
      Есть еще константы. Константы имеют только данные этого Типа или Класса. Но не имеют кол-ва ссылок на экземпляр и ссылки на RTTI. Но они пока не реализованы. Реализовано только их использование в арифметических выражениях: x*0.1 + 0.2; А компиляция констант: const double Pi = 3.14; еще нет.

      Вот вроде рассказал все что у меня реализованно.
      Сообщение отредактировано: Leprecon -
        Цитата
        Вот вроде рассказал все что у меня реализованно.

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

        Кстати, вот ты говоришь - "Типы имеют только методы, но не имеют членов ..... Cделано это чтобы реализовать классы стандартных типов". Я правильно понял, что у тебя стандартные типы данных реализованы только средствами самого языка, т.е. есть исходник скажем типа double, который поддерживает всякие операции над ним?

        Кстати, хочу поделиться интересным техническим решением. У меня один знакомый тоже пишет компилер (урожайная на них будет осень :) ).  Он считает, что в языке не должно быть встроенных типов данных - всё должно быть реализовано средствами языка. Программы у него модульные, в качестве модулей, по-моему, используются DLL-ки. Каждый модуль может экспортировать реализуемые в нем типы данных. Ну и чтобы решить проблему с реализацией стандартных типов, он создает специальный модуль stdtypes - создает его не средствами своего языка, а при помощи другого (кажется, асм). Т.е. этот модуль экспортирует стандартные типы, как и любой модуль его языка, но только он создан не при помощи компиляции исходного текста на этом самом языке (по-моему, его ещё никак не зовут).

        Да, а как называется твой язык (если у него уже есть название)?
          Названия нет :) Это всегда для меня сложно было придумывать.
          Стандартные типы так и реализованы - средствами самого языка. Т.е. в типе double еще реализованы операторы +, -, * и т.д. как в C++, только тела таких операторов написаны на небольшом встроенном асме. В самом кмопиляторе нет ни одного типа. В нем есть только константы.
          Да, уже компилирует. Только это у меня не ехе, а дллка, которая экспортирует функцию void compile(char* makefile); и еще несколько структур и классов для работы со скомпилированным модулем.
          Сообщение отредактировано: Leprecon -
            Вот кстати, прикольная штука у меня есть: код
            ExpandedWrap disabled
              <br>procedure a;<br>var<br>    i   :   Integer;<br>begin<br>    i:=0;<br>    repeat<br>        i:=i+1;<br>    until i>10;<br>end;<br>

            при трансляции на С++ становится
            ExpandedWrap disabled
              <br>void a()<br>{<br>    int i;<br><br>    i = 0;<br>    do<br>    {<br>        i = i+1;<br>    }<br>    while(i<=10);<br>}<br>


            обрати внимание на то, как изменилось условие цикла until/while.
              а сколько написание языка(компилятора) занимает по времени?
                Цитата Misha Muhin, 23.07.03, 21:57:13
                а сколько написание языка(компилятора) занимает по времени?

                у меня заняло несколько месяцев. но вообще то вопрос того, сколько часов в день можно выделить для написания.
                Также много зависит от того, насколько мощный язык должен быть реализован.
                  если можно вопрос, а почему не изобрести компилятор другого типа, например компилит с рисунков, а именно... штот-о на подобие УМЛ, если быть точьнее Ратионал Розе, ведь последнее слово идёт за аналитическими компиляторами а?
                    Цитата zheromo, 11.07.02, 12:25:19
                    пишу компилятор с собственного языка
                    интересно, занимается ли этим кто-нибудь еще?
                    если интересно - вышлю исходники компилятора и описание языка

                    Компиляторы не пишу, но очень инетресно было бы посмотреть и изучить.
                    Идея у вас очень хорошая, так держать. Надеюсь ваш проект найдёт продолжение и развитие.
                    Всего....
                      Цитата zheromo @ 11.07.02, 11:25
                      пишу компилятор с собственного языка
                      интересно, занимается ли этим кто-нибудь еще?
                      если интересно - вышлю исходники компилятора и описание языка

                      если можешь отправь мне !!
                      просто срочно очень нужно
                      prostak_p@mail.ru :D
                        Очень полезно было бы написать компилятор формул, типа на вход принимается строка типа х*х+10*у, потом "x", "y" - переменные, 1, 2 - значение переменных, а на выходе - 21 - значение функции. Еще неплохо, что-бы искало все частные производные, типа, говорю - дай производную по х, и получаю строчку 2 *х. Если есть у кого-то, вышлите, пожалуйста на почту burda_r#mail.ru, где №=@/ Спасибо

                          Очень полезно было бы написать компилятор формул, типа на вход принимается строка типа х*х+10*у, потом "x", "y" - переменные, 1, 2 - значение переменных, а на выходе - 21 - значение функции.


                          А это - в Windows: Пуск - Программы - Стандартные - Калькулятор.


                          Еще неплохо, что-бы искало все частные производные, типа, говорю - дай производную по х, и получаю строчку 2 *х. Если есть у кого-то, вышлите, пожалуйста на почту burda_r#mail.ru, где №=@/


                          А это - MathCad.

                          А вообще всё это - "пишем компиляторы с языка, названия которому я не знаю..." - детский сад!

                          Сначала специфицируется язык, а потом ... может и компилятор писать расхочется. Посмотрите - интересная статья:

                          http://www.uni-vologda.ac.ru/cs/syntax/ariphm.htm
                          http://www.uni-vologda.ac.ru/cs/syntax/index.html

                          - что выросло из многодесятилетнего желания (в отличии от авторов, которым пару месяцев назад приспичило...) писать языки и компиляторы.
                            Цитата

                            если можешь отправь мне !!
                            просто срочно очень нужно


                            Компилятор с сорцами и примерами доступен на странице языка
                            К соообщению прикрепил сорцы

                            Описание языка
                            Прикреплённый файлПрикреплённый файлd2x86src.zip (31.41 Кбайт, скачиваний: 207)
                              Решил тоже поделится
                              Для своего проекта сотворил компилятор наподобие С++ только добавил своих типов данных, да и математике немного. В частности окромя booleana b complex по причине сути проекта добавились подтипы stream, common, in, out префекс обозначаюший что переменные могут быть связаны с переменными другого процесса - эт я к вопросу зачем компилятор переписывать(переменные эти по другим правилам живут немного);
                              Плюс добавил матричную арифметику - например int a[.3.] ; complex c [.1.] - a трехмерная матрица ( вектор матриц )целых чисел а с - вектор комплексных. Проект просто под математику затачивалась, но по жизни работать с матрицами удобно и без математики. Можно даже матрицу классов создать - вроде все ок будет . Еще там реализовано динамическое назначение функций т.е. например

                              ExpandedWrap disabled
                                 
                                int sqr(int x)=x*x;
                                //sqr(3)=9
                                sqr((int)a) // впрочем пока надо равно после скобок писать скоро устраню
                                {
                                return a;
                                }
                                //sqr(3)=3
                                sqr(b)+=b;// если определено например sqr(int) и sqr(double) - ошибка будет
                                //sqr(3)=6


                              Кстати про booalen - инт в него то же при особой необходимости конвертается но особая как бы фишка в умножении при умножении на него он сохраняет значение если он TRUE и делает 0 если FALSE так наприме функция
                              int sign(double x)=[1,-1]*[x>0,x<0]; //получить знак или
                              int max(int a,int b)=a+(b-a)*(b>a); //получить наибольшее
                              В целом же см выше изначально приспосабливал для описания кусочно заданных формул.

                              Компиляции как таковой правда нет все транслируется в шитый код который потом шустро крутится. Для промежуточных данных используется 2 стека - арифметический там локальные переменные промежуточные данные и так далее(в edi хранится) и програмный - там управление программой(в esp хранится) . Если интересно попробую оторвать его от проекта и дать в отдельном виде или проект доделать - что б там визуальная среда (написанная кстати на этом же языке как и десктоп и оконная беблиотека) появилась.
                              З.Ы. Кстати шитый код и продеференцировать можно и поиздеваться как-нибудь еще или например передать другой части этой программы по сети которая не на x86 работает( это я так замечтался ;) ). Впрочем он мне необходим еще и потому, что система в реальном режиме запускает сразу несколько потоков шитого кода на исполнения - между ними переключаться легко да и контролировать их.
                              Сообщение отредактировано: Shirenin -
                                вышли исходники плз на qaka@mail.ru
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 2 [3] 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0544 ]   [ 15 queries used ]   [ Generated: 28.03.24, 20:38 GMT ]