Новости
21 января 2012Появилась версия 0.58 компилятора Делавар для операционной системы Ubuntu 11.10. В данной версии доработан редактор TVIEW на основе GtkTextView для версий Windows и Linux: появилась возможность поиска и замены, а также механизм Redo/Undo.
01 января 2012Вышла версия 0.58 компилятора Делавар для Windows. В данной версии появилось ключевое слово synonym, которое позволяет задать другое имя типу или переменной.
25 декабря 2011Появилась версия 0.57 компилятора Делавар для операционной системы Ubuntu 11.10.

Содержание

Новости
Скриншоты примеров
Архив версий
Описание 16-битной версии компилятора Delavar
Параметры командной строки
Нововведения в языке. Типы
Нововведения в языке. Инструкции и операции
Многомодульные проекты
Нововведения в языке. Функции
Создание DLL
Компиляция примеров
Дальнейшее развитие
Загрузить
Обмен баннерами
Контакты

Здравствуйте, уважаемый посетитель!

   Предлагаю вашему вниманию дальнейшее развитие компилятора Делавар. Одним из главных отличий этого компилятора от других компиляторов, является то, что можно писать программы на разных языках. Имеется в виду возможность использования национальных ключевых слов и имен переменных. Программы на данный момент можно писать на русском и английском языках, алфавит которых закодирован в ASCII или совместимых с ней 8-битных кодировках.
    Предыдущая 16-битная версия транслятора создавала на выходе файл на языке ассемблер для плоского 16-битного кода архитектуры i8086. Который в свою очередь подавался на вход ассемблера для генерации бинарного файла с расширением com, исполняемого под операционной средой DOS или Windows.
   Данная версия транслятора позволяет создавать код для ассемблера NASM. Очевидное его преимущество заключается в том, что этот ассемблер позволяет создавать объектные и исполняемые файлы гораздо большего числа форматов. Кроме того, сам транслятор может быть скомпилирован под любой ОС, поддерживающей библиотеку С. Параметры компилятора Делавар позволяют задать возможность выходного формата для 32-битных ОС Windows и Linux.
   Прежде чем познакомиться с 32-битной версией компилятора, посмотрите описание, касающееся синтаксиса языка Делавар для 16-битной версии.

Параметры командной строки

   Для задания выходного формата используется ключ -f. По-прежнему поддерживается формат COM, использующийся по умолчанию. Для него этот ключ можно не указывать. Данный ключ со значением 'pe' задает выходной PE-формат для платформы Win32, значения 'elf' и 'aout' позволяют задать соответственно 32-битный формат ELF и A.OUT для платформы Linux. Командная строка для компилятора описывается следующим образом:
   dc32 [-f fmt] filename.d [-o outfilename.asm], где fmt - значения выходных форматов (pe, elf, aout), filename.d - файл исходного кода на языке Delavar, outfilename.asm - необязательное имя выходного файла. Если outfilename.asm не задан, используется filename.asm
   Для создания объектного или исполняемого кода используется ассемблер NASM с аналогичными ключами:
   nasm [-f fmt] filename.asm [-o outfilename], где fmt - значения выходных форматов (win32, elf, aout), filename.asm - файл исходного кода на языке ассемблер, outfilename - имя выходного файла.
   Если выходной формат не COM, то для сборки исполняемого файла можно использовать любой подходящий компоновщик. В дистрибутиве используется компоновщик ld из пакета MINGW for Windows.
Наверх

Нововведения в языке. Типы

   Встроенные (базовые) типы данных остались прежними: bool, int, char, byte, word и string, также появились новые.
   У типа string появился конструктор, который принимает целое число (константу) в байтах в качестве параметра для выделения буфера памяти под строку. Пример: string str = string(128). Кроме того, стало возможным обращаться к символу в строке посредством индекса, например: char ch = str[0]. В строковых литералах возможен ввод символов с использованием знака косой черты. Например: "abc\n", где \n - означает перевод строки. Возможен ввод следующих символов: \t - горизонтальная табуляция, \r - возврат каретки, \a - звонок, \" - двойная кавычка, \\ - косая черта. Также можно вставить символ в шестнадцатиричном формате. Пример:
   string s = "insert tab\x9line\x0A;feed".
