itkvariat

    Вольный обзор языков программирования



    Программирование – одна из сложнейших областей человеческой деятельности. Эта сфера постоянно развивается, включая все новые и новые технологии, платформы, языки. Считается, что до сегодняшнего дня создано, порядка 8500 языков программирования. И хотя принципы их построения во многом схожи, реализация, синтаксис, модели работы и возможности могут отличаться кардинально. Особенностям разных языков их устройству, истории, сферам применения и посвящен этот обзор. Автор не претендует на полноту и концептуальность, но включил в материал некоторое количество технических деталей и решений, которые могут показаться интересными.


    Языки древние


    Основным отличием языков старых от новых является как правило, наличие или отсутствие объектно-ориентированной модели (ООП). У языков старых, таких, как Cobol, Algol 68 и самых старых, вроде послевоенного немецкого «Планкалкюля», советского РЕФАЛА и других её нет.


    По многим причинам множество старых языков не используются. Из них пожалуй, только язык С, нашел применение. Он стал стандартом де-факто в программировании микроконтроллеров и других небольших устройств. С используется и в учебном процессе, в основном, для изучения модели его работы, так как он лежит в основе многих современных языков программирования, скриптовых и интерпретируемых языков таких, как С#, Java, jаvascript, PHP.


    Мои слова о том, что старые языки забыты окончательно, в определенном смысле спорны. К примеру, в США очень много старого софта на Cobol, который до сих пор нуждается в поддержке и там программистам, хорошо знающим этот язык, живется совсем неплохо. Им, говорят, даже платят двойную ставку.


    Cobol, на самом деле, язык интересный – создатели пытались приблизить его к обычному разговорному английскому, поэтому синтаксис его выглядит непривычно. Вместо стандартной сегодня «сишной» точки с запятой, в конце строки ставится точка.


    BEGIN.
    DISPLAY “Hello World!”.
    STOP RUN.
    Вот как выглядит проверка на число на языке Cobol:
    IF WS-A IS NUMERIC
    MOVE WS-A TO WS-B
    ELSE
    DISPLAY “Error!”
    END-IF.


    Здесь любой программист поймет, что если в ячейке WS-A число, то его надо занести в ячейку WS-B, иначе вывести на консоль слово Error. Понять можно. Правда, известный разработчик алгоритма поиска в матрице Эдгар Дикстра считал, что «Использование Кобола калечит разум; его преподавание должно приравниваться к уголовному преступлению». Что-ж, ему было, наверное, виднее.

    Как бы там ни было, но объектно-ориентированной модели в Коболе, конечно, не было. Как не было её и во многих других, действительно, забытых языках, таких, как Eiffel, например. Слышал кто-нибудь? А ведь хорошая была штука, простая, как «грабли» и даже изящная.

    Эти пару слов се позволяет создавать неограниченно широкий набор циклов.


    Цикл «пока». Смотрите:


    Цикл for
    from
    начальная инициализация
    until
    условие выхода из цикла
    loop
    тело цикла
    end
    Цикл while
    until
    условие выхода из цикла
    loop
    тело цикла
    end
    


    Монстром выглядит в этой когорте язык С, который послужил прототипом многих современных языков программирования. Привычные всем if…else, while, for, главная функция main, символы операций, знакомы сегодня каждому студенту любого технического вуза.


    Языки объектно-ориентированные


    К слову, многие языки программирования, например Fortran или Pascal впоследствии были доработаны под ООП. Допустим, С преобразовали в С++, способный весьма широко оперировать объектно-ориентированной моделью и до сих пор широко распространенный.

    Многие языки продолжали совершенствоваться, обрели собственные, весьма сложные визуальные среды проектирования, которые позволяли создавать программы с помощью перетаскивания нужных элементов, как «кирпичиков», мышью на панель и некоторого знания синтаксиса. Так было с Pascal, который стал Object Pascal и получил великолепную среду разработки (IDE) Borland Delphi. К сожалению, IDE Delphi перестала развиваться. По какой причине — сложно гадать.


    Итак, Pascal пополнил ряды учебных языков. А какие же языки составляют основу современного программирования? Их немало. Начнем с уже упоминавшегося С++ - современной, объектно-ориентированной версии С. Его особенность состоит в возможности контролировать выделение памяти и работать с данными на низком уровне. Это универсальный язык, на котором можно писать все – от огромных программных комплексов до небольших утилит или драйверов. С++ - кроссплатформенный язык. Компиляторы С++ есть для любой ОС. На С++ проще достичь максимального быстродействия программы – инеженер-кодер может контролировать все её элементы.


    Правда, с С++ необходимо быть внимательным. Перефразируя того же Страуструппа, если в С вы просто стреляете себе в ногу, то в С++ вы неожиданно создаете дюжину экземпляров самого себя и всем простреливаете ногу. Медицинская помощь оказывается невозможной, поскольку вы не можете разобраться, кто из вас настоящий, а кто просто указывает на других и говорит «Вот он я».


    Страуструпп вел речь о множественном наследовании, которое во многих языках запрещено. В чем тут состоит проблема, можно объяснить и «на пальцах». Допустим, вы создаете спортивный «автомобиль», наследуя его из трех классов – собственно «транспортное средство», «кабриолет» и «двухместный автомобиль». Неожиданно оказывается, что класс «двухместный автомобиль» обладает свойством «двухколесный». Ваша программа в этом месте закроется, а вы и знать не будете, в чем причина. Таких классов, содержащих противоречивые свойства и методы может быть множество. Вот тут и возникает проблема.


    Работа с памятью


    Языки, оперирующие моделью ООП можно условно разделить по возможности работать с памятью напрямую и её отсутствию. Ручное распределение памяти требует особого внимания и хороших знаний. Работа значительно упрощается, если компилятор языка сам занимается выделением памяти. В таком случае, в нем имеется особый зверь — Garbage Collection. Он очищает освободившуюся память от ненужного мусора. Это очень удобно для программиста, поскольку ему не нужно следить за тем, не занял ли он чего лишнего и не может ли это «лишнее» вызвать переполнение стека (за чем, в лучшем случае, последует аварийное завершение программы). Естественно, такая программа работать не будет, в какой-то момент она всегда будет «падать» и не так просто потом отыскать в ней ошибку. 


    Так вот, Garbage Collection (сборщик мусора) следит за ячейками памяти — объектными переменными, где находятся данные. И если к ячейке нет ссылок от других элементов программы (а их считает специальный счетчик, для каждой ячейки - свой) — он её удаляет. Другой подход — обход объектов, как ветвей «дерева». Если к «ветви» нет пути из ссылок — её объекты «мертвы». И она удаляется.


    Но мы не будем дальше углубляться в принципы работы сборщика мусора. Достаточно знать, что более-менее развитой системой подобного рода обладает любая современная платформа - С#, Java и даже упоминавшийся мною Eiffel. Но в языках С/С++ это невозможно, так как допустимо ручное изменение указателей на объекты, и автоматический их обход может вызвать лавину ошибок.


    А вот язык Modula-3 позволяет управлять памятью как в ручном режиме, так и при помощи сборщика мусора. Для этого там имеется две отдельных «корзины» или правильно «кучи», где находятся объекты. В зависимости от режима управления работает одна из них.


    Еще объектно ориентированные языки могут быть переносимыми или нет. Допустим, программу на языке С++ необходимо компилировать отдельно под Windows или Linux. А часто даже под конкретные их версии. Та же история с майкрософтовским языком C#.


    На Java программа, напротив, пишется 1 раз. А работает она везде, где есть виртуальные машины Java — их можно свободно установить и скачать для любой платформы, в том числе, для достаточно мощного мобильного телефона. Получается, что программисту не нужно делать двойную работу — виртуальная машина сама представит его программу, как надо и где надо.


    Перспективные языки программирования


    Сейчас достаточно много новых, интересных и перспективных языков программирования. Это Swift (Apple), Golang (Google), Erlang (мощнейший язык для распределенных систем), Расскажу об одном, который вызвал мой интерес. Это Haskell. Haskell - функциональный язык программирования. Он построен на взаимодействии функций при помощи, так называемых, монад — цепочек вычислений, которые позволяют четко структурировать программу и без классов.


    Можно, допустим, использовать такую монаду: сначала делаем первое вычисление — получаем результат, потом второе - снова ждем результат, запускаем третье и т. д. Либо же так: второе вычисление начинается, если в результате первого определенным образом изменились первоначальные параметры.


    Haskell довольно лаконичен и прост.

    Функция на Haskell:


    f x y = x*x + y*y
    На C:
    int f(int x, int y) {
    return x*x + y*y;
    }

    Haskell не имеет динамической типизации но там вполне можно объединять разные типы данных при помощи специальных конструкций. Функции в Haskell сами выводят наиболее общий тип, так что перегружать или переопределять их и даже, вообще, определять их тип не надо, а это упрощает работу. Integer в Haskell ограничен только размером оперативной памяти машины. Все функции языка принимают на вход только один аргумент, таким образом, чтобы передать два аргумента, нужно возвратить из функции другую функцию, которая и примет второй аргумент как параметр. Есть в этом языке и много других интересных «фич», о которых вы можете почитать и сами.


    Веб-программирование и его языки


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


    Сам модуль интерпретатора написан на С++ и встраивается во многие современные веб-сервера и во все операционные системы. Я когда-то изучал PHP, это довольно простой язык. 


    Вот как будет выглядеть на нем стандартный Hello World:


    <?= 'Hello, world!' ?> 


    И всего-то.


    Но за эту простоту приходится платить. Программы на PHP будут работать медленнее из-за того, что их код вначале проходит через модуль интерпретации. Кроме того, PHP, как и jаvascript, о котором пойдет речь ниже, нетипизированы (динамическая типизация). Поясню, о чем речь. В переменной или ячейке программы на таком языке может храниться что угодно – число, целое или дробное, строка или символ. В обычных, классических языках это запрещено и программа всегда знает, что она запрашивает у «ячейки-переменной». В нашем же случае вы можете получить оттуда самый неожиданный результат.


    $cell = 2; в ячейке – целое число
    $cell += "bold"; в ячейке 2bold

    Динамическая типизация – не редкость. Она встречается и в уже упоминавшемся мной Object Pascal.

    Веб-языков очень много. Но начинались они когда-то с Perl — языка структуризации отчетов для операционной системы UNIX. Этот язык был интерпретируемым, то есть, требовал для работы наличия в системе специального модуля. ООП не поддерживал. Был сложным:


    `$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=(
    $!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++;
    $_++;$_++;($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++
    ;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`

    Этот блок выводит всего одну строку текста «Just another Perl hacker». Известный в прошлом разработчик Джон Риббенс сказал о Перл: «PHP — это маленькое зло, созданное некомпетентными новичками, в то время как Perl — это большое и коварное зло, созданное умелыми, но извращёнными профессионалами.»


    Но в те годы никакого другого динамического языка, который позволял бы динамическую генерацию веб-контента, не было. Веб-мастерам приходилось изучать и использовать его. А через пару лет довольно запутанный и бедный графическими возможностями Perl заменили другие, более продвинутые ООП-языки.


    Вообще, в веб-программировании платформы довольно быстро набирают и теряют популярность. Еще не так давно был популярен фреймворк на языке Ruby — Ruby on Rails. На нем делали множество сайтов, в том числе даже всем известный Хабрахабр. Но понемногу его забросили. Во многом потому, что документации не хватало, поддержка запаздывала, технологически платформа стала отставать.

    В результате, сайтостроители пошли другими путями. А их сейчас достаточно, существуют огромные платформы — майкрософтовский DOT NET, например, Java и т. д., которые предлагают разработчикам широчайшие возможности.


    jаvascript, как тренд


    Популярными сегодня считаются различные «диалекты» jаvascript — веб-языка, созданного на базе Java за две недели и под пару бутылок виски программистом Бренданом Эйджем. История создания jаvascript довольно интересна. Вот что рассказывает сам Эйдж:

    «JS был обязан «выглядеть как Java», только поменьше, быть эдаким младшим братом-тупицей для Java. Кроме того, он должен был быть написан за 10 дней, а иначе мы бы имели что-то похуже JS.»


    «10 дней на то, чтобы сделать лексер, парсер, компилятор в байткод (bytecode emitter), интерпретатор, встроенные классы и декомпилятор.


    «Простите, времени было мало для того, чтобы сделать правильную оптимизацию хвостовой рекурсии. 10 дней почти без сна, чтобы сделать JS с чистого листа, заставить его «выглядеть как Java» (я сделал, чтобы он выглядел как C).”


    Как я понимаю, задача перед Эйджем ставилась серьезная — обогнать Майкрософт, который готовил свой собственный аналогичный продукт — VBScript. Программисты опасались, что Майкрософт внедрит в мировую веб-разработку нечто вроде PHP, только хуже и сложнее. В итоге, все получилось, как хотели Эйдж и его коллеги. Брендон Эйдж сегодня — уважаемый человек, 1 из 5 директоров Mozilla Foundation и действующий CTO Mozilla Corporation. А jаvascript, со временем, стал великолепной вещью, которая сильно изменила веб.

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


    Вздымающаяся нарисованная грудь какой-нибудь «дивы», отгибающиеся под указателем мыши странички сайта, машущий мечом при наведении курсора рыцарь — все это jаvascript. Существует серверный JS, который работает не в браузере, а выполняет все операции на сервере, не перегружая пользовательский компьютер.


    Вот простенький JS-скрипт, который меняет цвет шрифта при наведении на него курсора и нажатии кнопки мыши.


    <script>
    <!--
    document.getElementById('B').onmousedown=new
    Function("this.style.fontStyle='italic'; this.style.color='red';");
    document.getElementById('B').onmouseup=new
    Function("this.style.fontStyle=''; this.style.color='blue';");
    //-->

    Необычные языки программирования


    Есть языки программирования, которые могут поставить в тупик даже мэтра в этой сфере. Например, Brainfuck. Вот вам программа, которая выводит «Hello, world!»:


    ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
    .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
    ------.--------.>+.>.
    Вот такая же программа но на языке Whitespace:
    S S S T S S T S S S
    T
    S S S S S T T S S T S T
    T
    S S S S S T T S T T S S
    T
    S S S S S T T S T T S S
    T
    S S S S S T T S T T T T
    T
    S S S S S T S T T S S
    T
    S S S S S T S S S S S
    T
    S S S S S T T T S T T T
    T
    S S S S S T T S T T T T
    T
    S S S S S T T T S S T S
    T
    S S S S S T T S T T S S
    T
    S S S S S T T S S T S S
    T
    S S S S S T S S S S T
    T
    S S

    Что такое SQL?


    Часто слышу много споров о том, считать ли языком программирования SQL? Ведь фактически это язык запросов к серверу базы данных. Мы получаем, изменяем данные либо структурируем саму базу но ничего не программируем. Вот составной запрос с подзапросами, кто забыл, как это работает:


    SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
    (SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
    (SELECT имя_столбца FROM имя_таблицы WHERE условие));
    


    Как-то я задал компетентным специалистам вопрос, можно ли считать SQL языком программирования и вот что они ответили:


    SQL -- декларативный язык запросов и манипулирования данными в реляционных таблицах. В классическом варианте он не обладает полнотой по Тьюрингу, следовательно, на нём нельзя написать программу. Но Современный стандарт SQL включает рекурсивные выражения (WITH/CONNECT BY) и чисто теоретически это делает его настоящим языком программирования. То есть — считать или не считать SQL языком программирования — дело вкуса и интереса.


    Заключение


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


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


    А вот машинный код представляет собой набор цифр — 0 или 1, с помощью которых и «считает» сама машина. О машинных кодах, их видах и системах команд, которые они выполняют, мы поговорим в следующей статье.


    Эдуард ТРОШИН

    Компьютерная газета





    Подписывайтесь и читайте новости от ITквариат раньше остальных в нашем Telegram-канале !



    Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!  




    И еще об интересном...
  • LG G6: большой тест - обзор
  • МЭСМ – наша точка отсчёта
  • AppleTV: консоль, медиапроигрыватель или…
  • Материнская плата ASRock Fatal1ty H170 Performance/Hyper. Skylake опять можно разгонять
  • Java — великий и могучий
  • «Сапожник без сапог». SSD-накопитель Intel SSD 540s
  • Струйное многофункциональное устройство Canon PIXMA G3400


  • А что вы думаете? Напишите в комментариях!
    Кликните на изображение чтобы обновить код, если он неразборчив



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

    Полная версия правил

