Eiffel - любопытное явление. И кратко про Oberon на JS Язык - детище Бертрана Мэйера, https://ru.wikipedia.org/wiki/Мейер,_Бертран который озадачился надёжностью программ, доказательным выводом типов, методологией ООП. Умеет в множественное наследование, пред- и постусловия, инвариантность, переименование методов; указание(ограничение) классов, которые могут наследовать данный. Меня столкнуло любопытство со SmartEiffel - разработкой французов. Собирается под Win и Linux зоопарком компиляторов - от bcc и tcc до gcc. Могут вылезти сюрпризы в виде предельного количества скобок, но - работает. Фишка - собирается из и генерирует Си-код.
Полностью сделать проект на нём - это прям сильно озадачится надо; но он легко стыкуется с си в обе стороны через cecil - C-Eiffel Call-In Library. Делается файлик вида
-- The name of the include C file :
eiffel.h
-- The features you want to call from C :
EXAMPLE_new_string EXAMPLE new_string
EIF_STUFF_eif_adopt EIF_STUFF adopt
EIF_STUFF_eif_wean EIF_STUFF wean
Всё что после "--" - коментарии.
Первая строка - заголовочник для включения в проект на си, все последующие - это поля: название вашей функции, класс Eiffel, метод(features). Можно из эйфеля дёргать си, можно из си дёргать эйфель: мануал есть, лежит в tutorial\cecil. Видел картинки с автоматически построенными схемами наследования из BON-диаграм.
Сборка эйфель - как выяснил, классический bootstarp. Интересно, что получается тоже компилятор, но не в коды процессора или виртуальной машины, а в си. Суть не меняется - выражение одного языка средствами другого. Для меня было разрывом шаблона, что результат может быть не двоичный код или ассемблер, а язык более высого уровня. При этом это не "си с другим синтаксисом", а другой язык. (Именно поэтому я вспомнил про него, когда начали обсуждать кодогенерацию; но там в другой контекст.)
Хорошо было бы найти тот минимум, когда "эйфель делает си, который может сделать эйфель" для простоты понимания. На счёт отладки мало что могу сказать - вроде предприняты определённые усилия в этом отношении, но я могу заблуждаться или не допилено до конца.
Проекты, которыре нашёл кроме основного (eiffel.org, eiffel.com):
SmartEiffel - проект умер, но собрался спустя 15 лет, хоть и не без отвертки
Liberty Eiffel - имеет относительно живой список рассылки
Gobo Eiffel - автор очечает, отмечался недавно в рассылке Liberty Eiffel
По кодогенерации ещё интересный проект нашего СФУ - Oberon на JavaScript: https://visual.sfu-kras.ru/model/77
Движок здесь: https://github.com/vladfolts/oberonjs
Есть ещё OFrontPlus Олега Чередниченко - https://github.com/Oleg-N-Cher/OfrontPlus - Оберон в си.
Подсказки по SE от Владислава Ермолаева:
---
Букварь:
http://se.inf.ethz.ch/courses/2013b_fall/eprog/additional_materials/eiffel_the_essentials.pdf
И получше:
http://se.ethz.ch/~meyer/ongoing/etl/LANGUAGE.pdf
---
Еще момент - при использовании boost в с-компиляторе struct align должен быть 1 байт, при разветвленной иерархии наследования это принципиально, так как для быстроты классы представляются как union, а смещение высчитывается исходя из фактического размера поля без учета выравнивания структур.
---
Нет, CECIL - это из C вызвать фичу эйфеля. А там наоборот, из эйфеля вызывается C через external "C".
---
> .e - сами исходные тексты классов, так сказать текст для исполнения.
Так и есть.
> *.se - пути к используемым в этом же модуле(корректная аналогия?) файлам
Файл CECIL. Т.е. какие методы каких классов какими C-функциями оборачивать.
> *.ace - SmartEiffel, как средство упорядочивания
Да. Аналог makefile.
---
https://pastebin.com/nC5wsgbZ
(товарищ Генерал, у вас переводы строк съедаются)