Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save anonymous/74ec34ffd614577ad819560aa7ea4977 to your computer and use it in GitHub Desktop.
Save anonymous/74ec34ffd614577ad819560aa7ea4977 to your computer and use it in GitHub Desktop.
Где используются языки программирования

Где используются языки программирования - Какие языки программирования используются при создании сайтов



Со времени создания первых программируемых машин человечество придумало более восьми тысяч языков программирования включая эзотерические , визуальные и игрушечные [en] [3]. Каждый год их число увеличивается. Некоторыми языками умеет пользоваться только небольшое число их собственных разработчиков, другие становятся известны миллионам людей. Профессиональные программисты могут владеть десятком и более разных языков программирования. Язык программирования отличается от естественных языков тем, что предназначен для управления ЭВМ, в то время как естественные языки используются, прежде всего, для общения людей между собой. Большинство языков программирования использует специальные конструкции для определения и манипулирования структурами данных и управления процессом вычислений. Можно сказать, что первые языки программирования возникали ещё до появления современных электронных вычислительных машин: Для управления ими использовались наборы инструкций, которые в рамках современной классификации можно считать прототипами предметно-ориентированных языков программирования. В — годах , А. Цузе в период с по годы [4]. Программисты ЭВМ начала х годов , в особенности таких, как UNIVAC и IBM , при создании программ пользовались непосредственно машинным кодом , запись программы на котором состояла из единиц и нулей и который принято считать языком программирования первого поколения при этом разные машины разных производителей использовали различные коды, что требовало переписывать программу при переходе на другую ЭВМ. Он был разработан в компании Eckert—Mauchly Computer Corporation , выпускавшей UNIVAC-и, созданной одним из сотрудников Тьюринга, Джоном Мокли. Мокли поручил своим сотрудникам разработать транслятор математических формул, однако для х годов эта цель была слишком амбициозна. Краткий код был реализован с помощью интерпретатора [5]. Вскоре на смену такому методу программирования пришло применение языков второго поколения, также ограниченных спецификациями конкретных машин , но более простых для использования человеком за счёт использования мнемоник символьных обозначений машинных команд и возможности сопоставления имён адресам в машинной памяти. Они традиционно известны под наименованием языков ассемблера и автокодов. Однако, при использовании ассемблера становился необходимым процесс перевода программы на язык машинных кодов перед её выполнением, для чего были разработаны специальные программы, также получившие название ассемблеров. Позднее языки второго поколения были усовершенствованы: С середины х начали появляться языки третьего поколения, такие как Фортран , Лисп и Кобол [6]. Программа на языке высокого уровня может исполняться по крайней мере, в теории, на практике обычно имеются ряд специфических версий или диалектов реализации языка на любой ЭВМ, на которой для этого языка имеется транслятор инструмент, переводящий программу на язык машины, после чего она может быть выполнена процессором. Обновлённые версии перечисленных языков до сих пор имеют хождение в разработке программного обеспечения, и каждый из них оказал определенное влияние на последующее развитие языков программирования [7]. Тогда же, в конце х годов, появился Алгол , также послуживший основой для ряда дальнейших разработок в этой сфере. Необходимо заметить, что на формат и применение ранних языков программирования в значительной степени влияли интерфейсные ограничения [8]. Каждый из этих языков породил по семейству потомков, и большинство современных языков программирования в конечном счёте основано на одном из них. Кроме того, в —х годах активно велись споры о необходимости поддержки структурного программирования в тех или иных языках [14]. В частности, голландский специалист Э. Дейкстра выступал в печати с предложениями о полном отказе от использования инструкций GOTO во всех высокоуровневых языках. Развивались также приёмы, направленные на сокращение объёма программ и повышение продуктивности работы программиста и пользователя. В е годы наступил период, который можно условно назвать временем консолидации. Сообщество функциональных языков приняло в качестве стандарта ML и Лисп. В целом этот период характеризовался скорее опорой на заложенный в предыдущем десятилетии фундамент, нежели разработкой новых парадигм. Часто модульные системы объединялись с конструкциями обобщённого программирования [16]. Визуальные языки обеспечивают наглядность и лучшее восприятие логики программы человеком. Возрастала также и популярность технологий виртуализации. В настоящее время развитие языков программирования идёт в направлении повышения безопасности и надёжности, создания новых форм модульной организации кода и интеграции с базами данных. Для многих широко распространённых языков программирования созданы международные стандарты. Специальные организации проводят регулярное обновление и публикацию спецификаций и формальных определений соответствующего языка. В рамках таких комитетов продолжается разработка и модернизация языков программирования и решаются вопросы о расширении или поддержке уже существующих и новых языковых конструкций. Современные языки программирования рассчитаны на использование ASCII , то есть доступность всех графических символов ASCII является необходимым и достаточным условием для записи любых конструкций языка. Управляющие символы ASCII используются ограниченно: Ранние языки, возникшие в эпоху 6-битных символов , использовали более ограниченный набор. Например, алфавит Фортрана включает 49 символов включая пробел: Заметным исключением является язык APL , в котором используется очень много специальных символов. Использование символов за пределами ASCII например, символов KOI8-R или символов Юникода зависит от реализации: Расширение набора используемых символов сдерживается тем, что многие проекты по разработке программного обеспечения являются международными. Вместе с тем, для работы с текстовыми данными языки программирования нового поколения Delphi , C , Java поддерживают Unicode. Существует несколько подходов к определению семантики языков программирования. Не существует общепринятой систематичной таксономии языков программирования. Есть множество черт, согласно которым можно производить классификацию языков, причём одни из них однозначно проводят разделы между языками на основе технических свойств; другие основываются на доминирующих признаках, имеют исключения и более условны; а третьи полностью субъективны и нередко сопровождаются заблуждениями, но на практике весьма распространены. Конкретный язык программирования в подавляющем большинстве случаев имеет более одного языка-предка. Многие языки создаются как сочетание элементов различных языков. В одних случаях такое сочетание проходит математический анализ на предмет непротиворечивости см. Лисп-машина , Java Optimized Processor [en]. К языкам самого низкого уровня относят машинные языки. Их относят к первому поколению языков программирования [en]. В одних случаях они представляют собой не более чем мнемонику над машинным языком , в других имеют весьма развитый макроязык. Языки первого и второго поколения позволяют тонко контролировать, как требуемая функциональность будет исполняться на данном процессоре с учётом особенностей его архитектуры. С одной стороны, это обеспечивает высокое быстродействие и компактность программ, но с другой, для переноса программы на другую аппаратную платформу её нужно перекодировать а порой и перепроектировать с нуля. К м годам сложность программ выросла настолько, что превысила способность программистов управляться с ними, и это привело к огромным убыткам и застою в развитии информационных технологий [22]. Ответом на эту проблему стало появление массы языков высокого уровня , предлагающих самые разные способы управления сложностью подробнее см. Как следствие, программы гораздо легче модифицируются и совсем легко переносятся с компьютера на компьютер. Языки четвёртого и пятого поколения нацелены преимущественно на выражение того, что должна делать программа см. На таких языках в большинстве случаев достаточно просто перекомпилировать программу под определенную компьютерную архитектурную и операционную систему. Кроме того, для них не редкость компиляция в язык третьего поколения в большинстве случаев это Си , но иногда в роли целевых платформ выступают Java , JavaScript , Ada и др. Он позволяет в значительной степени контролировать способ реализации алгоритма с учётом свойств, типичных для весьма большого числа аппаратных архитектур. Однако, есть платформы, под которые реализации Си даже с в нестандартном виде отсутствуют по причине принципиальной невозможности или нецелесообразности их создания. Со временем появились и другие языки среднего уровня, например, LLVM , C В большинстве случаев языки высокого уровня порождают машинный код большего размера и исполняются медленнее. Однако, некоторые языки высокого уровня для алгоритмически и структурно сложных программ могут давать заметное преимущество в эффективности, уступая низкоуровневым лишь на небольших и простых программах подробнее см. К примеру, автоматическая сборка мусора , присутствующая в большинстве высокоуровневых языков программирования, считается одним из важнейших улучшений, благотворно повлиявших на скорость разработки [25]. Поэтому в наши дни языки низкого уровня используются только в задачах системного программирования. В действительности, этому определению отвечают и многие языки, требующие значительных преобразований до получения машинного кода. Более того, языки C и Limbo используются именно в роли системных в операционных системах с повышенной отказоустойчивостью. Язык BitC является представителем четвёртого поколения функциональной парадигмы программирования , но целиком и полностью ориентирован именно на системное программирование , и уверенно конкурирует по скорости с Си. Современные компьютеры представляют сложные данные реального мира в виде чисел в памяти компьютера. Это вводит в дисциплину программирования риск человеческого фактора , в том числе вероятность ошибок доступа к памяти. Однако, существуют и бестиповые языки , например, Forth. Системы типов языков делятся на динамические потомки Lisp , Smalltalk , APL и статические , а последние, в свою очередь, делятся на неполиморфные потомки Алгола и BCPL и полиморфные потомки ML [26]. Кроме того, они делятся на явные англ. Системы типов бывают сильные и слабые. Сильная типизация порой ошибочно отождествляется со статической. В общем и целом, язык называется безопасным , если программы на нём, которые могут быть приняты компилятором как правильно построенные, в динамике никогда не выйдут за рамки допустимого поведения [27]. Это не значит, что такие программы не содержат ошибок вообще. Хотя термины неформальны, безопасность некоторых языков например, Standard ML математически доказуема [26]. Безопасность других например, Ada была обеспечена ad hoc -образом, без обеспечения концептуальной целостности, что может обернуться катастрофами, если положиться на них в ответственных задачах см. Неформальная терминология была популяризована Робином Милнером , одним из авторов теории формальной верификации и собственно языка Standard ML. Степень контроля ошибок и реакция языка на них могут различаться. Простейшие системы типов запрещают, к примеру, вычитать строку из целого числа. Однако, целыми числами могут представляться и миллиметры , и дюймы , но было бы логической ошибкой вычитать дюймы из миллиметров. В частности, Standard ML не допускает над данными никаких операций, кроме тех, что разрешены явно и формализованы; однако, программы на нём всё же могут завершаться порождением необработанного исключения например, при попытке деления на ноль. Его потомок, MLPolyR гарантирует также и отсутствие необработанных исключений. Сильно динамически типизируемые языки отслеживают поведение программ в динамике что влечёт снижение быстродействия и реагируют на ошибки порождением исключения. Все эти языки ориентированы на практичность , предоставляя оптимальный компромисс между пресечением серьёзных сбоев и высокой скоростью разработки программ. Но существуют и языки, предназначенные для написания программ, которые верны по построению , то есть обеспечивающие гарантию того, что исполнимая программа по структуре и поведению будет тождественна её спецификации см. Соответствие Карри — Говарда. Трудоёмкость разработки на таких языках возрастает на порядки, кроме того, они требуют очень высокой квалификации разработчика, поэтому они используются только в формальной верификации. Примерами таких языков служат Agda , Coq. PVS-Studio [en] , [29] [30] , но их использование обходится очень дорого в денежном смысле. Достоверно же гарантировать безотказность программ на этих языках невозможно, не прибегая к формальной верификации , что не только ещё дороже, но и требует специальных знаний см. У Си есть и безопасные потомки, такие как Cyclone или Rust. Можно выделить три принципиально разных способа реализации языков программирования: Распространено заблуждение, согласно которому способ реализации является присущим конкретному языку свойством. В действительности, это деление до определенной степени условно. В ряде случаев язык имеет формальную семантику, ориентированную на интерпретацию , но все или почти все его действительные реализации являются компиляторами, порой весьма эффективно оптимизирующими примерами могут служить языки семейства ML , такие как Standard ML , Haskell. Говоря же более точно, встраиваемые языки добавляют к сказанному ещё четыре способа реализации. Естественный для языка способ реализации определяется временем связывания программных элементов с их характеристиками. Некоторые свойства элементов языка, такие как значение арифметических операторов или управляющих ключевых слов, могут быть связаны уже на этапе определения языка. В других языках возможно их переназначение см. Для любого традиционно компилируемого языка такого как Паскаль можно написать интерпретатор. Но многие интерпретируемые языки предоставляют некоторые дополнительные возможности, такие как динамическая генерация кода см. Большинство традиционно интерпретируемых или компилируемых языков могут реализовываться как встраиваемые , хотя метаязыков , которые были бы способны охватить другие языки как своё подмножество, не так много наиболее ярким представителем является Lisp. Как правило, скомпилированные программы выполняются быстрее и не требуют для выполнения дополнительных программ, так как уже переведены на машинный язык. Вместе с тем, при каждом изменении текста программы требуется её перекомпиляция, что замедляет процесс разработки. Кроме того, скомпилированная программа может выполняться только на том же типе компьютеров и, как правило, под той же операционной системой, на которую был рассчитан компилятор. Чтобы создать исполняемый файл для машины другого типа, требуется новая компиляция. Портируемость интерпретируемой программы определяется только наличием реализаций интерпретаторов под те или иные аппаратные платформы. Некоторые языки, например, Java и C , находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Подобный подход в некотором смысле позволяет использовать плюсы как интерпретаторов, так и компиляторов. Эта терминология естественным образом наследуется информатикой , образуя семантики, соответственно, первого и высшего порядка [32]. Языки первого порядка например, потомки Алгола , такие как Basic или классический Pascal Вирта позволяют определять только зависимости первого порядка между величинами. Например, значение sqare x зависит от значения x. Такие зависимости называются функциями. Языки высшего порядка в первую очередь это все функциональные языки позволяют определять зависимости между зависимостями. Например, значение map f x зависит от значений f и x , где значение f само выражает абстрактную зависимость другими словами, параметр f варьируется над множеством функций определённой сигнатуры. Такие зависимости называются функциями высшего порядка. При этом в большинстве случаев говорят, что такой язык рассматривает зависимости функции как объекты первого класса , иначе говоря, допускает функции первого класса [33] некоторые языки, например Си , не поддерживают первоклассные функции, но предоставляют ограниченные возможности строить функции высшего порядка. Эти термины ввёл Кристофер Стрэчи [en]. С развитием систем типов различение порядков распространилось и на типы см. Языки первого порядка позволяют воплощать в виде кода алгоритмы , но не архитектуру программ. По мнению Стрэчи [en] , это ограничение унаследовано языком Алгол а от него другими языками из классической математики, где используются только константные операции и функции, однозначно распознаваемые вне контекста, и отсутствует систематичная нотация для произвольной работы с функциями в качестве такой нотации в х годах было построено лямбда-исчисление , которое позже легло в основу языков высшего порядка [34]. Схемы взаимодействия компонентов процедур , функций , объектов , процессов и др. В результате, решения, которые на языках первого порядка могут быть представлены фрагментами программ порой довольно сложными и громоздкими , на языках высшего порядка могут сокращаться до одной команды или вообще использования элемента семантики самого языка, не имеющего синтаксического выражения. Преимущественно, сказанное относится к языкам, семантика которых основана на лямбда-исчислении потомки Lisp , ML. Однако, некоторые языки иной природы также предоставляют возможность программирования высшего порядка [en]. Примерами служат стековые языки Forth и определённая разновидность объектно-ориентированных языков Smalltalk , CLOS , см. То есть порядок языка имеет ярко выраженное психологическое влияние см. Владение языками более высокого уровня поможет программисту думать в терминах более высокоуровневых абстракций [37]. Низкоуровневые же языки могут навязывать обратное, в связи с чем широко известно следующее высказывание:. Понимание возможностей и ограничений высокоуровневых конструкций, базовых принципов их реализации не только дают программисту возможность наиболее эффективно использовать изученный им язык, но и позволят создавать и использовать аналогичные механизмы в случае разработки на языке, где они не реализованы [37]. Отнесение языков к парадигмам может производиться по нескольким признакам, из которых одни соответствуют конкретным техническим характеристикам языков, а другие весьма условны. Технически языки делятся, например, на допускающие побочные эффекты и ссылочно-прозрачные. В качестве парадигмы также иногда рассматриваются определённые свойства системы типов и стратегии вычисления языка, например, для параметрически полиморфных систем типов нередко говорят о реализации парадигмы обобщённого программирования. Другим примером может служить свойство гомоиконности , открывающее целый спектр разновидностей метапрограммирования. Яркими представителями являются Lisp , впервые воплотивший лямбда-исчисление и положивший таким образом начало функциональной парадигме ; Smalltalk , впервые воплотивший объектно-ориентированную парадигму появившаяся за много лет до него Симула поддерживала понятие класса , но воплощала структурную парадигму и стековый язык Forth , воплощающий конкатенативную парадигму. Языки первого [en] и второго [en] поколения являются низкоуровневыми , то есть ориентированными на специфику конкретного аппаратного обеспечения, и в принципе не соотносятся с какой-либо парадигмой хотя конкретный разработчик на них, разумеется, может идеологически следовать определённым тенденциям. Они позволяют описывать лишь, как получить результат, тогда как языки четвёртого и пятого поколения претендуют на возможность описывать, что требуется в результате. Языки третьего поколения находятся по середине и в зависимости от степени пригодности к задаче могут рассматриваться как те или другие. Для множества задач полностью автоматическое порождение по-настоящему эффективной реализации алгоритмически неразрешимо , так что на практике даже на что -языках нередко используются определённые алгоритмические ухищрения. С ростом размера и сложности программ уже при использовании языков второго поколения начала формироваться парадигма процедурного программирования , требующая производить декомпозицию крупных процедур в цепочку иерархически связанных более мелких. Примерно в то же время появились первые языки третьего поколения [en] и сформировалось сперва структурное программирование как прямое развитие процедурного , а затем и модульное. К настоящему времени третье поколение языков представлено наиболее обширным спектром разнообразных парадигм. К пятому поколению [en] относят языки логического программирования , в котором, помимо традиционного, выделяется несколько особых форм, например, программирование ограничениями. Многие парадигмы являются условно провозглашёнными методиками организации структуры программы и применимы к большому множеству языков. Другие парадигмы тесно связаны с техническими свойствами. Программы могут решать задачи различного масштаба [en]: Различные языки программирования рассчитаны на разный исходный масштаб задачи и, что ещё более важно, по-разному справляются с ростом сложности программных систем. Ключевым качеством языка, от которого зависит, как меняется трудоёмкость разработки по мере наращивания системы, является абстракция , то есть возможность отделять смысл поведение компонента системы от способа его реализации [41] [42]. Такие показатели качества исходного кода , как тестируемость и модифицируемость, очевидным образом определяются коэффициентом повторного использования. Это может означать как применение разных функций к одному и тому же компоненту, так и возможность применять одну и ту же функцию к разным компонентам. Параметрически полиморфные особенно выводящие и динамические системы типов существенно повышают коэффициент повторного использования: Если же язык требует в сигнатуре функции указывать конкретный способ реализации входных данных, то этот коэффициент резко страдает. С развитием языков появились особые присущие исключительно программированию, не требовавшиеся ранее в математике категории компонентов и зависимостей: Другие фундаментальные проблемы, связанные со сложностью крупных систем, лежат вне самих программ: Кроме свойств семантики языка, повторное использование может обеспечиваться посредством модульной структуры программной системы или комплекса. Более того, сколь бы гибким ни был язык, работа с огромными объёмами кодов, особенно множеством людей, требует их декомпозиции на модули тем или иным образом. Модульная структура подразумевает не просто разбиение монолитного исходного кода программы на множество текстовых файлов, а обеспечение абстракции в более крупном масштабе, то есть определение интерфейса для всякого логически завершённого фрагмента и сокрытие деталей его реализации. В зависимости от применённых в языке правил определения области видимости язык может допускать или не допускать автоматическое определение зависимостей. Если согласно правилам возможен конфликт имён, то автоопределение зависимостей невозможно, и тогда в заголовке модуля требуется явно перечислять имена модулей, компоненты которых в нём используются. Некоторые языки например, Basic или классический Pascal Вирта ориентированы исключительно на разработку мелких, структурно простых программ. Они не обеспечивают ни развитой системы модулей, ни гибкости конкретных фрагментов. Однако, расширение функциональности в других аспектах на этих языках может оборачиваться затруднениями. Со временем были построены варианты слияния их воедино 1ML. Наиболее популярным на сегодняшний день подходом к решению проблемы комплексирования является объектно-ориентированное программирование , хотя успешность его применения на протяжении десятилетий существования неоднократно подвергалась скепсису, и до сих пор отсутствуют достоверные данные о том, что он приносит выигрыш по сравнению с другими подходами по тем или иным показателям качества. Ему сопутствуют а порой конкурируют различные технологии регламентирования зависимостей между компонентами: Более мощным подходом исторически считалось использование различных форм метапрограммирования , то есть автоматизации самого процесса разработки на различных уровнях. Принципиально различается метапрограммирование внешнее по отношению к языку и доступное в самом языке. Фредерик Брукс [50] и Ч. Хоар [51] делают акцент на необходимости обеспечения концептуальной целостности информационных систем вообще и языков программирования в частности, чтобы в каждой части системы использовались сходные синтаксические и семантические формы и не требовалось осваивать помимо собственно состава системы также и правила её идиоматического использования. Хоар предсказывал, что сложность Ады станет причиной катастроф. Эти акценты призывают к использованию языков, воплощающих некое математическое исчисление, аккуратно адаптированное для того, чтобы быть более практичным языком для разработки реальных программ. Лишь некоторые языки попадают под эту категорию; большинство же языков проектируются приоритетно исходя из возможности эффективной трансляции в машину Тьюринга. Многие языки опираются на общие теории, но при разработке они почти никогда не проверяются на безопасность совместного использования конкретных языковых элементов, являющихся частными приложениями этих теорий, что неизбежно приводит к несовместимости между реализациями языка. Эти проблемы либо игнорируются, либо начинают преподноситься как естественное явление англ. Наличие математического обоснования для языка может гарантировать или, как минимум, обещать с очень высокой вероятностью некоторые или все из следующих положительных свойств:. Турчин [63] , достоинства всякого формализованного языка определяются не только тем, сколь он удобен для непосредственного использования человеком, но и тем, в какой степени тексты на этом языке поддаются формальным преобразованиям. Это открывает возможности почти произвольных автоматических преобразований программ [en]: С другой стороны, это означает полное отсутствие побочных эффектов , а это делает реализацию некоторых алгоритмов заведомо менее эффективной, чем при использовании изменяемого состояния. Для небольших и простых программ языки высокого уровня порождают машинный код большего размера и исполняются медленнее. Однако, для алгоритмически и структурно сложных программ преимущество может быть на стороне некоторых языков высокого уровня, так как человек физически не способен выражать сложные концепции с учётом их эффективного исполнения на языке машины. К примеру, существует бенчмарк , на котором MLton и Stalin Scheme [en] уверенно опережают GCC. Есть масса частных причин, по которым автоматическая оптимизация в ходе трансляции языков высокого уровня даёт в принципе более высокую скорость исполнения, чем сознательный контроль способа реализации на языках низкого уровня. Например, имеются достоверные данные о том, что автоматическое управление памятью более эффективно, чем ручное, уже только при использовании динамического метода см. Далее, для каждого микроконтекста необходимо распределить регистры с учётом минимизации обращения к памяти, а это требует решения задачи раскраски графа. Существует множество стратегий автоматической оптимизации. Некоторые универсальны, другие могут быть применимы лишь к языкам определённой природы, а некоторые зависят от способа использования языка. Хотя компиляторы многих языков осуществляют оптимизацию хвостовой рекурсии при определённых условиях, лишь некоторые языки способны семантически гарантировать оптимизацию хвостовых вызовов в общем случае. Стандарт языка Scheme требует , чтобы всякая реализация гарантировала её. Для многих функциональных языков она в принципе применима, но лишь оптимизирующие компиляторы её выполняют. Языки высшего порядка в большинстве случаев вынуждены исполняться медленнее, чем языки первого порядка. Причины лежат как в самой декомпозиции линейного кода на цепочку вложенных вызовов, так и в вытекающих особенностях низкоуровневого представления функций см. Однако, существуют техники агрессивной оптимизации программ , позволяющие редуцировать языки высшего порядка до языков первого порядка см. Один язык может отнимать наибольшее количество человеко-часов, на другом написано наибольшее число строк кода, третий занимает наибольшее процессорное время, а четвёртый наиболее часто служит исследовательской базой в академических кругах. Некоторые языки очень популярны для конкретных задач. Другие языки регулярно используются для создания самых разнообразных приложений. Существуют различные метрики для измерения популярности языков, каждая из которых разработана с пристрастием к определённому смыслу понятия популярности:. Например, язык Кобол входит в число лидеров по количеству написанных на нём строк кода, но причиной этому является крайне низкий показатель модифицируемости кода, что делает этот код не повторно используемым , а legacy-кодом [en]. Как следствие, поддержка программ на Коболе в кратковременной перспективе обходится значительно дороже, чем программ на большинстве современных языков, но переписывание их с нуля потребовало бы значительных единовременных вложений, и может сравниваться только с долговременными расходами. Техническое несовершенство Кобола обусловлено тем, что его разрабатывали без привлечения экспертов в области информатики. Материал из Википедии — свободной энциклопедии. Подробнее по этой теме см. Языки программирования с ключевыми словами не на английском. Этот раздел не завершён. Вы поможете проекту, исправив и дополнив его. Практически невозможно обучить хорошему программированию студентов, имевших опыт работы с Бейсиком: It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: Рост сложности любой программной системы принципиально ограничен тем пределом, до которого ещё можно сохранять контроль над ней: Станет чрезвычайно тяжело дорабатывать его или исправлять ошибки, и от каждой корректировки можно ждать введения новых ошибок из-за этого неполного знания. There is a fundamental limit to complexity of any software system for it to be still manageable: Архивировано 22 августа года. History of programming languages PDF. Проверено 5 октября Архивировано 10 мая года. IBM Punch Cards Columbia University Computing History. History of Programming Languages , Academic Press, , chapter XIV. Сопоставление с образцом, с. Programming Language Usage Graph. Проверено 21 июня American Scientist 94 4: Mini-Bibliography on Modules for Functional Programming Languages. Проверено 27 сентября Проверено 16 января Проверено 28 декабря Связывание и время связывания, с. First and second class objects. First and second class objects, с. A Pragmatic Guide to Learning Programming Languages. Systems Programming with Modula Prentice Hall, Englewood Cliffs, Эквивалентные преобразования программ на РЕФАЛе: The Measured Cost of Conservative Garbage Collection. Conner 14 May Computerworld International Data Group 18 Computerworld 4 October Проверено 27 апреля Страницы, использующие волшебные ссылки ISBN Википедия: Запросы на замену перенаправлений переводами Википедия: Статьи с незавершёнными разделами Википедия: Нет источников с января Википедия: Статьи без источников тип: Статьи с утверждениями без источников более 14 дней Статьи с неизвестными терминами Статьи, требующие уточнения источников Википедия: Нет источников с декабря Навигация Персональные инструменты Вы не представились системе Обсуждение Вклад Создать учётную запись Войти. Пространства имён Статья Обсуждение. Просмотры Читать Править Править вики-текст История. В других проектах Викисклад Викиучебник Викиновости. Эта страница последний раз была отредактирована 8 июля в Текст доступен по лицензии Creative Commons Attribution-ShareAlike ; в отдельных случаях могут действовать дополнительные условия. Свяжитесь с нами Политика конфиденциальности Описание Википедии Отказ от ответственности Разработчики Соглашение о cookie Мобильная версия. Императивная контрастирует с декларативной Процедурная Структурная Аспектно-ориентированная Объектно-ориентированная Агентно-ориентированная Компонентно-ориентированная Прототипно-ориентированная Обобщённое программирование Декларативная контрастирует с императивной Чистота языка Чистота функции Функциональная В терминах Рефал-машины Аппликативная Комбинаторная Бесточечная чистая конкатенативная Логическая Ограничениями Конкатенативная Векторная [en] Метапрограммирование Языково-ориентированная Предметно-ориентированная Пользователями [en] Автоматизация процесса программирования Рефлексивность Гомоиконность Связанные темы Программирование в крупном и мелком масштабе [en] Модульность Полиморфизм Продолжения и CPS Параллелизм и конкурентность Методы и алгоритмы Автоматное Динамическое Потоков данных Событийно-ориентированное Реактивное Сервис-ориентированное.


Норматив достаточности банка
Сколько платить алименты если не работаешь официально
Где применяется программирование?
Сильно немеют руки по ночам
Александр костюнин рассказы
Стих на букву д для первого класса
Сколько стоит удаление горбинки на носу
Телефон не видит флеш карту
Заполните таблицу современная западная философия
На телефоне вылезает реклама что делать
Сузуки гранд витара 2001 технические характеристики
Сколько стоит ведущий на корпоратив
Язык программирования
Кинотеатр курган расписание сеансов афиша
Где в реестре ассоциации файлов
Сколько сигарет можно ввозить в доминикану
Синема на академической кинотеатр расписание
Где сделать узи в армавире
Какой язык программирования выбрать?
Как сделать ремонт 12 кв м
Спутниковая карта дивноморское
Проблематика рассказов горького
Приказ минстроя 1039 от 30.12 16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment