На що ви хочете, щоб мовні дизайнери звернули увагу? [зачинено]


38

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

Одне з моїх упереджень, і, можливо, це може бути суперечливим, полягає в тому, що м'яка сторона інженерної діяльності - "whys" та "fors" - у багато разів важливіша, ніж конкретніша сторона. Наприклад, Ruby був розроблений із заявленою метою поліпшити щастя розробника. Незважаючи на те, що ваші думки можуть бути неоднозначними щодо того, чи вона поставлена ​​чи ні, той факт, що був ціллю, означає, що на деякі варіанти мовного дизайну вплинула ця філософія.

Будь ласка, не публікуйте:

  • Синтаксис полум'яних воєн. Подивимося, ми маємо свої переваги, і синтаксис важливий, оскільки це стосується дизайну мови. Я просто хочу уникати епічних битв за природу emacs проти VI (про що сьогодні велика кількість людей нічого не знає).
  • "Будь-яка мова, яка не має функції X, не заслуговує на існування". Існує хоча б одна причина існування всіх мов програмування - хороша чи погана.

Будь ласка , зробити запис:

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

Я сподіваюся, що це буде весела і стимулююча тема.

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


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

Чого я хочу уникати - це вогняна війна. Якщо ви можете обговорити синтаксис, не починаючи полум'яну війну, перейдіть до цього.
Берін Лорич

Відповіді:


49

Підтримка Unicode за замовчуванням

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


2
+1 Насправді сама мова повинна дозволяти вам використовувати будь-який символ для своїх ідентифікаторів. Ми не всі англійці.
Берін Лорич

13
@Berin: Насправді, хоча я і французька, я більше віддаю перевагу англійським програмам. Проблема полягає в спілкуванні, якщо ви пишете програми з угорськими, іспанськими чи португальськими ідентифікаторами, не сподівайтесь, що я коли-небудь зможу заскочити ... в умовах інтернаціоналізації надзвичайно важливо, щоб розробники мали можливість спілкуватися між собою , а це означає використання загальної мови для ідентифікаторів, коментарів та документації. Англійська мова - це lingua franca розробників.
Матьє М.

11
Я додам, що підтримка Unicode повинна бути природною при використанні мови. Якщо це можливо, не слід докладати додаткових зусиль, щоб "додати його", він повинен "просто працювати" (де це можливо).
RHSeeger

4
Так само мова повинна робити принципове розмежування між текстовими (послідовністю символів) та бінарними (послідовність байтів) даними. C # отримує це право з stringі byte[]. Як і Python 3.x з strта bytes. C (++) charотримує це жахливо неправильно.
dan04

1
@RHSeeger - справді !!! Навіть у Python вам доведеться набирати текст u'My Unicode Štring'. Я б хотів, щоб ви могли просто забути, з яким типом рядка ви маєте справу та з кодом написання friggin.
orokusaki

25

У мене є пара:

  • Генеріки / шаблони. Наприклад, дженерики Java є потужними, але не обов'язково гнучкими. Крім того, оскільки вони використовують стирання типів, я бачив проблеми, що їх реалізує абстрактно, особливо в інтерфейсах. І компілятор не повинен попереджати, коли використовується неспецифічний загальний ролик (як Hashmapзамість Hashmap<String, int>). Я думаю, що їх можна було б значно покращити. Хороші шаблони дуже корисні, але часто нехтують.

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


2
"хороша підтримка побачень" - це досить крута вимога! що це навіть означає? Я думаю, що дати та часи - це одна з тих речей, де ти не можеш це збагнути. або ви робите це просто і неправильно, або ви робите це правильно і безбожно. ВДАЛЬНО важко вдарити хороший середина.
сара

@kai Справа в тому, що підтримка на побачення зазвичай досить жахлива. У старої java.util.Dateє майже всі можливі проблеми та проблеми. Я знаю лише частину нового java.time.*пакету, але він чистий, простий у використанні та AFAICT без помилок. Більш просунуті користувачі можуть знайти проблеми, але це величезне вдосконалення. +++ Проблема, здається, полягає в тому, що це складна проблема, і перша версія поспішає і ламається.
maaartinus

24

Будь ласка, зробіть свою мову аналізованою / підлягає аудиту для людей із комп'ютерної безпеки.

Люди з безпеки повинні мати можливість виявляти вразливості в програмі, перш ніж вона надходить. В ідеалі, ми зателефонували на початку та можемо коментувати базу коду під час її розвитку, але часто ні.