Добавлен пустой тип void. Появились вещественные типы float и double. Однако, есть некоторые ограничения. Например, вещественную константу можно присвоить переменной (или передать в качестве параметра функции) только типа float.
    Теперь, приравнять тип с большей размерностью к типу с меньшей размерностью просто так нельзя. Необходимо использовать явное приведение. Например: int a = 5 byte b = (byte) a. Неявное приведение вещественных типов к целым типам также запрещено. Типы bool, char и byte по-прежнему имеют размерность 8 бит, int, word и float - 32 бита, double - 64 бита. Длина идентификаторов в языке увеличена до 128 символов.
   Нововведения в языке также связаны с желанием отказаться от использования в языке явных указателей. В связи с этим введено понятие значимых и ссылочных типов. К значимым типам относятся все базовые типы, а также типы, объявленные с помощью ключевого слова type. Память под объекты значимых типов выделяется сразу после объявления. При объявлении ссылочных типов, создается ссылка на объект. Объект ссылочного типа создается при вызове конструктора объекта.
   Если встроенные типы являются значимыми, то массивы базовых типов можно объявить и как значимые, и как ссылочные. Введение значимых массивов связано с тем, что пока не реализован механизм передачи многомерных ссылочных массивов в качестве параметра функции (метода). Поэтому, при необходимости передачи многомерного массива в функцию, используйте массивы значимого типа.
Объявление ссылочного массива выглядит следующим образом:
   <class_name>[[,]...] varname [ = <class_name>[v1[, v2]...] ].
Так, например, для объявления одномерного массива целых чисел ссылочного типа потребуется следующий код:
   int[] arr - будет создана ссылка на одномерный массив целых чисел;
   int[] arr = int[5] - будет также выделена память для хранения пяти элементов массива.
   int[,] arr = int[5,6] - объявление двумерного массива целых чисел и выделение памяти для ссылки на массив и 30 элементов массива.
Возможно также выделение памяти под массив с одновременной его инициализацией:
   int[] arr = { 0, 1, 2 }
   string[] sarr = { "one", "two", "three" }

Объявление двумерного массива целых чисел 2х3 с инициализацией:    int[,] arr = { {0, 1, 2}, {4, 5, 6} }
Обратиться к элементу массива можно, указав индекс в квадратных скобках:
   int a = arr[0]
Объявление массива значимого типа имеет несколько иной синтаксис:
   <type_name>[v1[, v2]...] varname.
Например:
   int[3] arr - объявление одномерного массива целых чисел значимого типа
   int[2,3] arr = { {0, 1, 2}, {4, 5, 6} } - объявление двумерного массива с инициализацией
   foo[5] fooName - объявление массива значимого типа, состоящего из пяти элементов, где foo некоторый тип, объявленный с помощью ключевого слова type. Вызов конструктора для переменных значимого типа на данный момент невозможен.
Ссылочные типы объявляются с помощью ключевого слова class. Описывается они аналогично значимым типам:
class Name
{
   [Здесь следует перечень полей пользовательских и базовых типов]
   [конструктор(ы)]
   [метод(ы)]
   [деструктор]
}
Пример:
class dot
{
   int x, y

   dot()
   {
      x = 0
      y = 0
   }
   dot(int x, int y)
   {
      this.x = x
      this.y = y
   }
   void SetX(int x)
   {
      this.x = x
   }
}

Деструктор можно объявить, однако, вызов его в нужный момент не гарантирован (т.е. работа с деструктором полностью не реализована). Так как компилятор на текущий момент является однопроходным, методы составного типа должны быть определены до их вызова (это же касается и глобальных функций, для которых возможна предварительная декларация). На данный момент, все поля и методы пользовательских (составных) типов являются открытыми (public). Для обращения к полям внутри класса можно использовать ключевое слово this (но не обязательно), которое является ссылкой на экземпляр класса.
Объявить переменную ссылочного типа можно следующим образом:
   dot d, при этом выделяется память для хранения ссылки.
   dot c = dot() - с помощью вызова конструктора класса осуществляется создание экземпляра класса, на который сылается переменная с. Память под такой объект выделяется в стеке, так как отсутствует механизм динамического выделения памяти (кроме случаев использования библиотечных функций наподобие malloc). Поэтому нужно помнить, что при завершении работы функции или метода, где вызывается конструктор ссылочного типа, уничтожается и сам объект.
Массив ссылок (не сами объекты) на структуры типа dot объявляется аналогично ссылочным массивам базовых типов:
   dot[] darr = dot[5]
Для создания элемента массива класса dot используйте вызов конструктора:
   darr[0] = dot()
