2016-12-01 3 views
-3

Язык Я ищу в этом вопросе должен иметь следующие характеристики:Существует ли объектно-ориентированный язык, который обеспечивает доступ к объектам с низким уровнем доступа?

  • компилировать в машинный код,
  • имеют C++ - стиль дизайна объектно-ориентированного программирования (возможно, ограниченного одного класса наследования),
  • в идеале быть из семейства C (не является обязательным требованием),
  • позволяют обработки стека инициализированы-объекты выделены,
  • позволяют прямое призвание конструкторов и деструкторов как функции, вкл ЛУДИНГ контроля над тем, как, когда и будет ли у называется все суперкласс конструктор/деструктор,
  • позволяет прямое чтение/записи доступа к виртуальной таблице и данным RTTI,
  • идеально не различает статические и нестатический функции-члена (последний мог бы просто принять еще один параметр для this),
  • необязательно: разрешить управление потоком во время исключений (например, вызов деструкторов и переадресация стека).

Три точки выделены курсивом на C++ за кулисами, и попытка вмешаться в них вызывает неопределенное поведение, несмотря на то, что в общих реализациях они очень просты. Некоторые другие против своих принципов. Это, конечно, по уважительным причинам, но в целом это всего лишь выбор дизайна. Почему я заинтересован в языке, который не затенять их конструкции:

  • можно создать подклассы на лету, Java-анонимного класса стиля (например, создать экземпляр базового класса, но заменить некоторые виртуальная функция с собственным указателем функции без необходимости определять новый класс)
  • можно было бы разработать собственные более быстрые, но семантически эквивалентные версии, например, динамические типы, с учетом контрактов или предположений, которые компилятор не может знать,
  • можно было дать свои классы (которые позволяют RTTI) доступным для человека именам во время выполнения с использованием существующих механизмов,
  • можно хранить дополнительные «полиморфные» данные с объектом, как виртуальных, не являющихся членами функции,
  • студенты могли более непосредственно понять внутренние механизмы наследования, идентификации типа и т.д.

Конечно, можно просто оставайтесь с C, но я хочу сказать, что язык будет фактически объектно ориентированным и по умолчанию сделает все «волшебство» правильно для пользователя, если на самом деле не потребуется дополнительная гибкость. Пользователь несет ответственность за то, что он не справляется с ситуациями, вызванными ими.

Существует ли такой язык (возможно, неясный)? Если нет, то какие самые близкие совпадения и какие условия они удовлетворяют?

+0

Вы * знакомы с размещением новых, да? – jaggedSpire

+0

Вы можете просто сделать курсивом в C++ вручную. – nwp

+0

@jaggedSpire Конечно, но это только часть пути. Например. он не позволит вам оставить объект неинициализированным. –

ответ

2

Большинство современных языков сознательно избегают давать слишком малому уровню мощности программисту, поскольку это имеет тенденцию создавать дорогие и сложные для поддержания кода.

Сказанное, хотя я не знаю ни одного языка, который соответствует именно тому, что вы ищете, самым близким, о котором я могу думать, является старый, но очень мощный язык под названием Forth. Хотя это оригинальный дизайн не включает объектно-ориентированные структуры, для его поддержки были сделаны расширения для языка. В отличие от большинства языков, у Forth нет проблем с тем, чтобы уровень программиста на уровне ассемблера свободно смешивался с концепциями разработки на высоком уровне, такими как функциональное программирование и объектно-ориентированное наследование. Тем не менее, это сильно отличается от семейства языков C, поэтому, если вы уже не знакомы с ним, это займет некоторое время, прежде чем вы сможете эффективно использовать его.

Forth - это такой мощный язык, на котором вы можете буквально создавать свои собственные объектно-ориентированные механизмы в самом языке, разрабатывать любое наследование, инкапсуляцию или любой другой объектно-ориентированный принцип, который вы хотели бы иметь. Вы также можете сделать его как автоматическим, так и ручным, например, выбирая, как автоматически вызываются конструкторы суперкласса или нет.

Это, вероятно, не поможет вам слишком много, так как вы, вероятно, ищете больше C-подобного языка. Единственное, что я могу придумать, это язык ассемблера высокого уровня, возможно, язык, похожий на сумасшедший, с большим количеством синтаксического сахара, встроенного в препроцессор.

+0

Это звучит потрясающе! C-семья была просто мягким требованием, у меня нет проблем с этим. –

+0

Ну, язык, достаточно сильный, чтобы можно было реализовать ** ООП в нем (а затем использовать абстракцию сразу), кажется, явный победитель! Мне нужно будет кое-что прочитать в Gforth, но я не вижу больше ответов на этот счет. То, что я читал на Форте, убедительно. –