Коли вийде нова версія мовної або основної бібліотеки, попередньо безпечні речі більше не можуть бути:

  1. бібліотеки можуть стати більш потужними: наприклад, зараз підтримується бібліотека URL-адрес javascript:
  2. можуть бути нові способи перетворення рядків або байтів у код: наприклад, evalабо бібліотеки десеріалізації
  3. методи відображення мови можуть стати більш потужними: наприклад, відкриття локальних змінних

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

Тож, будь ласка, подумайте про нас при розробці та версії мови. Нижче наведено кілька порад:

Визначте кілька примітивів, на які можна розкласти програму.

HTML5 особливо поганий. Вони явно доклали багато думок в безпеці і є деякі дуже розумні люди, але замість того , щоб вказати нові програмні елементи , як <video>з точки зору старих або створення загальної абстракції , що нові <video>і старі <img>і можуть бути визначені в термінах, <video>поки ще один разовий програмний елемент із своїми наслідками для безпеки.

Зробіть свою мову придатною для статичного аналізу (навіть якщо вона не набрана статично).

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

Повинно бути очевидним, які ідентифікатори є локальними змінними, а які - ні.

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

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

Дозволити для розкладної безпеки

Багато захищених систем розроблено навколо захищеного ядра, яке зберігає властивості безпеки, щоб люди з безпеки могли зосередити свої зусилля на аналізі невеликої кількості коду та звільнити більшість програмістів від необхідності мати справу з {дратівливим, педантичним, параноїдальним} фольклором безпеки. .

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

Деякі мови, як Newspeak, використовують модель об'єктних можливостей. Це дивовижний і чудовий спосіб отримати безпеку для розкладу.

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

Обмежте повноваження вбудованих мов сценарію

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

І вбудовування мов сценаріїв може зробити систему набагато більш розширюваною.

Але мова сценаріїв не повинна мати повний авторитет VM.

Якщо ви вирішите дозволити вбудовані мови скриптування, спростіть, хто вимагає обмеження того, що вони можуть зробити. Тут дуже доречна модель об'єктних можливостей (див. Коментар до Newspeak); тож при оцінці коду на мові скрипту абонент повинен передати код для виконання та всі глобальні змінні для цього коду.

Трактуйте evalяк мову, що втілює себе як мову сценарію

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

Використовуйте просту модель одночасності

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

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

Одне з простих - це паралельність циклу подій, подібна до E, Verilog та JavaScript.

Не заохочуйте цитувати плутанину

Деякі мови є клейовими мовами, і вони закінчують справу з рядками на безлічі різних мов.

Наприклад, JavaScript часто складає рядки HTML, CSS, XML, JSON і навіть JavaScript. Програмістам дуже важко пам’ятати, як правильно кодувати рядки простого тексту при їх поєднанні для створення рядків іншими мовами, тому програми JS, як не дивно, мають всілякі проблеми із заплутаністю: XSS є найгіршим.

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


Прекрасна поломка.
Qix

23

Деякі з найкращих мов були розроблені людьми, які хотіли зробити мову для себе.

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


4
Це може бути правдою до певної міри. Однак, якщо ти ніколи не слухаєш своїх користувачів, ти ніколи не знаєш, який біль ти їм завдаєш, коли вони намагаються використати дитину мозку. Не чуючи / не відчуваючи цього болю, ви ніколи не придумаєте наступної чудової ідеї, яка вирішує цю проблему та інших. Жодна людина не острів. Біль може бути чудовим мотиватором інновацій.
Берин Лорич

5
@Berin: Я не думаю, що суть у тому, що ти ніколи не повинен слухати своїх користувачів, але і не слухати користувачів, які хочуть використовувати мову для чогось, що не було призначено. Якщо ви розробили мову для вирішення певного набору або проблем, то вам слід задовольнити користувачів, яким також потрібно вирішити ці проблеми. Однак ви звертаєтесь до крайніх, і іноді мова може знайти нішу в новому домені, тому +1.
Джеремі Хайлер

2
@Jeremy, так, саме так я і говорю, але я думаю, що мова є нечастою для роботи в домені, для якого вона не була розроблена.
dan_waterworth

@dan_waterworth: Успішні мови, як правило, добре працюють у сферах, для яких вони не були розроблені.
Девід Торнлі

8
Замість того, щоб "не слухати користувачів", поради краще формулювати як "не слухати користувачів, яких у тебе немає".
chrisaycock

