LXF93:Что за штука
Makoron (обсуждение | вклад) (Новая: Что за штука...D? Вам наскучил B? Надоел C? '''Пол Хадсон '''проследует по алфавиту и покажет новый способ п...) |
Версия 20:21, 5 апреля 2008
|
|
|
Что за штука...D?
Вам наскучил B? Надоел C? Пол Хадсон проследует по алфавиту и покажет новый способ программировать.
»Это была шутка насчет «B», так ведь?
Э-э-э...?
»Я слышал про C. Так называется язык программирования, на котором написано ядро Linux.
Ну да. А еще - большая часть Gnome, X.org, Apache и тысячи других проектов.
» Достаточно, я понял. Но неужели вы хотите сказать, что язык программирования B тоже существует?
Уверяю вас, так оно и есть. Язык B существовал еще до C, и вообще говоря, С является прямым потомком B. Такие хорошо известные элементы C, как операторы ++ и --, а также комментарии вида /* */ впервые появились в B. Но у B были свои ограничения, и поэтому его создатели, Кен Томпсон (Ken Thompson) и Дэннис Ричи (Dennis Ritchie), разработали кое-что получше.
»И назвали C?
Точно! Так как эта буква следует за B в латинском алфавите.
»Выходит, шутка про C++ не такая уж и оригинальная!
Ну да, хотя любой хороший программист подтвердит вам, что правильнее было бы назвать его ++С.
» Простите, не понял...
Неважно. Сегодня мы говорим про D. По этому названию вы можете видеть, что авторы рассчитывают сделать очередное улучшение над C и С++.
» Примерно как Java и C#?
Ну, их создатели тоже считали, что занимаются улучшением C и С++. Но, в отличие от Java и C#, D разрабатывается как расширение C++, каким в свое время С++ был для C. Благодаря этому программистам на C++ будет легко выучить его. При этом у D есть много новых возможностей, таких как встроенная поддержка Unicode и сборка мусора.
»Хм, но про Java и C# говорят в точности то же самое! Разве нам не достаточно существующих перепевок С++?
Но вы не слышали еще об одном важном отличии! Java и C# работают в виртуальных машинах и благодаря этому могут обеспечить самую причудливую защиту памяти. А D компилируется в родной машинный код, точно так же как C. Это означает, что (теоретически) код, написанный на D и на С будет работать с одинаковой скоростью. Кроме того, системные вызовы D совместимы со стандартом С, чего не скажешь о Java или C#, которым требуется специальный промежуточный слой, чтобы выбраться из виртуальной песочницы.
»А какие еще функции D унаследованы от C#?
Как и C# или Java, язык D содержит string в числе базовых типов данных, а это значит, что про символьные массивы можно счастливо забыть. В стандартной библиотеке C++ уже есть концепция строкового типа, но там он прикручен сбоку и не является неотъемлемой частью языка. Например, вы пробовали сделать блок switch/case на основе строковой переменной? Нет? Это потому, что в C++ это было бы невозможно.
Превращение строк в более сложные объекты нарушает совместимость с C, но это не проблема - вы всегда можете использовать для любой D-строки метод c_str(), который возвращает обычный символьный массив, пригодный для передачи в любую функцию C.
Кстати, в D стали умнее не только символьные массивы. Фактически, все массивы в D автоматически обзавелись метаданными, такими как размер. В C эту информацию приходилось сопровождать и обрабатывать вручную.
Некоторые новые ключевые слова, такие как finally (выполнить некий блок кода в любой ситуации) или foreach (быстрый перебор элементов массива), тоже были привнесены в D из C#.
»Итак, D - это некоторое расширение C++?
У D есть много функций, привнесенных из других языков программирования, но помимо этого, его разработчики воспользовались случаем избавиться от некоторых элементов C++, которые им нравились меньше всего. Например, под нож попало множественное наследование. Препроцессор тоже был уничтожен, а это значит, что макросы погибли вместе с ним. Пропали заголовочные файлы, пространства имен и ранние объявления (forward declarations). Последние оставались еще с тех времен, когда компиляторы были гораздо менее умными. Ну и, конечно, появилась автоматическая сборка мусора...
» Погодите, разве вы не говорили только что, что D совместим с C?
Э нет, я говорил что D совместим с системными вызовами C, то есть вы можете пользоваться C-функциями вроде printf() в D-программах. Но, из-за большого объема добавлений и удалений, D и C не совместимы на уровне исходного кода. Это значит, что вы не можете взять C-код и скомпилировать его с помощью компилятора D. Но некоторые новшества D, вроде использования int[3] foo вместо int foo[3], в целях обратной совместимости можно и проигнорировать, так что переносите свой код на D, когда будете к этому готовы.
»Если D включает в себя сборку мусора, как он может создавать столь же быстрый код, что и C?
Ну, на самом деле современные системы сборки мусора позволяют программам работать даже быстрее, чем программы с ручным управлением памятью. Да, я знаю, что это противоречит вашим интуитивным ощущениям, но подождите, и я все объясню.
Во-первых, сборка мусора запускается только тогда, когда памяти становится слишком мало, а это значит, что память не освобождается, пока в этом не появится необходимость. Для большинства программ может оказаться, что за время их работы сборка мусора не запустится ни разу - а это большой выигрыш в производительности по сравнению с С, в котором память освобождается всегда, вне зависимости от того, нужна она сейчас для чего-нибудь еще или нет.
Во-вторых, объекты C++ освобождают память с помощью вызова метода деструктора, что может сильно замедлить работу, особенно если нужно освободить несколько тысяч объектов. В-третьих, сборка мусора автоматически перегруппирует кучу, что улучшает производительность памяти.
» Достаточно! Но ведь в сборке мусора должны быть и отрицательные моменты.
Да, и вполне обычные - она увеличивает объем кода, а также вполне может запуститься в тот момент, когда вам меньше всего этого хотелось бы, что может время от времени приводить к появлению маленьких пауз в работе вашего приложения. Но эти проблемы совершенно ничтожны по сравнению с тем, сколько времени сборка мусора экономит для программиста! Последней сложностью является необходимость модифицировать ее код так, чтобы он мог запускаться на различных операционных системах.
»О, вы меня просто заинтриговали этим D! Как бы мне попробовать его на практике?
Никак. D существует только в теории.
»Что? Вы хотите сказать, что я провел последние 10 минут, забивая свою голову этой...
Шучу, шучу. На самом деле уже существует два работающих компилятора D - DMD и GDC. Первый из них -это официальный пример реализации компилятора, а второй - модуль к GCC. Официальный компилятор хорош своей 100% совместимостью со стандартом, чего пока нельзя сказать по GDC. Но при этом DMD имеет частично закрытые исходные тексты - часть, преобразующая D в промежуточный код, открыта, а вот компилятор промежуточного кода в тот или иной машинный - проприетарный. Сейчас эту проблему решают так: CDG использует открытый модуль, а результат его работы передает GCC, имеющему свой собственный слой генерации машинного кода. Благодаря этому GDC работает на большом числе платформ, включая Linux, Mac OS X, FreeBSD, Windows и AIX, как на 32-х, так и на 64-битных компьютерах.
»Мне казалось, что GCC работает на большем количестве платформ.
Так и есть, но как я уже упоминал, код сборщика мусора приходится модифицировать для каждой новой операционной системы. Это не такая уж большая работа, и ее нужно сделать только один раз при портировании GCD на новую платформу, но пока ее сделали только для тех систем, которые я перечислил выше.
»Вам пора привести список ссылок, поскольку доступное место уже кончается.
Хе, вовремя подмечено! О’кей, если вы хотите побольше узнать про D, зайдите на его официальную домашнюю страницу по адресу http://www.digitalmars.com/d/index.html. Вы можете скачать компилятор DMD на этой же странице (посмотрите под меню Tool в левой ее части). Компилятор GDC расположен на SourceForge: http://dgcc.sourceforge.net/.
Если вы любите работать с подсветкой синтаксиса при редактировании кода, то вам будет приятно узнать, что многие редакторы уже поддерживают синтаксис D. Vim, начиная с версии 6.3, включает режим D как один из стандартных. Пользователи Emacs могут скачать модуль для D с http://www.prowiki.org/wiki4d/wiki.cgi?EditorSupport/EmacsDMode . Если вы используете Kate, то вам не повезло. Но даже если ваш любимый редактор не понимает D, вы можете попытать счастья с режимами Java или C#, поскольку их синтаксис наиболее близок к синтаксису D.
»Круто! Большое спасибо за то, что рассказали мне про D. Если на этом все, то я пойду и попробую поработать с ним прямо сейчас!
Пожалуйста! А в следующем месяце мы с вами рассмотрим E.
»E?! Это шутка, так ведь?
Подождите немного, и увидите.