Разрабатывался как средство эффективной обработки больших текстовых файлов script язык

Обновлено: 04.07.2024

Добрый вечер. Как наиболее быстро или просто возможно осуществить такую задачу:
Есть 2 огромных текстовых файла. В 1 - 70 млн строк, в 2 - 60 млн строк.
Задача - извлечь в файл 3 все строки из 1 файла которые не встречаются во 2. Тоесть извлечь все уникальные строки из первого по отношению ко второму файлу.

  • Вопрос задан более трёх лет назад
  • 933 просмотра

Решение "в лоб" вас по скорости уже не устраивает? Предполагаю, что оно решит задачу за минуты.

В лоб - это какое? Брать строку из файла 2 и сравнивать с каждой строкой из файла 1, а при несовпадении добавлять ее в файл 3?

Nubzilo: Читать из файла 2 все строки, добавлять в какой-то контейнер уникальные. Потом читать из файла 1 по строке и проверять что она есть в контейнере.

Честно говоря не совсем понял. В каждом из файлов все строки уникальные. Они могут быть не уникальные только по отношению друг к другу. Тоесть в файле 1 и в файле 2 могут быть одинаковые строки, но в самих файлах дублирования строк нет. Тоесть по сути нужно перебрать все 60 млн строк из второго файла, что б найти уникальные между первым файлом и вторым.

Nubzilo: А, если они гарантированно уникальные в каждом файле - даже не надо проверять перед помещением в контейнер. Читаете построчно файл2, кажду строку помещаете в "контейнер" в памяти. Потом читаете построчно файл1 и проверяете наличие прочитанной строки в "контейнере"

В таком способе смущает большое потребление памяти. Файл может быть и 50 млн строк и 120 млн.

Nubzilo: Объем файла в байтах какой? Пара гигов, думаю, влезет без проблем. Если больше - хэширование. MD5 со скоростью хэширования в районе 10MH/s дает хэши в 16 байт длиной. То есть 120M строк - 12 секунд хэшировать и около 2G памяти. Грубо говоря :-)

Nubzilo: Да не за что :-) Главное посмотреть объемы файлов, может оно там и не нужно.

С обьемами вы практически угадали. 80 млн - 2.8гб. Тоесть тут можно и без хеширования обойтись, но при возрастании до 150 млн лучше уже с ним )

Nubzilo: Если строки сильно различаются по длине - можно поискать порог для хэширования, но нужно учитывать размеры блоков хэшей (55 байт для MD5, например).

uvelichitel

Если строки короткие, то, в принципе, подойдёт такое решение:


Если длина строк неограничена, то могут возникнуть проблемы с расходом памяти. В этом случае, всё сильно усложняется. Вам, вероятно, придётся хранить набор хэш-кодов строк из второго файла и сравнивать с хэш-кодом каждой строки из первого. Но тут могут возникнуть ложно-положительные срабатывания, если у разных строк хэши будут совпадать. В этом случае, необходимо будет сравнивать строки посимвольно. Это при идеальной реализации. Впрочем, вероятность совпадения хэшей - 1/2^32. Ну, и надо умножить на 70 миллионов. Если задача позволяет добавить пару лишних строк в результирующий файл, я бы так и поступил.
Можно немного улучшить алгоритм с хэшами: если, например, использовать 256-битную хэш-функцию, а не стандартную (GetHashCode), можно снизить вероятность ложного срабатывания до 1e-77 (в случае использования SHA1). Думаю, такой мизерной вероятности будет достаточно, чтобы считать задачу решённой. Правда, придётся немного усложнить алгоритм сравнения хэшей - придётся сравнивать массивы.

В 17:13 поступил вопрос в раздел Информационные технологии, который вызвал затруднения у обучающегося.

Вопрос вызвавший трудности

Как средство эффективной обработки больших текстовых файлов разрабатывался script-язык:

Для того чтобы дать полноценный ответ, был привлечен специалист, который хорошо разбирается требуемой тематике "Информационные технологии". Ваш вопрос звучал следующим образом: Как средство эффективной обработки больших текстовых файлов разрабатывался script-язык:

После проведенного совещания с другими специалистами нашего сервиса, мы склонны полагать, что правильный ответ на заданный вами вопрос будет звучать следующим образом:

НЕСКОЛЬКО СЛОВ ОБ АВТОРЕ ЭТОГО ОТВЕТА:


Работы, которые я готовлю для студентов, преподаватели всегда оценивают на отлично. Я занимаюсь написанием студенческих работ уже более 4-х лет. За это время, мне еще ни разу не возвращали выполненную работу на доработку! Если вы желаете заказать у меня помощь оставьте заявку на этом сайте. Ознакомиться с отзывами моих клиентов можно на этой странице.

Зимина Анжиолетта Ильяовна - автор студенческих работ, заработанная сумма за прошлый месяц 63 922 рублей. Её работа началась с того, что она просто откликнулась на эту вакансию

ПОМОГАЕМ УЧИТЬСЯ НА ОТЛИЧНО!

Выполняем ученические работы любой сложности на заказ. Гарантируем низкие цены и высокое качество.

Деятельность компании в цифрах:

Зачтено оказывает услуги помощи студентам с 1999 года. За все время деятельности мы выполнили более 400 тысяч работ. Написанные нами работы все были успешно защищены и сданы. К настоящему моменту наши офисы работают в 40 городах.

Ответы на вопросы - в этот раздел попадают вопросы, которые задают нам посетители нашего сайта. Рубрику ведут эксперты различных научных отраслей.

Полезные статьи - раздел наполняется студенческой информацией, которая может помочь в сдаче экзаменов и сессий, а так же при написании различных учебных работ.

Красивые высказывания - цитаты, афоризмы, статусы для социальных сетей. Мы собрали полный сборник высказываний всех народов мира и отсортировали его по соответствующим рубрикам. Вы можете свободно поделиться любой цитатой с нашего сайта в социальных сетях без предварительного уведомления администрации.

Информационные технологии в профессиональной деятельности

В объектно-ориентированном программировании процедуры и функции, обеспечивающие все необходимые операции с данными: их чтение, преобразование, запись, называются

В объектно-ориентированном программировании совокупность данных определенного типа, передаваемых объектом-отправителем объекту-получателю, имя которого указывается, называется

В объектно-ориентированном программировании совокупность данных и методов их чтения и записи, которую можно изменять программно во время выполнения прикладной программы, называется

В объектно-ориентированном программировании совокупность данных и способов работы с ними называется

В объектно-ориентированном программировании типы, определяемые пользователем, называются

В языке Лисп выяснить значение свойства, связанного символом, можно с помощью функции

В языке Лисп головную часть списка возвращает функция

В языке Лисп для занесения значения в ячейку памяти, связанную с символом, можно пользоваться обобщенной функцией присваивания

В языке Лисп список из переданных в качестве аргументов головы и хвоста строит функция

В языке Лисп тождественность чисел различных типов проверяет функция

В языке Лисп хвостовую часть списка возвращает функция

Все Web-страницы написаны на языке или используют расширение языка

Инструментарий технологии программирования включает два типа средств для создания:

Информация о форме в Delphi хранится в двух файлах с расширениями

Как средство эффективной обработки больших текстовых файлов, генерации текстовых отчетов и управления задачами разрабатывался script-язык

Можно выделить два основных метода функционального программирования:

На автоматизацию рутинных процессов работы с абстрактными нетипизированными объектами ориентирован script-язык

Некорректную запись отдельных языковых конструкций с точки зрения правил их представления для выбранного языка программирования в программе представляют собой ___ ошибки

Определение и вычисление функции в языке Лисп основано на