Самое популярное
    
Проверьте скорость вашего интернета!


Что бывало...
Наши друзья
Сервисный центр Five Service

Магазин кабелей и аксессуаров UGREEN

Самоклейкин

Смарт



Вольный обзор языков программирования



Программирование – одна из сложнейших областей человеческой деятельности. Эта сфера постоянно развивается, включая все новые и новые технологии, платформы, языки. Считается, что до сегодняшнего дня создано, порядка 8500 языков программирования. И хотя принципы их построения во многом схожи, реализация, синтаксис, модели работы и возможности могут отличаться кардинально. Особенностям разных языков их устройству, истории, сферам применения и посвящен этот обзор. Автор не претендует на полноту и концептуальность, но включил в материал некоторое количество технических деталей и решений, которые могут показаться интересными.


Языки древние


Основным отличием языков старых от новых является как правило, наличие или отсутствие объектно-ориентированной модели (ООП). У языков старых, таких, как Cobol, Algol 68 и самых старых, вроде послевоенного немецкого «Планкалкюля», советского РЕФАЛА и других её нет.


По многим причинам множество старых языков не используются. Из них пожалуй, только язык С, нашел применение. Он стал стандартом де-факто в программировании микроконтроллеров и других небольших устройств. С используется и в учебном процессе, в основном, для изучения модели его работы, так как он лежит в основе многих современных языков программирования, скриптовых и интерпретируемых языков таких, как С#, Java, jаvascript, PHP.


