저는 최근 Linux Kernel Coding Style Guide를 검토하다가 다음과 같은 생각이 들었습니다.
1)들여 쓰기
탭 문자가 8자이므로 들여쓰기도 8자입니다. 들여쓰기를 4자(또는 심지어 2자!) 깊이로 설정하려는 이단적인 움직임이 있는데, 이는 PI 값을 3으로 정의하려는 것과 유사합니다.
이유: 들여쓰기의 기본 개념은 제어 블록이 시작하고 끝나는 위치를 명확하게 정의하는 것입니다. 특히 20시간 동안 화면을 계속 쳐다볼 때 들여쓰기가 더 클수록 들여쓰기가 어떻게 작동하는지 확인하기가 더 쉽다는 것을 알게 될 것입니다.
이제 일부 사람들은 8자 들여쓰기로 인해 코드가 너무 오른쪽으로 이동하여 80자 터미널 화면에서 읽기가 어려워진다고 주장할 것입니다.대답은 3단계 이상의 들여쓰기가 필요하다면 어차피 문제가 있는 것이므로 프로그램을 수정해야 한다는 것입니다.
https://www.kernel.org/doc/html/v4.10/process/coding-style.html
몇 년 전 이 기사를 처음 읽었을 때부터 한 가지 질문이 내 마음 속에 떠올랐습니다.이 규칙의 가장 큰 예외는 무엇입니까?제가 개인적으로 세어본 최대 개수는 5개인데, 모듈 하나만 보고 있습니다. 그런데 왜 더 엄격하지 않은지 궁금하고, 더 중요하게는 이것을 적용할 때 어떤 유형의 코드에 가장 덜 엄격합니까?
누군가 Git과 정규식에 능숙하다면 아마도 가장 연속적인 \t
'을 세고 코드 블록을 게시할 수 있을 것입니다.
또한 Linus는 최근 TED 강연에서 다음 코드를 보여주었습니다.
맞습니다. 비록 그가 다음과 같이 말했지만 들여쓰기는 4개입니다.
탭 문자가 8자이므로 들여쓰기도 8자입니다. 들여쓰기를 4자(또는 심지어 2자!) 깊이로 설정하려는 이단적인 움직임이 있는데, 이는 PI 값을 3으로 정의하려는 것과 유사합니다.
그러나 여기서 그는 자기 이단을 범했습니다. 그가 왜 이런 짓을 했는지 설명한 적이 있나요? 지금은 들여쓰기 공백 4개만 프로그램하나요?
답변1
현재 Linux 커널에서 가장 높은 들여쓰기 수준은 무엇입니까?
53drivers/pcmcia/vrc4173_cardu.c 및 linux-4.14.y 브랜치의 sound/pci/cs46xx/dsp_spos_scb_lib.c에 있지만 보시다시피 이는 탭 문자 블록 들여쓰기를 사용하는 대신 주석 정렬 및 함수 매개변수 래핑입니다. 이는 코드 포맷팅 빙산의 일각이라고 할 수 있습니다. Eclipse 포맷터를 자세히 살펴보면 수백 가지 옵션을 찾을 수 있습니다.
#!/bin/bash
IFS=''
MAX=0
while read -r F ; do
FMAX=0
FC=0
FOC=0
while read -r L ; do
FC=$(echo -n "$L" | perl -pe 's/^([\t ]*)[^\t ].+$/$1/g' | wc -c)
if [ "$FOC" -gt 0 ] ; then
FOC="$FC"
continue
fi
if [ "$FC" -gt "$FOC" ] && [ "$FC" -gt "$FMAX" ] ; then
FMAX="$FC"
fi
FOC="$FC"
if [ "$FMAX" -gt "$MAX" ] ; then
MAX="$FMAX"
echo "new max is $MAX in $F"
fi
done < "$F"
done < <(find . -iname '*.c' | xargs -I {} grep -lPm 1 "^[\t ]{50,}" "{}")
절대 탭을 보면 승자는 drivers/scsi/BusLogic.c입니다.20.
> find . -iname '*.c' | xargs -I {} grep -HPm 1 "^\t{20,}" "{}"
아니면 절대 간격을 살펴보세요238drivers/pcmcia/i82092.c에서
> find . -iname '*.c' | xargs -I {} grep -HPm 1 "^ {238,}" "{}"
Linux 커널에 통합된 최고 수준의 들여쓰기는 무엇입니까?
이는 모든 역사가 보존된 것이 아니기 때문에 답변하기 어렵습니다. "현재 트리에 병합된 적이 있습니다"라고 대답하는 것은 쉽지만 느립니다. 하지만 여전히 이 질문에 대한 답을 알고 싶다면 이 질문이 너무 광범위해지지 않도록 두 번째 질문을 하시기 바랍니다.
도대체 왜 더 엄격하지 않은 걸까요?
Linux는 "먼저 작동하게 하고 나중에 이념을 정리하는" 솔루션입니다(계속 변화하는 API, 폐쇄형 블롭 등을 갖춘 모놀리식입니다). 그리고 역사적으로 그들은 중요한 들여쓰기를 위한 도구가 없었습니다. git은 필요할 때만 커널용으로 구축되었습니다. 더 중요한 작업이 있지만 checkpatch.pl"이라는 코드에서 포괄적이지 않은 형식 검사가 수행되는 것 같습니다."가이드"...하지만 dsp_spos_scb_lib.c의 주석과 같이 코드에는 여전히 몇 가지 보석이 있습니다.
이건 내가 만든 똥이야
...그렇습니다. 많은 정리 작업을 수행할 수 있지만 작업 기능을 중단하지 않는 것이 좋으며 어딘가에 형식 오류가 있는 경우 코드도 수정해야 할 수 있습니다.
[리누스]가 왜 이런 짓을 했는지 설명한 적이 있나요?
그는 공백보다 탭을 선호하는 것 같습니다(탭을 사용하여 들여쓰기 길이를 변경하는 것은 설정이며 공백을 사용하는 경우 전체 코드베이스를 리팩터링하는 것입니다). 그러나 공백은 첫 번째 줄에 탭 문자를 삽입하는 대신 래핑된 함수를 정렬하는 데 사용되므로 공백과 탭의 비율(8:1)이 중요합니다.
지금은 들여쓰기 공백 4개만 프로그램하나요?
아니요. 커널의 모든 c 파일은 탭을 사용합니다(그러나 5개 파일에는 들여쓰기가 없습니다).
> find . -iname '*.c' | wc -l
25575
> find . -iname '*.c' | xargs -I {} grep -m 1 "\t" "{}" | wc -l
25570
> find . -iname *.c | while read F ; do C=$(grep -c "\t" "$F"); if [ $C == 0 ] ; then echo $F ; fi done
./sound/pci/ens1371.c
./sound/isa/sb/sbawe.c
./drivers/scsi/pcmcia/aha152x_core.c
./drivers/scsi/pcmcia/fdomain_core.c
./drivers/scsi/sun3_scsi_vme.c
대부분의 커널은 c 파일입니다.
> find . -type f | perl -pe 's/.*\.//g' | sort | uniq -c | sort -nr | head
25574 c
20046 h
3990 txt
1443 S
1391 dts
1075 dtsi
810 rst
204 gitignore
191 sh
189 json