Организационно-экономическая сущность задачи раскрывается на этапе технологического процесса разработки программ -

Основными частями среды программирования Delphi являются

Первый модуль программы в Delphi no умолчанию называется

Перевод описания алгоритма решения задачи на один из доступных для ЭВМ языков программирования выполняется на этапе технологического процесса разработки программ

Представителями процедурного подхода являются языки программирования

Присваивание нового свойства или изменение значения существующего в языке Лисп осуществляется с помощью функции

Связь источников информации с потребителями в CASE-технологии устанавливает диаграмма

Список в языке Лисп, в котором нет ни одного элемента, называется

Список в языке Лисп, в котором нет ни одного элемента, обозначается

Языки программирования, не зависящие от архитектуры компьютера, называются

CASE-технологии представляют специальные графические средства для изображения трех видов моделей

Актуализация данных в хранилищах данных (Data Warehouse) означает

Благодаря свойству классов - наследованию - новый класс может наследовать от родительского класса

В CASE-системах используется язык графического моделирования

В языке Лисп позволяют организовать последовательные вычисления из нескольких вычисляемых форм предложения

В языке Лисп при первом использовании символу должно быть присвоено или связано с ним некоторое значение с помощью функции

В языке Пролог предикаты с аргументами-константами, обозначающие отношения между объектами и свойства объектов, именованные этими константами, называются

В языке Пролог считаются всегда безусловно истинными и таким образом служат основой доказательства происходящего при выполнении программы

В языке Пролог хорновские фразы с заголовками и с одной или несколькими подцелями-предикатами называются

?) обеспечить совместимость программного обеспечения, разработанного на разных языках программирования

?) программировать без использования операторов и данных

?) проводить анализ правильности постановки и согласованности задач

?) свести программирование пользовательского интерфейса к простым и наглядным процедурам

Возможность взаимодействия с объектом, не зная, к какому конкретному классу он относится, называется

Первые скриптовые языки начали разрабатываться в 1960-ых годах с целью автоматизации процесса редактирования — компиляции — линковки — запуска при написании программ. Изначально их возможности были бедны - они просто избавляли от необходимости повтора нескольких команд, т. е.это были просто текстовые файлы, содержащие команды, которые обычно вводились операторами. Скрипты не требуют компиляции (преобразования в машинный код), а выполняются посредством интеграции в программное окружение.

Сетевые языки - языки, предназначенные для организации взаимодействия удаленных компьютеров в интенсивном интерактивном режиме, а поэтому они построены на принципах интерпретации, то есть построчной, интерактивной обработки строк программного кода, описывающего некоторый сценарий (скрипт) сетевого взаимодействия компьютеров, поэтому часто они называются скриптовыми языками, хотя скриптовые языки не обязательно являются сетевыми, к примеру, пакетные командные языки различных операционных сред.

Скриптовые языки применяются как для клиентского (JScript, VBScript), так и для серверного (PHP) программирования веб-сайтов.

Имеются и универсальные скрипт-языки (Perl, Python, Ruby, Tcl). Последние создавались для некоторых определённых целей, но со временем расширялись и применялись для всё более широкого круга задач (например, Perl изначально создавалася как язык обработки текста, но затем был значительно усовершенствован). Сейчас их уже называют не скриптовыми, а динамическими языками программирования, т.к. они позволяют определять типы данных и осуществлять синтаксический анализ и компиляцию «на лету» — на этапе выполнения программы. Такие языки удобны для быстрой разработки приложений.

Помимо упомянутых, к динамическим языкам относят также Smalltalk и JavaScript. Некоторыми динамическими чертами обладает и Visual Basic.

Технологии Perl, SSI, PHP предназначены для разработки динамических веб-сайтов и доступны на любой платформе.

