Главная > programming > Академические и промышленные языки программирования

Академические и промышленные языки программирования

В данной заметке я собрал языки программирования, которые необходимо знать, чтобы действительно стать профессиональным программистом и те, которые необходимы в реальной жизни. Я отдаю предпочтение Java, в вашем же случае это может быть C++, что-то из .NET, Common Lisp или что-то ещё.

Важно разделять языки программирования на группы для изучения и практического применения, так как подчас для оттачивания мастерства и расширения кругозора приходится изучать одни языки программирования, а использовать совсем другие. В качестве примера можно привести языки программирования Scheme и Common Lisp — они очень похожи, но начинать изучение функционального подхода лучше с «‘элегантной» Scheme, а использовать в промышленных системах уже «тяжеловеса» Common Lisp, к которому доступно несравненно больше библиотек, что подчас является ключевым аргументом при выборе языка для промышленной разработки.

Языки программирования, которые необходимо знать:

  1. С — процедурное программирование машины Тьюринга
  2. Scheme — основы функционального программирования
  3. Prolog — программирование на основе правил
  4. Smalltalk — основы ООП
  5. Forth — программирования на стековой машине
  6. OCaml — типизация
  7. Erlang — распределенное программирование
  8. Haskell — ленивое функциональное программирование

Языки программирования, на которых стоит писать промышленные системы:

  1. C — системное программирование
  2. Java — прикладное бизнес-программирование
  3. Erlang — распределенное программирование
  4. Haskell — прикладное ИИ-программирование
  5. SQL — реляционные базы данных
  6. Python/Ruby — скриптование, прототипирование и иногда пользовательские интерфейсы
  7. XML/DTD/XML Schema/RelaxNG/XSL — экспорт/импорт/преобразование данных
  8. HTML/JavaScript/Macromedia Flash/CSS — Веб-приложения

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

