Чому критичні короткі ідентифікатори все ще такі поширені в програмуванні низького рівня?


64

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

Чому це? Це просто тому, що старі звички важко порушити, чи є кращі причини?

Наприклад:

  • Atmel ATMEGA32U2 (2010?): TIFR1(Замість TimerCounter1InterruptFlag), ICR1H(замість InputCapture1High), DDRB(замість DataDirectionPortB) тощо.
  • Набір інструкцій .NET CLR (2002): bge.s(замість branch-if-greater-or-equal.short) тощо.

Чи не довші, некриптичні імена легше працювати?


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

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

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


82
Відповідь: Щоб ви відчували, як програмуєте на мові низького рівня.
Томас Едінг

5
Криптика відносна. JSRє втричі довше, ніж опкод, який він представляє ( $20на 6502) і значно простіше зрозуміти з першого погляду.
Blrfl

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

4
@gnat: Спробуйте set Accumulator32 to BaseIndex32? Просто розширення традиційних скорочень - не єдиний спосіб зробити щось більш читабельним.
Тімві

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

Відповіді:


106

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

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

Таблиця TIFR1 з таблиці

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


7
Крім того, ця відповідь насправді не стосується чисто програмного забезпечення, наприклад, CLR, JVM, x86 тощо. :)
Timwi

12
@romkyns: Дещо очевидніше, чому вони використовували ці короткі імена, коли ви насправді читали ці таблиці. Таблиці даних для мікроконтролера, які я маю під рукою, становить близько 500 сторінок навіть при використанні коротких імен на всьому протязі . Ширина таблиць охоплювала б кілька сторінок / екранів, якби ми використовували довші імена, що робило їх дуже незручними для використання посилань.
In silico

27
@romkyns: Більші назви однаково шукати, але вони "не рідні". Якщо ви слухаєте вбудованих інженерів, вони насправді говорять "нульовий рівень", а не "прапор переривання таймера нуля". Я сумніваюся, що веб-розробники також розширюють HTTP, HTML або JSON у своїх назвах методів.
TMN

6
@KarlBielefeldt ер, що? :) Очевидно, що я не знайду його у поточному аркуші, тому що замість них вони перейшли до короткої назви. Це не підтверджує твердження, що короткі імена можна шукати якнайменше ...
Роман Старков

5
Це не просто таблиці даних, які обмежені простором, це схеми. Усі ці логічні компоненти мають відведення, які потрібно підключити до інших компонентів. "TimerCounter1InteruptFlag.clear" не підходить поверх крихітного представлення проводів майже так само "TCIF.C"
AShelly

60

Закон Зіпфа

Ви самі можете спостерігати, дивлячись на цей самий текст, що довжина і частота вживання слова взагалі взаємопов'язані. Слова, які використовуються дуже часто, як it, a, but, youі andдуже короткі, в той час як слова, які використовуються рідше подобається observe, comprehensionі verbosityбільше. Цей спостережуваний взаємозв'язок між частотою та довжиною називається законом Зіпфа .

Кількість інструкцій в наборі інструкцій для даного мікропроцесора зазвичай налічується десятками або сотнями. Наприклад, набір інструкцій Atmel AVR містить близько ста різних інструкцій (я не рахував), але багато з них є варіаціями на загальну тему і мають дуже схожу мнемоніку. Наприклад, інструкції щодо множення включають MUL, MULS, MULSU, FMUL, FMULS та FMULSU. Вам не доведеться дуже довго дивитися на перелік інструкцій, перш ніж ви отримаєте загальне уявлення про те, що інструкції, які починаються з "BR", - це гілки, інструкції, які починаються з "LD", - це навантаження тощо. Це ж стосується змінних: навіть складні процесори надають лише обмежену кількість місць для зберігання значень: регістри стану, регістри загального призначення тощо.

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