16

Лише 5-10% часу витрачається на написання коду. Мовні дизайнери повинні звернути увагу на труднощі фактично змусити роботу з програмним забезпеченням, що означає виправлення помилок та помилок.

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


2
+1. Налагодження - одне з місць, де деякі мови кращі за інші - а деякі ІДЕ роблять різницю між мовою, якою можна скористатися, та мовою, яка стає вам на шляху.
Берін Лорич

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

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

3
Чи не було б краще мати мову, яка знаходить помилок під час компіляції? Наприклад, коли я використовую Ada, я витрачаю значно менше часу на відладчик, ніж тоді, коли я використовую C або C ++.
Мартін

12

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

Щодо філософських ідей, які є актуальними там, то це найважливіші з Дзен Питона:

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

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

Єдина технічна особливість, яку мені не вистачає в Python, - це "до" (наприклад, поки, але не тестування виразу вперше). Тоді є багато речей як у стандартних бібліотеках Python, так і в інших мовах, які можна було б вдосконалити, але це не суворо мови , тому це інше питання. :-)


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

15
Якщо явна краща, ніж явна, то чому вам не потрібно декларувати змінні? Коли проста друкарська помилка може спричинити важкі помилки налагодження (на відміну від помилок, які потрапляють під час компіляції або помилок виконання, які очевидні та прості для налагодження), це серйозний удар проти мови IMO.
Мейсон Уілер

4
@Mason Wheeler: Єдиною причиною, коли вам доведеться оголошувати змінні іншими мовами, є те, що ви повинні оголосити, який вони тип. Python динамічний, тому декларація типу не потрібна, а тому декларація не потрібна. Я не бачу, як це має щось спільне з неявним / явним. Типи в Python явні. Так само є і змінні. Після десяти років помилка друку ніколи не спричиняє важкої помилки. Насправді вони тривіальні для налагодження.
Леннарт Регебро

8
+1 для списку, -1 - для фанбоя. Звернути увагу на всі мови, які досягли значного успіху, та намагатися включити або хоча б проаналізувати застосованість цих елементів, схоже, більш прагматичний підхід.
Стівен Еверс

3
@Lennart: Я б сказав, що вміти (але не потрібно, див. Правило 4) явно констатувати типи функцій - це добре. Це схоже на дизайн за контрактом. Це я хочу зробити.
Тео Белер

11

Можливість змінювати мову відповідно до ваших потреб для мене велика. Для Lisp, що робиться з макросами, для Tcl з uplevel. Меншою мірою Рубі використовує лямбдаси тощо. Я просто хочу, щоб можливість додавати нові структури управління, які відповідають проблемі, а не формувати мої проблеми навколо наявних контрольних структур. Як простий приклад, конструкція "робити .. поки", яка існує в деяких мовах, але не в інших, є більш чистим способом обробки деяких випадків, ніж "поки", спроможність додати нові структури для задоволення інших випадків надзвичайно корисно.

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


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

"Метапрограмування зроблено правильно" повинно бути там, де просто зробити правильно (ну, для розумної простої діяльності) і де кінцевий результат відчуває себе природною частиною мови.
Стипендіати Доналу

1
Не просто модифіковані, а розшифровувані модифікації. Якщо ви щось переробили на мові, я, як читач, повинен мати можливість швидко зрозуміти це. Анотації або інші зовнішні маркери можуть допомогти у цьому.
Алекс Фейнман

Я думаю, що Mata-Lua або Шаблон Haskell добре справляються з цим. (Не так приємно, як макроси схеми, але саме за це ви платите за використання більше мов, ніж мовляв паролі)
Тео Белаар,

10

Найголовніше - це те, що ваша мова повинна мати «стиль». Наприклад, я би назвав C мовою програмування на основі покажчика. Я б назвав Erlang дуже одночасно функціональною мовою програмування. Деякі інші мови (наприклад, C ++ і, можливо, Java) - це те, що Аллан Кей назвав "агглютинативними" мовами: Франкенштейнські мови складалися з безлічі функцій, які поєднуються разом.

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

  1. Доведіть, що це справді необхідно.
  2. Доведіть, що це неможливо зробити в бібліотеці.
  3. Доведіть, що вона належить до мови.

2
Іншими словами, мова повинна мати один загальний принцип дизайну, а мова повинна відповідати цьому принципу. Коментарі щодо еволюції мови є гарантованими (я це бачив декілька разів).
Берін Лорич

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

