Разрабатываю язык Динрус на основе D. (Ди по-русски). Как лучше разместить проект в сеть?
Несколько лет назад меня заинтересовал язык программирования Ди. И я провёл сравнение первой и второй его версий и решил, что первая намного проще, а большинство усложнений во второй версии излишне. Кроме того, для первой версии уже имелись в наличии набор библиотек и кодов, которые для второй нуждались в переработке и адаптации.
Первым продуктом моей работы стала общая библиотека Рулада, в которой я интегрировал два рантайма языка Ди - библиотеку Фобос и библиотеку Танго + наиболее важные из дополнительных библиотек первой версии Ди. Эту вещь можно скачать здесь . Скачав её, достаточно запустить файл .bat и подождать завершения компиляции. Появится папка build, в которой будут примеры с графическим интерфейсом, созданные с помощью этой библиотеки.
Рулада 1 - это был первый шаг. На нём я осознал, что Ди удобен в своей совместимости с языком Си тем, что можно создавать коды на русском языке, а при необходимости оборачивать их в английские функции, если эти коды требуют "интернационализации"...
Так началась работа над Динрус.
Сейчас этот проект дошёл до стадии, когда рантайм практически в рабочем состоянии, а библиотека std Ди и многие из функций языка Си и API Windows имеют своих русских "двойников".
Но чтобы Динрус стал полноценным языком программирования, его нужно дополнить всеми прочими средствами (работа с БД, Интернет, формы, графика и проч). Эти средства уже есть в Руладе. Их можно просто руссифицировать и скомпилировать как в статические, так и динамические формы...
В дальнейшем предполагается даже интеграция с ДотНет через COM, создание компилятора на самом Динрусе и т.д.
Как быть мне далее с этим проектом?
для начала ответьте на вопросы:
зачем? для чего? и кому (кроме вас) это может понадобиться?
Вот если бы Вы разработали оболочку над javascript для работы с файловой системой и интерпретатор на движке SpiderMonkey, так чтобы язык перестал быть привязан к браузеру. Возможно, даже это было бы более востребовано для каких либо нужд.
Или сделали плагин для поисковых систем поиска музыки по голосу (ну намычал мотив в микрофон, а поисковик выдал ссылки на наиболее подходящие композиции). Это тоже полезно.
Более того, в рантайм этого языка можно ввести все необходимые средства для обеспечения безопасности кодов, для контроля над общей языковой средой (как следует выразиться в подражание CLR), то бишь создать средства, которые без всяких антивирусных программ будут обеспечивать функции безопасности написанных на этом языке программ.
Подвязка к любым англоязычным DLL выполняется без особой трудности, если в них есть функции, экспортируемые по правилам языка Си. Ну, и проч...
Вы уверены, что русские программисты - это те, кто программирует на русском языке?
Простой пример подвязки к WSO через VBS:
module vbs.test;
import vbs.wso.all;
проц ф1()
{
ЦветоДиалог цд = объЦветоДиалог;
цд.выполнить();
Форма ф1 = объФорма("TestForm");
ф1.ширинаКлиента(900);
ф1.высотаКлиента(700);
ф1.поЦентру();
ф1.текст("Проверка работы кода 2");
ф1.пиктограмма();
ф1.покажись();
}
void main()
{
инитВСО();
ф1();
закройВСО();
}
Картинку с открывшимся окошком при запуске экзешника могу выслать отдельно...
Фик с ними, китайцами. Пусть сами позаботятся о своих удобствах.
Для интерфейса - объясняю подробнее - можно использовать английский. Если Вам нужно, чтобы вашей DLL воспользовались иностранцы. Основной же код можно писать по- руски.
export extern(C) проц showColorDialog()
{
ЦветоДиалог цд = объЦветоДиалог;
цд.выполнить();
}
В интерфейс выводим extern(C) void showColorDialog(); Всё.
Сделайте страницу на википедии, выложите наработки на sourceforge, сделайте сайт разработки и статистика использования сама покажет скольким людям это надо и зачем.
Какова скорость выполнения тестовых общепринятых алгоритмов? Как решается проблема кроссплатформенности? На сколько эффективна работа со сложными структурами данных? Сколько длится компиляция? Каков размер исполняемых файлов? Доступность и наличие ИСР с подсказками, подсветками, завершениями кода, графическими конструкторами форм? Это важно, а не идентификаторы на кириллице или прочем региональном шрифте.
Сделайте страницу на википедии, выложите наработки на sourceforge, сделайте сайт разработки и статистика использования сама покажет скольким людям это надо и зачем.
Какова скорость выполнения тестовых общепринятых алгоритмов? Как решается проблема кроссплатформенности? На сколько эффективна работа со сложными структурами данных? Сколько длится компиляция? Каков размер исполняемых файлов? Доступность и наличие ИСР с подсказками, подсветками, завершениями кода, графическими конструкторами форм? Это важно, а не идентификаторы на кириллице или прочем региональном шрифте.
На СорсФордже пока есть Рулада - гибрид Tango-Phobos'а. Вы подняли, наконец-то, те самые вопросы. Азис Кёксаль практически написал код компилятора на самом Ди, его аналог есть уже на русском, Чего там не хватает? Во первых, нужно не только ввести русские ключевые слова, но самое важное - перевести промежуточные файлы объектов в COFF для обеспечения совместимости с Visual C++. Задач много. Поэтому для дальнейшей разработки нужна целая совокупность проектов, решающих самые важные задачи, начиная с компилятора...
Соответственно, такая задача под силу лишь команде...
Я присматриваюсь ко многим открытым кодам, UPP, QT и т.д., поскольку самое важное - создать совершенный рантайм языка. В ближайшее время выложу проект рядом с Руладой, представление о которой можно получить нажав ссылку "здесь" в тексте поста. В ней всего десяток библиотек, в том числе и интерфейс Винды в одном флаконе. По сути, программа скомпилируется, если просто открыть исходник компилятором... Хотя есть некоторые нюансы пользования им. В Руладе присутствует масса недостатков... Это поскольку после интеграции двух библиотек я начал работать над рантаймом Динрус, так и не доделав вторую версию Рулады. Я решил оставить её как вспомогательное средство. Все пакеты из Рулады можно преобразовать в DLL. и они будут работоспособны в Динрусе. Так, Dinrus.Arc.dll уже функциональна вполне. Рантайм помещён в Dinrus.Base.dll. Вообще-то, вместо OpenGL32 и др. будет Dinrus.OpenGl.dll, Dinrus.Glut.dll и Dinrus.Glu.dll, скомпилированные из исходников Mesa. Управление над ними будет через Dinrus.Mesa.dll
Есть и другие замыслы, воплощение которых было бы желательно...
Не берусь сравнивать.
Не берусь сравнивать.
Хорошо. Чем D лучше Python?
Проблема с переводом справки языка Ди была. Теперь появился перевод книги Андрея Александреску "Язык программирования D", т.е. мне не придётся уделять много времени для полного перевода всей справки, что радует. Достаточно подставить вместо ангоязычных кодов и типов русские аналоги. В целом грамматика полностью совпадает. Ключевые слова остаются на английском, теми же что и в Ди. Ссылку на Александреску можно прогуглить.
Не берусь сравнивать.
Хорошо. Чем D лучше Python?
Динрус компилируемый, а не скриптовый язык. Он подходит для того, чтобы создавать для первого библиотеки с расширением pyd, то есть фактически то, на чём тот самый Питон функционирует вообще...
Проанализировав массу исходников на английском, в том числе для Python'а, я понял следующее: если у меня есть средства для подвязке к системным библиотекам и есть возможность писать на родном языке, то любые решения я смогу создать, не пудря себе голову двумя ячейками памяти - английской (первичный ключ) и русскоязычной(перевод английской в уме)... Голова ТРЕСНЕТ...
Конечно, это сложновато, но любой код можно переписать под Динрус и результат его работы будет таким же, как и в варианте для Си (++)... Минус забивание ячеек памяти МОЗГА англоязыкой чепухой.
Простой пример подвязки к WSO через VBS:
module vbs.test;
import vbs.wso.all;
проц ф1()
{
ЦветоДиалог цд = объЦветоДиалог;
цд.выполнить();
Форма ф1 = объФорма("TestForm");
ф1.ширинаКлиента(900);
ф1.высотаКлиента(700);
ф1.поЦентру();
ф1.текст("Проверка работы кода 2");
ф1.пиктограмма();
ф1.покажись();
}
void main()
{
инитВСО();
ф1();
закройВСО();
}
Картинку с открывшимся окошком при запуске экзешника могу выслать отдельно...
Вот поднаготная этой программы:
module vbs.wso.form;
import vbs.wso.common, vbs.wso.wso, stdrus;
class Форма
{
private:
ткст имя = "f";
бул икоДинрус = нет;
public:
this(ткст перск= "f")
{
Перск форма;
форма.уст(перск, "wso.CreateForm(0,0,0,0)");
this.имя = перск;
}
this(цел а, цел б, цел в ,цел г){
Перск форма;
форма.уст(имя, фм("wso.CreateForm(%s,%s,$s,$s)", а, б, в, г));
}
~this(){if(икоДинрус) удалиФайл("dinrus.ico");}
проц заголовок(сбул зн){скрипт(имя~`.Caption = `~зн);}
//Надпись
проц текст(ткст зн){скрипт(имя~`.Text = "`~зн~`"`);}
//Наличие разворачивающей кнопки
проц боксРазвернуть(сбул зн){скрипт(имя~`.MaximizeBox = `~зн);}
//Пиктограмка
проц пиктограмма(ткст ик){скрипт(имя~`.Icon = "`~ик~`"`);}
проц пиктограмма()
{
пиктограммаДинрус();
икоДинрус = да;
скрипт(имя~`.Icon = "`~"dinrus.ico"~`"`);
}
//Размер
проц ширинаКлиента(цел зн){скрипт(фм(имя~`.ClientWidth =`~stdrus.вТкст(зн)));}
проц высотаКлиента(цел зн){скрипт(фм(имя~`.ClientHeight =`~stdrus.вТкст(зн)));}
проц размерИзменяем(сбул зн){скрипт(имя~`.SizeGrip = `~зн);}
//Положение на экране
проц поЦентру(){скрипт(имя~`.CenterControl()`);}
//Действия
проц покажись(){скрипт(имя~`.Show()`);}
проц модально(){скрипт(имя~`.ShowModal()`);}
// Метод показывает форму на экране, запрещая доступ к остальным окнам программы пока эта форма не будет закрыта.
проц свернись(){скрипт(имя~`.Minimize()`);}
// Метод минимизирует форму.
проц развернись(){скрипт(имя~`.Maximize()`);}
// Метод разворачивает форму во весь экран.
проц восстановись(){скрипт(имя~`.Restore()`);}
// Метод развертывает форму обратно из минимизированного состояния.
проц закройся(){скрипт(имя~`.Close()`);}
// Метод закрывает форму.
}
Простой пример подвязки к WSO через VBS:
module vbs.test;
import vbs.wso.all;
проц ф1()
{
ЦветоДиалог цд = объЦветоДиалог;
цд.выполнить();
Форма ф1 = объФорма("TestForm");
ф1.ширинаКлиента(900);
ф1.высотаКлиента(700);
ф1.поЦентру();
ф1.текст("Проверка работы кода 2");
ф1.пиктограмма();
ф1.покажись();
}
void main()
{
инитВСО();
ф1();
закройВСО();
}
Картинку с открывшимся окошком при запуске экзешника могу выслать отдельно...
Увы... пробовал называть файлы по-русски, что соответствеенно означало бы и русское название модулей.
Подвёл компилятор, DMD 1.6, который напрочь не желает иметь дело с файлами, проименоваными не по-англицки.
В его сишном коде следует OpenFileA заменить на OpenFileW.
Но вначале надо найти правильный код компилятора, так как не все они пригодны для Динрус. А кода для той версии, с которой он работает у меня нет (или в сети нет). Проблема обозначена так: НУЖНО ДО - ПИСАТЬ КОМПИЛЯТОР... Исходники есть, но не полные, не готовые...
Напишите проц main !)))) Вот текст с кодом, который отвечает за запуск главной функции.
module dmain2;
import gc, dinrus, win, runtime;
//debug=НА_КОНСОЛЬ;
extern (C)
{
бул смДобавьКорень( ук p );
бул смДобавьПространство( ук p, т_мера разм );
проц максПриоритетПроцессу();
ткст[] ртПолучиАрги(цел аргчло, сим **аргткст);
бул рт_вЗадержке();
бул ртПущен();
бул ртОстановлен();
бул ртСтарт(ПередВходом передвхо = пусто, ОбработчикИсключения дг = пусто);
бул ртСтоп(ПередВыходом передвых = пусто, ОбработчикИсключения дг = пусто );
проц ртСоздайОбработчикСледа( Следопыт h );
Исключение.ИнфОСледе ртСоздайКонтекстСледа( ук ptr );
проц ртУстановиОбработчикСборки(ОбработчикСборки h);
}
static т_см _гсм;
static Рантайм рт;
extern (C) ИнфОМодуле[] _moduleinfo_array;
static экз g_hInst;
extern(C) ук указательНаИспМодуль(){return cast(ук) g_hInst;}
/////////////////////////////////////////////
void ассертОбр( ткст файл = __FILE__, т_мера строка =__LINE__, ткст сооб = null )
{
throw new ПроверОшиб(сооб, файл, строка );
}
проц ошиб()
{
бцел кодош = ДайПоследнююОшибку();
throw new Исключение (_текстСисОшибки(кодош));
}
/***********************************
* Функция main() языка Динрус, предоставляемая программой пользователя
*/
цел main(ткст[] арги);
/***********************************
* Замещает функцию main() языка Си.
* Its purpose is to wrap the call to the D main()
* function и catch any unhandled exceptions.
*/
extern (C) int main(int аргчло, сим **аргткст)
{
цел результат;
бцел ин;
проц пробуйВыполнить(проц delegate() дг)
{
try
{
дг();
}
catch (Исключение e)
{
результат = НЕУДАЧНЫЙ_ВЫХОД ;
e.выведи; смСобери(); ртСтоп();
}
}
проц пускГлавной()
{
результат = main(ртПолучиАрги(аргчло, аргткст));
}
проц передВыходом()
{
_гсм.полныйСборБезСтэка();
_гсм.Дтор();
}
проц передВходом()
{
try
{
debug(НА_КОНСОЛЬ) _скажинс("Вход в ртМодКонстр");
_гсм = new СМ();//cast(т_см) дайУкНаСМ();
debug(НА_КОНСОЛЬ) _скажинс("Создан СМ экзешника");
_гсм.сканируйСтатДан(_гсм);
нить_прикрепиЭту();
_minit();
рт.интегрируй(_moduleinfo_array);
foreach( r; _гсм.обходКорня )
{
смДобавьКорень( r );
debug(НА_КОНСОЛЬ) _скажинс("Добавление корня");
}
foreach( r; _гсм.обходПространства )
{
смДобавьПространство( r.Низ, r.Верх - r.Низ );
debug(НА_КОНСОЛЬ) _скажинс("Добавление пространства");
}
/+_гсм = cast(т_см) дайУкНаСМ();+/ //Объединить с основным?
}
catch(Исключение и){delete и; debug(НА_КОНСОЛЬ) _скажинс("Исключение в ртМодКонстр");}
}
проц обрИскл(Исключение и)
{
throw new Исключение("Проблема с пуском\\остановкой\nрантайма в функции (ртСтарт\\ртСтоп):\n"~и.сооб, и.файл, и.строка, и.следщ, и.инфо);
}
проц пускВсех()
{
g_hInst = ДайДескрМодуляА(пусто);
максПриоритетПроцессу();
ртСтарт(&передВходом, &обрИскл );
устПроверОбр(&ассертОбр);
пробуйВыполнить(&пускГлавной);
ртСтоп();//&передВыходом, &обрИскл);
}
пробуйВыполнить(&пускВсех);
return результат;
}
Если у вас получится сделать его лучше, попробуйте.
Особо обратите внимание на строки
* Функция main() языка Динрус, предоставляемая программой пользователя
*/
цел main(ткст[] арги);
Выходит, что компилятор ждёт именно main, а не пуск, старт или поехали!)))
Вкратце можно сказать, что множество функций Уолтер Брайт вложил в сам компилятор, поэтому во всех случаях приходится на Динрусе использовать эти функции только в английском их варианте. Например, длина переменной будет представлена как имя_переменной.length, размер класса или структуры как имя_класса_или_структ.sizeof . Короче, есть такой "магический" списочек...
Вкратце можно сказать, что множество функций Уолтер Брайт вложил в сам компилятор, поэтому во всех случаях приходится на Динрусе использовать эти функции только в английском их варианте. Например, длина переменной будет представлена как имя_переменной.length, размер класса или структуры как имя_класса_или_структ.sizeof . Короче, есть такой "магический" списочек...
Избавиться от "списочка" несложно же.
Для системного программирования, как я понимаю, есть ряд основных языков - это Си, ассемблер, Си++, Дельфи, Фортран (?) и ... Ди(!) Список просто крутой... Или я чего-то не учёл?
Кстати, вместо икс можно писать Ш (ширина), а вместо игрек В (высота). Вернее КООРДИНАТА ширины или высоты...(!)
интерфейса Виндоус примерчик "перевода":
////////////////////////////////////////////////////////
struct SIZE {
LONG cx;
LONG cy;
}
alias SIZE SIZEL;
alias SIZE* PSIZE, LPSIZE, PSIZEL, LPSIZEL;
struct РАЗМЕР //SIZE
{
цел cx;//дш - дельта координат ширины
цел cy;//дв - дельта координат высоты
alias cx дш;
alias cy дв;
}
//////////////////////////////
struct RECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
}
alias RECT* PRECT, NPRECT, LPRECT;
struct ПРЯМ //RECT
{
бцел лево;
бцел верх;
бцел право;
бцел низ;
}
/////////////////////////////////////////////////
Проведите сравнение, с чем вам проще работать...