저수준 프로그래밍에서 암호 형 짧은 식별자가 왜 그렇게 일반적입니까?


64

명령 / 레지스터 이름을 짧게 유지해야하는 매우 좋은 이유 가있었습니다 . 이러한 이유는 더 이상 적용되지 않지만 낮은 수준의 프로그래밍에서는 짧은 암호 이름이 여전히 일반적입니다.

왜 이런거야? 오래된 습관이 깨지기 어렵거나 더 좋은 이유가 있습니까?

예를 들면 다음과 같습니다.

  • Atmel ATMEGA32U2 (2010?) : TIFR1(대신 TimerCounter1InterruptFlag), ICR1H(대신 InputCapture1High), DDRB(대신 DataDirectionPortB) 등
  • .NET CLR 명령어 세트 (2002) : bge.s(대신 branch-if-greater-or-equal.short) 등

길고 비 암호적인 이름으로 작업하기가 쉽지 않습니까?


응답하고 투표 할 때 다음 사항을 고려하십시오. 여기에 제안 된 가능한 많은 설명은 고급 프로그래밍 에도 동일하게 적용 되지만, 합의는 대체로 한두 단어로 구성된 비 암호적인 이름을 사용하는 것입니다 (일반적으로 이해되는 약어는 제외).

또한 주요 다이어그램이 종이 다이어그램의 물리적 공간에 관한 것이라면 이것이 어셈블리 언어 또는 CIL에 절대적으로 적용되지 않는다는 것을 고려하십시오. 또한 간결한 이름은 맞지만 읽을 수있는 이름은 다이어그램을 악화시키는 다이어그램을 보여 주시면 감사하겠습니다. . 팹리스 반도체 회사에서의 개인적인 경험을 통해 읽을 수있는 이름은 잘 맞으며 더 읽기 쉬운 다이어그램이됩니다.

이란 무엇입니까 핵심 것은 높은 수준의 언어 반대로 낮은 수준의 프로그래밍에 대한 다른 낮은 수준에서 바람직하지만 높은 수준의 프로그래밍 간결한 암호 같은 이름을 무엇입니까?


82
답 : 저수준 언어로 프로그래밍하는 것처럼 느끼게하기 위해.
Thomas Eding

5
암호는 상대적입니다. JSR$206502에서 나타내는 opcode보다 3 배 길며 한 눈에 이해하기가 훨씬 쉽습니다.
Blrfl

4
정답이 있기 때문에 약간 실망하지만 확실히 받아 들일 수는 없습니다. 회로도 및 이러한 인터럽트의 이름은 일반적으로 연관된 회선의 이름을 따서 명명되며 회로도에서는 자세하게 표시하지 않으려는 것이 좋지 않거나 실용적이지 않습니다. 둘째, 답변이 마음에 들지 않는다고해서 정답이 아니라는 의미는 아닙니다.
Jeff Langemeier

4
@ gnat : 시도해보십시오 set Accumulator32 to BaseIndex32? 전통적인 약어를 단순히 확장하는 것만으로는 더 읽기 쉬운 방법이 아닙니다.
Timwi

1
"주요 주장이 종이 다이어그램의 물리적 공간에 관한 것이라면"좋은 이름 지정이 단순히 이름의 명료 함보다 다른 것들을 고려한다는 사실에 관한 것이 아닙니다. 칠판-이 다른 것 중 하나 일뿐입니다.
AProgrammer

답변:


106

소프트웨어가 해당 이름을 사용하는 이유는 데이터 시트가 해당 이름을 사용하기 때문입니다. 데이터 시트가 없으면 해당 수준의 코드를 이해하기가 매우 어려우므로 검색 할 수없는 변수 이름을 만드는 것은 매우 도움이되지 않습니다.

데이터 시트가 짧은 이름을 사용하는 이유에 대한 의문이 제기됩니다. 아마도 25 문자 식별자를위한 공간이없는 경우 이와 같은 테이블에 이름을 제시해야하기 때문일 수 있습니다.

데이터 시트의 TIFR1 테이블

또한 회로도, 핀 다이어그램 및 PCB 실크 스크린과 같은 공간은 종종 공간이 매우 비좁습니다.


7
또한이 답변은 CLR, JVM, x86 등과 같은 순수한 소프트웨어 측면을 실제로 다루지는 않습니다. :)
Timwi