4
Доведіть, що це неможливо зробити в бібліотеці . +1
Qix

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

10

Дякую за чудове запитання. Ви отримуєте кілька хороших відповідей.

Не засліплювати очі, але я дивлюсь на програміста як на інформаційний канал. Ідеї ​​/ концепції / вимоги йдуть з одного кінця, а код виходить з іншого.

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

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

Дозвольте лише навести приклад того, що я маю на увазі. Для проблеми створення гнучких діалогових інтерфейсів користувачів ця методика виключає необхідність запису обробників подій, переміщення даних, більшість матеріалів, які зазвичай виконуються в інтерфейсах користувача. Це також призводить до зменшення вихідного коду приблизно на порядок. Мета-мова - це лише декілька підпрограм та макросів на C / C ++ / Lisp, і я також робив це на мовах без макросів.

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


9

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


2
Обмежені цілі типи ala C, C ++, D, Java, C # тощо, безумовно, мають своє місце. Деякі типи програмування не хвилюються і просто потрібно лише розрізнити ціле число проти плаваючої точки. Навіть тоді, можливо, нам просто потрібен тип числа і пізніше турбуватися про невід'ємну частину числа? Коротше кажучи, бізнес-програмування менш чутливий до конкретного цілого типу, ніж до того, що число є цілим числом. Коли ви реалізуєте протокол на низькому рівні, правила різко змінюються.
Berin Loritsch

2
Що я думав, де такі типи, як в Ada, де ви можете просто сказати type Date_Of_Month is 1 .. 31;і залишити рішення, як 16 або 32 біт, оптимізатору. Але важливіше присвоєння змінної типу 32 або 0 або -5 дає вам значення RANGE_ERROR.
Мартін

Діапазони добре працюють для таких речей, як Date_Of_Month(або Month_Of_Year), де існує очевидний діапазон, але багато - можливо, більшість випадків нечіткі. type Persons_Age is 0..120? Що робити, якщо хтось порушить рекорд довговічності? type Year is 0..9999? Що робити, якщо ти єгиптолог?
dan04

Якщо ви єгиптолог, то вам не потрібно type Egyptian_Year is -9999 .. 300;. На мій досвід, ви можете знайти корисні межі для цілих чисел більшу частину часу. У цьому відношенні слід врахувати, що type Scrolls_Found is array Egyptian_Year of Natural;Ви не можете / не повинні мати необмежений тип як індекс масиву. Це просто вектор атаки для хакера. BTW: Ada дозволяє розраховувати межі діапазону під час виконання.
Мартін

1
@kai ніхто не сказав, що ця особливість типів систем повинна використовуватися скрізь без винятків. Я впевнений, що Ada також дозволяє використовувати "звичайні" числові типи. І обмежені числові типи, безумовно, корисні для деяких (досить поширених) проблем.
Sarge Borsch

8

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


8

Названня конвенцій (я дивлюся на вас PHP)


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

3
Можна для стандартної бібліотеки.
Мальфіст

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

@delnan: деякі мови, як, наприклад, Меркурій або Ейфель, накладають умови іменування (усі назви класів капіталу, змінні, що починаються з великої літери тощо), і вони застосовуються компілятором. Фортран сказав, що змінні, що починаються з i, j, k, є цілими (звідси традиційне використання як циклічних змінних у більшості мов ...). І так далі. Якось дратує, якщо вам не подобається умовність, але принаймні добре для узгодженості вихідних кодів.
PhiLho

@PhiLho: Хоча це дуже обмежено. Він не може примусити - лише один приклад - послідовного, змістовного (для людських читачів) використання капіталізації чи підкреслення (це може спробувати, але загрожує небезпеці програмістів у процесі).

7

Першокласна інтеграція із середовищами розвитку.