Мои слова о том, что старые языки забыты окончательно, в определенном смысле спорны. К примеру, в США очень много старого софта на Cobol, который до сих пор нуждается в поддержке и там программистам, хорошо знающим этот язык, живется совсем неплохо. Им, говорят, даже платят двойную ставку.


Cobol, на самом деле, язык интересный – создатели пытались приблизить его к обычному разговорному английскому, поэтому синтаксис его выглядит непривычно. Вместо стандартной сегодня «сишной» точки с запятой, в конце строки ставится точка.


BEGIN.
DISPLAY “Hello World!”.
STOP RUN.
Вот как выглядит проверка на число на языке Cobol:
IF WS-A IS NUMERIC
MOVE WS-A TO WS-B
ELSE
DISPLAY “Error!”
END-IF.


Здесь любой программист поймет, что если в ячейке WS-A число, то его надо занести в ячейку WS-B, иначе вывести на консоль слово Error. Понять можно. Правда, известный разработчик алгоритма поиска в матрице Эдгар Дикстра считал, что «Использование Кобола калечит разум; его преподавание должно приравниваться к уголовному преступлению». Что-ж, ему было, наверное, виднее.

Как бы там ни было, но объектно-ориентированной модели в Коболе, конечно, не было. Как не было её и во многих других, действительно, забытых языках, таких, как Eiffel, например. Слышал кто-нибудь? А ведь хорошая была штука, простая, как «грабли» и даже изящная.

Эти пару слов се позволяет создавать неограниченно широкий набор циклов.


Цикл «пока». Смотрите:


Цикл for
from
начальная инициализация
until
условие выхода из цикла
loop
тело цикла
end
Цикл while
until
условие выхода из цикла
loop
тело цикла
end


Монстром выглядит в этой когорте язык С, который послужил прототипом многих современных языков программирования. Привычные всем if…else, while, for, главная функция main, символы операций, знакомы сегодня каждому студенту любого технического вуза.


Языки объектно-ориентированные


К слову, многие языки программирования, например Fortran или Pascal впоследствии были доработаны под ООП. Допустим, С преобразовали в С++, способный весьма широко оперировать объектно-ориентированной моделью и до сих пор широко распространенный.

Многие языки продолжали совершенствоваться, обрели собственные, весьма сложные визуальные среды проектирования, которые позволяли создавать программы с помощью перетаскивания нужных элементов, как «кирпичиков», мышью на панель и некоторого знания синтаксиса. Так было с Pascal, который стал Object Pascal и получил великолепную среду разработки (IDE) Borland Delphi. К сожалению, IDE Delphi перестала развиваться. По какой причине — сложно гадать.


Итак, Pascal пополнил ряды учебных языков. А какие же языки составляют основу современного программирования? Их немало. Начнем с уже упоминавшегося С++ - современной, объектно-ориентированной версии С. Его особенность состоит в возможности контролировать выделение памяти и работать с данными на низком уровне. Это универсальный язык, на котором можно писать все – от огромных программных комплексов до небольших утилит или драйверов. С++ - кроссплатформенный язык. Компиляторы С++ есть для любой ОС. На С++ проще достичь максимального быстродействия программы – инеженер-кодер может контролировать все её элементы.