12
@romkyns : 실제로이 데이터 시트를 읽을 때 왜이 짧은 이름을 사용했는지 조금 더 분명합니다. 내가 가지고있는 마이크로 컨트롤러의 데이터 시트 는 짧은 이름을 사용하더라도 약 500 페이지 입니다. 더 긴 이름을 사용하면 테이블 너비가 여러 페이지 / 화면에 걸쳐 표시되므로 참조하기가 매우 불편합니다.
silico에서

27
@romkyns : 더 긴 이름은 똑같이 검색 가능하지만 "기본이 아님" 임베디드 엔지니어의 말을 듣게되면 실제로는 "타이머 제로의 인터럽트 플래그"가 아니라 "강한 제로"라고 말합니다. 웹 개발자가 메소드 이름으로 HTTP, HTML 또는 JSON을 확장한다고 의심합니다.
TMN

6
@KarlBielefeldt 어, 뭐? :) 분명히 짧은 이름을 사용했기 때문에 현재 데이터 시트에서 찾을 수 없습니다. 그것은 짧은 이름이 가장 작은
것에서

5
공간이 제한된 데이터 시트 일뿐만 아니라 회로도입니다. 이러한 모든 논리적 구성 요소에는 다른 구성 요소에 연결해야하는 리드가 있습니다. "TimerCounter1InteruptFlag.clear는"거의뿐만 아니라 작은 와이어 표현의 상단에 "TCIF.C을"적합하지 않습니다
AShelly

60

Zipf의 법칙

단어 길이와 사용 빈도가 일반적으로 반비례한다는이 텍스트를 보면 스스로 관찰 할 수 있습니다. 같은, 매우 자주 사용되는 단어 it, a, but, you, 그리고 and덜 자주 사용되는 단어를 좋아하지만, 매우 짧은 observe, comprehension그리고 verbosity더 이상. 이 주파수와 길이의 관계를 Zipf 's Law 라고 합니다.

주어진 마이크로 프로세서에 대한 명령어 세트의 명령어 수는 일반적으로 수십 또는 수백 개의 숫자입니다. 예를 들어 Atmel AVR 명령어 세트 에는 약 100 개의 별개의 명령어가 포함되어있는 것으로 보이지만 (많이 계산하지는 않았지만) 공통된 주제에 대한 변형이며 매우 유사한 니모닉이 있습니다. 예를 들어, 곱셈 명령어는 MUL, MULS, MULSU, FMUL, FMULS 및 FMULSU를 포함합니다. "BR"로 시작하는 명령은 브랜치, "LD"로 시작하는 명령은로드 등의 일반적인 아이디어를 얻기 전에 오랫동안 명령 목록을 볼 필요가 없습니다. 변수에도 동일하게 적용됩니다. 복잡한 프로세서조차도 조건 레지스터, 범용 레지스터 등과 같이 값을 저장하는 제한된 수의 장소 만 제공합니다.

지시 사항이 적고 긴 이름을 읽는 데 시간이 오래 걸리므로 짧은 이름을 지정하는 것이 좋습니다. 이와 반대로 고급 언어를 사용하면 프로그래머가 수많은 함수, 메서드, 클래스, 변수 등을 만들 수 있습니다. 이들 각각은 대부분의 조립 지침보다 훨씬 덜 자주 사용될 것이며, 독자 (및 작가)에게 자신이 무엇을하고 무엇을하는지 이해할 수있는 충분한 정보를 제공하기 위해서는 더 긴 이름이 점점 더 중요 해지고 있습니다.

또한 다른 프로세서에 대한 명령어 세트는 종종 유사한 작업에 유사한 이름을 사용합니다. 대부분의 명령어 세트에는 ADD, MUL, SUB, LD, ST, BR, NOP에 대한 연산이 포함되며 정확한 이름을 사용하지 않으면 일반적으로 매우 가까운 이름을 사용합니다. 하나의 명령어 세트에 대한 니모닉을 배운 후에는 다른 장치의 명령어 세트에 적응하는 데 오래 걸리지 않습니다. 당신에게 "비밀"보일 수도 이름이 같은 단어만큼이나 잘 알고 그래서 and, ornot낮은 수준의 프로그래밍 기술 분야에서 숙련 된 프로그래머. 어셈블리 수준에서 일하는 대부분의 사람들은 코드를 읽는 법을 배우는 것이 저수준 프로그래밍에서 큰 도전 중 하나가 아니라고 말할 것입니다.