В даний час кодування проводиться в багатому середовищі. Для HTML / CSS / JS ми маємо Firebug та інші інтерактивні інструменти. Для Java, Eclipse та IDEA та інших справжніх IDE. І так далі. Існує екологія інструментів, починаючи з редактора, але не закінчуючи:

  • Організація коду в файлах і між ними
  • Розумне виділення
  • Розумне завершення / передбачуване введення тексту
  • Статична налагодження (синтаксис позначення, семантичні та стилістичні помилки)
  • Створення та використання шаблонів та макросів
  • Контроль версій (версія, об'єднання, розгалуження, ...)
  • Розподілений розвиток з декількома авторами (коментарі, inline doc, анотації, ...)
  • Налагодження часу виконання (сліди стека, кроки, годинник, ...)
  • Інтерактивна "жива" налагодження (як Firebug - редагування поведінки живої системи)
  • ... Я навіть не знаю, що далі.

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

Але в основному це зламані речі, як-от використання $ Id $ у коментарі, щоб джерело, кероване CVS, могло містити номер версії. Чому я не можу зробити щось подібне з самої мови?


Ви маєте на увазі щось на кшталт ASIS (ISO / IEC 15291: 1999 "Специфікація інтерфейсу Ada Semantics")? ASIS покриває не все, що ви хочете, але дуже багато. Я часто хотів щось подібне ASIS для інших мов програмування. Детальніше дивіться на sigada.org/wg/asiswg .
Мартін

Деякі з цих речей можна зробити порівняно дешево або безкоштовно отримати від IDE: організація коду, підсвічування синтаксису, складання коду, контроль версій, шаблони / макроси. Інші вимагають набагато більше зусиль: налагодження часу виконання, статична налагодження, інтелектуальне завершення / передбачувальна введення тексту, рефакторинг тощо. Незважаючи на те, що часто нехтувати, розробити послідовну мову набагато складніше, коли вам також доведеться турбуватися про плагіни IDE.
Berin Loritsch

6

Розподілене обчислення

Безкоштовний обід закінчився. Сьогодні потрібні програми, які працюють на декількох ядрах / декількох процесорах (а за особливих обставин - декількох комп'ютерах).

На жаль, писати багатопотоковий код важко концептуально, тому насправді не потрібно додавати мову як бар'єр.

Використання майбутнього C ++ 0x , безумовно, цікаве, адже все, що воно створено як бібліотека, не позбавляє вас від актуальних проблем синхронізації (ви знаєте, тих, які просто так легко вирішити ...)

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

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

Також наступною ціллю може стати модель Актора . Він призначений і для розподілених обчислень.


Іншим прикладом може бути Ерланг. Поширеною темою серед мов такого роду є загальний підхід, коли держава по суті передається разом із повідомленням. Підхід добре масштабується.
Berin Loritsch

@Berin: Ти маєш рацію, хоч я не цитував Ерланга в повідомленні, бо мало що його знаю, я пам'ятаю правильно, що він реалізує модель Актора.
Матьє М.

6

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


JavaDoc, CppDoc, RubyDoc і т. Д. Були чудовим плюсом для розуміння стандартних бібліотек, а також створених бібліотек. Вони не всі створені рівними, і деякі легше орієнтуватися, ніж інші.
Берін Лорич

Погоджено, сайт Java API - чудовий актив. Він також має стандартний формат для створення API-документації. Підвищення продуктивності від використання IDE із вбудованою підтримкою для аналізу JavaDoc (netbeans) є дивовижним. Хоча я маю жахливу пам’ять, тому це, мабуть, користь мені більше, ніж інші.
toc777

6

Більше вміння допомогти компілятору перевірити ваш код.

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

Я можу мати функцію

f(int x)

але я вважаю за краще

f(int range[-5..25] x)

EG Мені хотілося б писати твердження про функції, використовуючи якусь функціональну мову вищого рівня, наприклад, Lisp чи Haskell. Вони не збираються в код, але можуть бути використані для статичного або динамічного аналізу.


По суті ефективний спосіб зробити перевірку меж? Це було б досить круто. Хоча я хоч би хотів, щоб це було включено для перевірки часу виконання, а також для перевірки часу компіляції. Коли ви перетягуєте інформацію з бази даних або з інтерфейсу користувача, ви завжди гарантуєте, що значення буде дійсним. Якби це мовна особливість, я б хотів використовувати її і для цих цілей.
Берін Лорич

3
Вам слід використовувати Pascal. Ви можете визначити тип, який охоплює довільний діапазон чисел, наприклад -5..25, який компілятор може перевірити під час компіляції. (Поки, звичайно, ви призначаєте лише константи.)
Мейсон Уілер

1
@Kugel: Що ще, крім функції компілятора, затверджено? І Unit Unit не перевірить код у виробництві. А не перевірити виробництво - це як зняти живі човни після дівочого плавання. Щоб заощадити пальне та зробити корабель швидше
Мартін

1
Я б використав Ada, за винятком того, що платформа, над якою я працюю, не має компілятора Ada. У ньому є лише компілятор C, так що це все одно академічно.
Rocketmagnet

1
Я вже використовую багато тверджень, але ще краще, щоб це та інші речі були мовними особливостями.
Rocketmagnet

5

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

Найгірший приклад - Ада:

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

Слова наповнювача, як, наприклад, .. не мають сенсу для мов програмування.


4
Я думаю, що найгірший приклад - це мови, де ви говорите public static void.
Джої Адамс

1
Ідея не нова, і вже реалізована в тодішній формі SmallTalk, у якій взагалі немає ключових слів. Тож вам слід було використовувати SmallTalk як позитивний приклад для вашої претензії. BTW: Якщо ви не знаєте, що ISтаке, то ви не зрозуміли Ada (чи програвали ви коли-небудь Ada?): ISВідокремлює декларацію процедури від оголошення локальних змінних, а також відрізняє специфікацію від реалізації. Звичайно, ви тільки помічаєте, порівнюючи специфікацію та реалізацію функції, щоб побачити, що це ISмає ідеальний сенс і зовсім не є наповнювачем.
Мартін

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

7
Слова наповнювача можуть насправді слугувати цілі, якщо вони допоможуть розмежувати синтаксис. Наприклад, я вважаю за краще , if x then …щоб if (x) …. Ми торгували парою дужок для контекстного ключового слова. Це має сенс, оскільки умова xможе бути складним виразом із власними дужками. Усунення самої зовнішньої пари може різко підвищити читабельність. Альтернативою, звичайно, є використання товстої кишки тут, як у Python. Насправді я вважаю, що більшість таких розбірливих наповнювачів можуть бути замінені колонами. Не впевнений, якому методу я віддаю перевагу.
Конрад Рудольф

3
@Konrad: Якщо він роз'єднує синтаксис, це не наповнювач. is Є наповнювачем , тому що Ада могла дозволили procedure Hello begin ... endбез будь - яких двозначностей.
dan04

4

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

Для мене Haskell - це чудовий приклад того, що я маю на увазі під «вивченням мови» (хоча вона також зростала популярністю та загальною корисністю протягом багатьох років). Відмовившись від звичного синтаксису С та маючи назад оператори композиції функцій (наприклад (+2) . (*3), це функція, яка помножується на 3, потім додає 2), Haskell навчив мене писати більш короткі функції. Його безжальна перевірка типу допомогла мені швидше вивчити мову та покращила мою здатність логічно мислити код. Обидві ці переваги перекинулися на інші мови, навіть складання.

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

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


2
Як композиція функцій Haskell якимось чином відстала? Це прямий переклад (f ∘ g)(x) = f(g(x)).
Джон Перді

@ Джон Перді: Це означає, що ви повинні записати функції у зворотному порядку їх застосування. В обох формах gзастосовується спочатку до аргументу, після чого f. Якщо ви хочете сортувати список, згрупувати його та отримати перший пункт із цих списків, ви напишете (map head . group . sort) listчи map head $ group $ sort listабо map head (group (sort list)). У всіх випадках ви закінчуєте писати операції назад. До речі, імпорт Control.Arrowдозволяє говорити (sort >>> group >>> map head) list, але >>>оператор виглядає для мене досить незручно і багатослівно.
Joey Adams

2
Я не знаю, я все ще думаю, що справа наліво має сенс. (map head . group . sort) listчитається як "перший елемент кожної групи у своєму роді list", що цілком природно - і, на моє вухо, більш функціональне, ніж те (sort >>> group >>> map head) list, що читається досить імперативно і відстало як "сортування, а потім групуйте тоді перший пункт кожної групи. .. list".
Джон Перді

@JoeyAdams - то >>>оператор виглядає досить незграбні і багатослівним - Кілька більш пізні функціональні мови почали використовувати в |>якості лівого направо оператора ланцюговим, що , можливо, трохи легше на очах ...
Жюль

4

Оскільки ми в 2011 році,

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

    all (o в моїй колекції) {o.someMethod ()}

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

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


Я з вами на 100% для повної специфікації. Багатопарадигма і послідовність, безумовно, будуть врівноважуючим актом. Ви можете вказати набір поведінки для динамічної парадигми як підмножину поведінки для статичної перевірки - але я думаю, що ці два підходи можуть піддаватися дуже різним стилям програмування. Вони справді мали б бути окремими мовами на той момент. Можливо, ви шукаєте пару послідовних мов зі 100% сумісністю?
Berin Loritsch

Такі мови, як Scala (а можливо, Haskell? Я цього не знаю достатньо), мають сильну систему статичного типу та лаконічність, завдяки виводу та імплікаціям типу.
PhiLho

2
Функції, що залежать від архітектури, добре, коли мова дозволяє програмісту вказати, що є, а що не важливо. Що робить C жахливим, це те, що немає способу оголосити "числовий тип, який обгортає модуль 65536"; навіть якщо платформа реалізує uint16_t, стандарт вимагає, щоб деякі реалізації розглядали різницю між двома uint16_tзначеннями як підписані, а інші розглядали різницю як неподписану; це не дає можливості програмісту визначити, яка поведінка бажана.
supercat

Я не згоден з багатопарадигмою; це залишає занадто багато місця для викручування для битв у стилі кодування. Бібліотека A написана купою динамічних парадигм . Бібліотека B написана купою статичних парадигм . Ну, тепер Бібліотеці А потрібно поговорити з Бібліотекою B; де середина? Якщо вам доводиться писати клей між двома фрагментами коду однією і тією ж мовою, мова є по суті хибним IMO.
Qix

3

Легкі процеси

Я хотів би мати легкі процеси, як в Ерланге. В основному це проблема для виконання. Цього немає у JVM та .NET CLR. LWP допомагає створювати масово одночасне програмне забезпечення. В ідеалі не повинно бути дорожчим створити процес, як це створити об’єкт мовою. Я хотів би створити мільйони процесів у своїх додатках.

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

Підтримка хвостової рекурсії

Мені б хотілося підтримати рекурсію хвоста. Це також може бути проблемою для середовища виконання. Наприклад, JVM не підтримує рекурсію хвоста.

Легке розподілене програмування

Я хотів би мати підтримку для відправки ( ! ) Та отримання примітивів до частин програми, що працює на інших машинах в тій же мережі, що і в Erlang. Це дозволяє легко створювати масштабовані програми, наприклад розподілені сховища даних. Додано до цієї вбудованої мови серіалізації також дуже корисно, як і в ерланг. І не так, як на Java, я повинен це робити вручну.


Хвост-рекурсія: c2.com/cgi/wiki?TailRecursion
Berin Loritsch

Scala має хвостову рекурсію і збирається в JVM. Компілятор IBM Java теж може іноді робити хвостові рекурсії.
Мартін

3

Спростіть метапрограмування.

обмежити спеціальні форми

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

Чи є нам дійсно потрібно for, foreach, whileі т.п. кожен у своїй особливій формі. Як щодо однієї петельної конструкції та деяких макросів за замовчуванням, щоб забезпечити синтаксичний цукор варіантів петельних форм.

метапрограмування для спеціальних форм

form['if'](test-fn, body-fn)


У сорту Ruby є "спеціальні форми" для циклічного циклу, принаймні в тому сенсі, що в ітерабельних об'єктах зазвичай є такий метод, eachякий приймає блок коду як аргумент. (У Ruby також є forі whileцикли, але жоден поважаючий себе програміст Ruby насправді не використовує.)
mipadi

@mipadi: Я великий фанат блоків Ruby та пов'язаних з ними ідіом.
дієтабудда

можливо вони думають - ти вистрієш око. :) Гадаю, це була асоціація всіх потужних "Python" і "немає вагомих причин чому". Тим не менш, метапрограмування є дійсним мовним дизайном, яке часто нехтують. Саме тому я підтримаю це.
Берін Лорич

@Berin: Я насправді використовую, і я фанат Python, що робить його кумеднішим.
дієтабудда

Один тип циклу зробив би потік коду неясним. Наприклад, як do..whileвиглядатиме цикл, якщо у верхній частині був один тип циклу? Це зовсім не буде схоже на цикл "до".
Qix

2

Можливості мережі

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

Більшість додатків у реальному світі потребують спілкування через якусь мережу:

  • автоматичне оновлення
  • доступ до бази даних
  • веб-сервіси

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


8
Але це може бути стандартною функцією бібліотеки просто чудово.
стипендіати Дональ

@Donal: Я ніколи не говорив інакше (або, принаймні, не думав так), питання є відкритим як для мови, так і для бібліотечних особливостей. Моя думка полягає лише в тому, що якщо ви отримаєте мовний пакет і в ньому немає можливостей мережі, ви заповнить біль рано, ніж пізніше :)
Матьє М.