Правда, с С++ необходимо быть внимательным. Перефразируя того же Страуструппа, если в С вы просто стреляете себе в ногу, то в С++ вы неожиданно создаете дюжину экземпляров самого себя и всем простреливаете ногу. Медицинская помощь оказывается невозможной, поскольку вы не можете разобраться, кто из вас настоящий, а кто просто указывает на других и говорит «Вот он я».


Страуструпп вел речь о множественном наследовании, которое во многих языках запрещено. В чем тут состоит проблема, можно объяснить и «на пальцах». Допустим, вы создаете спортивный «автомобиль», наследуя его из трех классов – собственно «транспортное средство», «кабриолет» и «двухместный автомобиль». Неожиданно оказывается, что класс «двухместный автомобиль» обладает свойством «двухколесный». Ваша программа в этом месте закроется, а вы и знать не будете, в чем причина. Таких классов, содержащих противоречивые свойства и методы может быть множество. Вот тут и возникает проблема.


Работа с памятью


Языки, оперирующие моделью ООП можно условно разделить по возможности работать с памятью напрямую и её отсутствию. Ручное распределение памяти требует особого внимания и хороших знаний. Работа значительно упрощается, если компилятор языка сам занимается выделением памяти. В таком случае, в нем имеется особый зверь — Garbage Collection. Он очищает освободившуюся память от ненужного мусора. Это очень удобно для программиста, поскольку ему не нужно следить за тем, не занял ли он чего лишнего и не может ли это «лишнее» вызвать переполнение стека (за чем, в лучшем случае, последует аварийное завершение программы). Естественно, такая программа работать не будет, в какой-то момент она всегда будет «падать» и не так просто потом отыскать в ней ошибку. 