2
감사합니다 Caleb! 나에게이 훌륭한 답변은 "암호 적", "짧음", "정지", "너무 흔하다"라는 제목으로 네 가지 가치 판단 을 수집하는 질문을 어떻게
gnat

1
귀하의 의견과 관대 한 보너스에 대해 @gnat에게 감사드립니다.
Caleb

37

일반적으로

이름 지정 품질은 설명적인 이름을 갖는 것이 아니라 다른 측면도 고려해야하며, 다음과 같은 권장 사항으로 이어집니다.

  • 범위가 전체적으로 클수록 이름이 더 설명 적이어야합니다.
  • 자주 사용하면 이름이 짧아 져야합니다
  • 모든 상황에서 동일한 이름을 사용해야합니다.
  • 상황이 다르더라도 다른 것들의 이름이 달라야합니다
  • 변형이 쉽게 감지되어야합니다
  • ...

이러한 명령은 충돌합니다.

지시 니모닉

어셈블리 언어 프로그래머로서 short-branch-if-greater-or-equalfor 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짧아야합니까?
Timwi

4
@Timwi는, InterruptFlagIptFlag보다는 더 낫다 IF같은 방법으로 그것을에서 EnumerableInterfaceItfcEnumerable보다 더 있습니다 IEnumerable.
AProgrammer

@AProgrammer : 귀하의 답변과 귀하의 의견이 최고라고 생각하며, 가능하다면이를 승인 된 것으로 표시하겠습니다. 신체적 한계 만이 짧은 이름을 지시한다고 믿는 사람들은 잘못되었습니다. 이 토론은 당신에게 흥미로울 것입니다 : 37signals.com/svn/posts/…
alpav

5
@alpav 귀하의 링크가이 답변의 반대 의견을 주장한다는 것을 알고 있습니까? InterruptFlag1더 나은 선명도를 위해 완벽하게 지원합니다 .
Roman Starkov

24

"오래된 습관"이유와는 별도로 30 년 전에 작성되었지만 여전히 사용중인 레거시 코드는 매우 일반적입니다. 경험이 부족한 사람들이 생각하는 것에도 불구하고,이 시스템을 리팩토링하면 예쁘게 보이기 때문에 적은 비용으로 높은 비용이 발생하며 상업적으로 실행 가능하지 않습니다.

하드웨어에 가깝고 레지스터에 액세스하는 내장 시스템은 매우 좋은 이유로 하드웨어 데이터 시트에 사용 된 것과 동일하거나 유사한 레이블을 사용하는 경향이 있습니다. 하드웨어 데이터 시트에서 레지스터를 XYZZY1이라고하면 XYZZY1 일 가능성이 있거나 프로그래머가 좋은 날인 RegXYZZY1을 나타내는 변수가 의미가 있습니다.

까지는 bge.s어셈블러와 비슷합니다. 더 긴 이름을 알아야하는 사람들은 읽기가 어렵습니다. 당신이 머리를 댈 수없고 차이를 만들 bge.s것이라고 생각 branch-if-greater-or-equal.short한다면-당신은 단지 CLR을 가지고 놀고 있고 그것을 모른다.

짧은 변수 이름이 표시되는 다른 이유는 소프트웨어가 대상으로하는 도메인 내에 약어가 널리 퍼져 있기 때문입니다.

요약하면, 산업 규범 및 하드웨어 데이터 시트와 같은 외부 영향을 반영하는 짧은 약식 변수 이름이 예상됩니다. 소프트웨어 내부의 축약 형 변수 이름은 일반적으로 바람직하지 않습니다.


"bge.s"를 방어하기 위해 사용하는 주장을 이해했다면, 그것을 이해해야하는 TIFR1사람들이 더 읽기 편 TimerCounter1InterruptFlag합니까?
Roman Starkov

2
@romkyns : 절대적으로-이 경우에는 더 적습니다 .... "카운터", "제어", "경로 추적 불가"등을 의미 할 수있는 CNTR과 달리 T1FR1 정확하게 정의 된 의미.
mattnz

