При современных способах программирования есть такая проблема - очень трудно описать компьютеру напрямую то что от него хочется. Каждый раз приходится переводить то описание задачи и ее решения, которое сидит а голове, на какой-нибудь язык программирования. При этом, к сожалению, многое из смысла задачи теряется
(
Read more... )
Comments 49
Reply
Речь идет в первую очередь о том как представлять исходный код программы. И вместо использования текстового линейного представления с жесткой языковой грамматикой предлагается иметь небольшое расширяемое ядро, на основе которого можно удобно вводить любые новые языковые конструкции. Здесь как раз аналогия с Фортом, но в отличие от него факт представления программы в виде графа значительно облегчает описание таких сложных языковых конструкций, как например класс или аспект.
Я говорил об интерпретаторе, потому что его намного легче написать для начала, но поскольку модель ядра проста (это - набор команд, память и стек) то конечно же возможно будет написать и различные компиляторы.
Reply
1) текст программы
2) граф
3) коды абстрактной стековой машины
4) байт-код (тройки или четверки)
5) ассемблерные инструкции
6) машинный код
В интерпретаторе отсутствуют шаги 5-6 (самые сложные). Иногда отсутствует шаг 4, можно исполнять сразу стековую машину, хотя это и неудобно, на мой взгляд.
Вы, фактически, предлагаете убрать шаг 1, т.е лексер и грамматику.
Грамматика, кстати, определяет язык. Так что без нее говорить о каких-либо "языковых конструкциях" не совсем уместно ;-)
Reply
Потому что это делается либо мышкой, что медленно, либо на специальном языке, что возвращает нас к линейной записи и приводит к менее удобному языку. Такой язык будет плохо читаем или похож на ассемблер и плохочитаем.
Фактически такое представление программы нас сводит к ручному выполнению того, что делает компилдятор - построение DAG и CFG (Control Flow Graph - граф потока управления, в котором ребра - инструкции перехода - видимо тот самый граф, что Вы имели в виду)
Добавление новых ребер - это команды goto, которые осложняют работу оптимизаторов. И от которых стремятся отказываться (эту команду уже начинают убирать из языков программирования)
Рекомендую:
А. Ахо, Р. Сети, Д. Ульман. Компиляторы: принципы, технологии и инструменты.
Reply
Reply
По поводу аналогии семантических типов и классов:
Все семантические типы не совсем на одно лицо, потому что во первых, их семантика явно прописана в соответствующих методах и может определять совершенно разное поведения во время компиляции и во время исполнения, у класса же семантика всегда одна и та же. С точки зрения внешней структуры семантический тип может выглядеть гораздо более разнообразно чем класс, за счет различных типов ссылок и дополнительных свойств. Кроме того семантические типы могут сильно отличатьсся с точки зрения среды разработки - для разных типов могут быть заданы разные редакторы, навигаторы, правила рефакторинга и т.д.
По поводу эффективности текстового представления по сравнению с картинками:Во первых я вовсе не предлагаю все рисовать мышкой ( ... )
Reply
Reply
Reply
Reply
Reply
Reply
Reply
Reply
Reply
И то, и другое, кстати, по определению - компиляторы.
Reply
Ещё вопрос, я так понял, вы хотите поддержать различные парадигмы программирования; у пролога, лиспа и явы общего, мне кажется, мало, чтобы имело смысл их объединять в одну систему, более высокоуровневую, чем стековая VM (.NET, скажем), или нет?
Что касается domain-specific язычков, то они, как я понимаю, реализуются в рамках какой-то одной заранее выбранной парадигмы, и от универсальности нижележащей платформы толку вроде снова мало?
Reply
Leave a comment