2009-10-07 10 views
1

컴파일 타임에 무한 루프를 입력 할 수 있습니까?컴파일 타임에 무한 루프가 발생합니까?

컴파일 할 때 내 프로그램이 무한 루프를 입력하는 것처럼 보입니다. gameRun() 메서드를 호출하는 클래스 생성자가있는 클래스가 있습니다. gameRun()은 실행이 끝났을 때 자신을 호출하지만 런타임에 실행을 중단 할 수있는 적절한 검사가 있어야합니다 ... 그러나 클래스를 컴파일하려고하면 실제로 무한 루프가 발생하는 것 같습니다.

컴파일에 대한 내 이해는 실제로 코드를 실행하지 않는다는 것입니다. 컴파일러의 소스에 심각한 버그가없는 한 무한 루프를 입력하는 것은 불가능할 수 있습니다. 이 올바른지?

저는 Java로 작성 중이며 BlueJ (초보자 용 IDE)를 IDE로 사용하고 있습니다.

미리 감사드립니다.

..............................

감사합니다. 이렇게 많은 도움이되는 응답. 내가 업데이트를 게시 할 것이라고 생각했는데, 이것이 약간의 관심을 불러 일으킨 것으로 보이고, 나는 그것에 대해 궁금하다.

프로젝트에서 소스 파일을 가져 와서 성공적으로 컴파일하고 실행시킬 수 있기 때문에 원본 오류를 게시 한 이후 BlueJ 또는이 오류로 전체 작업을 수행하지 못했습니다. 이것은 그것이 BlueJ (또는 관련) 문제라는 것을 나에게 암시한다. 나는이 성질의 더 이상 문제없이 이클립스와 함께이 프로젝트를 계속 작업했다. 원래 프로젝트가있는 머신을 다시 사용할 수있을 때 문제에 대한 자세한 내용을 후속 처리합니다. (이후로 변경된 사항이 없어야합니다.)

..............................

추가 고려 사항 ...이 질문이 내가 게시되고 등록 된 계정에 연결할 수있는 방법이 있습니까? 나는 그 일을 할 수있는 방법을 찾을 수없고, 더 편리하게 추적 할 수 있습니다 ...

+1

전화가 도움이 되었습니까? –

+1

여러 개의'jstack' /'ctrl- \'/'ctrl-break'는 유용한 것을 알려줍니다. –

+0

새 계정에서이 질문을 편집 할 수 있습니까? 그렇지 않은 경우 MetaStackOverflow에 문의하십시오. – deworde

답변

1

예를 들어 파일을 컴파일하는 경우 이론적으로는 가능하지만 컴파일러는 먼저 해당 파일을 컴파일해야합니다. (아 ... 재귀). 그러나 나는 그런 종류의 광기를 확인하는 것이 실세계 컴파일러가 처리 할 첫 번째 것이 될 것이라고 생각합니다.

그러나 컴파일러가 꼬리 재귀를 단순 구현으로 해결하려고 시도하지 않는 한 메소드/함수에서 발생하지 않을 것이라고 생각합니다. 그러나, 비록 그것이 존재한다고 할지라도 현대의 Java 컴파일러로 인해 이것이 문제가 될 것이라고 저는 생각할 수 없습니다. 필자는 컴파일러가 결국 무한 루프가 아닌 오류를 포기하고 게시 할 것이라고 생각합니다.

멀리 컴파일러보다 IDE 일 가능성이 큽니다. 짐작할 수 있듯이 IDE는 코드에서 경고/오류를 추적하여 코드를 강조 표시하고 갇히게 할 수 있습니다. BlueJ는 컴파일러 오류/경고에서 텍스트 강조 표시가 있습니까? 당신은 그것을 끌 수보십시오. 많은 사람들이 이미 제안으로

는 있지만, 첫 번째 실제 테스트는

javac *.java 

또는 코드가 사용하는 파일을 어떤을 사용하여 명령 줄에서 컴파일하는 것입니다.