"만약 당신이 bge.s를 둘러 보지 못하고 branch-if-greater-or-equal.short가 차이를 만들 것이라고 생각한다면, 당신은 단지 CLR을 가지고 놀고 있고 그것을 모른다는 것입니다." 나는 그것에 대해 모른다. x86 어셈블리를 잘 이해하지만 루프를 작성할 때마다 모든 j?지침의 의미 를 찾아야합니다 . 더 분명한 이름의 수업을 받으면 분명히 도움이 될 것입니다. 그러나 어쩌면 나는 규칙보다는 예외입니다. 사소한 세부 사항을 기억하는 데 어려움이 있습니다.
코디 그레이

11

여기에는 많은 다른 아이디어가 있습니다. 나뿐만 기존의 답변의 받아 들일 수 없다 답 : 첫째,이에 기여 가능성이 많은 요인이있다, 둘째, 나는 아마도 가장 중요한 하나입니다 하나 알 수 없다.

여기 다른 사람들이 게시 한 답변 요약이 있습니다. 나는 이것을 CW로 게시하고 있으며 내 의도는 결국 그것을 승인 표시하는 것입니다. 누락 된 부분이 있으면 수정하십시오. 나는 간결하면서도 명확하게 표현하기 위해 각 아이디어를 바꾸려고 노력했다.

그렇다면 왜 저수준 프로그래밍에서 암호 식 짧은 식별자가 그렇게 일반적입니까?

  • 이들 중 다수는 해당 도메인에서 매우 짧은 이름을 보증하기에 충분히 공통이기 때문에. 이것은 학습 곡선을 악화 시키지만 사용 빈도를 고려할 때 가치있는 트레이드 오프입니다.
  • 일반적으로 고정 된 작은 가능성 세트 가 있기 때문에 (프로그래머는 세트에 추가 할 수 없음).
  • 가독성은 습관과 연습의 문제이기 때문입니다. branch-if-greater-than-or-equal.short이다 처음 보다 더 많은 읽을 수 bge.s있지만, 일부 연습 상황은 반전된다.
  • 저수준 언어에는 자동 완성 기능이 뛰어난 강력한 IDE가 제공되지 않거나 a / c가 신뢰할 수 없기 때문에 수작업으로 직접 입력해야하는 경우가 종종 있습니다.
  • 많은 정보를 식별자에 포함시키는 것이 때때로 바람직하기 때문에, 높은 수준의 표준에 의해서도 읽을 수있는 이름은 용납 될 수 없을 것입니다.
  • 저수준 환경은 역사적으로 보였기 때문입니다. 습관을 끊으려면 의식적인 노력이 필요하고, 예전 방식을 좋아하는 사람들을 귀찮게 할 위험이 있으며, 가치있는 것으로 정당화되어야합니다. 정해진 방법을 고수하는 것이 "기본"입니다.
  • 대부분 회로도 및 데이터 시트와 같은 다른 곳에서 시작 되었기 때문입니다. 이것들은 공간 제약의 영향을받습니다.
  • 사물 이름 지정을 담당하는 사람들은 가독성을 고려한 적이 없거나 문제를 일으키거나 게으르다는 사실을 몰랐기 때문입니다.
  • 경우에 따라 이름은 일부 컴파일러의 중간 표현으로 어셈블리 언어를 사용하는 것과 같이 데이터 교환을위한 프로토콜의 일부가 되었기 때문 입니다.
  • 이 스타일은 즉시 저수준으로 인식되므로 괴짜에게는 시원하게 보입니다.

개인적으로이 중 일부는 실제로 새로 개발 된 시스템이이 이름 지정 스타일을 선택하는 이유에 기여하지 않는다고 생각하지만 이러한 유형의 답변에서 일부 아이디어를 걸러내는 것이 잘못되었다고 생각했습니다.


10

모자를이 엉망으로 던져 넣을 것입니다.

높은 수준의 코딩 규칙 및 표준은 낮은 수준의 코딩 표준 및 관행과 다릅니다. 불행히도, 대부분은 레거시 코드와 오래된 사고 과정에서 비롯된 것입니다.

그러나 일부는 목적을 수행합니다. 물론 BranchGreaterThanBGT 보다 훨씬 더 읽기 쉬울 것이지만 지금은 협약이 있으며 지침이며 지난 30 년 동안 표준으로 사용하면서 약간의 견인력을 얻었습니다. 명령, 변수 등에 대한 임의의 문자 너비 제한으로 시작하는 이유는 무엇입니까? 그들은 왜 그것을 유지합니까, 표준입니다. 이 표준은 int 를 식별자 로 사용하는 것과 동일 하지만 모든 경우에 Integer 를 사용하는 것이 더 읽기 쉽지만 몇 주 이상 프로그래밍 한 사람에게는 필요합니다. 왜? 표준 관행이기 때문입니다.

