This is a translator of C/C++ to EOLANG. The 1st step is C to EOLANG S2S compiler.
Semantic-preserving translation of C programs to EOLANG programs.
$ 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
$ 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
$ cd ../..
$ git clone https://github.com/kreofil/C2EO-draft.git 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
Use
--
at the end of command below to skip all errors:
$ ./c2eo file-name.c
.
├── 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
содержит исходные тексты программ на языках программирования C и EO, которые предполагается использовать как для интеграционного тестирования транспилятора, так и для проверки возможных вариантов трансформации в EO. Программы на C размещаются в подкаталогеc-sources
. Они формируют наборы данных, позволяющие оценить работоспособность разрабатываемого транспилятора. В подкаталогеeo-sources
размещаются программы на EO, которые используются для анализа различных вариантов кодогенерации, а также для анализа возможности трансформации программ с C в EO. -
Каталог
doc
содержит документацию, формируемую в ходе работы над проектом. -
Каталог
llvm-clang
предназначен для хранения сборки проекта llvm. Предполагается, что данная сборка будет формироваться на уровне бинарных кодов под конкретную автономную реализацию (докер, ВМ) и впоследствии не будет меняться. Вряд ли в ходе разработки проекта стоит переходить на более свежую версию llvm без особых на то оснований. Нахождение внутри проекта позволит ее распространять вместе с результатом работы. При этом можно посмотреть и выкинуть все лишнее, что не нужно для проекта, тем самым сократив 8 гигабайт до более приемлемого значения. -
Каталог
project
содержит все то, что является результатом разработки. В данный момент в нем просматриваются следующие каталоги:-
Каталог, предназначенный для хранения промежуточных результатов, а также окончательного результата работы транспилятора. Из отдельных промежуточных файлов в нем формируется окончательный файл
global.eo
, который затем копируется (пересылается) в соответствующий подкаталог каталогаresult
. -
Каталог, в котором группируются все исполняемые файлы и скрипты, обеспечивающие работу транспилятора.
-
Каталог предназначенный для сборки проекта. Предполагается сборка проекта с использованием
cmake
.В связи с этим используется иерархическая организация файлов в каждом из подпроектов, обеспечивающих выполнение отдельных функций, при необходимости должен размещаться свой файлCMakeLists.txt
. Также корневой файлCMakeLists.txt
располагается в каталогеproject
. -
Каталог, предназначеный для хранения статических и (или) динамических библиотек, формируемых в процессе создания проекта, если таковые появятся.
-
Каталог
src
является ключевым для разработки. На данном этапе просматриваются два основных проекта, размещенные в соответствующих каталогах. В целом его содержание скорее всего будет меняться.-
Транспилятор, осуществляющий разбор AST одной единицы компиляции и формирующий на выходе объекты EO.Эти объекты размещаются в каталоге assembly и разделяются по двум файлам. В одном собираются все объекты, соответствующие глобальным артефактам, а в другом статическим. Учитывая специфику анализа AST, данный проект реализуется на C++.
-
Каталог, в котором разрабатывается сборщик файла
global.eo
.В общем случае после обработки транспилятором всех единиц компиляции он осуществляет компоновку из множества файлов, содержащих как статические, так и глобальные объекты, единый файл объектов на EO. Разработка данной программы может вестись на языке сценариев. -
Каталог, содержащий программу, котора осуществляет многократный запуск транспилятора по числу единиц компиляции, после чего передает управление сборщику полученных отдельных файлов в монолит. После завершения сборки данная программа осуществляет перенос сформированного файла
global.eo
в каталогresult/eo/c2eo/src
.
-
-
Каталог с различными тестовыми программами и данными, проверяющими работоспособность разрабатываемого кода.
-
-
Каталог для хранения данных, используемых компилятором EO. В нем содержится информация о проекте на EO, обновляемая каждый раз при обновлении проекта этого компилятора
-
Описание компилируемого проекта, которое формируется разработчиками c2eo и практически не меняется (может только корректироваться);
-
Cкрипт, осуществляющий запуск откомпилированного приложения;
-
Каталог, содержащий используемые библиотеки, написанные на EO для поддержки артефактов языка C, а также исходные тексты на EO, порождаемые транспилятором или сформированные вручную. Внутри каталога
eo
структура сформирована подкаталогов. Непосредственно вeo
находится каталогc2eo
, определяющий общее название пакета. В нем располагаются:-
Отвечает за запуск приложения (он пишется вручную и не изменяется);
-
Каталог, который по сути определяет некоторую библиотеку объектов, написанную на EO и предназначенную для моделирования различных артефактов языка C;
-
Каталог, в который записывается файл
global.eo
с объектами, порожденными транспилятором в ходе анализа программы на C (он содержит объектglobal
, в котором собраны все артефакты в виде соответствующих объектов).
-
-
Формирование файла global.eo
по сути является основной задачей транспилятора и обеспечивает путем сборки множества единиц компиляции исходной программы на языке C.
Представленная структура стала возможной из-за использования начальной инициализации объектов, имитирующих переменные языка C.
Транспиляция осуществляется отдельно для каждой единицы компиляции, которая на выходе формирует два файла:
-
файл с описанием всех глобальных объектов, к которым относятся абстрактные объекты, полученные при трансформации абстрактных типов данных, глобальных переменных, глобальных описаний функций;
-
файл с описанием всех статических объектов, которые трансформируются из описаний статических переменных и функций, расположенных в глобальном пространстве, статических переменных, размещенных внутри функций.
Эти два файла являются базовой заготовкой для дальнейшей сборки после транспиляции всех единиц компиляции проекта. Сама сборка на текущий момент заключается в формировании общего файла на языке программирования EO. В нем формируется глобаальный объект global
, который содержит все объекты, полученные в результате компиляции абстрактных типов данных, внешних переменных, внешних функций, а также объектов, которые получены из файлов, описывающих статические объекты.
Количество статических объектов определяется количеством файлов со статическими артефактами. Размещение в едином объекте global
всех данных позволяет без проблем обеспечить доступ как со стороны глобальных объектов к своим статическим данным, так и со стороных статических объектов к глобальным данным. Сборщик этого файла может в принципе быть отдельной программой, реализованной на любом удобном языке программирования.
При наличии в одной из единиц компиляции функции main
, она преобразуется в соответствующий объект глобального пространства. А сразу за его описанием следует описание ее запуска. Функция может располагаться в любом месте глобального объекта.
В целом порядок сборки файла с глобальными объектами и статическими объектами несущественен.
Представленная схема обеспечивает полную автономность формирование программы на EO. Объект, запускающий приложение содержит только датаизацию глобального объекта. Он не меняется, оставаясь постоянным независимо от транспилируемого проекта.