Чому при розробці одного продукту або частини програмного забезпечення використовується кілька мов програмування?


114

Я нещодавній студент, який мав на меті розпочати магістр з інформатики. Я натрапив на декілька проектів з відкритим кодом, які мене справді заінтригують та спонукають до участі в них (CloudStack, OpenStack, moby та Kubernetes). Я знайшов одне, що більшість із них є спільним - це використання декількох мов програмування (наприклад, Java + Python + Go або Python + C ++ + Ruby). Я вже розглядав це інше питання, яке стосується того, як кілька мов програмування зроблені для спілкування між собою: як взаємодіють два різних програмування з двома різними мовами?

Я хочу зрозуміти вимогу, яка спонукає підприємства використовувати декілька мов програмування. Яка вимога або тип вимоги змушує архітектора програмного забезпечення чи керівника проекту сказати: "Я пропоную використовувати мову X для завдання 1 та мову Y для завдання 2"? Я не можу зрозуміти причину того, що в одному і тому ж продукті або програмному продукті використовується кілька мов програмування.


14
Як студент-однокурсник з комп’ютерної інженерії, додам, що, зокрема, для коду дослідження , часто виникає питання про те, "яку мову автор (студент) краще знав, коли вони починали". Дослідницькі проекти, особливо одноразові, які не призводять до великих науково-дослідних проектів, як правило, оцінюють результати за «правильність» (на мій досвід).
tonysdg

16
@tonysdg: Я б сказав, що "правильність", як правило, є більш актуальною в наукових закладах, не менше. Що, як правило, не актуально - це ремонтопридатність, досвід користувача та / або документація. Зокрема, змішування мов впливає на збереження ремонту; це обмежує кількість кваліфікованих технічних працівників.
MSalters

2
@MSalters: Ремонтопридатність - це слово, яке, я думаю, шукав у той час --- я згоден з усім, що ви написали!
tonysdg

19
Різні інструменти для виконання різних завдань. Ви помітите, що будівельні архітектори та інженери використовують різні інструменти для побудови одного будинку.
Пол Д. Уейт

17
Коли ви їдете на відпочинок, від свого будинку до аеропорту, потім до закордонного аеропорту, потім до готелю, потім до пляжу, ви використовуєте один і той же вид транспорту для кожної ноги подорожі?
Гонки легкості на орбіті

Відповіді:


17

Ця відповідь має чудове висвітлення та посилання на те, чому різні мови можуть надати певні переваги проекту. Однак у тому, чому проекти закінчуються використанням декількох мов, є дещо більше, ніж просто відповідність мові.

Проекти з шести основних причин використовують декілька мов:

  1. Вигідні переваги повторного використання коду, написаного іншими мовами;
  2. Необхідність включення та розміщення застарілого коду;
  3. Наявність кодерів для певних мов;
  4. Потреба у спеціальних мовах для спеціальних потреб;
  5. Спадкові упередження мови; і
  6. Погане управління проектами (незаплановане багатомовне використання).

Причини 1-4 є позитивними причинами в тому сенсі, що звернення до них безпосередньо може допомогти проекту укластись швидше, ефективніше, з якіснішим продуктом та легшою довгостроковою підтримкою. Причини 5 і 6 негативні, симптоми стійкості до необхідних змін, поганого планування, неефективного управління або певного поєднання всіх цих факторів. На жаль, ці негативні фактори є поширеними причинами "випадкового" багатомовного використання.

Причина 1 , вигідна витрата на повторне використання, стала все більш вагомою причиною дозволити використання декількох мов у проекті, що пояснюється як більшою роллю програмного забезпечення з відкритим кодом, так і вдосконаленими можливостями пошуку потрібних компонентів коду в Інтернеті. Філософія "давайте кодимо все це внутрішньо" останніх десятиліть продовжує згасати перед економічними реаліями і, по суті, ніколи не є найбільш рентабельним підходом до будь-якого нового проекту. Це, в свою чергу, робить менш чіткими можливості для суворого дотримання використання однієї мови в рамках проекту.

Особливо у випадку, коли проект використовує добре керовані компоненти з відкритим кодом, використання декількох мов може забезпечити величезні загальні переваги за витратами, оскільки багаторазово використані компоненти приховані за добре розробленими інтерфейсами і незалежно підтримуються зовнішніми групами з нульовою вартістю. У найкращих сценаріях змішування мов за допомогою такого повторного використання не є більш дорогим для проекту, ніж використання компонентів операційної системи. Я знаю не кращий приклад цінності цього підходу, ніж широкомасштабне впровадження програмного забезпечення з відкритим кодом Microsoft у своїх браузерах.

Причина 2 , необхідність розміщення застарілого коду, ігнорується в небезпеці будь-якого великого проекту. Хоча скільки завданих проблем може викликати спадковий код, наївно припускаючи, що його можна легко замінити новим кодом новою мовою, може бути неймовірно ризиковано. Спадковий код, навіть поганий застарілий код, часто включає те, що означає неявний «контракт» функцій, очікуваних громадою, яка використовує спадщину. Ця спільнота досить часто є головним джерелом доходу для компанії або основною ціллю підтримки урядового програмного забезпечення. Просто відмовившись від того, що мається на увазі контракт, може переслідувати обізнаних клієнтів у сукупності, і може банкрутувати компанію протягом ночі, якщо інші варіанти легко доступні.