Реклама
Рубрики:programming
  1. Декабрь 13, 2006 в 11:07 дп

    Студентам:
    Ныне Форт забыт, однако все равно посмотрите его. Когда придет Ваше время писать очередную виртуальную машину, подумайте о стековой архитектуре. Форт — это одна из good things в программировании.

  2. ykud
    Декабрь 13, 2006 в 11:13 дп

    Q тоже стоит посмотреть, хотя чем он сильно от Haskell отличается, не скажу.

  3. Декабрь 13, 2006 в 12:32 пп

    Это наверное какой-то новый язык, по тем же, что я в списке привел доступно уйма документации, примеров…

  4. Декабрь 13, 2006 в 12:41 пп

    Я, честно сказать, испытываю определенную ностальгию по Лиспу. Даже вот как-то полгода назад интерпретатор написал на Дельфи. Прикрутил примитивные предикаты, управляющие нашей системой, в Лисп. Очень здорово получилось:
    OS>telnet remote-system 49800
    Connecting to remote-system…
    SYS%CON>(DIAG neigbors)
    ((HOST10 +OK)
    (HOST20 -BAD Connection failure))
    SYS%CON>(QUIT)
    Connection to remote host terminated.
    OS>

  5. Декабрь 13, 2006 в 12:48 пп

    И что самое интересное, благодаря причудливой лисповой скобочной нотации очень легко реализовать синтаксический анализатор и как следствие писать код, который модифицирует самого себя. Мало где такое есть. Кроме того фактически стирается разница между данными и кодом. Информация в чистом виде!

  6. Декабрь 13, 2006 в 1:55 пп

    Да! А написание начинки — это концентированный кайф! Поскольку все можно представить в виде списка со свойствами (например, с именами),
    обработка информации очень упрощается. Один раз написал — используй везде.

  7. Декабрь 15, 2006 в 10:29 пп

    Я бы сказал, что Haskell уделает python/ruby по части скриптования и прототипирования. Прикладное ИИ — узковато для него.

    А вот писать большие «промышленные» системы на хаскеле как-то боязно. С одной стороны, у языка все для этого есть. С другой стороны — методы, которыми в нем надо для этого пользоваться, скажем так «необычны» :). Хотя попробовать определенно стоит.

    Также меня, как человека в течение более двух лет делающего коммерческие программы на кемле, задело отсутствие его во втором списке :).

    И еще к первому списку стоит добавить Oz, хотя бы ради констрейнтсов. Хотя там кроме constraint programming есть еще и logic programming (Oz — убийца пролога 🙂 ), и распределенка не хуже эрланга, и dataflow concurrency, и объекты, и сам себя компилить умеет (first-class software components), и много чего еще. Короче, стоит посмотреть.

    А еще по Oz есть книжка «Concepts, Techniques, and Models of Computer Programming». И это, наверное, саме главое его преимущество, как учебного языка. Ибо книга уровня SICP.

  8. Декабрь 16, 2006 в 8:32 дп

    Я все же не очень крут в языках программирования и реально писал только на Assembler/Pascal/C/C++/Java/Python, т.е. преимущественно на Ada-подобных языках. С такими же языками как Scheme/Common Lisp/Prolog/Smalltalk/Ruby знаком «шапочно». Об остальных же больше сужу по высказываниям.

    Тем не менее, что касается списка языков для обучения, я старался перечислить там классические языки, т.е. сформировать некий базис, из которого выводится любой другой язык. Именно этим они и ценны — конструкциями, идеями. Oz все же более новый язык и многогранный, для обучения это может быть тяжело. То ли дело Prolog — классическая процедурная семантика нахождения цели путем поиска по дереву в глубину, пускай прямолинейно, пускай устарело, но для обучения самое оно. Haskell, например, я не очень хотел включать в список, потому что он достаточно прогрессивный а для основ достаточно той же Scheme.

    C промышленным применением сложнее был выбор, на чем тока не пишут! Здесь наверное стоило ограничится общими словами и предупредить не путать некоторые изящные, но не доведенные до промышленного уровня языки, коими я считаю Scheme, Smalltalk, Oz, Mozart и другие.

    Резюмируя сказанное считаю что включать Oz в языки обучения излишне, а OCaml наверное рекомендовал бы к использованию, кроме того есть оптимизированные по производительности
    его реализации.

  9. Декабрь 17, 2006 в 2:54 дп

    Да, производительность у кемла действительно очень высокая — на уровне плюсов и выше. Это, кстати, в свое время и определило мой выбор его, как основного языка разработки. И только потом я случайно обнаружил, что вот уже год как не пользовался отладчиком 🙂 .

    А Oz в список включать возможно действительно не стоит, т.к. scheme+prolog+erlang по большей части покрывают Oz.

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

    Когда учат инженеров-конструкторов, вначале дают физику, математику, термех, сопромат и тмм, а уж потом детали машин. В программировании пока дают только детали машин (т.е. языки). В итоге большинство программистов похожи на монтеров (иногда с золотыми руками), которые знают огромную кучу деталей и машин, но врядли смогут сделать самолет. Спасает только то, что большинство программ похожи на унитазы и никакой rocket science им не требуется 🙂 .

    Иногда думаю, а как бы я хотел, чтобы меня учили программированию. Пока думаю так:
    * первый год — SICP — простенький язык и реализация всех отдельных фишек ручками без замороченной теории
    * второй год — CTM — реализация большей кучи фишек, не всегда ручками + несколько систематичный подход (EBNF, чуть семантики) + немного о других языках
    * третий год — тут пора поговорить о типизации, желательно с выводом теорем. практикум на ocaml или haskell
    * дальше — изучить C (видите какое убожество, зато какая производительность).

    Причем параллельно со всем этим должна идти теоретическая подготовка. Т.е. на момент ввода типизации, люди должны легко втыкать в typed lambda calculus . И вообще желательно, чтобы к концу обучения человек умел доказывать корректность программ.

    А уж про общий software engineering, психологию, основы управления и прочие фишки я уж даже боюсь подумать 🙂 .

  10. Декабрь 17, 2006 в 3:25 пп

    При обучения действительно важно учить основам компьютерных наук, без привязки к реализациям — это особенно ощущается у тех, кто заканчивал ВМиК МГУ. Поэтому, наверное надо 50/50 давать теорию и практику. К такому выводу я прихожу и анализируя свой курс обучения на физфаке МГУ, у нас было примерно 50/50 теоретических занятий и так называемых «практикумов».

    Тот же SICP — там очень неплохая подборка упражнений, которые можно использовать для закрепления полученных знаний. Жалко только, что в MIT решили использовать Python в качестве базового языка обучения вместо Scheme. Вот уж действительно недальновидный шаг! Хоть концепний в нем и достаточно, но они не навязаны к использованию и можно как и в C++ вечно писать в процедурном стиле и думать что это и есть настоящий ООП.

    P.S. На русском языке есть неплохой обзор функциональной парадигмы (Scheme + OCaml + Erlang + Prolog) — http://www.softcraft.ru/paradigm/dp/index.shtml.

  11. Декабрь 19, 2006 в 5:10 дп

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

    А с питоном вместо схемы — это они явно погорячились. Схема — идеальный язык для введения в программирования — в нем даже синтаксиса нет :). Только не понял, приняли они это окончательно или пока на стадии предложения.

  12. Январь 4, 2007 в 9:21 дп

    я сам не програмер, а студент. физфака 🙂 я юзаю питон и яву потому что там можно быстро и просто закодить что нить прикладное.

  13. C++ user
    Январь 30, 2007 в 4:43 пп

    Идиотская подборка. Вы что, хотите с такими знаниями найти работу? Может, есть шанс найти ее в каком-нибудь сверх академическом, оторванном от практики учебном заведении. Но современное проектирование систем предполагает использование объектно-ориентированного подхода и соответсвующих языков — это С++, Java, C#. Функциональное программирование почти нигде не востребовано, оно фактически вытеснено даже из своей вотчины — программирования в сфере ИИ. У меня бывший одногрупник ездил в командировку в Японию, там говорят, что времена, когда ИИ делали на Lisp’e, давно минули. Основным языком разработки ИИ является С++, Java — и еще, что меня удивило, Eiffel (самый объектно-ориентированный язык из существующих сегодня).
    Что представляет собой программа, написанная на функциональном языке программирования? Чудовищное сплетение функций, которые вызывают друг друга и самих себя. Когда я смотрел исходники на Хаскеле, я вспомнил свое детство, когда я писал «индусские» программы на С (без крестов). Адепты функционального программирования хотят представить, будто бы ФП — это некий новый подход, который принципиального отличается от всех остальных. Что ФП и процедурное прграммирование — вещи совершенно разные. Мы же, сторонники ООП, принципиальной разницы здесь не видим. Единственное, чем отличается ФП от процедурного программирования — это то, что принципиально запрещает состояние. Поэтому, по сути, С — язык функционального программиования с разрешением состояния. Само собой, тут есть много вытекающих следствий такие, как ленивые вычисления и т п, но это уже второстепенное обрамление.

    Существуют ли сегодня задачи, которые наиболее эфективно решаются не путем ООП? Нам это неизвестно. Анализ, проведенный специалистами IBM, показывает, что нет такой задачи, в решение которой объектно-ориентированный подход не привнес бы решающую простоту. Само собой, где-то оно более эффекивно более, где-то — менее, но оно ПОЛЕЗНО всегда.
    Большинство программистов, которые занимаются сегодня ФП — это либо те, кому не удалось осилить объектно-ориентированный подход, либо новички, которых смутили первые. Последних мне особенно жалко.

  14. C++ user
    Январь 30, 2007 в 5:03 пп

    «Да, производительность у кемла действительно очень высокая — на уровне плюсов и выше. Это, кстати, в свое время и определило мой выбор его, как основного языка разработки. И только потом я случайно обнаружил, что вот уже год как не пользовался отладчиком»

    Был у нас один, тоже говорил, что скорость OCaml’a не хуже, чем у С++. Благо, пришли асемблерщики из соседнего отдела и быстро его опустили. То, что генерит компилятор OCamle’a — до такого даже старый добрый Borland C++ не додумывался. Такой код ПРИНЦИПИАЛЬНО на intel p4 не может выполняться быстрее С++-кода, откомпилированного Intel C++ Compiler с оптимизацией SSE3.

  15. Январь 31, 2007 в 4:50 дп

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

    Если хотите найти работу, то достаточно выбрать подходящую для вас платформу, будь то J2EE или .NET для разработчика или Oracle или MS SQL для администратора баз данных. Если же писать игры, то C/C++ или тот же OCaml. Этот выбор будет зависит от интересующей области (http://russian.joelonsoftware.com/Articles/FiveWorlds.html).

    То что функциональные языки почти нигде не востребованы — это вы точно погорячились 😉 В области телекоммуникаций Erlang крайне востребован. Ruby постепенно отвоевывает позиции PHP в области Веб-строительства, а уж он как язык по сравнению с C/C++/C#/Java достаточно революционный.

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

    Я сам каждый день пишу промышленные системы на Java и поэтому лучше знаю процедурные и ООП подходы, но функциональные языки позволяют мне взглянуть на программирование под другим углом. Мне больше нравится аналогия, что на Тьюринговых языках (Ada/Pascal/C/C++/C#/Java…) удобно писать монолитные, жесткие системы, как пирамиды Хиопса, а на функциональных языках некое подобие живых организмов.

  16. Февраль 2, 2007 в 4:38 пп

    «То, что генерит компилятор OCamle’a — до такого даже старый добрый Borland C++ не додумывался. Такой код ПРИНЦИПИАЛЬНО на intel p4 не может выполняться быстрее С++-кода, откомпилированного Intel C++ Compiler с оптимизацией SSE3.»

    Очень интересно было бы услышать, как SSE3 может увеличить скорость работы со строками, алгебраическими типами данных или сборку мусора? Если вы говорите только про числодробильню, то да — Intel C++ (а лучше фортран) действительно крут. Он и gcc делает. Только вот в большинстве программ не так много числодробильни.

    В окемле можно писать высокоуровневые программы практически без потерь производительности. В С++ с этим туго. В окемле очень дешевый вызов функции; почти бесплатные эксепшны (на них даже логику можно делать); очень хорошая работа с памятью — нет фрагментации памяти, очень быстрое выделение и освобождение (вы знаете, сколько в С++ стоит malloc/free? а при сильно фрагментированной памяти?). Также в кемле все структуры данных неявно передаются через указатели, т.е. невозможно случайно передать их по значению и нет никакого геморроя с возвратом из функции большой структуры памяти.

    Так что, для большинства задач, окемл работает лучше чем плюсы. Спросите своих ассемблерщиков, сколько стоит в С++ создать и уничтожить std::string, std::vector и т.д. В окемле это практически бесплатные операции.

  17. Февраль 2, 2007 в 5:38 пп

    Сделал простую проверку: создаем и удаляем строку миллиард раз.

    ocaml:
    let _ =
    for i = 0 to 1_000_000_000 do
    String.copy “asdf”
    done

    c++:
    #include <string>

    int main()
    {
    for ( int i = 0; i < 1000000000; i++ )
    {
    std::string t( “asdf” );
    }
    }

    В итоге:
    ocaml — 0m42s
    c++ — 3m57s
    c++/O3 — 3m26s

    Т.е. на кемле можно легко создавать и удалять объекты, и писать более высокоуровневый код (более функциональный) не парясь о производительности.

  18. Февраль 3, 2007 в 11:14 дп

    Попробовал тоже самое на Java 1.5.0_11:


    package com.wordpress.dulanov;

    public final class ObjectCreationMeasure {

    public static void main(String[] args) {
        long startMilliseconds = System.currentTimeMillis();
        for (int i = 0; i < 1e9; i++) {
            new String("asdf");
        }
        long endMilliseconds = System.currentTimeMillis();
        System.out.println("Overal calculation time: " + (endMilliseconds - startMilliseconds) / 1000. + " sec");
        }
    }

    Java HotSpot Client VM: 31.946 sec
    Java HotSpot Server VM: 23.213 sec

    Пускал на ноутбуке ASUS MNe6 (WinXP SP2/1.7GHz Centrino/1Gb).

    P.S. Сравнение Java с OCaml: http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=java&lang2=ocaml

  19. Февраль 3, 2007 в 5:49 пп

    Прикольно, у Java дела с памятью обстоят даже лучше чем у ocaml. Хотя есть подозрение, что там что-то с оптимизировалось, а м.б. и нет.

    Так что немного расширяем предыдущий вывод: на любом языке с нормальной сборкой мусора (не reference counting) любая достаточно большая программа в среднем будет работать быстрее чем плюсы (и другие языки с ручным управлением памяти). Не говоря уже о том, что она будет выше уровнем и быстрее напишется.

    А если очень хочется производительности, то никто не мешает использовать плюсы для критических мест (что я иногда и делаю). Только этих критических мест не так много.

    PS. Я пускал на Win2003 Server SP1/2.2GHz Athlon 64 X2 4200+/2Gb. Так что разница должна быть еще больше.

  20. C++ user
    Июль 9, 2007 в 8:04 пп

    Признаю, насчет этого я и в самом деле ошибался:
    «Что представляет собой программа, написанная на функциональном языке программирования? Чудовищное сплетение функций, которые вызывают друг друга и самих себя. Когда я смотрел исходники на Хаскеле, я вспомнил свое детство, когда я писал “индусские” программы на С (без крестов).»

    Течет время, меняются взгляды… Поизучав Хаскель на досуге, понял, что на ФП нужно смотреть немного под другим углом. Раньше я вопринимал Haskell как «C без состояния». Сейчас мне этот язык даже нравится, хотя программировать на нем не собираюсь. А началось с того, что знакомый переписал небольшой проект на Scala…

  21. Июль 10, 2007 в 3:41 дп

    Чем меньше знаешь — тем большая уверенность в своей правоте и осведомлённости, это даже можно назвать СИМПТОМОМ СТУДЕНТА 😉 Только с опытом приходит более или менее реальное представление и чтобы этот день настал я и описал те языки и подходы которые заслуживают внимания.

    На твоём месте я не стал бы останавливаться на достигнутым и раз в год учил бы новый язык — это принцип LOTY (Language Of The Year) отсюда, как минимум это касается Scheme, Erlang, Smalltalk, Prolog, Forth. Ты увидишь программирование с разных точек зрения и постигнешь ДАО. Воспринимай это как базис в математики, каждый из этих языков добавит тебе новое измерение в образе мышления.

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

    Легко смотреть на программирование уже обладая определёнными навыками в функциональном или логическом программировании, но передать их или обьяснить практически нереально. Это как объяснить нам земным людям как хорошо живётся кому-то в пятимерном пространстве где каждое наше мгновение расщепляется на новое измерение — это надо пережить на собственном опыте, чтобы обогатить себя. А уж будете ли вы использовать это на практике — тут вам решать 😉

    Немог бы подробнее описать опыт знакомого со Scala? Я рассматриваю его как реальную альтернативу над JVM для своих рабочих проектов. Но ощущения двоякие — с одной стороны язык явно продуманее чем Java и позволяет писать более компонентный код, а с другой уж более навороченный, отдаёт от него академичностью.

    P.S. Я понимаю, что метафора математического базиса не совсем корректна в данном контексте (мы обычно программируем в одном стиле т.е. в одном измерении и просто проецируем это на другие по мере надобности и нельзя сказать что наш подход — это некая точка или область в многомерном пространстве), но лучшего примера привести не мог ;(

  22. Ant
    Февраль 26, 2009 в 8:22 дп

    А есть мнения, для чего был бы хорош, а для чего не очень такой швейцарский нож как Mozart? Разрабатывался-то он, как я понимаю, в академической среде… К демонстрации какой-то отдельно взятой парадигмы он не стремится. Не похоже, что основной интерес заключался именно в его разработке — комплектность у него — вполне достаточная для готовности к употреблению — редактор, компилятор, отладчик, профилировщик, Tcl/Tk… Кто-нибудь с ним близко знаком?

  23. TarasB
    Март 30, 2011 в 3:08 пп

    то что крестоплюсов в вашем списке промышленных языков нету — это понятно.
    а почему там нет Паскаля ?

  24. Март 30, 2011 в 3:22 пп

    Тарас, спасибо за юморной коммент.

  1. Февраль 27, 2007 в 5:05 пп

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: