[2025 사무자동화산업기사 필기] 언어 구문과 번역

이기적 영진닷컴
21 팔로워
1 비디오 조회수·2024. 10. 21.
이 동영상은 [2025 이기적 사무자동화산업기사 필기 기본서)] 도서 내용을 바탕으로 제작되었습니다.
🔹 도서 자세히 보기 : http://www.yes24.com/Product/Goods/104404837
🔹 이 동영상이 포함된 재생목록 : https://youtube.com/playlist?list=PL6i7rGeEmTvr09yPV1T7G8GG1VxqqsMj7
🔹 모르는 문제? [이기적 스터디 카페] 질문하기 : https://cafe.naver.com/yjbooks
🔹 이기적 홈페이지 : https://license.youngjin.com
🔹 인스타그램 : https://www.instagram.com/license.youngjin_official/
이번 시간은 언어 구문과 번역에 관련해서 학습해 보도록 하겠습니다.
주로 언어의 구성 요소들에 대한 문제들이 많이 출제가 되기 때문에
앞부분에서 나오는 언어의 구문들을 잘 주의 깊게 학습해 보시면 될 것 같습니다.
가장 먼저 언어의 구문에 대한 부분들을 먼저 보도록 하죠.
언어의 구문 요소입니다.
이 구문 요소가 이번 학습에서 여러분들이 꼭 외우셔야 되는 부분이라고 보시면 되겠는데요.
주로 이 부분에 대해서 문제가 많이 출제가 됩니다.
문자 집합은 모든 프로그래밍 언어에서 알파벳 문자와 숫자로 이루어진다는 것을
우리가 문자 집합이라는 구문 요소로 나타내고 있는데요.
특별한 것은 없이 그냥 일반적인 알파벳 문자와 숫자라고 기억을 하시면 되겠습니다.
그리고 식별자는 앞서서도 여러분들이 한번 보셨는데 변수, 레이블, 프로시저 등의 이름들입니다.
그래서 이 이름을 식별자라고 합니다.
그래서 하나의 프로그램 안에서 식별자는 유일해야 된다고 했는데요.
유일해야 된다는 규칙은 예를 들어서 변수는 같은 이름을 사용할 수 없다.
그리고 레이블에서도 같은 이름을 사용할 수 없다라는
각 종류별로 하나의 이름만 써야 된다라는 규칙이 있다라는 것이고요.
식별자를 이름을 붙이는 데에는 각 언어마다 규칙이 있습니다.
그래서 네이밍 룰이라고 부르는 일반적인 이름 붙이는 규칙들이 있어서
그 규칙들을 지켜서 이름을 붙여주시면 되겠습니다.
그리고 연산자는 프로그래밍이나 논리설계에서 변수나 값의 연산을 위해 사용되는 부호
쉽게 얘기해서 더하기 빼기 이런 사챙이 한 사람부터 시작해서
다른 일반적인 컴퓨터에 관련된 연산들을 우리가 연산자로 표현을 합니다.
자 그리고 핵심 키워드라고 기억을 하시면 되겠는데
키워드라고 하는 것은 특별한 의미를 가진 프로그램 문장에서 고정된 부분이다.
무슨 얘기냐 키워드라고 하는 것은 이미 예약되어진 글자라고 보시면 됩니다.
그래서 이미 고정적으로 사용되고 있는 그래서 특별한 의미를 가지고 있는 부분이다 라고 보시면 되겠습니다.
그리고 예약어는 프로그래머가 변수 이름이나 다른 목적으로 사용할 수 없는 키워드.
즉 이 키워드 중에서도 변수로 사용할 수 없는 것들.
예를 들어서 나는 여기에서 int라는 값을 정수라는 의미로 사용을 하고 있어요.
그래서 int라는 정수 a에 대한 어떤 공간을 만들어 주세요 라고 썼어요.
이때 a는 변수명 즉 10발자가 됩니다.
하지만 int는 어때요? int는 인티저라는 어떤 정수형이다라는 의미를 가지고 있는 키워드입니다.
이 키워드는 절대 int라는 변수를 int라는 이름으로 쓰겠습니다.
이렇게 쓸 수 없다는 얘기죠.
이럴 때 int라는 값이 키워드가 되면서 예약어도 함께 된다는 얘기죠.
그래서 예약어라고 하는 것은 변수 이름이나 다른 목적으로 사용할 수 없다라고 하는 것을 여러분들이 기억을 해주시면 되겠습니다.
그리고 주석은 프로그램의 판독성을 향상시키는 요소다 라고 했는데요.
예를 들어서 내가 이런 형식의 문장을 작성을 했어요.
그리고 a에다가 100이라는 값을 할당을 했어요.
이때 a에다가 100을 왜 넣었느냐?
예를 들어서 100이라는게 어떤 의미를 가지는 숫자다라고 했을 때 뒤에 100은 어쩌고저쩌고 해서 설명을 붙여준다는 거죠.
그래서 그때 이 설명을 주석이라고 합니다.
주석을 달아주는 방법은 각 언어마다 다 다릅니다.
예를 들어서 방금 보셨던 것처럼 자바에서는 2줄, 슬래시 2줄 하시게 되면 주석이 된다라는 거죠.
그래서 이 부분은 컴파일되지 않습니다.
주석에 해당하는 부분은 컴파일되지 않고 단지 프로그래머들이 내가 어떠한 코드를 기록했는지 또는 다른 사람이 만든 코드를 분석할 때 참고하는 그러한 자료로서 사용이 되겠습니다.
그리고 연산식은 필요한 데이터의 값을 읽어서 원하는 연산을 수행하고 수행 결과를 반환한다라고 할 때 사용이 되는 연산식은 말 그대로 식이 되겠죠.
그래서 이 연산식이라고 하는 것은 프로그램에서 문장을 구성하는 가장 기본 단위가 되겠습니다.
그리고 구분문자는 문장이나 식과 같은 구문적인 단위의 시작과 끝을 나타내기 위해서 사용되는 구문적 요소다라고 했는데요.
그렇기 때문에 하나의 프로그램이 여러 개의 문장으로 구성이 되겠습니다.
그리고 잡음어라고 하는 것은 판독성을 향상시키기 위해서 선택적인 단어로 사용이 되는 것입니다.
그래서 특별한 정보를 갖지 않으면 판독성 향상만을 위해서 사용이 된다라고 했어요.
그래서 잡음어는 크게 어떤 프로그래밍 수행에 있어서는 크게 영향이 없겠습니다.
그래서 이러한 것들이 언어의 구문요소가 되고요.
구문요소는 여러분들이 요소별로 각 의미들을 잘 기억을 해 두시기 바랍니다.
구문, 즉 신텍스에 대한 표기법입니다.
먼저 우리가 구문이라고 하는 것은 뭔가요?
구문이라고 하는 것은 프로그램 문장 요소들 간에 관계를 나타내는 결합법칙을 의미합니다.
그래서 우리가 아무런 절차 없이 그냥 내가 원하는 대로 프로그램을 쓰는 게 아니라
각 프로그램마다 지켜주셔야 되는 신텍스, 즉 구문에 관련된 절차들이 있는데요.
그 때에 표기하는 방법으로 첫 번째로 BNF라는 방법이 보이죠.
그래서 방법은 프로그래밍 언어의 구문을 표현할 때 일반적으로 많이 사용되는 표기법이라고 했는데요.
어떤 문장, 프로그래밍 언어를 어떠한 순서대로 어떻게 기록을 해야 된다라는 것을 나타낼 때에 가장 많이 사용되는 표기법입니다.
그래서 알고리의 구문 정의, 알고리라는 언어 앞에서 보셨는데 가장 처음 사용이 됐던 그런 표기법이 되겠습니다.
그래서 기호별로 각 의미는 아래 보시는 표를 참고하시면 되겠는데요.
그래서 가장 먼저 정의에 관련된 의미는 이렇게 표기를 합니다.
그리고 선택, 태길은 이렇게 표기를 하고요.
그래서 5화가 되겠죠. 그리고 난 터미널 기호, 즉 BNF로 다시 정의될 대상이 이렇게 표기가 됩니다.
그리고 문자리나 예약허는 터미널 기호로 더 이상 정의가 불필요한 기호가 되겠습니다.
각 BNF와 EBNF 구문도표와 파스텔에 대한 설명들 간단하게 보고 계시는데요.
역시 모두 다 구문 표기법이라고 보시면 되겠습니다.
BNF 같은 경우에는 프로그래밍 언어의 구문을 표현할 때에 앞서 여러분이 보신 것처럼 가장 많이 사용되는 표기법이 되겠고요.
이 BNF는 BNF의 특수한 의미를 갖는 기호를 추가한 어떤 확장된 기호의 형태다.
그렇기 때문에 반복 부분이나 또는 선택 부분은 좀 더 간결하게 표현할 수 있는 그러한 표기법이 되겠습니다.
구문도표는 BNF와 EBNF 규칙을 표현하는 그래픽적인 방법이다 라고 했고요.
파스텔이 앞으로도 많이 나올 텐데요. 파스텔이라고 하는 것은 어떤 표현이 BNF에 의해서 바르게 작성되었는지를 확인하기 위해서 만드는 틀입니다.
그래서 파스 과정을 거치게 되면 파스팅을 거치게 되면 파스텔이 생성이 된다는 거죠.
그래서 어떤 부분이 맞게끔 작성이 되었고 어떤 부분이 틀리게 작성이 되었는지를 판단하기 위해서 만드는 틀이 바로 파스텔이 되겠습니다.
두 번째로 형식언어 부분입니다. 형식언어에 관련해서는 먼저 형식 문법이라고 하는 것은 형식언어 올바른 문자를 결정하는 규칙의 집합이다 라고 했어요.
그래서 형식언어를 구성하고 있는 문자열에 관한 규칙을 수학적 기어로 명시한 것입니다.
이러한 문법을 결정 짓는 요소들은 지금 아래에서 보시면 되시는데요. 이거 한가지 기억해 주시면 되겠습니다.
여기에서 의미하는 바가 먼저 S는 시작기호, 그리고 VT는 유한집합의 터미널기호, 그리고 VN은 유한집합의 넌터미널기호, 그리고 P는 유한집합의 생성규칙이라고 되어 있는데요.
이것들을 문법 구성요소로 가지고 있다라고 하는 것을 간단하게 기억하시면 되겠습니다.
이러한 구성요소들을 통해서 올바른 문법을 결정하는 규칙들을 정해놓는다 라고 하는 거죠.
반에서 정규언어라고 하는 것은 형식언어 중에서 정규문법에 의해서 생성된 가장 간단한 언어다.
그래서 정규문법이라고 하는 것은 컴파일러의 어휘 분석 단계에서 입력 프로그램에 나타나는 토큰의 구조를 정의하는데 사용한다.
즉 정규표현이라고 하는 것은 이러한 정규 언어를 표시하는 문법이라고 했는데요.
정규문법을 사용하는 이유가 먼저 간단하게 정규문법으로 토큰을 사용하시게 되면 간단하게 정규문법에 대한 표현이 가능하다는 것도 있겠고요.
그리고 문맥 자유문법보다 효과적으로 문법을 표현할 수 있다는 것도 정규문법을 사용할 때의 장점이 되겠습니다.
세 번째로 번역과 구문 분석에 관련해서 보도록 하겠습니다. 번역이라고 하는 부분은 앞에서도 여러분들이 이미 한번 학습을 하신 부분인데요.
유사한 부분이기 때문에 조금 더 쉽게 보실 수 있으실 것 같습니다. 번역이라고 하는 것은 컴파일이죠. 컴파일을 할 때 사용이 되는 것이 바로 컴파일러인데요.
컴파일러의 구조 보시면요. 먼저 컴파일이라고 하는 것은 고급 언어로 작성된, 즉 사람이 가장 가까운 언어로 작성된 프로그램을 실행하기 위해서 기계어로 번역하는, 즉 기계가 알 수 있는 기계어로 번역하는 과정이다.
그리고 언어 번역의 논리적 단계는 먼저 분석 단계 그리고 생성 단계. 먼저 분석 단계는 입력된 소스 프로그램을 분석하는 단계입니다.
먼저 언어에 대한 소스 프로그램에 대한 구문 분석이 들어가고요. 그리고 실행 가능한 목적 프로그램으로 생성하는 생성 단계를 거치게 됩니다.
세부적으로 컴파일하는 과정들을 보자면 먼저 첫 번째로 선행 처리, 즉 컴파일러가 원시 프로그램 처리하기 전에 먼저 필요한 작업을 수행하는 과정인
선행 처리가 들어가는데요. 원시 프로그램에서 기계어 언어로 번역하기 전에 기존의 컴파일 언어로 전환을 하는, 즉 바로 기계어로 가는 것이 아니라 중간에 한 단계를 더 거친다 라는 것인데요.
그때 선행 처리가 들어가게 됩니다. 그리고 어휘 분석을 하게 되고요. 그리고 구문 분석 그리고 의미 분석을 통과해서 중간 코드를 한번 생성을 하게 됩니다.
그런 다음에 이 코드 중에 필요 없는 부분 제외한 코드 최적화, 그리고 나서 목적 코드를 생성하고 이 목적 코드를 통해서 실행 코드를 생성하는 과정들을 거치게 되죠.
이 과정 순서대로 컴파일이 진행이 되게 되는데요. 그 중에서 선행 처리는 지금 보신 것과 같은 작업이고,
원시 프로그램을 기계어 프로그램을 번역하는 대신 기존의 고수중 컴파일러 언어로 전환하는 과정이다 라고 보시면 되겠고요.
어휘 분석 과정, 두번째 있는 어휘 분석 과정은 소스 프로그램의 문자열을, 즉 우리가 작성한 그런 문자를 프로그램 구성의 기본 요소의 토큰으로 구분한다.
앞서서 여러분들이 토큰을 사용하게 되면 좀 더 간결하게 언어에 대한 구분이 가능해진다 라고 했는데요.
그러한 작업을 어휘 분석 단계에서 하게 됩니다. 이때에 스캐너라고 불리는 어휘 분석기에 의해서 이루어진다.
그래서 우리가 사람이 알 수 있는 그런 언어로 이렇게 작성을 해뒀겠죠.
그래서 이 안에 들어가 있는 어떠한 이런 문자들을 다 하나씩 하나씩 구분을 지어서 분류를 해놓는 그러한 작업이 어휘 분석 단계에서 일어나게 됩니다.
그리고 세번째로 구문 분석은 파싱 이라고 하는 과정인데요.
일단은 어휘 분석에서 구분을 다 해놨으면 파싱 과정을 통해서 이것이 문법에 맞게끔 작성이 되었는지 비어있는 구문은 없는지
예를 들어서 이런 경우가 있죠. 우리 자바에서 포문을 쓴다면 앞에 어떤 값이 들어가야 되고 두번째 들어가는 값, 세번째 들어가는 이런 값이 필요하고
각각은 이렇게 세미콜론으로 구분 지어져야 된다. 그리고 각각이 하는 역할과 이런 것들이 정해져 있죠.
여기에 맞게끔 구성이 되어 있는지를 분석하는 과정이 구문 분석이 되겠습니다.
그래서 파싱을 하고 나면 이 결과 값으로 뭐가 나와요? 파스트리가 결과적으로 나오죠.
앞에서 파스트리 라고 하는 것을 구문에 맞게끔 작성이 되었는지, 문법에 맞게끔 작성이 되었는지를 판단해서 작성하는 무언가 결과물을 파스트리 라고 봤는데
파싱 과정에 의한 결과 값으로 나오게 됩니다. 그래서 파싱을 거치게 되면 어휘 분석계에서 발생된 토큰들을 사용해서
프로그램의 수행, 수식 등의 구조를 분석하고 결과로 파스트리 를 생성한다. 그러면 이제 뭐 맞게 작성이 되어 있는지가 판단이 되겠죠.
파스트리를 작성을 했을 경우에 올바르게 작성이 되었다고 한다면 다음 단계로 넘어가서 이제 의미 분석이 되겠죠.
의미 분석은 구문 분석의 결과로 생성된 파스트리 를 사용해서 실행 가능한 중간 코드를 생성한다.
파스트리 로 어떤 트릭 결과가 나왔으면 그것들을 다시 한 번 더 기계가 알 수 있는 코드로 생성을 합니다.
이때 프로그램 구조의 특정형을 분석하고 처리하는 이런 과정을 거치게 되고, 그런 다음에 코드 최적화 과정으로 넘어갑니다.
코드 최적화는 실행 결과에 변화를 주지 않으면서 코드를 최적화된 코드로 변환하는 작업입니다. 예를 들어서 반복문이라든지 혹은
분기문이라든지 이런 것들을 최적화된 과정 코드로 변환하는 작업. 이때 중요한 것은 실행 결과에 변화를 주면 안되겠죠.
그래서 동일한 파스트리 를 사용해서 목적 코드가 된 것들을 동일한 방법, 동일한 결과 나오게끔 다시 한 번 더 최적화하는 그런 과정을 거치게 됩니다.
그런 다음에 가장 마지막 단계인 목적 코드를 생성을 하게 되겠죠. 그래서 코드를 어셈블리어 등의 목적 프로그램 형태로 바꾸는 과정이 바로 목적 코드 생성에 들어가겠구요.
이 목적 코드까지 생성했으면 이제 컴파일이 다 끝나고 마지막으로 어떤 실행 코드를 생성하는 7번째 과정을 거쳐서 프로그래밍 컴파일이 다 끝나게 되는 거죠.
그래서 여러분들이 여기에서 기억하셔야 되는 것은 각 단계별 물론 특징도 기억하셔야 되겠지만 이 컴파일에 대한 세부 과정.
다시 한 번 보시면 선행 처리 즉 컴파일 하기 전에 어떤 컴파일이 쉬운 어떤 형태로 바꾸는 선행 처리부터 해서 어휘 분석, 구무 분석 그리고 의미 분석과 중간 코드 생성과정과 코드 최적화
그런 다음에 우리가 원하는 목적 코드 생성하고 그걸 바탕으로 실행 코드를 생성하는 이 과정들은 여러분들이 다 기억하고 계셔야 되겠습니다.
자 다음은 이 구문 분석 즉 팟싱 과정에 대해서 좀 더 자세히 보도록 하겠습니다.
구문 분석 즉 팟싱 이라고 하면요 기본적으로 입력으로 받아들인 스티링이 주어진 프로그래밍 언어의 문법에 맞는가를 판단한다.
그리고 결과로 팟스트리를 출력한다라고 했는데요. 팟싱 과정을 거친 어떠한 결과 값으로 팟스트리가 나오는 거죠.
자 이러한 팟싱 기법의 종류는 두 가지로만 간단하게 보시면 되겠습니다. 먼저 상향식 팟싱 방법이 있구요.
그리고 하향식 팟싱 방법이 있겠죠. 그래서 이 상향식 팟싱 같은 경우에는 입력 스티링으로부터 위쪽으로 팟스트리를 만들어가는 방식이구요.
하향식 같은 경우에는 반대로 로드가 아니라 루트부터 시작을 해서 하향으로 점점 팟싱을 해나가는 그러한 방식이 되겠습니다.
자 그래서 이러한 팟싱 기법 중에서 보시면은 반복되는 구문들이나 이런 것들에 대한 검증을 할 수가 있고
그리고 문법들이 제대로 맞게끔 작성이 되어있는지를 잘 알 수가 있기 때문에 우리가 팟스트리를 출력하는 과정을 문법이 맞는지를 기계가 알 수 있는 가장 최적화된 방법이라고 볼 수가 있겠습니다.
자 여기까지 해서 우리 구문 분석까지 다 마무리가 되셨는데요. 아마 이번 과정도 여러분들이 생소한 그러한 문장들이 굉장히 많이 보일 거에요.
이 중에서 여러분들이 꼭 기억을 하셔야 되는 것은 제일 앞에서 여러분들이 보셨던 언어의 구문 요소들, 각 요소들의 이름들과 그리고 특징들을 잘 기억을 하는 게 중요하겠구요.
그리고 팟싱 기법이 무엇인지, 팟싱 기법이 어떻게 진행이 되는지, 그리고 번역 과정이 어떻게 되는지, 그리고 토큰 같은 경우에는 어휘 분석기에 관련된 것,
그리고 파스 같은 경우에는 구문 분석에 관련된 것이다라는 것을 잘 기억을 하시면 되겠구요.
그 핵심어들과 그리고 특징들을 잘 기억을 하셔서 문제를 풀어 보시면 되실 것 같습니다.
자 우리 이번 시간 언어 구문과 번역에 관련된 부분은 여기까지 하고 마치도록 하겠습니다.
여러분 수고하셨습니다.
