Изменить: мой язык допускает множественное наследование, в отличие от Java.
Я начал проектировать и разрабатывать свой собственный язык программирования для образовательных, развлекательных и потенциально полезных целей.
Сначала я решил основать его на Java.
Это подразумевает, что весь код будет написан в форме классов, и этот код компилируется в классы, которые загружаются виртуальной машиной.
Однако я исключил такие функции, как интерфейсы и абстрактные классы, потому что я не нашел в них необходимости. Казалось, что они применяют парадигму, и я бы хотел, чтобы мой язык этого не делал. Я хотел сохранить классы как модуль компиляции, потому что это казалось удобным для реализации, знакомым, и мне просто понравилась идея.
Затем я заметил, что я в основном остался с модульной системой, где классы можно использовать либо как «пространства имен», предоставляя константы и функции с использованием static
директивы, либо как шаблоны для объектов, которые должны быть созданы («фактическое» назначение классов). на других языках).
Теперь я задаюсь вопросом: каковы преимущества и недостатки использования классов в качестве модулей компиляции?
Кроме того, любые комментарии к моему дизайну будут высоко оценены. Информационный пост на моем языке можно найти здесь: http://www.yannbane.com/2012/12/kava.html .
Ответы:
Это может уменьшить сложность языка. Нет необходимости в разных конструкциях, все обрабатывается одинаково. В определенных проектах (хотя, кажется, не в вашем) вы выигрываете от отсутствия статики и проблем дизайна, с которыми они, как правило, сталкиваются (проблемы порядка инициализации, ограничения параллелизма, неловкость с классами обобщений / типов). Это также допускает некоторые преимущества концепции модуля, такие как изолированные экземпляры модуля для песочницы или распараллеливания; и типизацию модулей, когда зависимости соответствуют некоторому интерфейсу, и можно реализовать весь экземпляр модуля и реализовать его.
Тем не менее, концепция имеет больше проблем, чем нет. Реально, вы не можете относиться ко всему одинаково, так как классы «верхнего уровня» нуждаются в специальных правилах, таких как наличие конструктора по умолчанию (иначе вы столкнетесь с нечетными проблемами, которые приводят их в движение). Модульность модулей компиляции также становится очень неудобной. Как класс даже ссылается на других, когда они просто классы? Как обрабатываются эти зависимости и как вы определяете правильный порядок раскрутки классов? Как убедиться, что повторяющиеся ссылки на классы повторно используются различными частями приложения (или как вы справляетесь с дублирующимися экземплярами, если вам нужна эта семантика)?
Изучив его, я столкнулся с множеством проблем с зависимостями, правильной областью определения и проблемами с инициализацией. В конечном итоге вы сталкиваетесь с проблемами, которые делают «классы верхнего уровня» особенными, и со многими ограничениями, заставляющими их работать, в конечном итоге формируете их в простые пространства имен.
источник
Object
. Я понимаю, что мне, вероятно, понадобится какое-то особое поведение для этого, но пока это единичный случай, я в порядке с этим. Я не верю, что у меня будут проблемы с зависимостью. Есть набор классов, которые загружаются при запуске виртуальной машины, некоторые из них реализованы изначально (класс System), но все они наследуются от Object. Как только все загружено, KVM загружает класс, который ему было поручено загрузить, и вырабатывает зависимости. Однако мне интересно, какие проблемы представляют статики?object
, я имею в виду классы, которые ведут себя как модули, а не как внутренние классы, которые не обязательно являются открытыми вне их модуля компиляции. «Выработка зависимостей» превращается в гнездо гигантского шершня в деталях, если вы хотите какое-либо поведение в стиле DLL; YMMV. Что касается статики .Math
класса, который на самом деле является модулем со статическими методами и постоянным статическим двойным членом, вызываемымPi
.Вместо того, чтобы отвечать на этот вопрос, я поднимусь на один уровень выше и предложу изучить MIT OpenCourseWare , в частности 6.035 (Computer Language Engineering). Это объяснит всю проблематику, так что у вас не будет соблазна задавать подобные вопросы снова.
Компьютерная инженерия
Единственным предварительным условием является Java.
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/
Описание курса
В этом курсе анализируются проблемы, связанные с реализацией языков программирования более высокого уровня. Охватываемые темы включают в себя: основные понятия, функции и структуры компиляторов, взаимодействие теории и практики и использование инструментов при создании программного обеспечения. Курс включает в себя проект для нескольких человек по разработке и реализации компилятора.
источник