Крім того, набори інструкцій для різних процесорів часто використовують подібні назви для подібних операцій. Більшість наборів інструкцій включають операції для ADD, MUL, SUB, LD, ST, BR, NOP, і якщо вони не використовують ці точні імена, вони зазвичай використовують імена, які дуже близькі. Після того, як ви дізналися мнемоніку для одного набору інструкцій, не потрібно багато часу, щоб адаптуватися до наборів інструкцій для інших пристроїв. Тож імена, які можуть здатися вам "загадковими", настільки ж звичні, як слова, як and, наприклад or, і notпрограмістам, кваліфікованим у галузі програмування низького рівня. Я думаю, що більшість людей, які працюють на рівні складання, скажуть вам, що навчання читання коду не є однією з найбільших проблем у програмуванні низького рівня.


2
дякую Калебу! Мені ця чудова відповідь врятувала запитання, яке якось вдалося зібрати чотири ціннісні судження в одну назву: "криптовалюта", "коротко", "все-таки", "так часто"
гнат

1
Дякую, @gnat, за ваш коментар і ваш щедрий бонус.
Калеб

37

Загалом

Якість іменування стосується не лише описових імен, але й інших аспектів, а це призводить до таких рекомендацій:

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

Зауважте, що ці рекомендації суперечать один одному.

Інструкція мнемоніка

Як програміст з мовної збірки, використання short-branch-if-greater-or-equalдля bge.sмене справляє таке ж враження, як коли я бачу, як програміст Algol SUBSTRACT THE-HORIZONTAL-COORDINATE-OF-THE-FIRST-POINT TO THE-HORIZONTAL-COORDINATE-OF-THE-SECOND-POINT GIVING THE-DIFFERENCES-OF-THE-COORDINATE-OF-THE-TWO-POINTSзамість цього робив обчислювальну геометрію dx := p2.x - p1.x. Я просто не можу погодитися, що перші читаються в контекстах, про які я дбаю.

Зареєструйте імена

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


4
Це TIFR1дійсно краща схема імен, ніж InterruptFlag1все-таки, або IptFlag1якщо ви дійсно повинні бути короткими?
Тімві

4
@Timwi, InterruptFlagі IptFlagкраще, ніж IFтак само, як EnumerableInterfaceі ItfcEnumerableкраще, ніж IEnumerable.
AProgrammer

@AProgrammer: Я вважаю вашу відповідь та ваш коментар найкращими, і я би визначив її прийнятою, якби міг. Ті, хто вважає, що лише фізичні межі диктують короткі назви, помиляються. Ця дискусія буде цікавою для вас: 37signals.com/svn/posts/…
alpav

5
@alpav Ви розумієте, що ваше посилання стверджує протилежне тому, що говорить ця відповідь? Якщо що-небудь, це повністю підтримує InterruptFlag1з міркувань кращої ясності.
Роман Старков

24

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

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

Наскільки bge.sце схоже на асемблер - тим мало хто, кому потрібно знати, довші назви менш читабельні. Якщо ви не можете змусити вас обійтися bge.sі думаєте, що branch-if-greater-or-equal.shortзміниться - ви просто граєте з CLR і не знаєте цього.

Інша причина того, що ви побачите короткі назви змінних, пов'язана з широким поширенням скорочень у домені, на яке орієнтується програмне забезпечення.

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


Якщо я зрозумів аргумент, який ви використовуєте для захисту "bge.s", TIFR1читабельніше для тих, хто повинен це знати, чи не так TimerCounter1InterruptFlag?
Роман Старков

2
@romkyns: Абсолютно - в цьому випадку менше - це більше .... На відміну від CNTR, який може означати "Лічильник", "Контроль", "Неможливо простежити маршрут" тощо, T1FR1 Точно визначене значення.
mattnz

"Якщо ви не зможете змусити вас обернутися bge.s і подумати, що галузь, якщо-більша-або-рівна.коротка, змінить значення - ви просто граєте з CLR і не знаєте цього." Я не знаю про це. Я досить добре розумію збірку x86, але щоразу, коли пишу цикл, я повинен шукати, що означають усі j?інструкції . Маючи більш очевидно названу інструкцію, безумовно, допоможе мені. Але, можливо, я швидше виняток, ніж правило. У мене проблеми з запам'ятовуванням дрібницьких деталей.
Коді Грей

11

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

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