둘째, 내 의견에서 말했듯이 많은 인터럽트의 이름은 INTG1 및 기타 암호 이름으로 지정되며 목적도 제공합니다. 회로도에서 선의 이름을 지정하는 것은 좋은 관례 가 아니며 , 그로 인해 도표가 복잡 해져서 가독성이 떨어집니다. 모든 자세한 내용은 문서에서 처리됩니다. 또한 모든 배선 / 회로 다이어그램에는 인터럽트 라인에 대한 이러한 짧은 이름이 있으므로 인터럽트 자체도 회로 다이어그램에서 임베디드 설계자에 대한 일관성을 유지하기 위해 회로 다이어그램에서 코드까지 프로그래밍과 동일하게 유지됩니다.

설계자는이를 제어 할 수 있지만 모든 필드 / 새 언어와 마찬가지로 하드웨어에서 하드웨어에 이르는 규칙이 있으므로 각 어셈블리 언어에서 유사하게 유지되어야합니다. 나는 어셈블리의 조각을보고 그들이 규칙에 충실하기 때문에 지금까지 그 명령어 세트를 사용하지 않고 코드의 요점을 얻을 수 있습니다 LDA 또는 일부 관계는 아마 등록로드 MV는 아마도 어딘가에서 뭔가를 이동 어딘가에, 그것은 당신이 멋지거나 고수준의 연습에 관한 것이 아니며, 언어 자체이며, 자체 표준과 디자이너가 따라야 할 표준을 가지고 있기 때문에, 이들은 종종 임의적이지 않습니다. 그들은 그렇게 보인다.

임베드 된 커뮤니티에 자세한 고급 사례를 사용하도록 요청하는 것은 화학자에게 항상 화합물을 쓰도록 요구하는 것과 같습니다. 화학자는 그들 자신을 위해 짧게 쓰고 현장의 다른 사람들이 그것을 이해할 것입니다. 그러나 조정하는 데 새로운 시간이 조금 걸릴 수 있습니다.


1
나는 것을 느낀다 "그 낮은 수준의 프로그래밍 같은 느낌을 무엇 때문에 우리가 암호 같은 이름을 사용하는 것""그 낮은 수준의 프로그래밍의 규칙이기 때문에 우리는 암호 같은 이름을 사용하는 것" 거의 같은, 그래서 +1 저에게서 그리고 나는 이것을 처음에 받아 들인 것의 덜 염증성 변이체로 받아들이는 것에 대해 생각할 것 입니다.
Roman Starkov

6
다른 프로그래밍 영역에 대해 좋은 유추를 생성하므로 화학자 참조의 경우 +1입니다.

4
+1 또한 "DiHydrogenOxyde"가 훨씬 읽기 쉬운 사람들이 왜 "물"과 같이 짧고 비밀스러운 이름을 사용하는지 이해하지 못했습니다.
Ingo

6

그들이 암호로 된 짧은 식별자를 사용하는 한 가지 이유는 개발자에게 암호가 아니기 때문입니다. 당신은 그들이 매일 그것과 함께 일하고 그 이름이 실제로 도메인 이름이라는 것을 깨달아야합니다. 그래서 그들은 TIFR1이 정확히 무엇을 의미하는지 마음에 알고 있습니다.

새로운 개발자가 팀에 오면 데이터 시트 (@KarlBielefeldt가 설명)를 읽어야하므로 편안하게 사용할 수 있습니다.

나는 당신의 질문이 나쁜 예를 사용했다고 생각합니다. 왜냐하면 실제로 그러한 종류의 소스 코드에서는 도메인이 아닌 것들에 대해 불필요한 암호 식별자가 많이 있습니다.

나는 컴파일러가 입력 한 모든 것을 자동 완성하지 못했을 때 존재하는 나쁜 습관 때문에 대부분 그렇게한다고 말합니다.


5

요약

초기주의는 많은 기술 및 비 기술 분야에서 만연한 현상입니다. 따라서 저수준 프로그래밍에만 국한되지 않습니다. 일반적인 토론은 약어 에 대한 Wikipedia 기사를 참조하십시오 . 내 대답은 저수준 프로그래밍에만 해당됩니다.

