커널에서 goto문 사용이유

kysu5095의 이미지

안녕하세요.
UFS 파일시스템관련 업체에서 인턴중인 대학생입니다.

커널 소스든, 만들어 논 소스든 중간중간 goto문을 사용한 부분이 많은걸 확인했습니다.
제가 학부생때 배운 지식으로는 goto 사용은 지양해야하며, 운영체제를 공부하면서 goto사용시
캐시미스 확률이 올라간다는 것으로 배웠습니다.

나름대로 검색을 해보니 c에서는 try-catch가 없기때문에 goto문을 사용한다고 하는것같은데,
속도와 정확성이 중요한 임베디드 시스템에서 goto문을 사용하면 좋은점(?)이 있나요?

캐시미스도 있고, 유지보수 문제도 있을 수 있는데 굳이 사용하는 이유가 뭔지 잘 모르겠습니다.
아니면 그저 예전부터 사용해온 코드이기때문에 그대로 놔둔것일까요?

감사합니다.

라스코니의 이미지

제가 goto 신봉자이기도 한데, 몇가지 말씀드리면

1. 모든 분기문은 assembly로 보게되면 goto 문과 같거나 유사한 구조를 가짐. 즉 사용자가 goto 문을 안쓰더라도 goto 분기 구조가 들어갈 수밖에 없음
2. for(), while() do...while() 등으로 묶기가 어려운 제어 구조를 억지로 감싸게 되면 오히려 가독성(readability)이 떨어질 수 있다.
3. 함수 중간 중간에 어떤 상황에 발생했을 때 그 처리를 함수 끝에서 공통으로 처리하고 싶을 때 goto 문외에 특별히 방법이 없다. 예를들면 goto ERROR_PROCESS; 등

와 같은 상황이 있기 때문에 특수한 경우 goto 문을 없애려고 고민하기 보다는 사용하는게 코드가 훨씬 유지보수에 좋을 수 있습니다.

kysu5095의 이미지

답변 감사드립니다.
이해가 안됐던 부분이었는데 라스코니님 설명 덕분에 이해할 수 있었습니다.

bushi의 이미지

흑백논리에 경도된 경직되어 있는 자세는 좋지 않습니다.
거의 발생하지 않을 예외 상황에 대처하기 위한 부분을 따로 빼서 goto 로 처리하는 것과
goto 안쓰려고 그곳에 예외상황 처리용 코드를 몽땅 박아 넣는 것 중에 어떤 것이
1. cache hit/miss
2. 개발
3. 유지보수
에 적합할 것 같습니까.

캐시에 뭐가 올라갈지는 어셈블리로 번역된 코드를 보기 전엔 알 수 없으며,
그 이전에 branch prediction 이 어떠냐를 먼저 고민해야 합니다.

kysu5095의 이미지

답변 감사드립니다.
아직 지식이 많이 부족해 단편적으로 생각하게 되는것 같습니다.
고수분들의 의견에 많은걸 배워갑니다ㅠ. 감사합니다.

swish95의 이미지

지금은 돌아가신 다익스트라 옹께서 "goto 문은 좋지않다" 라는 취지로 글을 쓰신적이 있습니다.

https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf

그래서 goto 가 아닌 break 와 같은 문장을 써야 한다는 것이었지만
그 후에 위에 다른분이 언급하신 문제 - 다중 루프에서 한번에 빠져나가야 하는 경우등 - 로 인해 적절한 goto 문은 유효하다라는 반론도 있었습니다.

결론적으로는 무분별한 goto 문은 언급하신 문제들이 생기기 때문에 좋지 않지만
구조적인 문제로 인해 goto 문을 써야 하는 상항이 생기는 경우에는 오히려 쓰지 않아서 생기는 문제들을 해결하는 좋은 해결책이 되기도 합니다.

------------------------------------------------------------
ProgrammingHolic

bushi의 이미지

왜 goto 에 목소리 커지는 사람들이 있는가했더니 오해를 해서 그런거였군요...

비록 일천구백육십년대 말에 쓰여지는 글이라 뭔가 좀 답답스럽긴하지만,
goto 가 아니라 label 의 오남용에 대해 장문에 걸쳐 지적하는 글임이 명백한데,
어째서 다들 goto 에 꽂혀가지고 절대 새겨들어야할 소중한 가르침으로 마음 속에 소중히 간직하고 대대손손 이어가는지 모르겠네요.

swish95의 이미지

정확히 파악하셨네요 ^^
이 글의 요지를 제대로 파악 못하고 제목만 가지고 딴지들 많이 걸었었죠
하지만 그걸 쓴사람이 그런걸 모르고 쓰실 분이 아니라서, 찬찬히 읽어보면 거의 결론까지 명확하게 나와있는 글이죠

이때 당시에는 스파케티 소스에 대한 비판이 주를 이루던 시대라 구태의연한 코드를 고집하던 사람들에게 경고의 의미였다고 보여집니다.

------------------------------------------------------------
ProgrammingHolic

나빌레라의 이미지

사실 어지간하면 goto 없이 코드 만드는게 좋아요.

그런데, 일을 하다 보면 '이건 goto 없이는 더 지저분하고 더 못 알아먹겠다. goto 외엔 답이 없다' 라는 생각이 드는 상황이 생깁니다. 이럴 때는 'goto는 절대 쓰면 안돼!' 이런 생각으로 안 쓰는 것 보다는 그냥 써도 된다라는게 제 생각합니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

Anti-Lock의 이미지

MISRA C 룰이 등장하면 어떻게 되죠?

물론 커널에는 적용하지 않겠지만,
어플리케이션에는 그걸 요구하는 갑 업체가 많을텐데요.

bushi의 이미지

Rule 15.1 (Advisory): The goto statement should not be used.
Rule 15.2 (Required): The goto statement shall jump to a label declared later in the same function.
Rule 15.3 (Required): Any label referenced by a goto statement shall be declared in the same block, or in any block enclosing the goto statement.
Rule 15.4 (Advisory): There should be no more than one break or goto statement used to terminate an any iteration statement.
자세하고 구체적인 flow chart 그린 다음에 프로그래밍에 돌입하라는 요구사항이죠.
프로그래밍에 시간을 어마어마하게 투자하고, 보수/유지 비용을 극단적으로 줄이자는게 그 rule 의 목표니, 그대로 해주면 되는 일 아니겠어요 ?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.