UNIX / POSIX 시스템 호출 이름을 알아볼 수없는 이유는 무엇입니까?


43

무슨 일이 같은 같은 untelling 시스템 호출 이름을 사용하는 이유 timecreat대신 getCurrentTimeSecscreateFile유닉스에 어쩌면 더 적합 또는, get_current_time_secs하고 create_file. 다음 요점은 다음과 같습니다. 왜 누군가가 cfsetospeed낙타 케이스없이 또는 최소한 밑줄없이 읽을 수 있도록해야합니까? 물론 호출에는 더 많은 문자가 있지만 코드의 가독성이 더 중요하다는 것을 모두 알고 있습니다.


42
그들은 헝가리어 표기법보다 수십 년 전에 발명 되었기 때문에 낙타 케이스, 뱀 케이스 등이 유행했습니다. 또한 당시 컴파일러에는 리소스가 거의 없었기 때문에 식별자 이름은 (IIRC) 8 자로 제한되었습니다.
lcd047

3
@phresnel 파일 이름과 변수 ID 사이에 어떤 관계가 있는지 확실하지 않지만 8, 12 및 14 사이에서 망설였습니다. 변수 ID에 대한 한계도 14였습니다. 확실히 256+가 아니었다. 표기법은 "항상"을 정의하십시오. Arminius 는 CamelCase 단어를 사용 했습니까 ? 아마. AFAIR, 헝가리 표기법은 1990 년대 초 Windows에 도입되었습니다. CamelCase와 sneak_case는 나중에 변형되었습니다. 둘 다 물론 그 전에 사용되었습니다. 내가 말하는 것은 그들이 1990 년대 중반에 대중적 이되었다는 것 입니다.
lcd047

6
@phresnel : 링크는 첫 번째 Unix 파일 시스템 의 한계에 대해 이야기합니다 . 톰슨, 리치 외. 유닉스 를 설계 하고 있었지만, 아직 유닉스를 실행하지 않은 머신 , 즉 더 제한적인 환경에서 유닉스부트 스트랩 해야했습니다 .
DevSolar

11
독일어로 작성되지 않은 이유를 물을 수도 있습니다. Java가 프로그래머가 받아들이도록 오랫동안 장려 한 괴물에 대해 생각할 수있는 가장 가까운 자연 언어 근사치에 대한 것이기 때문입니다.
R ..

12
나는 이렇게 행복합니다. ls -la | grep다음과 같은 모습을 상상해보십시오 listAllHiddenAndNormalFiles() | globallySearchARegularExpressionAndPrint()..
Pouya

답변:


61

그것은 시간의 기술적 제약 때문입니다. POSIX 표준은 1980 년대에 만들어졌으며 1970 년에 탄생 한 UNIX를 참조했습니다. 당시 여러 C 컴파일러는 6 ~ 8 자 길이의 식별자로 제한되어 변수와 함수의 길이에 대한 표준을 정립했습니다. 이름.

관련 질문 :


5
기술 제약 조건이 적용 되지 않는다고 생각 합니다. 6 바이트보다 큰 파일을 가질 수 있으며 수천 줄의 코드에 걸쳐있는 프로그램을 가질 수 있습니다. 추상 구문 트리는 6 레벨보다 깊고 레벨 당 더 많은 노드가 있습니다. 이성적으로 6 자 제한은 기술적 인 것이 아니라 디자인 된 제한 일 수 있습니다. 그리고 "만들기"가 "만들기"보다 나은 이유를 설명하지 않습니다. 또한 당신이 말하는 몇 개의 C 컴파일러의 이름을 지정할 수 있습니까? 당신의 대답은 실제로 "어딘가에 들었다"고 읽습니다.
phresnel

41
@phresnel : 파일 크기, 줄 수 또는 구문 트리 깊이에 대해서는 이야기하지 않습니다. C 언어의 구 버전 에서는 컴파일러와 링커에서 내부 링크가있는 식별자의 처음 31 자 이상을 유지 하거나 외부 식별자의 경우 6 자를 초과 하지 않아도 되었습니다 . 따라서, get_current_date()그리고 get_current_time()이러한 초기 툴체인의 일부가 떨어져 말 할 수 없습니다. 그 이유는이 시스템이 몇 킬로바이트의 작은 설치 공간에서 작동했기 때문 입니다.
DevSolar

34
하지만 당신은 맞습니다 creat(). 켄 톰슨 (Ken Thompson)은 유닉스 시스템을 재 설계 할 때 어떻게 다르게 할 것인지 물었습니다. 그의 대답 : "창조자를 e로 쓰겠습니다."
DevSolar

8
@phresnel : 제한된 메모리 만있는 것이 하드 제한이 아닙니다. 식별자의 제한된 보증 지원의 길이를 갖는 것입니다 . 6 개의 중요한 캐릭터 만 보장한다면, 소금의 가치가 있다면 바로 그 일을하는 것입니다.
DevSolar

6
FWIW에서 기존 Fortran 표준 제한은 6 자로 식별됩니다. 에서 이 책 ". 6 자 한 IBM 704 단어로 표현 될 수 있다는 사실에서 유래 식별자 하나의 6 개 문자의 포트란 규칙" 나는 C를 말할 수는 없지만 그 한계는 매우 비슷한 기원 (또는 아마도 같은 근원)을 가지고 있다고 상상합니다.
tpg2114

26

dr01이 옳지 만 또 다른 이유가 있습니다-유용성. 과거에는 키보드 입력만큼 편안한 느낌이 없었습니다. 운이 좋으면 구식 타자기와 비슷한 것이 있습니다. 운이 좋지 않은 경우, 실제 물리적 작업이 필요한 시스템 ( "키"를 누르는 데 많은 힘이 필요함)을 처리하거나 카드에 구멍을 수동으로 뚫어야했습니다.

이것은 6-8 자 이내로 명령을 가능한 한 짧게 유지하려고했습니다. 당신이 가지고있는 이유입니다 ls대신 list하고, creat대신 create. 그 시대의 코드는 a, x그리고 i물론 x2친구 와 같은 변수로 가득 합니다. 타이핑은 많은 작업이었습니다. 오늘 listIndex은 "타이핑"에서했던 것보다 타이핑을 덜받으며 i더 이상 느리지는 않습니다 (특히 자동 완성과 같은 추가 기술 사용).

진짜 질문은-왜 그렇게 많은 유닉스 관용구가 더 이상 바람직하지 않더라도 지속 되는가?


23
내 커널에서 변경 일 timegetCurrentTimeSecs같은 또는 뭔가, 그냥 정지 업그레이드 그 것이다. 편안한 키보드와 최신 하드웨어를 사용하더라도 이러한 이름은 매우 편리하고 단순합니다 (단순함은 UNIX의 기본 중 하나임). 나는 리눅스 커널에서는 물론 그런 종류의 Java / C # 스타일 명명을 C 언어로 가져올 필요가 없다고 생각한다. 커널 개발자 또는 일반적으로 UNIX 개발자의 관점에서 볼 때 이러한 관용구바람직하지 않습니다 .
John WH Smith

11
@ Benjoyo unRootlyLongNamed.Packaged.nonsensicalFunction는 나에게 추악 하고, 나는 man 2 time그것이하는 것처럼 보이는 것보다 추측 하는 것보다 그것이 무엇을하는지 확신하고 싶습니다 .
muru

7
@Benjoyo 글쎄, 이 환경에 익숙하지 않은 사람은 처음에는 시스템 호출을 사용하지 않아야합니다. 왜냐하면 그들은 사람들을 위해 특별히 고안 되었기 때문입니다. 다른 표준 라이브러리 는 여기에 있습니다. 유닉스는 언뜻보기에 쉽게 이해할 수있는 이러한 세련된 디자인 "규칙" 을 따르지 않습니다 . 문서를 보지 않고 사용하는 사람들 은 많은 어려움을 겪고 있으며 UNIX 커뮤니티의 사람들은 문제를 해결할 것이라고 생각하지 않습니다.
존 WH 스미스

4
@JohnWHSmith는 커널 모드 개발자가 자신의 시스템과 문서를 알고 있지만 간결 하고 이름 이없는 이유는 아닙니다 .
Benjoyo

7
@JohnWHSmith 커널 드라이버 만 작성하고 약어로 가득하지 않은 의미있는 이름을 선호하는 저 개발자로서 나는 동의하지 않는다. 그러나 원래 git 소스 코드를 보면 적어도 하나의 커널 개발자가 나와 동의하기 때문에 알 수 있습니다. 당신이 그의 것을 리누스을 말한다면 비록 get_X또는 remove_file_from_cache(내가 제안 할 수 rmfc?) 개발자가 커널에 바람직하지 않다, 공개적으로 제발 - 나는 것 좋아하는 자신의 반응을 볼 수 있습니다.
Voo

22

다른 답변 외에도 Unix는 Multics, CTSS 및 기타 현대 운영 체제에 대한 반응으로 개발되었으며 이름 지정 규칙에 대해 더 장황한 것으로 나타났습니다. http://www.multicians.org/devdoc.html 에서 이러한 OS에 대한 정보를 얻을 수 있습니다 . 예를 들어 http://www.multicians.org/mspm-bx-1-00.htmlchange_name파일 이름 바꾸기 명령을 제공 합니다. 유닉스를 비교하십시오 mv.

또한 매우 짧은 시스템 호출 이름이 지속되는 주된 이유 는 이전 버전과의 호환성입니다. 최신 API는보다 명시적인 경향이 있습니다. 예를 들어 gettimeofdayclock_gettime대신의 time.

(오늘날, 루프 인덱스 whateverIndex대신에 사용하는 것이 i에서 자동 코드 검토 실패입니다 . ;-)


2
네. LISP Machine이 UNIX보다 앞서있을 때 하드웨어 기능에 대한 기술적 주장을 듣는 것은 재미 있습니다. 물론, UNIX 기계 저렴했다 ,하지만 그것에 대해 그의. 유지 보수 비용 (물론 * nix 토지에 포함되지 않음)을 추가해도 테이블이 바뀌었지만 설득력이 충분하지는 않습니다. (그리고 i배열을 반복 할 때 인덱스에 적합합니다. 좌표? 사용 xy. 서수 순회? 설명하기.)
Luaan

@Luaan LISP 시스템은 Unix보다 이전 버전이 아닙니다. 당신은 실패합니다.
pizdelect

@pizdelect 기술적으로는 사실이지만 기술적 진실은 누군가를 사로 잡을만한 충분한 이유가 아닙니다.
zwol

@pizdelect 죄송합니다. Lisp가 UNIX (및 C)보다 오래되었습니다. 그러나 상업적 영향을 비교해 보면 LISP 시스템은 본질적으로 현대적입니다 (UNIX는 약 3 년의 초기 시작을 보였지만 LISP 시스템이 출시 될 때까지 상용 UNIX 시스템은 여전히 ​​거의 없었으며 UNIX의 대부분은 학계 나 지원하지 않음). 어쨌든 사람들이 실제로 UNIX 시스템과 LISPM을 결정할 때 80 년대였던 일반적인 기술적 인 주장에 대한 반응으로 잘못된 것입니다. 어쨌든 LISP를 더 빨리 실행할 수있는 마이크로 컴퓨터로 바뀌 었습니다.
루안

10

Dennis Ritchie는 Fortran에 필요하지 않은 링커 기능에 의존하지 않을 C라는 제약 조건을 설정했습니다. 따라서 외부 이름은 6 자로 제한됩니다.


@downvoter 당신은 이것에 대해 데니 리치 (Denni Ritchie)와 동의하지 않을 수도 있지만, 이것이 그가 한 일입니다. 이 답변에서 그것을 꺼내는 것은 쓸데없는 일입니다.
user207421
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.