Так вот, Garbage Collection (сборщик мусора) следит за ячейками памяти — объектными переменными, где находятся данные. И если к ячейке нет ссылок от других элементов программы (а их считает специальный счетчик, для каждой ячейки - свой) — он её удаляет. Другой подход — обход объектов, как ветвей «дерева». Если к «ветви» нет пути из ссылок — её объекты «мертвы». И она удаляется.


Но мы не будем дальше углубляться в принципы работы сборщика мусора. Достаточно знать, что более-менее развитой системой подобного рода обладает любая современная платформа - С#, Java и даже упоминавшийся мною Eiffel. Но в языках С/С++ это невозможно, так как допустимо ручное изменение указателей на объекты, и автоматический их обход может вызвать лавину ошибок.


А вот язык Modula-3 позволяет управлять памятью как в ручном режиме, так и при помощи сборщика мусора. Для этого там имеется две отдельных «корзины» или правильно «кучи», где находятся объекты. В зависимости от режима управления работает одна из них.


Еще объектно ориентированные языки могут быть переносимыми или нет. Допустим, программу на языке С++ необходимо компилировать отдельно под Windows или Linux. А часто даже под конкретные их версии. Та же история с майкрософтовским языком C#.


На Java программа, напротив, пишется 1 раз. А работает она везде, где есть виртуальные машины Java — их можно свободно установить и скачать для любой платформы, в том числе, для достаточно мощного мобильного телефона. Получается, что программисту не нужно делать двойную работу — виртуальная машина сама представит его программу, как надо и где надо.


Перспективные языки программирования


Сейчас достаточно много новых, интересных и перспективных языков программирования. Это Swift (Apple), Golang (Google), Erlang (мощнейший язык для распределенных систем), Расскажу об одном, который вызвал мой интерес. Это Haskell. Haskell - функциональный язык программирования. Он построен на взаимодействии функций при помощи, так называемых, монад — цепочек вычислений, которые позволяют четко структурировать программу и без классов.