Теперь можно обращаться к полям и методам экземпляра класса.
Вместо ключевого слова class можно использовать конструкцию pointer type.
Введен новый базовый тип object. Предполагается, что любой пользовательский тип, определяемый с помощью ключевого слова class, наследуется от данного типа. Это удобно при использовании приведений типов. Т.е., любой ссылочный тип может быть присвоен (или приведен к) типу object:
    object o = c, где с - экземпляр типа dot.
Ссылке на объект или массив, а также типу object можно присвоить фиксированный адрес, используя явные приведения:
   object o = (object)(word) expr, где expr - выражение, приводимое к беззнаковому целому.
Например, ссылку на объект можно инициализировать следующим образом: dot d = (object)(word) 0. Аналогично инициализируется ссылка на массив: int[] iArr = (int[])(word) 0. Следует заметить, что константы целого типа, большие -128 и меньшие 256 имеют размерность байта.
В данной версии компилятора отсутствует инициализация составных типов (наподобие dot d = {1, 0}). Для этого используйте конструкторы.
   Появилась возможность задавать перечень констант с помощью ключевого слова enum. Память для них не выделяется. Для определения перечня используется следующий синтаксис:
   enum Name
   {
      Value1[=Number],
      ...,
      ValueN[=Number]
   }, где Number - любое беззнаковое целое число
Если конкретные значения элементам перечисления не заданы, то значения им присваиваются автоматически, начиная с нуля, с инкрементом 1. Пример:
   enum Color
   {
      Red,
      Green = 5,
      Blue
   }

Использование:
   Color clr = Color.Red
Размерность такой константы составляет машинное слово. Перечисление можно преобразовать к целому типу путем явного приведения:
int b = (int) clr
В языке также появился тип delegate. Фактически - это указатель на функцию. На данный момент имеется ограничение: кандидатом в делегаты может быть только глобальная функция. Объявляется делегат следующим образом:
   delegate <decl_function>, где decl_function - прототип функции.
Пример использования:
   int printf(string, ...)

   delegate int MyProc(int a, int b);

   int Summa(int a, int b)
   {
      return a + b
   }

   void Start()
   {
      MyProc Proc = MyProc(Summa);

      printf("%d\n", Proc(5, 5));
   }

В функции Start создается переменная Proc типа делегат MyProc, далее вызывается конструктор делегата, который принимает в качестве параметра для инициализации переменной Proc подходящую функцию Summa. Естественно, что сигнатура функции должна совпадать с сигнатурой прототипа, объявленного в делегате.
   Из ограничений для типов перечисление и делегат нужно отметить отсутствие реализации массивов данных типов.
В версии компилятора 0.56 появилась предопределенная константа базового типа object по имени NULL. Предназначена для инициализации ссылочных переменных, а также для сравнения таких переменных со специальным нулевым значением.
Наверх

Нововведения в языке. Инструкции и операции

В языке имеются следующие управляющих конструкции:
    if(cond) { statements } [else { statements }],
    for(init_expr; cond_expr; step_expr) { statements },
    while(cond) { statements },
    do { statements } while(cond)
    switch(int_expr) { case n1: statements ... default: statements }

По сравнению с 16-битной версией компилятора добавлена инструкция do..while и switch. Также в теле цикла можно использовать операторы break и continue.
Есть отличие в задании условия cond: результирующим значением выражения условия должно быть обязательно булево выражение. Например:
   int a = 3
   if(a != 0)
       b = 5

В инструкции switch выражение int_expr может быть следующих типов: char, byte, word, int или enum.
Для числовых типов добавлены битовые операции (&, |, ^, ~, &=, |=, ^=), операции сдвига (<<, >>, <<=, >>=). Все операнды логических выражений вычисляются последовательно, вне зависимости от их количества и типов операций (в отличие от языка Си).
Появилась инструкция sizeof(type), которая возвращает размер типа в байтах. В качестве параметра принимает имя типа. Пример: word sizeInt = sizeof(int).
   Начиная с версии 0.52 компилятора, появилось ключевое слово extern, которое позволяет объявить глобальную переменную, определенную во внешнем модуле (библиотеке). Используется следующий синтаксис: extern type_name name, где type_name - имя типа, name - имя переменной. Например, extern int foo.
   В версии 0.58 компилятора Делавар появилось ключевое слово synonym, которое можно использовать в двух случаях:
   - для создания синонима типа (другого имени типа),
   - для создания ссылки на переменную (другого имени переменной).
Для объявления синонима типа используется следующий синтаксис: synonym new_type_name type_name. Например, synonym UINT word. Возможно объявление синонимов как базовых, так и пользовательских типов. Объявления синонимов типа возможны только в глобальной области видимости модуля. После объявления синонима типа, возможно использование нового имени типа для объяления переменных.
   Для объявления ссылки на переменную используется аналогичный синтаксис: synonym new_var_name var_name. Например, synonym b a, где а - имя переменной. После объявления синонима имени переменной возможно обращение к ней по имени b. Объявление ссылки на переменную возможно в области видимости исходной переменной, или во вложенных областях видимости относительно этой переменной.
Наверх

Многомодульные проекты

   В версии компилятора 0.54 появились ключевые слова import и module. Указываются инструкции в начале модуля. Сначала должны следовать инструкции import, затем module.
   Ключевое слово import предназначено для импорта описаний перечислений, глобальных переменных и прототипов функций, определенных в сторонних библиотеках. Для глобальных переменных не забывайте использовать ключевое слово extern. Данные описания должны находиться в файлах с расширением *.i и располагаться с каталоге C:\DC32\IMP. На данный момент в указанном каталоге уже имеются описания для стандартной библиотеки С (файл std.i), GTK (gtk.i), SDL (sdl.i), Open GL (gl.i), математических функций (math.i) и некоторых других, достаточные для компиляции имеющихся примеров. Недостающие описания можно добавить в имеющиеся или создать собственные файлы импорта. Пример использования: import std, gtk, sdl. После ключевого слова import следует список импортируемых файлов описаний, разделенных запятой, без расширения.
   Ключевое слово module используется для подключения информации об описаниях пользовательских типов, глобальных функций или переменных, размещенных в других файлах исходного кода проекта (файлы с расширением *.d). Таким образом, появляется возможность многомодульной разработки программ. Предполагается, что файлы исходного кода будут находиться в каталоге проекта. Также как и для инструкции import, перечень подключаемых файлов указывается через запятую, без расширений. Например: module src1, src2, src3. Если указанный модуль не будет найден в каталоге проекта, его поиск также будет произведен в каталоге C:\DC32\OBJ. Каталог C:\DC32\OBJ предназначен для хранения используемого в разных проектах одного и того же исходного кода (библиотеки), и соответствующих ему откомпилированных объектных файлов. Описание библиотеки подключается с помощью инструкции module, а соответствующий объектный файл указывается компоновщику при сборке проекта. Пример такой собственной объектной библиотеки имеется в каталоге C:\DC32\OBJ и называется egtk.
   В версии компилятора 0.57 появилась возможность инициализации в месте объявления глобальных переменных, определенных в модулях проекта, отличных от главного (в котором определена функция Start). Простые примеры многомодульных проектов хранятся в папке C:\DC32\EX\MODULES. Более сложный пример находится в папке C:\DC32\EX\GTK\IDE.
Наверх

Нововведения в языке. Функции

   Ключевое слово function больше не используется для объявления функции. Исчезло также ключевое слово declaraton. Для декларации функции используется следующий синтаксис:
ret_type [modif] function_name([param_list])
Например:
   string __stdcall GetName(int id)
По умолчанию используется конвенция вызова функции, принятая для языка Си: __cdecl. Возможно использование модификатора __stdcall, принятого для вызова функций Win32 API. Параметры функции разделяются запятыми.
   Возвращаемые значения и параметры функции на данный момент не могут быть многомерными массивами ссылочного типа (не реализовано); возвращаемые значения функции не могут быть также значимыми составныи типами или массивами. Параметры базовых типов передаются по значению, пользовательские типы и массивы - по ссылке. Возможна передача параметров базового типа по ссылке при использовании ключевого слова ref. Передать параметр с использованием этого ключевого слова возможно также и для ссылочных типов.
   Если задан прототип функции, и отсутствует тело функции в файле исходного кода, то такая функция считается определенной во внешней библиотеке (модуле). Например:
// Функция printf определена во внешней библиотеке
int printf(string, ...)

int Sum(int a, int b)
{
   return a + b
}

void Start()
{
   printf("%d", Sum(1, 2))
}


Троеточие в параметрах прототипа функции printf, как и положено означает, наличие переменного числа параметров, первый из которых, в данном случае, обязателен. Однако, в языке возможность определения функций с переменным числом параметров не реализована.
Также стало возможным использование полиморфных функций и методов:
   void foo(string text, bool f)
   {
   }
   void foo(string text)
   {
      foo(text, true)
   }