То чому чомусь загальновідомі короткі ідентифікатори настільки поширені в програмуванні низького рівня?

  • Оскільки багато з них досить поширені у відповідному домені, щоб гарантувати дуже коротку назву. Це погіршує криву навчання, але є корисним компромісом, враховуючи частоту використання.
  • Оскільки зазвичай є невеликий набір можливостей, який фіксується (програміст не може додати до набору).
  • Тому що читабельність - це питання звички та практики. branch-if-greater-than-or-equal.shortє спочатку більш читабельним , ніж bge.s, але з деякою практикою ситуація стає зворотним.
  • Тому що їх часто доводиться вводити повністю вручну, оскільки мови низького рівня часто не мають потужних IDE, які мають гарне автодоповнення, або ж / c не є надійним.
  • Тому що іноді бажано запакувати багато інформації в ідентифікатор, і читабельна назва неприйнятно довга навіть за високими стандартами.
  • Тому що так виглядали історичні середовища низького рівня. Порушення звички вимагає усвідомлених зусиль, ризикує роздратувати тих, хто любив старі способи, і його потрібно виправдати як належне. Дотримуватися встановленого способу - це "за замовчуванням".
  • Тому що багато з них походять з інших місць, наприклад, схеми та таблиці даних. На них, у свою чергу, впливають космічні обмеження.
  • Тому що люди, відповідальні за називання речей, ніколи навіть не вважали читабельністю, або не розуміють, що вони створюють проблему, або лінуються.
  • Тому що в деяких випадках імена стають частиною протоколу обміну даними, наприклад, використання мови збирання в якості проміжного представлення деякими компіляторами.
  • Тому що цей стиль миттєво розпізнається як низькорівневий і, таким чином, виглядає прикольно до вундуків.

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


10

Я буду кидати шапку в цей безлад.

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

Деякі, однак, служать цілі. Звичайно, BranchGreaterThan було б набагато легше читати, ніж BGT , але зараз там є умова , це інструкція, і як така вона отримала деяку тягу за останні 30 років використання в якості стандарту. Чому вони почали саме з цього, ймовірно, довільної межі ширини символів для інструкцій, змінних тощо? чому вони його зберігають, це стандарт. Цей стандарт такий же, як використання int в якості ідентифікатора, Integer було б більш розбірливим у всіх випадках, але чи потрібно це тому, хто програмує більше декількох тижнів ... ні. Чому? Тому що це стандартна практика.

По-друге, як я вже сказав у своєму коментарі, багато переривань називаються INTG1 та іншими криптовалютними іменами, вони також служать цілі. У діаграмах схеми НЕ добре умовляти називати ваші рядки, і таке багатослів’я це захаращує діаграму і шкодить розбірливості. Вся багатослівність обробляється в документації. Оскільки всі діаграми проводки / схеми мають ці короткі назви ліній переривання, самі переривання також отримують те саме ім'я, що і для збереження послідовності вбудованого конструктора від схеми аж до коду для його програмування.

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

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


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

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

4
+1 Я також ніколи не розумів, чому люди використовують короткі криптовалютні назви типу "вода", якщо є набагато більш читабельний "DiHydrogenOxyde"
Інго

6

Однією з причин вони користуються критичні короткі ідентифікатори - це тому, що вони не є критичними для розробників. Ви повинні усвідомити, що вони працюють з цим щодня, і ці імена справді є доменними іменами. Тож вони напам'ять знають, що саме означає TIFR1.

Якщо до команди прийде новий розробник, йому доведеться читати таблиці (як пояснив @KarlBielefeldt), щоб їм було зручно.

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

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


5

Підсумок

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

Причини криптовалют:

  1. Інструкції низького рівня сильно набрані
  2. Потрібно запакувати багато типів інформації в назву інструкції низького рівня
  3. Історично склалося, що однофакторні коди віддають перевагу упаковці інформації про тип.

Рішення та їх недоліки:

  1. Існують сучасні схеми іменування низького рівня, які є більш послідовними, ніж історичні.
    • LLVM
  2. Однак необхідність упакувати багато інформації про тип все ще існує.
    • Таким чином, криптичні абревіатури все ще можна зустріти скрізь.
  3. Поліпшена читабельність за рядком допоможе початківцю програмісту низького рівня швидше підібрати мову, але не допоможе зрозуміти великі фрагменти коду низького рівня.

