Одна из проблем, связанных с включением абстракций очень высокого уровня в язык, заключается в том, что иногда они не подходят для всего, что вы хотите сделать, поэтому вам в конечном итоге также понадобятся абстракции более низкого уровня.Проблема с наличием абстракций высокого и низкого уровня на одном и том же языке заключается в том, что абстракции высокого уровня могут очень легко стать утечками, если вы можете исследовать их с помощью абстракций низкого уровня.
Например, Java не настолько высокУровень языка, но он разработан, чтобы быть безопасным (в том смысле, что абстракции не просачиваются) в первую очередь.Поэтому некоторые вещи просто невозможно сделать в Java.Например, вы не можете написать сборщик мусора Java в Java, или свернуть свою собственную объектную систему, используя полиморфизм приведения указателя, или написать операционную систему (по крайней мере, не традиционную).
Напротив, D предлагаеткак на высоком, так и на низком уровне.Например, сборщик мусора D написан на D. Это звучит хорошо, и по большей части это так.Однако, когда вы начинаете смешивать уровни абстракции в одной кодовой базе, абстракции могут просочиться, особенно если вы используете приведения или объединения, чтобы победить систему типов.Поэтому, чтобы успешно программировать на D, вам иногда может потребоваться информация о низкоуровневых деталях, чтобы справиться с вытекающими абстракциями, даже если они вам не нужны для текущей задачи.