Языки программирования низкого и высокого уровня.

К языкам самого низкого уровня относят машинные языки. Их относят к первому поколению языков программирования. Вскоре после них появились языки второго поколения — так называемые «языки ассемблера». В одних случаях они представляют собой не более чем мнемонику над машинным языком, в других имеют весьма развитый макроязык. Языки первого и второго поколения позволяют тонко контролировать, как требуемая функциональность будет исполняться на данном процессоре с учётом особенностей его архитектуры. С одной стороны, это обеспечивает высокое быстродействие и компактность программ, но с другой, для переноса программы на другую аппаратную платформу её нужно перекодировать (а порой и перепроектировать) с нуля. Большинство ассемблеров являются бестиповыми, но существуют и типизированные ассемблеры, нацеленные на обеспечение минимальной безопасности>>> низкоуровневых программ.

К 1970-м годам сложность программ выросла настолько, что превысила способность программистов управляться с ними, и это привело к огромным убыткам и застою в развитии информационных технологий. Ответом на эту проблему стало появление массы языков высокого уровня, предлагающих самые разные способы управления сложностью (подробнее см. парадигма программирования и языки для программирования в мелком и крупном масштабе). Термин «язык высокого уровня» в этом смысле предполагает, что семантическая модель языка в большей степени учитывает особенности мышления человека, нежели машины. Как следствие, программы гораздо легче модифицируются и совсем легко переносятся с компьютера на компьютер. На практике, наибольшее распространение получили языки третьего поколения, которые лишь претендуют на звание «высокоуровневых», но реально предоставляют лишь те «высокоуровневые» конструкции, что находят однозначное соответствие инструкциям в машине фон-Неймана.

Языки четвёртого и пятого поколения нацелены преимущественно на выражение того, что должна делать программа (см. декларативное программирование). На таких языках в большинстве случаев достаточно просто перекомпилировать программу под определенную компьютерную архитектурную и операционную систему. Кроме того, для них не редкость компиляция в язык третьего поколения (в большинстве случаев это Си, но иногда в роли целевых платформ выступают Java, JavaScript, Ada и др.).

Язык Си изначально позиционировался как «высокоуровневый ассемблер»; его также часто называют «языком среднего уровня». Он позволяет в значительной степени контролировать способ реализации алгоритма с учётом свойств, типичных для весьма большого числа аппаратных архитектур. Однако, есть платформы, под которые реализации Си (даже с в нестандартном виде) отсутствуют по причине принципиальной невозможности или нецелесообразности их создания. Со временем появились и другие языки среднего уровня, например, LLVM, C--.

В большинстве случаев языки высокого уровня порождают машинный код большего размера и исполняются медленнее. Однако, некоторые языки высокого уровня для алгоритмически и структурно сложных программ могут давать заметное преимущество в эффективности, уступая низкоуровневым лишь на небольших и простых программах (подробнее см. эффективность языков). Иначе говоря, потенциальная эффективность языка меняется с повышением его «уровня» нелинейно и вообще неоднозначно. Однако скорость разработки и трудоёмкость модификации, устойчивость и другие показатели качества в сложных системах оказываются гораздо важнее предельно возможной скорости исполнения — они обеспечивают различие между программой, что работает, и той, что нет — так что экономически более целесообразна эволюция аппаратного обеспечения (исполнение большего числа инструкций в единицу времени) и методов оптимизирующей компиляции (более того, последние десятилетия эволюция аппаратного обеспечения движется в направлении поддержки методов оптимизирующей компиляции для языков высокого уровня). К примеру, автоматическая сборка мусора, присутствующая в большинстве высокоуровневых языков программирования, считается одним из важнейших улучшений, благотворно повлиявших на скорость разработки.

Поэтому в наши дни языки низкого уровня используются только в задачах системного программирования. Как следствие, сам термин «низкоуровневый язык программирования» многими людьми понимается исключительно как «предоставляющий возможность решать задачи системного программирования». В действительности этому определению отвечают и многие языки, требующие значительных преобразований до получения машинного кода. Более того, языки C# и Limbo используются именно в роли системных в операционных системах с повышенной отказоустойчивостью. Язык BitC является представителем четвёртого поколения (функциональной парадигмы программирования), но целиком и полностью ориентирован именно на системное программирование и уверенно конкурирует по скорости с Си. Таким образом, его классификация как языка «низкого» или «высокого» уровня оказывается весьма субъективной.



Наши рекомендации