3
Стандартна бібліотека дійсно є частиною досвіду мови, і до неї слід ставитися з такою ж уважністю та повагою. Я також згоден з цією вимогою до стандартної бібліотеки.
Берін Лорич

1

Мені подобається мова програмування, яку легко вивчити, і легко поєднувати для створення нових речей.

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

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

Я розумію, що іноді мовний синтаксис повинен перешкоджати кращій роботі на етапі компіляції / інтерпретації, але іноді я відчуваю, що дизайнер мови відкладає цю роботу розробнику. Наприклад, багаторядкові рядки в Java або Javascript.

Нарешті, синтаксис мови - це його користувальницький інтерфейс, і як такий він повинен бути чітким, стислим, інтуїтивним, простим у користуванні та повинен поважати ваші звички.


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

1
  • Читання : Чим менше / найменших символів використовується в граматиці, тим чистіше та краще.
  • Об'єктно-орієнтовані типи : методи, а не функції.
  • Зрозумілість : вбудовані вільні інтерфейси, вичерпні та короткі назви для бібліотечних класів / інтерфейсів та інших типів.

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

Для мене чистий код - це читабельний код. Я також сказав найменший: мати ":" замість "=>" у масивах PHP або мати ". замість "->", безумовно, буде поліпшенням (і мені вже подобається PHP).
герцогство, яке відбулося

