Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.86.235.207] |
|
Страницы: (4) 1 2 [3] 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Цитата В глобальном пр-ве имен это выглядит очень полезным. А как быть внутри функции? void f() { .... for(n=0; n<0; n++) { } ... // И где нибудь в конце функции: int n; } Выглядит это как-то неочень ну, так у меня ж Паскаль - а там объявления только в начале подпрограммы, в отдельном разделе. А вообще, как я уже говорил - это довольно специфичный язык программирования. Он приспособлен для хранения математических алгоритмов с возможностью автоматического перевода. А всё, что не укладывается в эти две концепции, я просто выкинул из языка Так, нет приведения типов - у меня только три типа - целый, вещественный и булевый. Нечего приводить, по сути дела. Думаю, во второй версии я часть выкинутого верну обратно... но пока у меня другая задача - закачать первую версию на сайт библиотеки алгоритмов, для которого я собственно это и делал. Ну и разобраться с переводом уже имеющихся алгоритмов. Владимир (автор сайта) сейчас как раз сподвигается мной на предмет этого. Надо будет его сегодня утречком повопрошать... Цитата Вобщем-то у меня тоже компилятор пишется помаленьку а на какой стадии у тебя процесс сейчас? я первую версию своего уже закончил (даже не верится). Теперь надо будет перевод ещё на пару языков добавить. С++ и delphi уже есть, думаю, может взять С# и Visual Basic... кстати, всем желающим посмотреть - транслятор лежит на shadeofgray.narod.ru |
Сообщ.
#32
,
|
|
|
Цитата 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; еще нет. Вот вроде рассказал все что у меня реализованно. |
Сообщ.
#33
,
|
|
|
Цитата Вот вроде рассказал все что у меня реализованно. Эта штука у тебя уже есть в виде экзешника, который работает и компилирует модули? Т.е. уже можно что-нить откомпилить и запустить на выполнение? Кстати, вот ты говоришь - "Типы имеют только методы, но не имеют членов ..... Cделано это чтобы реализовать классы стандартных типов". Я правильно понял, что у тебя стандартные типы данных реализованы только средствами самого языка, т.е. есть исходник скажем типа double, который поддерживает всякие операции над ним? Кстати, хочу поделиться интересным техническим решением. У меня один знакомый тоже пишет компилер (урожайная на них будет осень ). Он считает, что в языке не должно быть встроенных типов данных - всё должно быть реализовано средствами языка. Программы у него модульные, в качестве модулей, по-моему, используются DLL-ки. Каждый модуль может экспортировать реализуемые в нем типы данных. Ну и чтобы решить проблему с реализацией стандартных типов, он создает специальный модуль stdtypes - создает его не средствами своего языка, а при помощи другого (кажется, асм). Т.е. этот модуль экспортирует стандартные типы, как и любой модуль его языка, но только он создан не при помощи компиляции исходного текста на этом самом языке (по-моему, его ещё никак не зовут). Да, а как называется твой язык (если у него уже есть название)? |
Сообщ.
#34
,
|
|
|
Названия нет Это всегда для меня сложно было придумывать.
Стандартные типы так и реализованы - средствами самого языка. Т.е. в типе double еще реализованы операторы +, -, * и т.д. как в C++, только тела таких операторов написаны на небольшом встроенном асме. В самом кмопиляторе нет ни одного типа. В нем есть только константы. Да, уже компилирует. Только это у меня не ехе, а дллка, которая экспортирует функцию void compile(char* makefile); и еще несколько структур и классов для работы со скомпилированным модулем. |
Сообщ.
#35
,
|
|
|
Вот кстати, прикольная штука у меня есть: код
<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> при трансляции на С++ становится <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. |
Сообщ.
#36
,
|
|
|
а сколько написание языка(компилятора) занимает по времени?
|
Сообщ.
#37
,
|
|
|
Цитата Misha Muhin, 23.07.03, 21:57:13 а сколько написание языка(компилятора) занимает по времени? у меня заняло несколько месяцев. но вообще то вопрос того, сколько часов в день можно выделить для написания. Также много зависит от того, насколько мощный язык должен быть реализован. |
Сообщ.
#38
,
|
|
|
если можно вопрос, а почему не изобрести компилятор другого типа, например компилит с рисунков, а именно... штот-о на подобие УМЛ, если быть точьнее Ратионал Розе, ведь последнее слово идёт за аналитическими компиляторами а?
|
Сообщ.
#39
,
|
|
|
Цитата zheromo, 11.07.02, 12:25:19 пишу компилятор с собственного языка интересно, занимается ли этим кто-нибудь еще? если интересно - вышлю исходники компилятора и описание языка Компиляторы не пишу, но очень инетресно было бы посмотреть и изучить. Идея у вас очень хорошая, так держать. Надеюсь ваш проект найдёт продолжение и развитие. Всего.... |
Сообщ.
#40
,
|
|
|
Цитата zheromo @ 11.07.02, 11:25 пишу компилятор с собственного языка интересно, занимается ли этим кто-нибудь еще? если интересно - вышлю исходники компилятора и описание языка если можешь отправь мне !! просто срочно очень нужно prostak_p@mail.ru |
Сообщ.
#41
,
|
|
|
Очень полезно было бы написать компилятор формул, типа на вход принимается строка типа х*х+10*у, потом "x", "y" - переменные, 1, 2 - значение переменных, а на выходе - 21 - значение функции. Еще неплохо, что-бы искало все частные производные, типа, говорю - дай производную по х, и получаю строчку 2 *х. Если есть у кого-то, вышлите, пожалуйста на почту burda_r#mail.ru, где №=@/ Спасибо
|
Сообщ.
#42
,
|
|
|
Очень полезно было бы написать компилятор формул, типа на вход принимается строка типа х*х+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 - что выросло из многодесятилетнего желания (в отличии от авторов, которым пару месяцев назад приспичило...) писать языки и компиляторы. |
Сообщ.
#43
,
|
|
|
Цитата если можешь отправь мне !! просто срочно очень нужно Компилятор с сорцами и примерами доступен на странице языка К соообщению прикрепил сорцы Описание языка Прикреплённый файлd2x86src.zip (31.41 Кбайт, скачиваний: 207) |
Сообщ.
#44
,
|
|
|
Решил тоже поделится
Для своего проекта сотворил компилятор наподобие С++ только добавил своих типов данных, да и математике немного. В частности окромя booleana b complex по причине сути проекта добавились подтипы stream, common, in, out префекс обозначаюший что переменные могут быть связаны с переменными другого процесса - эт я к вопросу зачем компилятор переписывать(переменные эти по другим правилам живут немного); Плюс добавил матричную арифметику - например int a[.3.] ; complex c [.1.] - a трехмерная матрица ( вектор матриц )целых чисел а с - вектор комплексных. Проект просто под математику затачивалась, но по жизни работать с матрицами удобно и без математики. Можно даже матрицу классов создать - вроде все ок будет . Еще там реализовано динамическое назначение функций т.е. например 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 работает( это я так замечтался ). Впрочем он мне необходим еще и потому, что система в реальном режиме запускает сразу несколько потоков шитого кода на исполнения - между ними переключаться легко да и контролировать их. |
Сообщ.
#45
,
|
|
|
вышли исходники плз на qaka@mail.ru
|