ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
21 июля
1153195
Связанные сообщения
Eiffel
В 2019 г. у меня состоялось шапочное знакомство в Eiffel - язык, который искаропки умеет в Си исходники транслировать. Ис...2020-11-03
Dingo (09.12.2021 11:40 - 13:24, просмотров: 1342)
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

(товарищ Генерал, у вас переводы строк съедаются)