4
@ Мейсон: Я і багато хороших технічних письменників (наприклад, Вільям Зінссер) не згодні. Багатослівність - це ворог читабельності, а не стислості.
Конрад Рудольф

2
Я переходжу до форми лаконічності, яка визначається символами . Я дуже задоволений багатознаковими символами, доки вони є тими речами, які читач природно сприймає як єдиний символ (наприклад, слово є символом).
стипендіати Дональ

1
Ваша перша точка прямо конфліктує з вашими останніми двома.
Qix

1

Додавання функції до існуючої мови програмування. Отже, нова мова B - це стара мова плюс функція X.

Існуючі приклади:

  1. C додавання класів => C ++
  2. Java додає деякі речі => C #

2
Це величезне спрощення. Набагато кращим прикладом може бути різниця між C і Objective-C.
Джон Перді

0

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

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

Оновлення: я надсилаю посилання на таку мову LabView

Оновлення: я мушу більше пояснити, що я маю на увазі під «обчислювальною потужністю». Продуктивність компільованого програмного забезпечення може бути не такою потужною, як складене програмне забезпечення на основі мови синтаксису. Я думаю про графічне програмування як про вищий рівень програмування, і може бути більше накладних витрат. Сьогоднішні комп’ютери можуть і легко запускати графічні мови програмування.


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