У той же час, НЕ замінюючи старий код на старому мовою може бути настільки ж небезпечно , як замінити його оптовий продаж. Найгірший приклад - Адміністрація ветеранів США, яка має велику кількість життєво важливих систем, кодованих мовою MUMPS (не жартуючи), яку розробили медики, а не комп'ютери. Ніхто не хоче вчитися МУМП, і ті, хто це знає, буквально відмирають. Тому програмісти повинні вміщувати MUMPS навіть тоді, коли вони намагаються рухатися вперед до використання інших більш поширених, більш потужних і краще підтримуваних мов.

Цей тип багатомовного використання вимагає ретельного планування. Це планування має орієнтуватися на край ножа між втратою десятиліть знань клієнтів, з одного боку, та втратою здатності підтримувати програмне забезпечення з іншого. Можуть допомогти методи, які виділяють старий код за чітко визначеними інтерфейсами та дозволяють новому більш потужному коду замінити старий код після того, як його поведінка була добре зафіксована. Але цей спадковий сценарій ніколи не є простим, і став (і надалі буде) причиною припинення багатьох компаній та організацій у широкому спектрі.

Причина 3 , наявність кодерів для різних мов, є прагматичним фактором, який проекти ігнорують з їхньої небезпеки. Хоча організатори проекту можуть відчути (правильно чи неправильно), що певна мова найкраще відповідає їхнім цілям, якщо ця мова суперечить доступному для них мовному експертному пулу, і графік, і якість продукту постраждають від навчання. вигнута програмістами, які намагаються вивчити нову мову.

Більш раціональний підхід полягає в аналізі мовних потреб проекту на основі функціональних областей. Наприклад, при уважному огляді проекту може виявитись, що існує лише невеликий «вершина» коду високої вартості, наприклад, для реалізації якогось власного алгоритму, що вимагає знань з кодування на деякій менш поширеній мові. Інші частини будь-якого великого проекту часто легко розміщуються більш поширеними мовами або (ще краще) добре керованими продуктами з відкритим кодом. Аналіз проекту відповідно до мовних потреб може забезпечити набагато більш реалістичний та економічно ефективний підхід до найму або оренди спеціальних знань на спеціальних мовах, а також може допомогти загострити інтерфейси між мовами в рамках одного проекту.

Причина 4 , використовуючи різні мови для різних потреб, негайно і безперебійно випливає з виконання такого аналізу потреб проекту. У цьому слід також дотримуватися обережності, оскільки вибір занадто багато мов для підтримки в рамках одного проекту може спричинити комбінаторний вибух складності як у підтримці, так і в інтерфейсах між компонентами. Найбезпечніший маршрут - це завжди знайти максимальні можливості для повторного використання, особливо якщо існують хороші пакети, які можуть задовольнити потреби проекту за рахунок трохи більше, ніж налаштування. Далі слід прийняти якесь рішення щодо якоїсь невеликої кількості мов, яка може задовольнити більшість виявлених потреб. При інтенсивному використанні це буде часто типом коду клею.

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

Причина 5 : опір необхідним змінам у використаних мовах може стати причиною серйозного зриву проекту та внутрішньої суперечки. Як користувач Daveoзазначив у коментарі до цієї відповіді, зміни можуть бути дуже складними для деяких працівників проекту. У той же час, опір змінам ніколи не є простим питанням, саме тому це може спричинити великі чвари. Використання застарілих мовних навичок може стати потужним підвищенням продуктивності проекту, якщо застаріла мова є достатньо потужною і може призвести до продукту з відмінною якістю в команді, яка працює безперебійно і поважає якість. Однак застарілі знання мови повинні бути збалансовані з тим, що багато старих мов більше не можуть комплектуватися більш новими мовами з точки зору розширених функцій, доступності компонентів, опцій з відкритим кодом та інтелектуальної підтримки набору інструментів.

І тоді, і зараз єдиним найпоширенішим (і за іронією долі, найчастіше правильним) аргументом для продовження використання більш слабкої, менш читабельної чи менш продуктивної застарілої мови є те, що старша мова дозволяє створювати більш ефективний код. Це старий аргумент - той, що сягає аж до 1950-х років, коли користувачі асемблерної мови обурювались, часто з гіркістю, появою програмування у FORTRAN та LISP. Приклад, коли навіть аргумент ефективності коду може мати дійсність, можна побачити в інтенсивно оброблюваному коді, такому як ядро ​​операційної системи, де C залишається мовою вибору над C ++ (хоча з причин, що виходять за рамки простої ефективності).

Однак у глобальних мережах та потужних машинно підтримуваних проектних середовищах нового тисячоліття ефективність коду як основного аргументу вибору мови проекту стала ще слабшою. Той самий вибух обчислювальних та мережевих апаратних засобів, що дав можливість масового маркетингу програм штучного інтелекту, також означає, що витрати на людське програмування можуть легко змінити витрати на неефективне виконання коду на надзвичайно дешевому апаратному та хмарному програмному забезпеченні. Коли це поєднується з більшою доступністю для більш сучасних мов бібліотек компонентів, опцій з відкритим кодом та розширених наборів інтелектуальних інструментів, кількість випадків, коли зберігання мови лише з міркувань ефективності стає дуже вузьким. Навіть у випадках, коли це застосовується,

Більш вагома причина того, що проект залишається зі застарілими мовами, виникає тоді, коли з будь-яких причин проект має мало або взагалі не має можливості змінити штат. Це може статися, наприклад, коли основна застаріла лінійка продуктів кодується повністю мовою, якою вільно володіє лише наявний персонал. У таких випадках проект повинен або продовжувати вниз шляхом спроб програмування старою мовою, або намагатися навчити наявний персонал, як використовувати нову мову.

Навчання штатних мовних службовців новою мовою може становити небезпеку само по собі. Я все ще пригадую випадок, коли учасник проекту, який щойно пройшов навчання та перехід з C на C ++, з усією щирістю скаржився на мене, що він просто не розуміє переваг об'єктно-орієнтованих методів. Коли я переглянув його код, він перетворив свої попередні 103 C функції в 103 методи для одного об’єктного класу C ++ ... і справедливо не бачив, як це нічого допомагає.

Більш глибоке повідомлення полягає в тому, що, коли люди роками або десятиліттями програмували в одній мові та мовному стилі, труднощі змусити їх «мислити» по-новому можуть стати майже непереборними навіть при хороших навчальних програмах. У деяких випадках може бути інший варіант, крім залучення молодих дизайнерів та програмістів, які більше співзвучні сучасним тенденціям та методам.

Причина 6 , погане управління проектами, говорить само за себе. Вибір мови та використання у проекті завжди слід розглядати та оцінювати чітко, а не допускати їх випадково. Принаймні, вибір мови може призвести до величезної зміни в довгостроковій долі та витратах на підтримку проекту, і тому його завжди слід враховувати та планувати. Не станьте МУМПОМ!


Я згоден з усім цим. Хоча відповідь Басіля в основному зосереджена на питаннях продуктивності та виразності, ваша відповідь допомагає кожному зрозуміти перспективу управління, яка вибирає програмування поліглоту.
Parth Patel

@ParthPatel Я думаю, ви повинні прийняти цю відповідь, це найкраща самодостатня інформація.
близько

2
+1: але ви забули Его. Багато людей відмовляються вивчати нові мови та дотримуються того, що знають. Цей різний рівень зрілості для кількох команд може призвести до багатьох різних технологій на одному проекті
Давео

1
Причина 7, намагаючись зробити ІТ-відділ виглядати сексуально для підбору персоналу. Не жартуючи, що в проекті .Net нам довелося замінити єдину кінцеву точку з існуючої служби, щоб використати цілком нову послугу в Go, просто щоб вони могли помістити "поліглот" у додаток до роботи!
Кріс Лі

1
Хе! Я не можу не погодитися з тим, що використання декількох мов - це привабливість для людей, які переживають, що вони можуть потрапити в глухий кут, лише для роботи типу COBOL. Це перший раз, коли я чув, що мова додається лише та спеціально для цієї мети, але, безумовно, існує багато середовищ, де наявність більшої кількості інструментів та мов розглядається як ознака того, що вони працюють із найновішими технологіями, і, отже, є більш прогресивним місцем для роботи. Гарний приклад, дякую!
Террі Боллінгер

158

Я не можу зрозуміти причину того, чому в одному продукті або програмному продукті використовуються кілька мов програмування?

Це досить просто: не існує єдиної мови програмування, підходящої для всіх потреб і цілей.

Прочитайте книгу Майкла Л. Скотта Прагматика мови програмування

Деякі мови програмування надають перевагу виразності та декларативності (багато мов сценаріїв, але також мови програмування високого рівня, такі як Agda , Prolog , Lisp , Haskell, Ocaml, ...). Коли вартість розробки важлива (людський час та витрати розробників), їх доцільно використовувати (навіть якщо продуктивність не є оптимальною).

Інші мови програмування надають перевагу продуктивності роботи (багато мов низького рівня, із звичайно складеними реалізаціями, такими як C ++, Rust, Go, C, асемблер, а також спеціалізовані мови, такі як OpenCL ...); часто їх специфікація допускає певну невизначеність поведінки . Коли продуктивність коду має значення, бажано використовувати ці мови.

Деякі зовнішні бібліотеки написані на певній мові та ABI і мають на увазі конвенції . Можливо, вам доведеться використовувати цю іншу мову та дотримуватися конвенцій іноземних функцій , можливо, написавши якийсь клей-код .

На практиці навряд чи є мова програмування, яка має високу виразність (так покращує продуктивність розробника, якщо брати на себе достатньо кваліфіковану команду розробників) та дуже ефективна під час виконання. На практиці існує компроміс між експресивністю та ефективністю.

Примітка: однак, спостерігається деякий повільний прогрес у мовах програмування: іржа є більш виразною, ніж C або, можливо, навіть C ++, але її реалізація майже настільки ефективною і, ймовірно, покращиться для створення однаково швидких виконуваних файлів. Тому вам потрібно вивчити нові мови програмування протягом свого професійного життя; однак немає Срібної кулі