Разделы страницы о сценарных языках программирования (скрипт-языках):

  • Виды сценарных языков
  • Справочники скриптовых языков и библиотеки веб-скриптов
  • Встроенные (прикладные) сценарные языки
  • Командно-сценарные языки (в т.ч. скрипт-оболочки для операционных систем):
    • Юникс-оболочка Shell
    • Язык CGI-программирования Perl
    • Язык функционального программирования Python
    • Контекстный интерпретатор REBOL
    • Интерпретатор Ruby
    • Сценарный интерпретатор R
    • Событийный язык прототипов Tcl
    • Язык Lua

    Виды сценарных языков

    Типы скриптовых языков:

    1. Языки обработки текста: AWK, Perl (последний изначально был таким, но затем был значительно усовершенствован и стал универсальным).
    2. Командные оболочки: AppleScript, sh, csh, bash. AppleScript в 2007 году встроен в Mac OS X.
    3. Языки для веб-разработки: серверные (PHP), клиентские (JavaScript - считающийся "встроенным" сценарным языком), универсальные (ниже).
    4. Универсальные (Perl, Python, Tcl, Ruby). Обычно эти языки создавались для каких-то конкретных целей, но со временем расширялись и применялись для всё более и более широкого круга задач (в т.ч. веб-разработки). Сейчас их уже называют "динамическими" языками программирования.
    5. Встроенные в прикладные программы (VBA, ActionScript). В прикладной программе скрипт — это программа, которая автоматизирует некоторую задачу, которую без сценария пользователь делал бы вручную, используя интерфес программы.

    Справочники скриптовых языков и библиотеки веб-скриптов

      HTML, CSS, PHP, Perl, JavaScript, Object Pascal. (обзоры и некоторые руководства по языкам скриптов: JS, VBS, Perl, PHP).

    Встроенные (прикладные) сценарные языки

    Сценарные языки этого типа начали появляться в 1980-е годы, когда на промышленных ПК стало возможным интерактивное общение с ОС. В клиент-серверной архитектуре такие языки работали в клиентской части программного обеспечения.

    Это такие языки как:

    • AutoLISP (диалект Лисп в САПРе AutoCAD),
    • ECMAScript и его диалекты (JScript и JavaScript, применяемые в клиентском веб-программировании, и ActionScript - язык API во Flash-анимации),
    • Emacs Lisp (диалект Лисп в текстовых редакторах Emacs),
    • ERM (ER-модель для описания концептуальной схемы предметной области),
    • Game Maker Language,
    • LotusScript,
    • MQL4 script,
    • UnrealScript,
    • VBA (Visual Basic for Application),
    • ВЯ 1С:Предприятие.

    Командно-сценарные языки (в т.ч. скрипт-оболочки ОС)

    Они появились ещё в 1960-х годах для управления заданиями в операционных системах (самый известный - JCL для OS/360). В этот класс входят языки пакетной обработки (англ. batch language) и языки командных оболочек, например sh (и его разновидности bash, csh, ksh) для Unix. Эти языки чаще всего используются в пакетном режиме обработки.

    Другие известные командно-сценарные языки:

    Юникс-оболочки Shell (sh, csh, bash)

    Bourne shell (часто sh по имени исполняемого файла) — ранняя командная оболочка UNIX, разработанная 1978 г. Стивеном Борном из Bell Labs и выпущенная в составе 7-го издания операционной системы UNIX (UNIX Version 7). Даннаяоболочка является де-факто стандартом и доступна почти в любом дистрибутиве *nix. Существует много командных оболочек, основанных (идейно или напрямую) на Bourne shell.

    C shell (csh) — командная оболочка UNIX со встроенным скриптовым языком, разработанная Биллом Джоем, активным разработчиком BSD UNIX, в 1979 году. Базировался на коде командного интерпретатора шестой версии UNIX. Скриптовый язык не уступает шеллу Борна по мощности, но отличается синтаксисом. В то время как Борн скопировал все основные операторы с языка Algol 68, Билл Джой использовал в качестве макета язык C, вероятно, руководствуясь своими предпочтениями и предпочтениями других пользователей BSD UNIX.

    Bash (от англ. Bourne again shell, каламбур «Born again» shell — «Возрождённый» shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Одна из наиболее популярных современных разновидностей командной оболочки UNIX. Особенно популярна в среде GNU/Linux, где она часто используется в качестве предустановленной командной оболочки. Bash — это акроним от Bourne-again-shell, «еще-одна-командная-оболочка-Борна». Название — игра слов: Bourne-shell — одна из популярных разновидностей командной оболочки для UNIX (sh), автором которой является Стивен Борн (1978), усовершенствована в 1987 году Брайаном Фоксом. Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка.

    Универсальные сценарные языки (общего назначения)

    Для человека с молотком любая проблема кажется гвоздем.

    Язык CGI-программирования Perl

    PHP — это малое зло, созданное некомпетентными любителями, а Perl — это громадное и хитроумное зло, созданное опытными и извращёнными профессионалами. (Jon Ribbens, программист)

    Два девиза Perl:

    1. есть больше одного способа сделать это;
    2. простые вещи должны быть простыми, а сложные вещи — возможными.

    Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка представляет собой аббревиатуру от Practical Extraction and Report Language («практический язык для извлечения данных и составления отчётов»). Сначала аббревиатура состояла из 5 символов и совпадала с английским словом pearl ("жемчужина"). А когда стало известно, что такой язык существует, букву «а» убрали.

    Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе реализованные при помощи регулярных выражений. Perl унаследовал много свойств от языков С, shell script, AWK.

    На сегодняшний день Perl стал неотъемлемым инструментом в инструментарии web-программистов. В отличии от таких технологий как JavaScript и VBScript, perl-скрипты выполняются на сервере [альтернатива PHP], что позволяет создавать полноценные интерактивные приложения, управлять базами данных, почтой, создавать баннерные сети, счетчики, гостевые книги, форумы и многое, многое другое.

    Perl прославился как язык, программы на котором очень сложно понять спустя 5 минут после написания. Обилие одно-двух-символьных функций и переменных делает своё дело. Текст больше похож на набор смайликов, чем на программу. Особенно, если в ней используются регулярные выражения. Perl — один из немногих языков, где регулярные выражения закреплены на уровне синтаксиса.

      Официальный сайт разработчиков Perl. Профессионально созданный сайт. Хорошо наполнен [!] . В т.ч. Ресурсы Perl.
    • Проект "Язык программирования Perl". Проект создан с целью помочь как начинающим так и профессионалам в разработке своих web приложений на Perl. Здесь Вы найдёте документацию и учебники по Perl, справочники [хорошие статьи разных авторов]. .

    Язык функционального программирования Python

    Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход. Одной из интересных синтаксических особенностей языка является выделение блоков программы с помощью отступов.

    Появился в: 1990 г. Автор(ы): Гвидо ван Россум. Испытал влияние: ABC, Modula-3, Lisp, Smalltalk, C, Java, Icon. Повлиял на: Ruby, Boo, Groovy, ECMAScript.

    Groovy - объектно-ориентированный язык программирования, разработанный для платформы Java как дополнение к языку Java с возможностями Python, Ruby и Smalltalk.

    Python (Питон) — высокоуровневый язык программирования общего назначения с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций. Python поддерживает несколько парадигм программирования [!], в т.ч. структурное, объектно-ориентированное, функциональное, императивное, аспектно-ориентированное.

    Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Python организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).

    Python пригодится в случаях, когда задачи, связанные с анализом данных, вплетаются в работу веб-приложений, или если статистический код требуется инкорпорировать в рабочую базу данных. Python, будучи полнофункциональным языком программирования, отлично подходит для реализации алгоритмов с их последующим практическим использованием. Обязательно установите NumPy /SciPy (научные вычисления) и pandas (манипуляции с данными), чтобы приспособить Python для анализа данных. Кроме того, обратите внимание на библиотеку matplotlib для создания графики и scikit-learn для машинного обучения.

    Контекстный интерпретатор REBOL

    REBOL (Ребол) — это высокоуровневый мета-язык. Основные концепции языка: скрипты (тексты), выражения, серии, блоки, файлы, функции, объекты, модули, порты, протоколы, синтаксический анализ, математика, ошибки, графика нижнего уровня, графические диалекты. Язык прост в понимании, ему можно учить школьников и немедленно начинать программировать. Но, одновременно, он достаточно мощный благодаря своей универсальности, а отдельные приемы и методологии могут быть предметом глубокого университетского курса.

    Интерпретатор Ruby

    Ruby - универсальный скрипт-язык для ООП, пришедшего на смену Perl + Python, и сочетающего также достоинства языков Smalltalk, Eifel, Ada, Java. Используется для быстрого программирования прототипов систем и в других областях.

    История языка Ruby началась в 1993 году, когда Якихиро Мацумото (известный как “matz”) взялся за реализацию собственного скриптового языка, который бы был таким же мощным и удобным, как Perl, и более объектно-ориентированным, чем Python [концептуально повлияли также языки искусственного интеллекта].

    Регулярные выражения — спасение от всех бед для одних и ночной кошмар для других разработчиков, а если говорить объективно, то это мощнейший инструмент, требующий, однако, большой осторожности при применении. Регулярные выражения (регексы, регекспы, регулярки) в языке Ruby основаны на синтаксисе Perl 5 и потому в основных чертах знакомы всем, кто использовал Perl, Python или PHP. Но Ruby тем и хорош, что каждый компонент языка реализован со своим собственным подходом, упрощающим использование данного инструмента и увеличивающим его мощность.

    Главная цель Ruby - эффективность разработки программ, и пользователи найдут, что программирование на нем эффективно и даже забавно. Этот язык хорошо приспособлен для таких проблемных областей, как обработка текста, программирование CGI и XML, программирование для сети, приложения с графическим интерфейсом, прототипирование и обучение программированию.

    Ruby – это тщательно сбалансированный язык. Его создатель, Yukihiro Matsumoto, соединил конструкции его любимых языков (Perl, Smalltalk, Eiffel, Ada и Lisp), чтобы сформировать новый язык, в котором функциональное программирование уравновешено императивным (процедурным). Он часто повторял, что он “старается сделать Ruby естественным, но не простым языком в том плане, как он отображает жизнь. Основываясь на этом, он добавляет: "Ruby прост на вид, но очень сложен внутри, подобно нашему человеческому телу."

    Порталы о языке Ruby

      [Хабр] Официальный сайт о языке Ruby. Ресурсы для применяющих Ruby.

    Обзоры и статьи о Ruby

    Сценарный интерпретатор R со статанализом и графопостроением

    R — интерпретируемый язык программирования, основным способом работы с которым является командный интерпретатор. Язык является регистрозависимым, в плане синтаксиса он похож, с одной стороны, на функциональные языки типа Scheme, с другой — на типичные современные сценарные языки, с простым синтаксисом и небольшим набором основных конструкций. Язык объектный: любой программный объект в нём имеет набор атрибутов — именованный список значений, определяющих его.

    В целом, как язык программирования, R довольно прост и даже примитивен. Его наиболее сильная сторона — возможность неограниченного расширения с помощью пакетов. В базовую поставку R включен основной набор пакетов, а всего по состоянию на 2019 год доступно более 15 316 пакетов. В R реализованы практически все актуальные средства универсальных статистических вычислений, такие как регрессионный анализ и анализ временных рядов, а также множество специфических алгоритмов для решения узкоспециализированных задач и исследований в отдельных областях.

    Ещё одна особенность языка — возможность создания качественной графики типографского уровня, которая может быть экспортирована в распространённые графические форматы и использована для презентаций или публикаций. Имеются готовые пакеты, связывающие R с GUI-фреймворками (например, основанными на Tcl/Tk) и позволяющие создавать специализированные утилиты статистического анализа с графическим интерфейсом пользователя и отображением результатов в виде графиков и диаграмм. Язык R просто создан для визуализаций. Обязательно ознакомьтесь с пакетами для визуализации ggplot2, ggvis, googleVis и rCharts.

    Событийный язык прототипов Tcl (Tool command language)

    Интерпретируемый язык программирования высокого уровня Tcl ориентирован преимущественно на автоматизацию рутинных процессов ОС и крупных программных систем, состоя из мощных команд, ориентированных на работу с абстрактными нетипизированными объектами.

    Принципиальное отличие Tcl от командных языков ОС состоит в независимости от типа системы и, самое главное, он позволяет создавать переносимые программы с графическим интерфейсом (GUI).

    Tcl (Tool Command Language — «командный язык инструментов», читается «тикль») — скриптовый язык высокого уровня. Tcl часто применяется совместно с графической библиотекой Tk (Tool Kit). Связку Tcl/Tk по-русски иногда называют «Так-тикль».

    Области применения языка — быстрое прототипирование, создание графических интерфейсов для консольных программ (пакетов программ), встраивание в прикладные программы, тестирование. Иногда Tcl применяется для создания CGI скриптов. Tcl, наряду с Perl и Python, стал одним из 3 классических скриптовых языков общего назначения. Эта троица фигурирует не только в качестве списка свободных дистрибутивов, собираемых в ActiveState, но и, например, как языки, на которых (помимо диалекта PL/pgSQL) можно писать триггеры и хранимые процедуры сервера БД PostgreSQL.

    Особенностью языка является отсутствие ключевых слов. Понятие команды в Tcl аналогично понятию процедуры или функции распространённых языков программирования. Это относится и к управляющим конструкциям языка. В сочетании с элементарным синтаксисом это обеспечивает хорошую расширяемость языка, в том числе и библиотеками, написанными на других языках, таких как C/C++ или Java.

    В Tcl также качественно реализована модель управления программой на основе событий. События могут генерироваться таймером, при появлении данных в канале, изменении значения переменной, при завершении какой-либо внешней программы, или просто при работе пользователя с интерфейсом Tk. Можно задавать свои события и управлять ими.

    Как и большинство современных скриптовых языков Tcl содержит развитые средства работы с регулярными выражениями, работает с ассоциативными массивами и другими динамическими структурами данных. В базовом Tcl нет поддержки ООП, однако существует множество расширений Tcl объектно-ориентированными механизмами, реализованных в виде подключаемых библиотек на С, или самом Tcl. Пространства имён поддерживаются на уровне ядра языка.

    На Tcl легко программировать в функциональном стиле: он обеспечивает такие механизмы, как функции высшего порядка и абстракции функций, хотя Tcl редко используют таким образом.

    Специальные сценарные языки

    Язык тиражирования Lua

    Lua ([лу́а], порт. «луна») — интерпретируемый язык программирования, разработанный подразделением Tecgraf (Computer Graphics Technology Group) Католического университета Рио-де-Жанейро (Бразилия). Интерпретатор языка является свободно распространяемым, с открытыми исходными текстами на языке Си. По возможностям, идеологии и реализации язык ближе всего к JavaScript, однако Lua отличается более мощными и гораздо более гибкими конструкциями [поэтому, несмотря на его изначально узкое предназначение, он считается уже языком общего назначения].

    Язык широко используется для создания тиражируемого программного обеспечения (например, на нём написан графический интерфейс пакета Adobe Lightroom). Также получил известность как язык программирования уровней и расширений во многих играх (в том числе World of Warcraft) из-за удобства встраивания, скорости исполнения кода и лёгкости обучения.

    Читайте также: