Skip to content

kreofil/c2eo

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

This is a translator of C/C++ to EOLANG. The 1st step is C to EOLANG S2S compiler.

C2EO

Semantic-preserving translation of C programs to EOLANG programs.

1. Install LLVM + CLANG

$ wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-12.0.1.tar.gz
$ mkdir llvm-clang
$ tar -C llvm-clang -xvf llvmorg-12.0.1.tar.gz

 

2. Build LLVM + CLANG

$ cd llvm-clang
$ # rm -rf build
$ mkdir build && cd $_
$ cmake --no-warn-unused-cli -DBUILD_SHARED_LIBS:STRING=ON -DLLVM_TARGETS_TO_BUILD:STRING=X86 \
  -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE "-DLLVM_ENABLE_PROJECTS:STRING=clang;compiler-rt" \
  -DCMAKE_BUILD_TYPE:STRING=Debug -DLLVM_OPTIMIZED_TABLEGEN:STRING=ON \
  -DLLVM_USE_SPLIT_DWARF:STRING=ON -DLLVM_USE_LINKER:STRING=gold ../llvm -G Ninja
$ cmake --build . --config Debug --target all -j 10 -- -j1 -l 2

 

3. Install C2EO

$ cd ../..
$ git clone https://github.com/kreofil/C2EO-draft.git c2eo

 

4. Configuration C2EO

Set PATH_TO_LLVM_SOURCE variable to the LLVM+CLANG directory when invoking CMake;

Set -DCMAKE_BUILD_TYPE variable to the Debug state, if you want to output the values of all global variables (works only for ../kam/src);

$ cd c2eo
$ # rm -rf build
$ mkdir build && cd $_
$ cmake -DCMAKE_BUILD_TYPE=Debug -DPATH_TO_LLVM_SOURCE=~/path/to/llvm-clang/ \
  -DCMAKE_DEPENDS_USE_COMPILER=FALSE -G "CodeBlocks - Unix Makefiles" ../al/src
$ cmake --build . --target c2eo -- -j 6

 

5. Run

Use -- at the end of command below to skip all errors:

$ ./c2eo file-name.c

Project structure

.
├── collection
│   ├── c-sources
│   └── eo-sources
├── doc 
├── llvm-clang 
├── project 
│   ├── assembly
│   ├── bin
│   ├── build
│   ├── lib
│   ├── src
│   │   ├── transpiler
│   │   ├── collector
│   │   └── launcher
│   ├── tests
│   └── CMakeLists.txt
├── result
│   ├── pom.xml
│   ├── README.md
│   ├── run.sh
│   └── eo
│       └── c2eo
│           ├── run.sh
│           └── eo  
└── tmp 
  • collection

    Каталог collection содержит исходные тексты программ на языках программирования C и EO, которые предполагается использовать как для интеграционного тестирования транспилятора, так и для проверки возможных вариантов трансформации в EO. Программы на C размещаются в подкаталоге c-sources. Они формируют наборы данных, позволяющие оценить работоспособность разрабатываемого транспилятора. В подкаталоге eo-sources размещаются программы на EO, которые используются для анализа различных вариантов кодогенерации, а также для анализа возможности трансформации программ с C в EO.

  • doc

    Каталог doc содержит документацию, формируемую в ходе работы над проектом.

  • llvm-clang

    Каталог llvm-clang предназначен для хранения сборки проекта llvm. Предполагается, что данная сборка будет формироваться на уровне бинарных кодов под конкретную автономную реализацию (докер, ВМ) и впоследствии не будет меняться. Вряд ли в ходе разработки проекта стоит переходить на более свежую версию llvm без особых на то оснований. Нахождение внутри проекта позволит ее распространять вместе с результатом работы. При этом можно посмотреть и выкинуть все лишнее, что не нужно для проекта, тем самым сократив 8 гигабайт до более приемлемого значения.

  • project

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

    • assembly

      Каталог, предназначенный для хранения промежуточных результатов, а также окончательного результата работы транспилятора. Из отдельных промежуточных файлов в нем формируется окончательный файл global.eo, который затем копируется (пересылается) в соответствующий подкаталог каталога result.

    • bin

      Каталог, в котором группируются все исполняемые файлы и скрипты, обеспечивающие работу транспилятора.

    • build

      Каталог предназначенный для сборки проекта. Предполагается сборка проекта с использованием cmake.В связи с этим используется иерархическая организация файлов в каждом из подпроектов, обеспечивающих выполнение отдельных функций, при необходимости должен размещаться свой файл CMakeLists.txt. Также корневой файл CMakeLists.txt располагается в каталоге project.

    • lib

      Каталог, предназначеный для хранения статических и (или) динамических библиотек, формируемых в процессе создания проекта, если таковые появятся.

    • src

      Каталог src является ключевым для разработки. На данном этапе просматриваются два основных проекта, размещенные в соответствующих каталогах. В целом его содержание скорее всего будет меняться.

      • transpiler

        Транспилятор, осуществляющий разбор AST одной единицы компиляции и формирующий на выходе объекты EO.Эти объекты размещаются в каталоге assembly и разделяются по двум файлам. В одном собираются все объекты, соответствующие глобальным артефактам, а в другом статическим. Учитывая специфику анализа AST, данный проект реализуется на C++.

      • collector

        Каталог, в котором разрабатывается сборщик файла global.eo.В общем случае после обработки транспилятором всех единиц компиляции он осуществляет компоновку из множества файлов, содержащих как статические, так и глобальные объекты, единый файл объектов на EO. Разработка данной программы может вестись на языке сценариев.

      • launcher

        Каталог, содержащий программу, котора осуществляет многократный запуск транспилятора по числу единиц компиляции, после чего передает управление сборщику полученных отдельных файлов в монолит. После завершения сборки данная программа осуществляет перенос сформированного файла global.eo в каталог result/eo/c2eo/src.

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

  • result

    Каталог для хранения данных, используемых компилятором EO. В нем содержится информация о проекте на EO, обновляемая каждый раз при обновлении проекта этого компилятора

    • README.md

      Описание компилируемого проекта, которое формируется разработчиками c2eo и практически не меняется (может только корректироваться);

    • run.sh

      Cкрипт, осуществляющий запуск откомпилированного приложения;

    • eo

      Каталог, содержащий используемые библиотеки, написанные на EO для поддержки артефактов языка C, а также исходные тексты на EO, порождаемые транспилятором или сформированные вручную. Внутри каталога eo структура сформирована подкаталогов. Непосредственно в eo находится каталог c2eo, определяющий общее название пакета. В нем располагаются:

      • app.eo

        Отвечает за запуск приложения (он пишется вручную и не изменяется);

      • ctypes

        Каталог, который по сути определяет некоторую библиотеку объектов, написанную на EO и предназначенную для моделирования различных артефактов языка C;

      • src

        Каталог, в который записывается файл global.eo с объектами, порожденными транспилятором в ходе анализа программы на C (он содержит объект global, в котором собраны все артефакты в виде соответствующих объектов).

Формирование файла global.eo по сути является основной задачей транспилятора и обеспечивает путем сборки множества единиц компиляции исходной программы на языке C.

 

Размещение программы на EO, полученной в ходе транспиляции

Представленная структура стала возможной из-за использования начальной инициализации объектов, имитирующих переменные языка C.

Транспиляция осуществляется отдельно для каждой единицы компиляции, которая на выходе формирует два файла:

  • файл с описанием всех глобальных объектов, к которым относятся абстрактные объекты, полученные при трансформации абстрактных типов данных, глобальных переменных, глобальных описаний функций;

  • файл с описанием всех статических объектов, которые трансформируются из описаний статических переменных и функций, расположенных в глобальном пространстве, статических переменных, размещенных внутри функций.

Эти два файла являются базовой заготовкой для дальнейшей сборки после транспиляции всех единиц компиляции проекта. Сама сборка на текущий момент заключается в формировании общего файла на языке программирования EO. В нем формируется глобаальный объект global, который содержит все объекты, полученные в результате компиляции абстрактных типов данных, внешних переменных, внешних функций, а также объектов, которые получены из файлов, описывающих статические объекты.

Количество статических объектов определяется количеством файлов со статическими артефактами. Размещение в едином объекте global всех данных позволяет без проблем обеспечить доступ как со стороны глобальных объектов к своим статическим данным, так и со стороных статических объектов к глобальным данным. Сборщик этого файла может в принципе быть отдельной программой, реализованной на любом удобном языке программирования.

При наличии в одной из единиц компиляции функции main, она преобразуется в соответствующий объект глобального пространства. А сразу за его описанием следует описание ее запуска. Функция может располагаться в любом месте глобального объекта.

В целом порядок сборки файла с глобальными объектами и статическими объектами несущественен.

Представленная схема обеспечивает полную автономность формирование программы на EO. Объект, запускающий приложение содержит только датаизацию глобального объекта. Он не меняется, оставаясь постоянным независимо от транспилируемого проекта.

About

C/C++ to EO translator

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 56.1%
  • C++ 31.3%
  • Python 9.3%
  • CMake 1.4%
  • CWeb 0.9%
  • Shell 0.8%
  • Other 0.2%