Зауважте, що вартість розробки на сьогодні стає все більш значною (це не було в 1970-х - на той час комп'ютери, де дуже дорого - або в деяких вбудованих додатках - з великим обсягом продукту). Основне правило (дуже приблизне) полягає в тому, що кваліфікований розробник здатний писати близько 25 тисяч рядків (налагодженого та задокументованого) вихідного коду щороку, і це не дуже залежить від мови програмування, що використовується.

Поширений підхід полягає у вбудовуванні певної мови сценаріїв (або певної доменної мови ) у велику програму. Ця ідея дизайну (пов'язана з мовою, що залежить від домену) використовується десятиліттями (хорошим прикладом є редактор вихідного коду Emacs , який використовує Elisp для сценаріїв з 1980-х років). Тоді ви будете використовувати легко вбудовуваний інтерпретатор (наприклад, Guile , Lua , Python, ...) всередині більшого додатка. Рішення про введення перекладача у велику програму має бути прийнято дуже рано та має сильні архітектурні наслідки. Потім ви будете використовувати дві мови: для матеріалів низького рівня, які потрібно швидко працювати, деяких низькорівневих мов, таких як C або C ++; для сценаріїв високого рівня, іншої DSL або мови сценаріїв.

Зауважте також, що дане програмне забезпечення може працювати в більшості сучасних операційних систем (включаючи Linux, Windows, Android, MacOSX, Hurd, ...), у кількох взаємодіючих процесах, використовуючи певні методи міжпроцесорної комунікації . Він навіть може працювати на декількох комп'ютерах (або на багатьох з них), використовуючи методи розподілених обчислень (наприклад, хмарні обчислення , HPC, клієнтський сервер, веб-додатки тощо). В обох випадках легко використовувати декілька мов програмування (наприклад, кодувати кожну програму, що працює в одному процесі або на комп'ютері, своєю мовою програмування). Прочитайте Операційні системи: Три простих деталі . Також інтерфейси іноземних функцій(наприклад, JNI ), ABI , виклики конвенцій тощо ... полегшити змішування декількох мов в одній програмі (або виконуваному файлі ) - і ви знайдете генератори коду, такі як SWIG, щоб допомогти.

У деяких випадках вам потрібно змішати кілька мов програмування: для частини, що працює в браузері, для веб-додатків потрібен Javascript або Webassembly (єдині мови, що працюють у більшості веб-браузерів) (є рамки, що їх генерують , наприклад ocsigen ). Коду ядра потрібні деякі речі (наприклад, планувальник або низький рівень обробки переривань), щоб бути частково записані в асемблері, оскільки C або C ++ не можуть виразити те, що потрібно там, запити RDBMS повинні використовувати SQL, GPGPU потрібні ядра комп'ютера, кодовані у OpenCL або CUDA, керований C або C ++ кодом хоста тощо. Деякі мови розроблені для полегшення такої суміші (наприклад, asmзаяви в C,фрагменти коду в моїй пізній GCC MELT тощо).

У деяких випадках ви використовуєте методи метапрограмування : деякі частини вашого великого програмного проекту мали б код (наприклад, на C або C ++), сформований іншими інструментами (можливо, інструментами, специфічними для проекту), завдяки певній спеціальній формалізації: генераторам парсеру (неправильно називається компілятор- компілятори) на зразок зубрів або ANTLR , а також SWIG або RPCGEN. І зауважте, що GCC має у своєму розпорядженні понад десяток спеціалізованих генераторів коду C ++ (один для кожного внутрішнього DSL всередині GCC). Дивіться також цей приклад. Зауважте, що мета-помилок важко знайти. Читайте також про компілятори завантаження та про гомонікості та відображення(Варто вивчити Lisp , пограти з SBCL та прочитати SICP ; зазирнути також у бібліотеки, що складають JIT, як GCCJIT ; у деяких великих програмах ви можете генерувати якийсь код під час виконання, використовуючи їх; пам’ятайте про десяте правило Грінспуна ). Дивіться також в Подорожував ланцюга Менше розмов на FOSDEM2018.

Іноді ви хочете надати офіційні анотації свого коду (наприклад, для надання доказів, статичних аналізаторів, компіляторів), використовуючи деякі спеціалізовані мови анотацій (які можуть розглядатися як деякі DSL). Погляньте на ACSL за допомогою Frama -C, щоб коментувати програми C (критично важливі для безпеки) або прагмати OpenMP для HPC. Застереження: написання таких анотацій може вимагати багато навичок та часу на розробку.

До речі, це говорить про те, що деякі навички щодо компіляторів та інтерпретаторів корисні для кожного розробника (навіть не працюючи всередині компіляторів). Тому читайте Книгу Драконів, навіть якщо ви не працюєте на компіляторах. Якщо ви кодуєте власного перекладача (або якщо ви розробляєте DSL), прочитайте також Lisp In Small Pieces .

Дивіться також це & що & що & що мої відповіді, пов'язані з вашим запитанням.

Вивчіть також вихідний код кількох великих проектів безкоштовного програмного забезпечення (на github або з вашого дистрибутива Linux ) для натхнення та просвітлення.

Також деякі мови програмування розвивалися шляхом додавання анотацій (як прагм чи коментарів ) до існуючих мов. Для прикладу, подумайте про ACSL (прим-розширення для анотування програми C , щоб включити їх доказ по Фрам-C ) або OpenCL (С діалектом до програми GPGPUs) або OpenMP або OpenACC #pragmas або Common Lisp анотацій типу .

PS: Існують також соціальні чи організаційні чи історичні причини змішування мов програмування; Я тут їх ігнорую, але знаю, що на практиці такі причини є домінуючими. Читайте також Міфічний місяць людини


6
Для мене це правильна відповідь. Ви можете взяти, наприклад, схеми складання в програмах C. Оболонка UNIX всіяна декількома мовами програмування, і ви часто знайдете awk(що є іншою мовою програмування), що використовується в скриптах bash, тільки тому, що вона краще підходить для виконання завдання). Точка @ amon все ще стоїть.
MayeulC