У функции Start (точка входа в программу) появилась возможность получать параметры командной строки (пока за исключением формата BIN). Синтаксис стандартен:
   void Start(int argc, string[] argv)
   {    
   }

Наверх

Создание DLL

В версии компилятора 0.54 появилась возможность создания динамически загружаемых библиотек (DLL). Для ОС Windows в качестве точки входа используйте функцию WinAPI DllMain. В опциях компоновщика ld для этого также пользуйтесь ключом -e. На данный момент имеется ограничение: начальная инициализация глобальных переменных, определенных в модулях исходного кода, составляющих DLL, не реализована. Поэтому для инициализации таких переменных используйте какую-нибудь функцию.
С помощью файла экспорта (с расширением *.def) определите экспортируемые функции. Формат этого файла довольно прост: LIBRARY "имя_библиотеки_с_расширением" EXPORT список_имен_экспортируемых_функций. Имя каждой функции должно начинаться с новой строки. Также можно указать адрес размещения библиотеки BASE=0xDDDDDDDD, где 0xDDDDDDDD - шестнадцатиричный адрес. В опциях компилятора используйте ключ -m для отмены декорирования имен функций при компиляции библиотеки. Пример создания DLL имеется в папке C:\DC32\EX\MODULES\OOPDLL и C:\DC32\EX\GTK\TVIEWDLL\DLL, а также в C:\DC32\EX\WIN32\DLLTEST. Там же хранятся примеры динамической компоновки библиотеки.
Наверх

Компиляция примеров

   Для компиляции и запуска программ, написанных на языке Делавар, используются несложные пакетные файлы.
Компиляция в среде Windows. Сам компилятор и исходные тесты примеров на языке Делавар находятся в файле dc32.zip. Скачайте архив и распакуйте его содержимое. Все пути в пакетных файлах начинаются с C:\DC32. Именно поэтому желательно распаковать все на диск С:. Иначе вам придется менять пути во всех файлах, где они используются.
   Для сборки примеров с поддержкой библиотеки GTK используется вариант этой библиотеки для Win32, расположенной в папке DC32\GTK. Для подключения библиотеки добавьте путь C:\DC32\GTK\BIN к переменной окружения PATH или скопируйте содержимое этой папки в системную папку \WINDOWS\SYSTEM32. Тоже самое сделайте для библиотек PDCURSES, SDL, SQLITE и GLUT. Соответствующие файлы библиотек находятся в папках C:\DC32\PDCURSES\BIN, C:\DC32\SDL\BIN, C:\DC32\SQLITE\BIN и C:\DC32\FREEGLUT\BIN. Библиотеки Open GL имеются в составе ОС Windows, но на всякий случай в папке C:\DC32\FREEGLUT\BIN имеются их копии.
   Для включения локализации GTK-приложений используйте первый вариант ( добавьте пути к переменной PATH ).
   Пользователям Windows XP SP2 и ниже необходимо установить пакет Microsoft Visual C++ 2008 Redistributable Package (x86) для нормальной работы компилятора.
   Для удобного просмотра файлов с исходным кодом используйте
Far manager, Notepad++ или IDE, находящуюся в примерах в папке \DC32\EX\GTK\IDE.
Компиляция в среде Ubuntu. Компилятор с примерами поставляется в виде deb-пакета и архива Tar. На данный момент компилятор собран в 32-разрядной версии Ubuntu 11.10. Если для установки выбран deb-пакет, то автоматическая установка/удаление осуществляется средствами операционной системы.
   Если для установки выбран архив Tar, то необходимо распаковать архив с компилятором в любую папку. Далее необходимо запустить install.sh для копирования файлов программы. Данный скрипт требует административных прав, поэтому в процессе копирования файлов необходимо будет ввести соответствующий пароль. Перед использованием компилятора убедитесь, что установлены следующие пакеты: nasm, binutils, libc6, libgtk-2.0-dev, libgtksourceview2.0-dev, libxml2-dev, libsdl1.2-dev, libgl1-mesa-dev, libglu1-mesa-dev, freeglut3-dev, libsqlite3-dev, libncurses5-dev, libpanel-applet-4-dev. Для запуска и компиляция примеров перейдите в каталог /usr/local/DC32. Для удаления установленных файлов программы используйте скрипт uninstall.sh.
