- •Введение
- •1. История создания
- •2. Архитектура unix систем
- •2.1 Ядро системы
- •1. Файловая подсистема
- •3. Подсистема ввода/вывода
- •2.2 Файловая подсистема
- •2.3 Подсистема управления процессами
- •3. Работа с операционной системой unix
- •3.1 Файлы и файловая система
- •3.2 Структура файловой системы unix
- •2.4 Подсистема ввода/вывода
- •3.3 Процессы
- •3.4 Программы и процессы
- •3.5 Типы процессов
- •3.6 Пользователи системы
- •4. Пользовательская среда unix
- •4.1 Командный интерпретатор shell
- •5 Основные стандарты
- •6.1 Поддерживаемые языки программирования
- •6.1.1 Язык c
- •6.1.2 Фортран
- •6.1.3 Паскаль
- •6.1.4 Ассемблер
- •6.2 Специализированные языки программирования
- •6.3.1 Отличия от языка с
- •6.3.2 Достоинства
- •Заключение
- •Список использованных источников
6.1.4 Ассемблер
Этот язык наиболее близок к аппаратуре и поэтому является машинно-зависимым и не является мобильным. Необходимость программирования на ассемблере возникает, как правило, при невозможности воспользоваться языками высокого уровня.
6.2 Специализированные языки программирования
Кроме описанных языков программирования, в ОС UNIX имеются спе- циализированные языки, перечисленные ниже.
6.2.1 awk(1)
awk(1) (буквы в названии языка представляют инициалы его авторов) отыскивает во входном файле строки, соответствующие шаблону, описанному в файле спецификаций. Найдя такую строку, awk выполняет действия, также заданные в файле спецификаций. Зачастую программа из двух строк на awk может сделать то же, что и программа на две страницы на таких языках как C или Фортран. В качестве примера рассмотрим следующую задачу. Пусть имеется множество записей, состоящих из двух полей, первое из которых является ключом, а второе содержит число. Требуется каждую группу записей с одним и тем же ключевым значением заменить одной записью с тем же ключом и с числом, равным сумме чисел во всех записях группы. Таким образом, в результирующем наборе записей уже не будет совпадающих значений ключа. Если предположить, что исходный набор записей отсортирован по ключевому полю, то алгоритм решения задачи может выглядеть, например, так:
Прочитать первую запись в рабочую область.
Читать записи, пока не встретится признак конца файла (EOF); при этом:
Если ключ текущей записи совпадает с ключом записи в рабочей области, прибавить к числу в рабочей области число из текущей записи. В противном случае добавить запись из рабочей области к результату и поместить в рабочую область текущую запись.
Если достигнут конец файла, добавить к результату последнюю запись из рабочей области.
Программа на awk, выполняющая те же действия, может быть, например, такой:
{ qty[$1] += $2 }
END { for (key in qty) print key, qty[key] }
Отметим, что в отличие от описанного выше алгоритма, для этой программы не требуется, чтобы входной файл был отсортирован.
6.2.2 lex(1)
С помощью lex(1) можно сгенерировать C-программу, которая распознает во входном потоке регулярные выражения, специфицированные пользователем, после чего выполняет некоторые действия, также заданные пользователем, и формирует выходной поток для следующей программы.
6.2.3 yacc(1)
С помощью yacc(1) можно сгенерировать C-программу для выполнения синтаксического анализа входного потока согласно правилам, заданным в файле спецификаций. Кроме описания грамматики, этот файл содержит описания действий, которые должны быть выполнены, когда лексемы во входном потоке сопоставляются с тем или иным правилом грамматики. Для выделения лексем во входном потоке удобно использовать lex.
6.2.4 m4(1)
m4(1) - это макропроцессор, который можно использовать как препроцессор для языка ассемблера и C.
6.2.5 bc(1) и dc(1)
bc(1) позволяет использовать терминал как программируемый калькулятор. С помощью bc можно выполнить арифметические вычисления, специфицированные в файле или поступающие со стандартного ввода. В действительности bc является препроцессором к dc(1). Можно пользоваться непосредственно dc, но это трудно, поскольку он работает с обратной польской записью.
6.2.6. curses(3X)
Хотя в действительности это библиотека C-функций, curses(3X) упоминается здесь, поскольку его функции можно рассматривать как подъязык для выполнения операций с экраном терминала. Если писать программы, предполагающие организацию экранного интерфейса с пользователем, будет полезно знать возможности этого пакета.
Так почему, имея такой выбор средств программирования, лучше отдать предпочтение языку С++?
6.3 Особенности языка С++
C++ — компилируемый статически типизированный язык программирования общего назначения. Поддерживает такие парадигмы программирования как процедурное программирование, объектно-ориентированное программирование, обобщенное программирование, обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции. Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.
Название «C++» происходит от названия языка C, в котором унарный оператор ++ обозначает инкремент переменной.
Являясь одним из самых популярных языков программирования, C++ широко используется для разработки программного обеспечения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр). Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Borland C++ Builder и другие.
Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.
В книге «Дизайн и эволюция C++» Бьёрн Страуструп описывает принципы, которых он придерживался при проектировании C++. Эти принципы объясняют, почему C++ именно такой, какой он есть. Некоторые из них:
Получить универсальный язык со статическими типами данных, эффективностью и переносимостью языка C.
Непосредственно и всесторонне поддерживать множество стилей программирования, в том числе процедурное программирование, абстракцию данных, объектно-ориентированное программирование и обобщённое программирование.
Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно.
Максимально сохранить совместимость с C, тем самым делая возможным лёгкий переход от программирования на C.
Избежать разночтений между C и C++: любая конструкция, допустимая в обоих языках, должна в каждом из них обозначать одно и то же и приводить к одному и тому же поведению программы.
Избегать особенностей, которые зависят от платформы или не являются универсальными.
«Не платить за то, что не используется» — никакое языковое средство не должно приводить к снижению производительности программ, не использующих его.
Не требовать слишком усложнённой среды программирования.
Язык С сконструирован таким образом, что позволяет писать эффективные программы и транслировать их в эффективный машинный код.