8
BTW, чудовий програміст іноді здатен видалити рядки коду ... (замінивши безліч хитрих кодових рядків крихітними кількома хорошими рядками)
Basile Starynkevitch

12
Відмінна відповідь, але один запит: Я вдячний за бажання зазначити "сторону", представляючи їх менш помітно, але, будь ласка, не зловживайте тегом HTML SUP просто тому, що він має побічний ефект візуалізації меншим шрифтом. Це повинно бути кошмаром доступності, і, як зазначає стандарт HTML5, "Ці елементи повинні використовуватися лише для маркування типографічних конвенцій із конкретними значеннями, а не для типографічного викладу заради презентації. [...] використовувати ці елементи лише у випадку, якщо відсутність цих елементів змінила б зміст змісту ".
FeRD

4
@FeRD: видалено, <sup>але з жалем
Василь Старинкевич

6
@BasileStarynkevitch Вдячний. Як я вже говорив, я ціную намір, і як надмірно багатослівний, схильний до дотичних письменник, я, безумовно, бажаю, щоб StackExchange надав підтримуваний метод стилізації тексту меншим розміром або, можливо, згорнувся в контейнері, що відкривається для натискання. Але суперапідписи довжини абзацу не є відповіддю на цей недолік.
FeRD

29

Багато проектів не побудовані з декількома мовами програмування. Однак звичайно використовувати скрипти на інших мовах, щоб допомогти з програмним забезпеченням.

  • Інструменти адміністрування, які є окремими програмами, іноді пишуться різною мовою.
  • Бібліотеки та API часто пропонують прив'язку для декількох мов, так що розробники можуть використовувати будь-яку мову, яку вони бажають.
  • Створюйте сценарії та пов'язані сценарії розробки часто використовують спеціалізовані мови.
  • Для завершення тестів програми не потрібно використовувати одну і ту ж мову.

Кілька проектів використовують кілька мов у програмі, наприклад, ядро ​​на мові нижчого рівня, яке може інтегрувати плагіни в мову скриптів. У деяких екосистемах (наприклад, JVM або .NET) точна мова, що використовується, не надто важлива, оскільки декілька мов на одній і тій же мові мають хорошу сумісність. Наприклад, я міг написати проект у Scala, який використовує існуючі бібліотеки Java та інтегрує сценарій функціональності з Groovy.

Якщо проект складається з декількох інструментів, вони також можуть бути розроблені різними мовами. Хоча послідовність була б хорошою, особливо для проектів з відкритим кодом, наявні зусилля з розробки можуть бути вузьким місцем. Якщо хтось готовий розробити корисний інструмент, але не знайомий з основною мовою, можливо, цей інструмент є більш цінним, ніж послідовність.


3
Це доповнює відповідь @ Basile. Сценарії perl з ядра Linux не є частиною ядра, також не є Makefile. З використанням C для цього нічого не можна отримати. Крім того, ці сценарії perl можна використовувати незалежно від ядра Linux. Досить часто їх можна розглядати як тісно пов'язаний проект, але все ж виразний . Зазвичай ви використовуєте одну мову для одного завдання.
MayeulC

20

Це дві форми, і багато організацій, які потрапляють десь між двома:

Погана форма - організація безлад, і ніхто не переконається, що існує єдине технологічне бачення зусиль. Devs, швидше за все, використовує будь-яку мову, якою вам найбільше комфортно, або нещодавно експериментував з новою рамкою чи мовою, і вирішив просто почати використовувати її через наївного оптимізму.

Хороша форма - організація має дійсно гарну, чисту архітектуру, яка добре піддається програмуванню поліглотів; розв'язування додатків на незалежні компоненти з чітко визначеним обмежуючим контекстом, і ця комбінація дозволяє їм вибирати мову програмування, яка найбільш просто дозволяє їм записати саме цей компонент.

Реальність - це зазвичай більше перша, ніж остання. Я бачив, як кілька компаній обирають одну мову для свого бізнес-домену та іншу для свого веб-сервера, а часто і третю для управління їх базами даних, що технічно добре, але досить скоро їх недостатнє технічне розуміння (або відмова слухати своїх співробітників) означає, що вони закінчуються з усіма трьома розмиттями разом у великому безладі, і часто вводять ще більше мов, що підходять для вирішення певних частин безладу.


20

Я можу навести приклад проекту програмування, який працює вже 32 роки, і, здається, в ньому ще багато життя. Це швидше комерційний, ніж відкритий.