Общая информация. В каталоге DC32 расположен исполняемый файл компилятора dc32, файлы ресурсов dc32.res, dc32.en.res, dc32.cp866.res, dc32.cp1251.res. Заменяя содержимое файла dc32.res содержимым файлов dc32.*.res с соответствующей кодировкой, можно компилировать программы, написанные с использованием выбранной кодировки.
   В папке DC32\EX находятся примеры программ на языке Делавар. В папке EX\COM - примеры, написанные для компиляции в 16-битный COM-формат DOS\Windows-консоли. В папке EX\WIN32 - для 32-разрядной ОС Windows c использованием Win32 API. В папке EX\GTK - для 32-разрядных ОС Windows и Linux c использованием библиотеки GTK. В папке EX\GL имеются примеры с использованием библиотеки Open GL и FreeGlut, а в папке EX\SDL - графической библиотеки SDL. В папке EX\CURSES имеются примеры с использованием библиотеки NCURSES. В Windows-версии используется библиотека PDCURSES. В папке EX\CONS - программы, написанные для Linux\Windows-консоли. В папке EX\RU - программы, написанные с использованием русского синтаксиса.
   Для компиляции, сборки и запуска каждого примера перейдите в соответствующий подкаталог папки EX, запустите файл run. Для запуска примера из папки EX\CONS необходимо запустить файл run с параметром. В качестве параметра используйте имя файла исходного кода компилятора Делавар (файл с расширением *.d). Если Вы работаете с FAR, то создайте ассоциацию на файл run для удобного запуска примеров на компиляцию.
   Для пакетного запуска примеров программ на языке Делавар используйте файлы run_cons и run_ex, находящиеся в каталоге \DC32.
   В папке EX\GTK\IDE содержится пример простой IDE, которая имеет редактор с подсветкой синтаксиса для языка Делавар (англоязычной версии) и позволяет создать проект и произвести сборку и запуск примера. Файлы проекта имеют расширение dlv. В некоторых папках примеров они уже созданы. Вам остается их просто открыть, используя меню Project-Open. Для сборки и запуска примера используйте меню Build-Execute или кнопку Execute. В папке EX\GTK\TVIEW расположен редактор с возможностью синтаксической подсветки исходного кода языка Делавар для русскоязычной версии компилятора.
   Для компоновки объектных файлов, полученных с помощью ассемблера NASM, используется компоновщик ld. Для ОС Windows данный компоновшик расположен в папке \DC32\MINGW\BIN, его можно найти также в пакете MinGW. Скриншоты некоторых примеров программ, написанных на языке Делавар, можно посмотреть здесь .
Наверх

Дальнейшее развитие

   Естественно, еще многое хотелось бы сделать. В первую очередь, доделать то, что выше объявлено как нереализованное. Из интересных задач - это реализция наследования, сборщик мусора, поддержка юникода, использование пространств имен, перегрузка операторов и т.д. и т.п.
   Хотелось бы также переписать генератор кода для создания объектного файла с секцией отладочной информации DWARF для отладчика GDB. Интерес также представляет создание генератора кода для выходного формата MS CIL.

Наверх

Контакты

Ваши предложения или пожелания, а также в случае обнаружения ошибок в работе компилятора, пишите на почту или оставляйте сообщения в гостевой книге.

Наверх

Загрузить

Для Windows
С сервера hut.ru (12,2 Мб)
С сервера freesoft.ru (12,2 Мб)
С сервера narod.ru (12,2 Мб)
Для Ubuntu 11.10
Deb-пакет с сервера hut.ru (312,7 kб)
Архив tar с сервера hut.ru (312,4 kб)
Наверх

Обмен баннерами

Присылайте на адрес электронной почты предложения об обмене баннерами. Исходный код баннера компилятора Делавар расположен ниже:

Компилятор Делавар
Наверх


Каталог@Mail.ru - каталог ресурсов интернет

SoftNew.Ru

Курс борьбы с программированием, windows и web

Компьютеры каталог сайтов компаний и фирм России
бесплатный каталог фирм, предприятий и интернет ресурсов России. Добавить сайт в каталог Программирование, Компьютеры.

Каталог весь интернет

Поисковое продвижение

Каталог лучших ресурсов интернета. BestResurs.ru

Скачать софт

Каталог сайтов OpenLinks.RU



Каталог ресурсов ВСЕГО РУ

Каталог HITOFF. Каталог ресурсов рунета. Каталог для людей

Referal.ru