암호 이름의 원인 :

  1. 저수준 명령어는 강력하게 형식화됩니다
  2. 저수준 명령어의 이름에 많은 유형 정보를 포장해야 함
  3. 역사적으로 단일 문자 코드는 유형 정보를 포장하는 데 선호됩니다.

솔루션 및 단점 :

  1. 과거의 것보다 더 일관된 현대식 저수준 명명 체계가 있습니다.
    • LLVM
  2. 그러나 많은 유형 정보를 포장해야 할 필요성이 여전히 존재합니다.
    • 따라서 암호 약어는 여전히 모든 곳에서 찾을 수 있습니다.
  3. 줄간 가독성이 향상되면 초급 저수준 프로그래머가 언어를 더 빨리 익힐 수 있지만 큰 저수준 코드를 이해하는 데는 도움이되지 않습니다.

전체 답변

(A) 더 긴 이름이 가능합니다. 예를 들어 C ++ SSE2 내장 함수의 이름은 어셈블리 니모닉의 7 자에 비해 평균 12 자입니다. 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는 dword "double-word"(32 비트)를 의미합니다.
  • Q는 qword "쿼드 워드"(64 비트)를 의미합니다.
  • DQ는 dqword "double-quad-word"(128 비트)를 의미합니다.

이러한 역사적 언급은 현대적인 의미가 없었지만 여전히 고집하고 있습니다. 보다 일관된 체계는 비트 폭 값 (8, 16, 32, 64, 128)을 이름에 넣었을 것입니다.

반대로, LLVM은 하위 수준 지침에서 일관성 방향으로 올바른 단계입니다. http://llvm.org/docs/LangRef.html#functions

(D) 명령 명명 체계에 관계없이, 저수준 프로그램은 세부적인 실행 세부 사항에 초점을 맞추기 때문에 이미 장황하고 이해하기 어렵습니다. 명령어 명명 체계를 변경하면 행 단위 수준에서 가독성이 향상되지만 큰 코드의 작업을 이해하는 데 어려움이 없습니다.


1
개선 된 행간 가독성은 전체 내용을 이해하는 데 영향을 미치겠지만, 이름만으로도 사소한 것은 아닙니다.
Roman Starkov

3
또한 주제 이외의 주제이지만 or CVTSI2SD보다 더 많은 정보를 전달하지는 않지만 후자는 더 이상 즉시 인식 할 수 있지만 전자는 해독해야합니다 ...ConvertDword2DoubleConvInt32ToFloat64
Roman Starkov

2

인간은 가끔씩 어셈블리를 읽고 쓰며 대부분의 경우 단지 통신 프로토콜 일뿐입니다. 즉, 컴파일러와 어셈블러 간의 중간 직렬화 된 텍스트 기반 표현으로 가장 자주 사용됩니다. 이 표현이 더 장황할수록이 프로토콜에서 불필요한 오버 헤드가 발생합니다.

opcode 및 레지스터 이름의 경우 긴 이름은 실제로 가독성에 해를줍니다. 짧은 니모닉은 통신 프로토콜 (컴파일러와 assember 사이)에 더 좋고 어셈블리 언어는 대부분 통신 프로토콜입니다. 컴파일러 코드가 읽기 쉽기 때문에 짧은 니모닉이 프로그래머에게 더 좋습니다.


공간을 절약하려면 gzip으로 저장하십시오! ... 오버 헤드가 필요하지 않으면 이진 형식을 대신 사용하십시오! 텍스트를 사용하는 경우 가독성을 목표로하고 있습니다. 그렇다면 가독성을 높이고 올바르게 읽을 수있는 이유는 무엇입니까?
Roman Starkov

2
@romkyns, 두 개의 로컬 프로세스간에 텍스트 기반 통신 프로토콜을 압축합니까? 그것은 새로운 것입니다. 이진 프로토콜은 훨씬 덜 강력합니다. 그것은 유닉스 방식입니다-텍스트 기반 프로토콜은 때때로 가독성을 위해 존재합니다 . 그들은 충분히 읽을 수 있습니다.
SK-logic

권리. 당신의 전제는 오버 헤드가 중요 할 정도로이 레지스터 또는 CIL 명령어의 이름을 읽고 쓰는 것입니다. 그러나 그것에 대해 생각하십시오. 그것들은 프로그래밍 하는 동안 다른 프로그래밍 언어에서 이상한 방법이나 변수 이름처럼 자주 사용됩니다 . 여분의 몇 바이트가 중요 할 정도로 드문 일입니까?
Roman Starkov

1
나는 이름이 얼마나 길어야하는지에 대해 다른 취향을 가질 수있는 권리를 존중하지만 실제로 컴파일러에서 메소드와 지역 이름을 암호 같은 것들로 지정 TIFR합니까, 아니면 전체 단어를 포함하는 경향이 있습니까?
Roman Starkov

1
나는 읽기 가능한 것과 짧은 트레이드 오프와 관련된 차이점이 없다고 본다. 물론 변수가 유형과 다른 함수와 다른 것처럼 그것들은 다릅니다. 나는 opcode와 레지스터 이름이 왜 당신이 무엇을하는지에 대한 단서 가 있기 전에 새로 등장한 모든 문서에 대해 문서를 참조해야 할 정도로 극도로 짧은 이유 를 알지 못합니다. 내가 실수하지 않으면 지금까지 유일한 주장은 효율적인 저장입니다. 당신은 정말로 그것을 의미합니까? 또는 다른 이유가 있습니까?
Roman Starkov

1

대부분 관용적입니다. @TMN이 다른 곳에서 말했듯 이 파이썬에서 쓰지 import JavaScriptObjectNotation않거나 import HypertextTransferProtocolLibrary파이썬에서 Timer1LowerHalf = 0xFFFF와 마찬가지로 C로 쓰지 않습니다 . 문맥에서 똑같이 어리석은 것처럼 보입니다. 알아야 할 사람은 이미 알고 있습니다.

임베디드 시스템의 일부 C 컴파일러 공급 업체는 임베디드 프로그래밍에 더 유용한 기능을 구현하기 위해 언어 표준과 구문에서 벗어난 사실 때문에 변경에 대한 저항이 발생할 수 있습니다. 즉, 저수준 코드를 작성할 때 자주 사용하는 IDE 또는 텍스트 편집기의 자동 완성 기능을 항상 사용할 수있는 것은 아닙니다. 이러한 사용자 지정으로 인해 코드를 분석하는 기능이 손상되기 때문입니다. 따라서 짧은 레지스터 이름, 매크로 및 상수의 유틸리티입니다.

예를 들어, HiTech의 C 컴파일러는 메모리에서 사용자 지정 위치를 가져야하는 변수에 대한 특수 구문을 포함했습니다. 다음과 같이 선언 할 수 있습니다.

volatile char MAGIC_REGISTER @ 0x7FFFABCD;

현재 이것을 분석 할 유일한 IDE는 HiTech 자체 IDE ( HiTide )입니다. 다른 편집기에서는 매번 메모리에서 수동으로 입력해야합니다. 이것은 매우 빨리 늙어갑니다.

그런 다음 개발 도구를 사용하여 레지스터를 검사 할 때 종종 여러 열 (레지스터 이름, 16 진수 값, 2 진수 값, 16 진수 마지막 값 등)이있는 테이블이 표시된다는 사실이 있습니다. 이름이 길면 이름 열을 13 자로 확장하여 두 레지스터 간의 차이를 확인하고 수십 줄의 반복되는 단어에서 "차이점을 찾아 내십시오"라는 의미입니다.

이것들은 어리석은 작은 퀴즈처럼 들릴 수 있지만, 모든 코딩 규칙이 눈의 피로를 줄이거 나 불필요한 타이핑을 줄이거 나 백만 건의 다른 작은 불만 사항을 해결하기 위해 고안된 것은 아닙니까?


2
당신의 모든 주장은 의미가 있습니다. 나는 그 모든 요점을 완전히 이해합니다. 그러나 똑같은 것이 고급 코드에도 적용된다고 생각하지 않습니까? 또한 C # 함수에서 지역 테이블을 볼 필요가 있습니다. 상황은 주관적이며, File.ReadAllBytes익숙한 누군가에게 말도 안되게 길어질 수 있습니다 fread. 그렇다면 ... 왜 고수준 코드 저수준 코드를 다르게 취급 합니까?
Roman Starkov

@romkyns - 나는 당신의 점을, 그러나 나는 우리가 실제로 높은 수준의 코드를 취급하지 않는 생각하지 않는다 매우 다르게. 약어는 많은 고급 컨텍스트에서 훌륭합니다. 약어 나 그와 관련된 스키마에 더 익숙하기 때문에이를 인식하지 못합니다. 실제로 함수를 작성하거나 저수준 코드로 변수를 만들 때 멋진 설명 이름을 사용합니다. 그러나 레지스터를 언급 할 때 문자와 숫자의 혼란을보고 "T = 타이머, IF = 인터럽트 플래그, 1 = 첫 번째 레지스터"라고 빠르게 생각하게되어 기쁩니다. 그것은 그 점에서 유기 화학과 거의 같습니다 : P
detly

@romkyns은 - 또한, 순전히 실용적인 의미에서, 나는 C #에서 일부 마이크로 프로세서의 IDE 및 응용 프로그램 개발에 레지스터 테이블의 차이는 생각이 : 최대 레지스터의 테이블과 같습니다 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 (quite common)로 설정하면 set_prescalar(TMR4,13);IMHO의 의미 가보다 명확하지 않습니다 TMR4->PSREG=12;. 첫 번째 코드가 무엇인지 알아 내기 위해 컴파일러 매뉴얼을
보더라도

1

게으름에 대해 언급 한 사람이없고 다른 과학에 대해서는 언급하지 않은 것이 놀랍습니다. 프로그래머로서의 일상적인 작업은 프로그램의 모든 종류의 변수에 대한 명명 규칙이 세 가지 측면의 영향을 받는다는 것을 보여줍니다.

  1. 프로그래머의 과학적 배경.
  2. 프로그래머의 프로그래밍 기술.
  3. 프로그래머의 환경.

저수준 또는 고수준 프로그래밍에 대해 논의하는 것은 쓸모가 없다고 생각합니다. 결국에는 항상 이전 세 가지 측면으로 고정 될 수 있습니다.


첫 번째 측면에 대한 설명 : 많은 "프로그래머"는 처음에는 프로그래머가 아닙니다. 그들은 수학자, 물리학 자, 생물 학자, 심지어 심리학 자나 경제학자이지만 대부분은 컴퓨터 과학자가 아닙니다. 그들 대부분은 "컨벤션"이라는 이름으로 볼 수있는 자체 도메인 별 키워드와 약어를 가지고 있습니다. 그들은 종종 자신의 영역에 갇혀 있으며 가독성이나 코딩 가이드를 생각하지 않고 알려진 약어를 사용합니다.

두 번째 측면에 대한 설명 : 대부분의 프로그래머는 컴퓨터 과학자가 아니기 때문에 프로그래밍 기술이 제한되어 있습니다. 그렇기 때문에 종종 코딩 규칙에 신경 쓰지 않고 첫 번째 측면에서 언급 한 도메인 별 규칙에 더 관심을 갖습니다. 또한 프로그래머의 기술이 없으면 코딩 규칙을 이해하지 못합니다. 나는 대부분의 사람들이 이해할 수있는 코드를 작성 해야하는 긴급한 필요성을 보지 못한다고 생각합니다. 불처럼 잊어 버리세요.

세 번째 측면에 대한 설명 : 지원해야하는 오래된 코드, 회사의 코딩 표준 (코딩에 신경 쓰지 않는 경제학자가 운영) 또는 소속 도메인이 될 수있는 환경 규칙에 어긋날 것 같지 않습니다. 누군가 암호 이름을 사용하기 시작하고 해당 코드를 지원해야하는 경우 암호 이름을 변경할 가능성이 없습니다. 회사에 코딩 표준이 없으면 거의 모든 프로그래머가 자체 표준을 작성합니다. 마지막으로 도메인 사용자로 둘러 쌓인 경우 사용하는 것보다 다른 언어를 작성하지 않습니다.


게으름에 대해 언급 한 사람 은 없습니다. 여기에 관련이 없기 때문일 수 있습니다. 그리고 다른 과학이 논의되지 않습니다 오 그것은 쉽게 :하지 않는이 사이트 토론 . 그것은을 위해의 질문과 답변
모기

게으름은 합법적 인 이유입니다. 거의 모든 프로그래머는 게으른 사람들입니다 (그렇지 않으면 우리는 수동으로 모든 것을 할 것입니다!).
Thomas Eding
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.