Можно, допустим, использовать такую монаду: сначала делаем первое вычисление — получаем результат, потом второе - снова ждем результат, запускаем третье и т. д. Либо же так: второе вычисление начинается, если в результате первого определенным образом изменились первоначальные параметры.


Haskell довольно лаконичен и прост.

Функция на Haskell:


f x y = x*x + y*y
На C:
int f(int x, int y) {
return x*x + y*y;
}

Haskell не имеет динамической типизации но там вполне можно объединять разные типы данных при помощи специальных конструкций. Функции в Haskell сами выводят наиболее общий тип, так что перегружать или переопределять их и даже, вообще, определять их тип не надо, а это упрощает работу. Integer в Haskell ограничен только размером оперативной памяти машины. Все функции языка принимают на вход только один аргумент, таким образом, чтобы передать два аргумента, нужно возвратить из функции другую функцию, которая и примет второй аргумент как параметр. Есть в этом языке и много других интересных «фич», о которых вы можете почитать и сами.


Веб-программирование и его языки


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


Сам модуль интерпретатора написан на С++ и встраивается во многие современные веб-сервера и во все операционные системы. Я когда-то изучал PHP, это довольно простой язык. 


Вот как будет выглядеть на нем стандартный Hello World:


<?= 'Hello, world!' ?> 


И всего-то.


Но за эту простоту приходится платить. Программы на PHP будут работать медленнее из-за того, что их код вначале проходит через модуль интерпретации. Кроме того, PHP, как и jаvascript, о котором пойдет речь ниже, нетипизированы (динамическая типизация). Поясню, о чем речь. В переменной или ячейке программы на таком языке может храниться что угодно – число, целое или дробное, строка или символ. В обычных, классических языках это запрещено и программа всегда знает, что она запрашивает у «ячейки-переменной». В нашем же случае вы можете получить оттуда самый неожиданный результат.


$cell = 2; в ячейке – целое число
$cell += "bold"; в ячейке 2bold

Динамическая типизация – не редкость. Она встречается и в уже упоминавшемся мной Object Pascal.

Веб-языков очень много. Но начинались они когда-то с Perl — языка структуризации отчетов для операционной системы UNIX. Этот язык был интерпретируемым, то есть, требовал для работы наличия в системе специального модуля. ООП не поддерживал. Был сложным:


`$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=(
$!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++;
$_++;$_++;($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++
;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`

Этот блок выводит всего одну строку текста «Just another Perl hacker». Известный в прошлом разработчик Джон Риббенс сказал о Перл: «PHP — это маленькое зло, созданное некомпетентными новичками, в то время как Perl — это большое и коварное зло, созданное умелыми, но извращёнными профессионалами.»


Но в те годы никакого другого динамического языка, который позволял бы динамическую генерацию веб-контента, не было. Веб-мастерам приходилось изучать и использовать его. А через пару лет довольно запутанный и бедный графическими возможностями Perl заменили другие, более продвинутые ООП-языки.


Вообще, в веб-программировании платформы довольно быстро набирают и теряют популярность. Еще не так давно был популярен фреймворк на языке Ruby — Ruby on Rails. На нем делали множество сайтов, в том числе даже всем известный Хабрахабр. Но понемногу его забросили. Во многом потому, что документации не хватало, поддержка запаздывала, технологически платформа стала отставать.

В результате, сайтостроители пошли другими путями. А их сейчас достаточно, существуют огромные платформы — майкрософтовский DOT NET, например, Java и т. д., которые предлагают разработчикам широчайшие возможности.


jаvascript, как тренд


Популярными сегодня считаются различные «диалекты» jаvascript — веб-языка, созданного на базе Java за две недели и под пару бутылок виски программистом Бренданом Эйджем. История создания jаvascript довольно интересна. Вот что рассказывает сам Эйдж:

«JS был обязан «выглядеть как Java», только поменьше, быть эдаким младшим братом-тупицей для Java. Кроме того, он должен был быть написан за 10 дней, а иначе мы бы имели что-то похуже JS.»


«10 дней на то, чтобы сделать лексер, парсер, компилятор в байткод (bytecode emitter), интерпретатор, встроенные классы и декомпилятор.


