Почему не существует универсального языка программирования? Ответы пользователей сайта Quora опубликовал KV.BY.
Дин Хью, бывший электротехник
Проще всего ответить на этот вопрос, если представить программирование как деревообработку, а языки программирования – как столярные инструменты. Сначала вы спиливаете дерево, получаете чурбан, затем обрабатываете его и получаете, например, шкаф, дверь, деревянную ложку или еще что-нибудь. И становится понятно, зачем нужно столько столярных инструментов. Огромная пила, которая нужна, чтобы разделить ствол на более мелкие части, отличается от столярного станка, сверла, напильника, наждачной бумаги и прочих инструментов, используемых для получения финального продукта.
Компьютер в данном случае – это чистый холст памяти, ждущий нанесения красок в виде скрипта, приложения или утилита. В зависимости от того, что вы хотите получить в итоге, и от того, с чего начинаете, вы выбираете язык программирования, каждый из которых имеет свою специфику. Некоторые языки просты и приятны в обращении, как пила или разводной ключ. К таким языкам относятся Basic и JavaScript. Для достижения высокой скорости и точности программирования существуют языки С и С++. Это утверждение может вызвать массу споров, но высокая скорость и точность в этом контексте связаны с операционными системами, алгоритмами и другими критическими для скорости задачами программирования. Мистер Тьюринг научил нас тому, что и операционную систему можно написать на Perl или Javascript, но можно и из дуба наждачной бумагой стол вышлифовать, если конечно хватит наждачной бумаги, времени и терпения. О практичности речь не идет.
Возможно, лучше сравнить языки программирования с инструментами для резки. Существует хлебный нож, нож для мяса, перочинный ножик и, наконец, нож для масла. Каждый из них обладает своими преимуществами в зависимости от задачи. Это же самое актуально и для языков программирования.
Эндрю МакГрегор, инженер
Немногие языки могут использоваться практически для любой цели, и все они различаются по сложности. К ним относятся , C++, Haskell, Rust, Algol, Lisp или Scheme, Forth, PL/1 и Assembler.
Заметили у них что-то общее? У них всех репутация тяжелых в изучении, тяжелых в использовании или доступных лишь посвященным языков. Или все сразу.
Причина, по которой я выбрал именно эти языки заключается в том, что все они могут быть использованы для программирования голографического ядра ОС, программ на уровне системы и приложений, ориентированных на пользователей, и я точно знаю, что они были использованы для написания ядер, начальных загрузчиков или приложений на голом железе. Я работал со всеми шестью языками.
Такое количество других языков появилось из-за того, что появляется потребность в написании все большего количества программ и со временем это делать все сложнее.
Причина, по которой C и C ++ настолько популярны, состоит в том, что они были существуют дольше, чем Haskell и Rust. К тому же С и С++ близки к золотой середине между широтой применения и дополнительной сложностью использования по сравнению с другими возрастными языками из моего списка. Вероятно, они даже лучше, чем Haskell.
Rust же слишком молод для того, чтобы повсеместным, но дайте ему 20 лет. Возможно, этот язык близок к тому, чтобы стать универсальным языком, но самым практичным на сегодняшний день является С++.
Эльфеус Мэдсен, математик, притворяющийся программистом
Многие отвечали на этот вопрос, приводя в пример языки, подходящие для любых целей; C, Assembly и Machine Language являются самыми масштабными примерами. Конечно, с точки зрения Тьюринга эти языки являются завершенными, но они не настолько хороши для исследовательского программирования или прототипирования, так что они не проходят проверку на универсальность. Мне также нравится Python и Ruby, но в этих языках «близость к железу» означает «просмотрите свою программу, найдите самые активные ее части и перепишите эти части на С». Едва ли эти языки являются универсальными.
Универсальный язык должен достигать как высокого, так и низкого уровня: он должен максимально использовать абстракции, но когда вам нужна производительность, вы должны быть в состоянии достичь необходимой глубины в аппаратном обеспечении и манипулировать битами, если это необходимо. Такие языки существуют, и я называю их «трансцендентными».
Некоторые из этих языков, такие как Common Lisp, Scheme и Smalltalk начинают как высокоуровневые, но при этом имеют механизмы (начиная от опционального ввода и заканчивая представлением для аппаратных команд низкого уровня с использованием встроенного ассемблера), позволяющие с легкостью достичь низкого уровня. Другие же, например, Forth, начинают как низкоуровневые, но могут с легкостью переходить на высокий уровень. Такие языки в прямом смысле позволяют создавать мини-языки, идеально вписывающиеся в оригинальный синтаксис исходного языка, что заметно упрощает решение сложных задач.
Для создания операционных систем с нуля использовались некоторые языки более высокого уровня. C – вездесущий язык, созданный в то время, когда ресурсов было не так много, но он занял золотую середину между простотой, низкоуровневостью и высокоуровневостью и стал очень популярен, несмотря на то, ему не хватает гибкости. Мне показалось интересным, что лишь несколько известных мне языков в свое время использовались для написания операционных систем – Lisp, Forth и Smalltalk – они также трансцендентны.
Итак, если эти языки способны на все, почему их не использует все больше людей? К сожалению, причина заключается в их простоте. Для ее достижения им приходится жертвовать математической приоритетностью, что многих сбивает с толку. Lisp использует префиксную нотацию — (+ 1 2 3) и получает 6. Forth использует постфиксную нотацию — «1 2 + 3 +». Получает 6. А Smalltalk оценивает все слева направо, поэтому из «1 + 2 * 3» получает 9 (это результат того, как Smalltalk передает сообщения объектам, цифры – это объекты, а операции – сообщения).
И хотя как большинство поначалу находят это странным, самое забавное заключается в том, что на самом деле все не так запутанно. Это всего лишь дело привычки. Сравните эти языки с любым языком на основе Algol (C, Pascal, PHP, Python и т. д.), который в котором присутствует иерархия выполнения математических действий, которая, как это ни парадоксально, имеет тонкие отличия от одного языка к другому. Все эти правила слишком многочисленны и труднозапоминаемы. Легче просто заключить все в круглые скобки, чтобы не пришлось беспокоиться о причудливых правилах приоритетности.
Уильям Шайн, кандидат наук по информатике и математике, университет Хьюстона (1995)
Как и было отмечено другими пользователями, С и семейство С являются универсальными языками. К ним относятся C, C++, Objective C, Objective C++ и Swift. Можно было бы добавить сюда Rust. Современные компиляторы С и С++ позволяют писать встраиваемый ассемблерный код. Не то, чтобы это было прекрасной идеей. И они почти все могут взаимодействовать между собой. С++ может использовать библиотеки С, Swift – библиотеки С и Objective C.
Python, Ruby, и Java могут использовать библиотеки C. В С вписаны преобразователи JavaScript. Так что взаимодействие действительно активное. Для достижения сырой производительности подходят С и компания. Если вам нужно написать много кодов быстро, первыми на очереди стоят JavaScript, Python и Ruby. Если вам важна скорость, безопасность и автоматическая сборка мусора, возможными вариантами будут C #, Java и Swift. . Если бы мне пришлось выбирать один язык программирования для всех целей, я бы выбрал C ++.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]