2
Це все ще мова про сорти. Було вже не одна спроба втілити це в реальність. Інструменти UML генеруватимуть певну кількість коду, але коли модель достатньо деталізована для створення діючого продукту, її неможливо зрозуміти для кодування. Я вважаю, що в середовищі Unix було щось для графічного підключення програм, але для корекції цього потрібно було багато конфігурації. Двигуни робочого процесу використовують цю метафору, щоб непрограмісти могли проектувати робочий процес.
Берін Лорич

1
Коротше кажучи, хоча я серйозно сумніваюся у корисності цього підходу в загальних рисах, є конкретні програми, де він зараз використовується і працює добре для цього додатка. Re: ваші бали ... 1. Комп'ютери мають обчислювальну потужність, технічна сторона - це не проблема. 2. Проблема полягає у наданні наочної мови, достатньо виразної, щоб виконати роботу в загальному сенсі, не втрачаючи деталей. Поза межами нішевих програм текст здається набагато більш компактним поданням програми. Я подав заяву, оскільки це стосується поставленого питання.
Берін Лорич

1
@Amir: Тоді поясніть, чому комп'ютери повинні бути більш потужними для того, щоб "графічне програмування" керувало розробкою програмного забезпечення?
Джеремі Хайлер

7
@Amir: Ви обмежуєте технічне обмеження з більш фундаментальним. Причина, що у нас не так багато мов графічних комп'ютерів, полягає в тому, що ми не знаємо, як зробити їх добре (і не знаємо, чи можна це зробити добре). Я знаю про LabView, і почув достатньо сукання про те, щоб робити в ньому складні речі або змінювати прості речі. Також нам не потрібні більш потужні комп’ютери для розробки такої мови, тому йдіть вперед і спробуйте накреслити кілька прикладних програм такою гіпотетичною мовою.
Девід Торнлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.