«Простите, времени было мало для того, чтобы сделать правильную оптимизацию хвостовой рекурсии. 10 дней почти без сна, чтобы сделать JS с чистого листа, заставить его «выглядеть как Java» (я сделал, чтобы он выглядел как C).”


Как я понимаю, задача перед Эйджем ставилась серьезная — обогнать Майкрософт, который готовил свой собственный аналогичный продукт — VBScript. Программисты опасались, что Майкрософт внедрит в мировую веб-разработку нечто вроде PHP, только хуже и сложнее. В итоге, все получилось, как хотели Эйдж и его коллеги. Брендон Эйдж сегодня — уважаемый человек, 1 из 5 директоров Mozilla Foundation и действующий CTO Mozilla Corporation. А jаvascript, со временем, стал великолепной вещью, которая сильно изменила веб.

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


Вздымающаяся нарисованная грудь какой-нибудь «дивы», отгибающиеся под указателем мыши странички сайта, машущий мечом при наведении курсора рыцарь — все это jаvascript. Существует серверный JS, который работает не в браузере, а выполняет все операции на сервере, не перегружая пользовательский компьютер.


Вот простенький JS-скрипт, который меняет цвет шрифта при наведении на него курсора и нажатии кнопки мыши.


<script>
<!--
document.getElementById('B').onmousedown=new
Function("this.style.fontStyle='italic'; this.style.color='red';");
document.getElementById('B').onmouseup=new
Function("this.style.fontStyle=''; this.style.color='blue';");
//-->

Необычные языки программирования


Есть языки программирования, которые могут поставить в тупик даже мэтра в этой сфере. Например, Brainfuck. Вот вам программа, которая выводит «Hello, world!»:


++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.
Вот такая же программа но на языке Whitespace:
S S S T S S T S S S
T
S S S S S T T S S T S T
T
S S S S S T T S T T S S
T
S S S S S T T S T T S S
T
S S S S S T T S T T T T
T
S S S S S T S T T S S
T
S S S S S T S S S S S
T
S S S S S T T T S T T T
T
S S S S S T T S T T T T
T
S S S S S T T T S S T S
T
S S S S S T T S T T S S
T
S S S S S T T S S T S S
T
S S S S S T S S S S T
T
S S

Что такое SQL?


Часто слышу много споров о том, считать ли языком программирования SQL? Ведь фактически это язык запросов к серверу базы данных. Мы получаем, изменяем данные либо структурируем саму базу но ничего не программируем. Вот составной запрос с подзапросами, кто забыл, как это работает:


SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
(SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
(SELECT имя_столбца FROM имя_таблицы WHERE условие));


Как-то я задал компетентным специалистам вопрос, можно ли считать SQL языком программирования и вот что они ответили:


SQL -- декларативный язык запросов и манипулирования данными в реляционных таблицах. В классическом варианте он не обладает полнотой по Тьюрингу, следовательно, на нём нельзя написать программу. Но Современный стандарт SQL включает рекурсивные выражения (WITH/CONNECT BY) и чисто теоретически это делает его настоящим языком программирования. То есть — считать или не считать SQL языком программирования — дело вкуса и интереса.


Заключение


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


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


А вот машинный код представляет собой набор цифр — 0 или 1, с помощью которых и «считает» сама машина. О машинных кодах, их видах и системах команд, которые они выполняют, мы поговорим в следующей статье.


Эдуард ТРОШИН

Компьютерная газета





Подписывайтесь и читайте новости от ITквариат раньше остальных в нашем Telegram-канале !



Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!  




И еще об интересном...
  • LG G6: большой тест - обзор
  • МЭСМ – наша точка отсчёта
  • AppleTV: консоль, медиапроигрыватель или…
  • Материнская плата ASRock Fatal1ty H170 Performance/Hyper. Skylake опять можно разгонять
  • Java — великий и могучий
  • «Сапожник без сапог». SSD-накопитель Intel SSD 540s
  • Струйное многофункциональное устройство Canon PIXMA G3400


  • А что вы думаете? Напишите в комментариях!
    Кликните на изображение чтобы обновить код, если он неразборчив



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

    Полная версия правил
    ITквариат (АйТиквариат) Powered by © 1996-2024