Ядро написано мовою, що відповідає домену, створеній спеціально для проекту. Це виявилося надзвичайно корисним, зокрема, тому, що воно інтегрує відкат у основну архітектуру, але він компілює у код C, який ми потім компілюємо з компілятором платформи. За цей час він підтримував близько двадцяти платформ, не враховуючи 32- та 64-бітних варіацій, і в даний час постачається на шести таких.

У ньому є доповнення, написане на C ++, яке було запущено, коли минулий керівник проекту переконався, що C ++ / MFC / Windows / x86 збирається перемістити всі інші архітектури та платформи, тому потрібно було запропонувати C ++ роботі вміти наймати персонал. Все не вийшло так, як він очікував.

Окрім мови домену та C ++, розробники працюють у LISP, який використовується для написання тестових випадків, використовуючи інтерпретатор, вбудований у тестовий джгут. Ми розглядали можливість заміни LISP на Java в один момент, але виявилося щасливим, що цього не зробили.

Він також має обгортку для свого основного API, написаного на C #. Це було зроблено, коли клієнти вимагали цього, щоб вони могли переписати свої заявки на C #. Він створений сценарієм Perl, який читає файли заголовків C для API, а також значний файл конфігурації та записує код C # для обгортки. Робити всю цю обробку тексту в Perl було просто простіше, ніж робити це в C ++.

Він має власні системи побудови та потребує їх, оскільки мова домену не піддається системам побудови на основі. Ця платформа, схожа на UNIX, написана у скриптах оболонки, Perl та деяких невеликих програмах мовою домену. Ця платформа для Windows написана пакетною мовою, Perl та тими ж невеликими програмами мовою домену. Стара система складання VMS була написана в DCL, але вона не використовувалася вже більше десяти років.

У компіляторі для мови домену є деякі програми YACC / Bison. Існує деякий код тестування для платформ Apple, написаний у Objective-C ++. Деякі внутрішні веб-сайти команди (використовуються для управління проектами, не є частиною результатів) написані в ASP, а інші як CGI-скрипти в Perl.

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

Функція цього коду - математичне моделювання, що використовується на робочих станціях та серверах (я можу говорити трохи вільніше, якщо не ідентифікую продукт). Зараз це близько 25 мільйонів LoC, загальний розмір команди близько півсотні.


Було б непогано розповісти трохи більше про цей програмний продукт: який промисловий домен (нейрохірургічні роботи не такі, як торгівля з високою частотою, наприклад)? Який приблизний розмір (у мільйонах рядків коду)? Який розмір команди?
Базиль Старинкевич

@BasileStarynkevitch: додано деталей.
Джон Далман

Це. Саме тому проекти мають кілька мов від доброго до поганого до потворного.
Джаред Сміт

15

У деяких випадках є інструмент, який потрібно використовувати (наприклад, набір інструментів інтерфейсу ОС), який є найпростішим доступним для даної мови. Наприклад, на iOS та macOS, якщо ви хочете писати програми GUI за допомогою UIKit та AppKit, написання в Swift або Objective-C - це найшвидший і найпростіший спосіб зробити це. (Можуть бути прив’язки для інших мов, але вони можуть стояти за останньою версією ОС, на яку ви будуєте, тому можуть не пропонувати всі функції.)

Тому часто трапляється, коли програма є платформою, основна логіка програми написана якоюсь мовою, доступною обом, а фрагменти, що стосуються інтерфейсу користувача / ОС, написані будь-якою мовою, якою вони працюють на рідній мові.

Отже, якщо ви пишете додаток для Windows та macOS, ви можете написати основну логіку в C ++ і використовувати C # для інтерфейсу користувача у Windows та Swift для інтерфейсу користувача на macOS. Це економить час, тому що вам не потрібно двічі писати основну логіку та мати справу з різними наборами помилок в обох додатках тощо. Але це також дозволяє справжній власний інтерфейс користувача, який не задовольняє найнижчий загальний знаменник між платформами, як, наприклад, використання бібліотека інтерфейсу міжплатформових програм.


MVC FTW! Навіть переходити до того, щоб мати лише одне крос-платформенне ядро ​​з обгортковими програмами для кожної ОС / середовища ... або в сучасному світі підключення, переміщуючи його до архітектури клієнт / сервер
ivanivan

1
Це відповідає моєму власному досвіду. Кожен великий проект, над яким я працював, використовував декілька мов, і ніколи багато мов не давали користі. Причиною завжди було те, що окремі частини повинні бути написані певними мовами, щоб взаємодіяти з певними інструментами.
Оуен

Як колишній розробник iOS, я можу підтвердити, що ми це зробили. У нас був написаний API на PHP, який спілкувався в JSON, веб-інтерфейс, написаний на PHP, який також мав частину JavaScript / HTML5, а також Android-фронт-енд, написаний на Java та фронтальний iOS, написаний на Objective-C . Пізніше нові проекти були написані в Swift, але наші внутрішні рамки все ще були написані в Objective-C. Так, в якийсь момент один із наших додатків був написаний на PHP, Java, Objective-C, Swift, JavaScript та HTML5 та доступний на 3 платформах.
Бель-Софі

10

Окрім того, що деякі мови програмування можна краще підходити для виконання певних завдань, є практична реальність.

У практичній реальності слід врахувати 2 особливо важливих пункту:

  1. Люди мають різний досвід та рівень інтересу до різних мов програмування. - Дозволити людям працювати мовами, які їм подобаються та володіти знаннями, за певних обставин може призвести до кращого кінцевого результату, ніж примушування їх до спільної мови.
  2. Великі бази коду будуються різними людьми протягом тривалих періодів часу. - Немає можливості отримати фінансування чи кількість волонтерів, необхідних для перезапису цілого проекту, як тільки мова, яка краще підходить для нього, з’явиться.

І звичайно, часто є конкретні частини програми, які мають зовсім інші потреби, такі як:

  • Сфери чутливості до продуктивності розроблені мовою компіляції. Приклад мови: C ++
  • Області, які повинні бути дешевими, легкими для зміни та потенційно налаштованими, розроблені мовою сценаріїв. Приклад мови: Lua
  • Макет графічного інтерфейсу. Приклад мови: HTML
  • Установник. Приклад мови / інструменту: WiX.
  • Побудувати. Приклад мови / інструменту: занадто багато списків, зазвичай їх декілька одночасно.

На додаток до цього існує досить багато інструментів, що використовуються складною базою коду, багато з яких дозволяють здійснити необхідні налаштування та плагіни з іншою мовою.


8
HTML не є мовою програмування
Bergi

1
@Bergi Правильно. Пітер не стверджує, що це так. Це мова розмітки.
Бель-Софі

1
HTML, XAML, QML тощо - це мови, які програмісти використовують у програмних проектах, щоб сказати комп’ютеру, що робити - мови зазвичай не є суворо необхідними, оскільки програмісти теоретично могли написати весь проект, включаючи інтерфейс користувача, однією мовою. Саме це робить його актуальним у контексті цього питання.
Петро

5

На додаток до правильних інших моментів, які вже були зроблені:
З досвіду багато мовних чи екологічних рішень приймаються «якщо у вас молоток, все виглядає як цвях», тобто люди зазвичай користуються знайомими інструментами.

Окрім того, впровадження нового середовища чи навіть мови - це головне вкладення коштів у ліцензії, тренінги, можливо, обладнання, а також великі втрати продуктивного часу - купувати, встановлювати, налаштовувати, тренуватись щотижня у більшій компанії, і ви в основному закінчуєте з купою розробників-початківців.
В основному ніколи немає часу «інвестувати» в більш сучасне або краще пристосоване середовище чи мову, тому вони дотримуються того, що мають, доки це просто не зможе працювати більше.

Зокрема, до вашого питання, якщо у розробці рішення беруть участь декілька людей / команд, кожна група прагне дотримуватися того, що вони найкраще знають, тому загальне рішення має в ньому кілька мов і є розробкою в різних середовищах.


5

Це питання (і деякі відповіді), мабуть, припускають, що програми є монолітними блоками коду - це не обов'язково так.

Ваш типовий веб-сайт на зразок Stack Exchange - це фактично безліч різних служб, які працюють незалежно один від одного, з якимись повідомленнями між ними. Ці сервіси можуть бути (і, як правило,) реалізовані різними мовами, кожен з яких має свої сильні сторони.

Я працюю над крихітною мережею платформи онлайн-банкінгу, орієнтованою на менші банки громади та кредитні спілки. Ця платформа має декілька компонентів - веб-фронт, рівень бази даних, сторонній рівень зв'язку тощо. Це все незалежні програми, що працюють на різних серверах з різними операційними системами. У браузері працює Javascript на клієнтській стороні, на сервері - сторінки побудови Perl, у вас є кілька служб, написаних на C ++, які діють як шар абстракції між кодом Perl та основним процесором банку, інший набір програм C ++, які маршрутні повідомлення між різними шарами, розміщення програм C ++ та сценаріїв Perl для контролю стану різних процесів та повідомлення про їх стан на внутрішньому моніторі, тощо, тощо, тощо.

Монолітні програми все ще існують, але навіть вони можуть скористатися різними мовами з різних причин. Ви можете написати 90% програми на Java, але використовувати JNI для використання C або C ++ для більш критичних розділів.


Я здивований, що ніхто не згадав про SQL (або мову запиту на ваш вибір), більшість додатків зараз дні мають принаймні якусь "стекову" архітектуру для них.
користувач3067860

3

Я хотів би зазначити дуже специфічний екземпляр мотива "різні мови мають різні сили": FORTRAN.

Спочатку Fortran був розроблений, щоб полегшити інженерам роботу з чисельним аналізом, і з того часу було зроблено багато зусиль, щоб компілятори Fortran видавали дуже ефективний числовий код. З іншого боку, з тих ранніх часів використання комп’ютерів вибухнуло в тисячі напрямків, жоден з яких не передбачає чисельного аналізу, а розробка мов програмування значною мірою слідувала відповідності ігноруванню «реального» світу [вибачте за каламбур].

ТАК: Це сьогодні, і ви опиняєтесь, що працюєте в компанії з досить розповсюдженим продуктом, більша частина написана на (скажімо) Java (я говорю з особистого досвіду тут) . Але ви виявляєте, що одна з основних особливостей продукту збирається отримати певну форму чисельного аналізу, і всі найкращі коди для цього конкретного аналізу вже доступні в мережі - у Fortran. Так, що ти робиш? Ви завантажуєте один з цих кодів Fortran, з'ясовуєте його інтерфейс [тобто аргументи найвищої підпрограми], збиваєте його з обгортки JNI в C і пакуєте його як клас Java. БАМ! Вам просто довелося розвиватися одразу трьома мовами. [особливо якщо ви виявите, що ваш код Fortran використовує блоки COMMON - тобто статичне сховище - і його потрібно змінити для безпеки потоку]


4
Або ваш добре перевірений обчислювальний ядро ​​FORTRAN було б покращено, зателефонувавши в один момент новий алгоритм, який залежить від виконання сортування купи за покажчиками, про який ви вже написали в C. І у вас є складні вхідні файли для сканування, тому ви пишете сканер в flex. О, і, можливо, ви хочете, щоб GUI зверху, на який вам потрібно зателефонувати з C ++. Або клієнт дуже хотів би називати це все як підпрограму Matlab ...
jamesqf

3

Тому що програмування - це не одне завдання. Навіть створити продукт - не одне завдання. Існує кілька типів завдань, які найкраще виражати різними мовами.

Щоб зробити це більш конкретним, припустимо щось просте, як автономне додаток (для розподілених додатків потрібно виконати більше завдань).

Продукт повинен бути

  • написана
  • скласти разом (це включає як компіляцію, так і збір ресурсів, таких як зображення, шрифти тощо для розгортання)
  • розгорнуто
  • налаштовано
  • контролюється

Мова, яка може бути корисною для написання тривалості продукту, навряд чи буде такою ж корисною для з’єднання продукту. І так далі.

Однак навіть процес написання продукту не може бути оптимально виконаний на 1 мові.

Скажімо, існує багато структурованих даних, якими обробляється продукт. Чи відома структура даних на момент написання? Якщо це так, ви хочете налаштувати деяку базу даних під час розгортання. Це оптимально зроблено мовою, яка може генерувати мову, яка буде складена у ваш час виконання.

Що робити, якщо структура даних може час від часу змінюватися? Тоді вам потрібен структурований спосіб перетворення нових конструкцій даних у конфігурацію коду та бази даних. Це найкраще зробити ще однією мовою.

Чи можете ви зробити це все тією ж мовою? Звичайно. Але ваша ефективність визначається тим, наскільки швидко ви можете закінчити проект і наскільки він стійкий до змін. Якщо багато вашої роботи можна автоматизувати за допомогою вже наявних інструментів, то те, що вам потрібно 3 місяці, може зробити хтось інший за 2 дні. Але щоб хтось використовував інші мови, щоб автоматизувати те, що ви робите за допомогою повторення.


"Мова, яка може бути корисною для написання часу роботи продукту, навряд чи буде такою ж хорошою" ... мови програмування не виходять із випадкового процесу, тому дивитися про ймовірність таким чином трохи дивно . Мови програмування призначені для вирішення якоїсь задачі. Ваша думка полягає в тому, що мова навряд чи також може випадково вирішити ще одну проблему, яку вона не була розроблена. Хоча я заперечую, що суть програмування полягає в тому, щоб абстрагуватися над усіма проблемами, які можна було б вирішити, і справді добре розроблена мова повинна бути такою ж корисною для будь-якого завдання.
близько

@leftaroundabout це звичайна помилка плутати, що може робити мова і що вона добре виражає. Мета мови високого рівня - не вирішити проблему. Це виступати як синтаксис для вираження рішення проблеми таким чином, щоб якийсь інструмент перетворив це вираження у завдання, яке має виконати комп'ютер. Враховуючи це, важливо пам’ятати, що фактичну роботу з вираженням роблять люди. І люди використовують різні абстракції, щоб описати рішення проблем з різних областей.
гровкін

Впевнені, що люди використовують різні абстракції. Моя думка - хороша мова повинна вміти висловлювати всі ці абстракції.
близько

@leftaroundabout, зовсім не так. Висловлювати що-небудь добре, потрібно вміти спрямовувати увагу на річ. Намагатись добре висловити всі види абстракцій означало б привернути увагу до них усіх. І це розсіяло б увагу і спричинило б слабке висловлення ідей. Немає нічого поганого у виборі того, на чому слід наголосити та зосередитись.
grovkin

Вміти направляти увагу кудись - це не те саме, що насправді робити.
близько

1

Розробка програмного забезпечення прогресувала до того моменту, коли ви можете використовувати різні мови програмування в одному проекті, і ви можете змусити його працювати.

Тоді виникає питання, чому ви використовуєте більше однієї мови.

Однією з причин є те, що мови застарівають і повільно замінюються новими, і якщо вам пощастить, це можна зробити потроху. Тож ваш проект матиме поєднання старої та нової мови.

Ще однією причиною є ситуація, коли мова X - це дуже багато того, що використовується на платформі A, мова Y - це дуже багато, що використовується на платформі B, але мова Z підтримується на обох платформах. Так звичайний код пишеться мовою Z, яка потім поєднується з X або Y, залежно від платформи.

А людям подобається використовувати код, написаний іншими (іншими словами, код, на який їм не довелося витрачати час, щоб написати його самостійно). Вони можуть вільно використовувати код, написаний іншими на будь-якій мові, а потім додавати код на тій мові, яку вони бажають.


8
Про перше речення: програми змішаної мови є річчю вже понад 50 років.
Blrfl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.