편집 : 죄송합니다. 다시 연락하지 않으 셨습니다. ...에

  • cmd를 입력을 시작 메뉴로 이동하여

    1. 열기 명령 줄 실행을 선택 : 미래 참고로, (나는 당신의 OS로 Windows를 있으리라 믿고있어) 명령 줄에서 컴파일 대화 상자를 실행하고 확인을 클릭하십시오.
    2. 이렇게하면 cmd.exe 콘솔이 나타납니다.
    3. 여기에서 "cd"명령을 사용하여 디렉토리를 Java 파일이있는 디렉토리로 변경하십시오. (cd "My Documents \ Java \ Monster Battle \ core")
    4. 올바른 디렉토리에 있으면 "javac * .java"를 입력하십시오. 이렇게하면 IDE를 다룰 필요없이 컴파일러가 실행됩니다. 컴파일하는 동안 일시 중지해야하며 완료되면 명령 프롬프트가 다시 나타납니다.
    5. "javac * .java -verbose"를 입력하면 무한 루프가 발생하는 경우를 대비하여 완전한 출력을 얻을 수 있습니다.

    제대로 작동하면 IDE 버그입니다. 그들에게 버그 보고서를 보냅니다. 축하하지 않으면 축하해!정말 재미있는 것을 발견했습니다. 아마도 한 달 동안 열악한 썬 개발자를 확보하게 될 것입니다.

  • +0

    몇 시간이 지나면 스택 오버플로 오류가 발생하는 것을 기억하는 것 같지만 컴파일러가 실행 중이거나 다른 것으로 남아있을 수 있다고 생각합니다. 그렇지 않으면 무한 루프로 간주하지 않을 것입니다 ... 확인하고 내가 할 수 있었던 것이 무엇인지 정확히 알 수 있습니다. 어떤 경우에 커맨드 라인 거래 (javac * .java)를하는 방법에 대해 좀 더 자세히 설명해 줄 수 있습니까? 나는 그것에 익숙하지 않다, 나는 윈도우즈 커맨드 라인을 많이 사용하지 않았다. 과거의 나의 중요한 프로젝트의 대부분은 리눅스 머신에서 원격으로 실행되었고, C++에 있었다. = s – Jonathan

    7

    일부 언어는 컴파일러가 무한 루프를 입력 할 수있게합니다. Java는 이러한 언어 중 하나가 아닙니다. :-)

    +0

    내가하고있는 일과 그 이유를 알아 내려고 노력할 것입니다. 고마워요. =) – Jonathan

    +0

    언어가 어떤 관심을 가지지 못했지만 가장 쉽게 할 수있는 방법은 무엇입니까? – deworde

    +1

    C++에서는 템플릿 메타 프로그래밍을 사용하는 경우이를 수행 할 수 있습니다. 튜링이 완료되었으므로 무한 루프를 코딩하는 것은 간단합니다. –

    2

    javac을 사용하는 경우 컴파일이 중단됩니까?

    Java를 컴파일하는 동안 컴파일을 무기한 중지 한 적이 없으며 BlueJ에 문제가 있는지 궁금합니다.

    +0

    문제는 BlueJ와 매우 잘 어울릴 수 있습니다. 나는 코드를 컴파일하는 것만 이었지만 컴파일이 끝난 것처럼 보이지 않았으며 "스택 오버플로"오류가 창에 나타납니다. 시스템이 계속 추적하려고 시도하는 호출이 너무 많았다. =/ – Jonathan

    +0

    그럴 가능성이 가장 높습니다. 여기에있는 대부분의 '솔루션'은 스택 오버플로를 초래할 것이라고 저는 믿습니다. 그래도 아래쪽으로 가면 다행입니다. –

    4

    당신이 옳아 요, 컴파일러는 코드를 실행하지 않으며, 버그로 인해 무한 루프에만 들어갑니다. Sun의 javac 컴파일러에는 그러한 버그가 없다고 확신합니다.

    내가 BlueJ의는 "내부적으로"사용하는 것을 컴파일러 모르겠지만, 개미는 컴파일하는 정말 시간이 오래 걸릴 수 있습니다 javac를 실행했을 때 문제가 보았다. 간단히 말해서, Ant가 컴파일러에게 주어진 디렉토리 아래에 의 모든 클래스를로드하도록 지시하는 경우가 있습니다. 해당 디렉토리에 수백 개의 타사 라이브러리가 포함되어 있다면 시간이 좀 걸릴 수 있습니다. 심지어는 메모리가 부족합니다.

    +2

    BlueJ는 JVM을 선택할 수있게 해줍니다. –

    1

    BlueJ가 자체 컴파일러를 사용하는 경우 BlueJ가 해당 컴파일러 또는 BlueJ의 주변 빌드 도구에서 버그를 발견했을 수 있습니다.

    BinaryChop 접근 방식을 취할 수 있습니다. 프로그램을 여러 개로 나누고 개별적으로 컴파일하고 컴파일러 걸기 동작을 작은 특정 테스트 사례로 격리 할 수 ​​있는지 확인하십시오. 하루가 끝나면 BlueJ 사람들을 보여주는 훌륭한 버그 보고서가 있거나 프로그램이 실제로 컴파일된다는 것을 알게 될 것입니다 (아직 머리를 긁적 거리게됩니다).

    +0

    언젠가 이것을 시도해 볼 수도 있습니다. 그동안, 나는 주말에 이클립스로 전환했고 상당한 발전을 이루었습니다. (같은 코드가 Eclipse로 잘 컴파일되었으므로 폴더에서 동일한 소스 파일을 가져 와서 시작했습니다.) 이 작업을 수행했다면 BlueJ 버그인지 찾기 위해 시도했을뿐입니다. BlueJ가 Java 로의 초보자가되도록 고려하면 특히 중요하지 않다고 생각합니다. 고교 과정에있는 사람이 이런 식으로 실행되는 것을 상상해보십시오. – Jonathan

    1

    AFAIK, Standard Java는 무한정 컴파일 할 수 없습니다.

    BlueJ가 제공하는 다른 기능보다는 컴파일 할 때 문제가 있습니까? 많은 Eclipse 기반 IDE는 재 작성 중에 여러 작업을 수행하며 컴파일은 그 중 하나 일뿐입니다. 다른 것이 가능할 수도 있습니다.

    정확히 무엇이 보이나요? 끝내지 않는 Eclipse 작업?

    +0

    "스택 오버플로"오류가 발생했으며 BlueJ로 가정 한 여러 종류의 호출 목록이 많이 표시됩니다. 지금 당장 그 프로그램을 사용하고있는 것은 아니기 때문에 정확한 오류를 설명 할 수는 없지만 BlueJ와 함께 사용하는 것은 초보자에게 친숙한 오류 메시지가 아닙니다. – Jonathan

    0

    컴파일 할 소스 코드를 가능한 작게 만들고 사용자가 설명하는 동작을 계속 나타내도록하십시오. 그렇게하는 과정은 문제가 무엇인지 식별하는 데 도움이 될 수 있습니다.

    관련 문제