Повна відповідь

(A) Більші назви можливі. Наприклад, імена внутрішніх символів C ++ SSE2 в середньому 12 символів порівняно з 7 символами в мнемонічній збірці. http://msdn.microsoft.com/en-us/library/c8c5hx3b(v=vs.80).aspx

(B) Далі питання переходить до: Як довго / не криптовалюта потрібно отримувати інструкції низького рівня?

(C) Тепер ми аналізуємо склад таких схем іменування. Нижче наведено дві схеми іменування для тієї ж інструкції низького рівня:

  • Схема іменування №1: CVTSI2SD
  • Схема іменування №2: __m128d _mm_cvtsi32_sd (__m128d a, int b);

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

(C.2) Кожна інструкція низького рівня повинна кодувати багато типів інформації у своє ім'я. Приклади інформації:

  • Сім'я архітектури
  • Операція
  • Аргументи (входи) та результати
  • Типи (підписаний цілий, без підпису, цілий поплавок)
  • Точність (бітова ширина)

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

(C.4) Схеми кодування типів, які використовуються різними постачальниками, мали давнє історичне коріння. Наприклад, у наборі інструкцій x86:

  • B означає байт (8-бітний)
  • W означає слово (16-бітове)
  • D означає слово "подвійне слово" (32-бітове)
  • Q означає qword "чотири слово" (64-розрядне)
  • DQ означає dqword "подвійне чотири слово" (128-бітове)

Ці історичні посилання не мали жодного сучасного значення, але все ще залишаються навколо. Більш послідовна схема додала б в ім'я значення бітової ширини (8, 16, 32, 64, 128).

Навпаки, LLVM - це правильний крок у напрямку узгодженості інструкцій низького рівня: http://llvm.org/docs/LangRef.html#functions

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


1
Поліпшення читабельності рядків до рядка обов'язково матиме певний вплив на усвідомлення всієї справи, але, звичайно, лише називання не може зробити це тривіальним.
Роман Старков

3
Крім того, різновид тематики, але CVTSI2SDне містить більше інформації, ніж ConvertDword2Doubleабо ConvInt32ToFloat64, але остання, хоча і довше, миттєво впізнається, тоді як перша повинна бути розшифрована ...
Роман Старков,

2

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

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


Якщо вам потрібно економити простір, просто gzip!! Якщо вам не потрібні накладні витрати, використовуйте замість цього двійковий формат! Якщо ви використовуєте текст, ви прагнете до читабельності - то чому б не пройти весь шлях і зробити його належним чином для читання?
Роман Старков

2
@romkyns, стискаючи текстовий протокол зв'язку між двома локальними процесами? Це щось нове. Бінарні протоколи набагато менш надійні. Це універсальний спосіб - текстові протоколи існують для випадкової читабельності. Вони читаються досить просто.
SK-логіка

Правильно. Ваша передумова полягає в тому, що я читаю і записую назви цих регістрів чи інструкцій CIL, мало того, щоб накладні витрати мали значення. Але подумайте про це; вони використовуються так само часто, як будь-який непарний метод або ім'я змінної в будь-якій іншій мові програмування під час програмування . Це так рідко, що зайві кілька байтів мають значення?
Роман Старков

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

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

1

Переважно це ідіоматично. Як говорить @TMN в іншому місці, так само, як ви не пишете import JavaScriptObjectNotationабо import HypertextTransferProtocolLibraryв Python, ви не пишете Timer1LowerHalf = 0xFFFFв C. Це виглядає так само смішно в контексті. Кожен, хто повинен це вже знати, знає.

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

Наприклад, компілятор C HiTech включав спеціальний синтаксис змінних, які потребували для визначення в пам'яті позиції, визначеної користувачем. Ви можете заявити:

volatile char MAGIC_REGISTER @ 0x7FFFABCD;

Зараз єдиний існуючий IDE, який буде аналізувати це власний IDE HiTech ( HiTide ). У будь-якому іншому редакторі вам доведеться кожного разу вводити його вручну, з пам’яті. Це дуже швидко старіє.

Тоді також є той факт, що коли ви використовуєте інструменти розробки для перевірки регістрів, вам часто буде відображатися таблиця з декількома стовпцями (ім’я реєстру, значення в шістнадцятковій величині, значення в двійковій формі, останнє значення в шістнадцятковій формі тощо). Довгі імена означають, що вам потрібно розгорнути стовпчик імен до 13 символів, щоб побачити різницю між двома регістрами, і відтворити «помітити різницю» через десятки рядків повторених слів.

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


2
Усі ваші аргументи мають сенс. Я повністю розумію всі ці моменти. Однак ви не вважаєте, що саме те саме стосується коду високого рівня? Вам також потрібно побачити таблицю місцевих жителів у функції C #. Контекст є суб'єктивним і File.ReadAllBytesможе також виглядати смішно довго тому, хто звик fread. Отже ... навіщо ставитися до коду високого та низького рівня по- різному ?
Роман Старков

@romkyns - Я вважаю, що ми насправді не дуже по- різному ставимось до коду високого рівня . Скорочення в багатьох контекстах високого рівня є чудовими, ми просто не усвідомлюємо цього, оскільки ми більше звикли до абревіатури або будь-якої схеми. Коли я фактично пишу функції або створюю змінні в коді низького рівня, я використовую приємні описові імена. Але коли я посилаюсь на реєстр, я радий, що можу зазирнути на безліч букв і цифр і швидко подумати "T = таймер, IF = прапор переривання, 1 = перший реєстр". Це майже як органічна хімія в цьому відношенні: P
декретно

@romkyns - Крім того , в суто практичному сенсі, я думаю , що різниця між таблицею регістрів IDE і розробки додатків деякого мікропроцесора в C # це: таблиця регістрів ÜP може виглядати наступним чином : Timer1InterruptFlag, Timer2InterruptFlag, ..., Timer9InterruptFlag, IOPortAToggleMask, IOPortBToggleMask, тощо x100. У мові вищого рівня ви використовуєте змінні, які відрізняються набагато більше ... або ви використовуєте більше структури. Timer1InterruptFlagстановить 75% невиправданого шуму в порівнянні з T1IF. Я не думаю, що ви створили б величезний перелік змінних у C #, які ледь відрізняються так.
detly

1
@romkyns - Те, що ви, можливо, не знаєте, - це факт, що існує вже спостерігається зрушення в бік то , що ви описуєте. Останні компілятори Microchip поставляються з бібліотеками, які набагато більш багатослівні та описові, ніж просто регістри, наприклад. UARTEnable(UART1, BITS_8, PARITY_N, STOP_1, BAUD_115200). Але вони все ще неймовірно незграбні і передбачають багато непрямості та неефективності. Я намагаюся використовувати їх там, де це можливо, але більшу частину часу я переношу маніпуляції з реєстром у власні функції і викликаю це з логіки вищого рівня.
detly

@detly: Компілятор CCS мав такі методи, як це роблять деякі інші процесори. Я взагалі їх не люблю. Спеціалізації реєстру достатньо для написання коду, який використовує регістри, і достатньо, щоб хтось читав код, який використовує регістри, щоб побачити, що роблять ці регістри. Якщо акт запису значення N на апаратний доскаляр встановить період N + 1 (досить поширений), то власне значенняset_prescalar(TMR4,13); IMHO набагато менш зрозуміле, ніж було б TMR4->PSREG=12;. Навіть якщо ви подивитесь на посібник з компілятора, щоб дізнатися, що робить перший код, ймовірно, все одно доведеться ...
supercat

1

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

  1. Наукове підґрунтя програміста.
  2. Навички програмування програміста.
  3. Середовище програміста.

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


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

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

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


ніхто не згадав про лінь - можливо, це тому, що це тут не актуально. І що інші науки не обговорюються , це просто: цей сайт не для обговорення . Це для запитань та відповідей
gnat

Лінь - це законна причина. Практично всі програмісти - ледачі (інакше ми б все робили ооо!).
Томас Едінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.