{"id":26833482,"url":"https://github.com/mr-won/programming-linguistics","last_synced_at":"2025-03-30T15:29:07.348Z","repository":{"id":189499415,"uuid":"671919856","full_name":"mr-won/Programming-linguistics","owner":"mr-won","description":"컴퓨터공학과 프로그래밍 언어론 정리입니다.","archived":false,"fork":false,"pushed_at":"2025-03-14T01:25:10.000Z","size":21410,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-18T02:27:13.567Z","etag":null,"topics":["igloocorporation","programming","programming-language","programming-linguistics"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mr-won.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-07-28T12:55:07.000Z","updated_at":"2025-03-14T01:25:56.000Z","dependencies_parsed_at":"2025-03-18T02:37:21.153Z","dependency_job_id":null,"html_url":"https://github.com/mr-won/Programming-linguistics","commit_stats":null,"previous_names":["wonttan/programming-linguistics","chihyunwon/programming-linguistics","mr-won/programming-linguistics","wonchihyeon/programming-linguistics","chihyeonwon/programming-linguistics"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FProgramming-linguistics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FProgramming-linguistics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FProgramming-linguistics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FProgramming-linguistics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mr-won","download_url":"https://codeload.github.com/mr-won/Programming-linguistics/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246337945,"owners_count":20761295,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["igloocorporation","programming","programming-language","programming-linguistics"],"created_at":"2025-03-30T15:29:06.653Z","updated_at":"2025-03-30T15:29:07.332Z","avatar_url":"https://github.com/mr-won.png","language":"C","readme":"## 버퍼 오버플로우 메모리 관련 복습\n\n# Programming-linguistics\n컴퓨터공학과 프로그래밍 언어론 정리입니다.\n## 종강\n![image](https://github.com/mr-won/Programming-linguistics/assets/58906858/3eab74ee-9f65-42aa-b849-4a79e8a445be)\n```\n컴퓨터 프로그래밍 언어를 설계하고 구현하는 방법과 현대 컴퓨터 프로그래밍 언어가 가지고 있는 주요\n요소들 및 패러다임에 따른 장단점들을 배울 수 있었습니다.\n```\n[BNF](https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true\u0026blogId=hamill_a\u0026logNo=221125554113)\n[4](https://blog.naver.com/PostView.nhn?blogId=bh5kks\u0026logNo=220498445612)\n![image](https://github.com/wonchihyeon/Programming-linguistics/assets/58906858/532d1fb1-1f40-4e6c-957d-fd56aa0d6d9b)\n![image](https://github.com/wonchihyeon/Programming-linguistics/assets/58906858/be821b10-a10b-407c-aee6-3578397112e9)\n```\nassign은 변화가능한 variable expression으로 유도가 가능하다.\nLHS 정의하려는 추상화 : RHS는 토큰, 어휘항목, 다른 추상화에 대한 참조로 구성\n\n논터미널 기호 혹은 논터미널 : 추상화된 대상\n터미널 기호 혹은 터미널 : 규칙에 포함된 어휘항목과 토큰\n논터미널 기호는 두 개 이상의 다른 정의를 가질 수 있음\n\n리스트 명세 가변 길이의 리스트를 표현할 때 BNF에서는 재귀를 사용\n\n최좌단 유도 -\u003e 파스트리 -\u003e 파스트리 구축 -\u003e 유도 o 문제 x\n\n문법의 모호성을 제거하는 방법 : 연산자의 우선순위, 연산의 결합 규칙\n\n연산자 우선순위가 있고 없고의 차이가 있다.\n연산자 우선순위는 낮은쪽에서부터 계산된다.\n낮은 쪽이 먼저 생성되므로 연산자 우선 순위에 따라서 연산을 수행하므로 모호성을 제거한다.\n(깊이 우선)\n\n연산의 결합규칙\n좌결합규칙: 좌순환적 표현은 좌결합 규칙을 기술한다. RHS의 시작 위치에 LHS가 나타나는 경우\n우결합규칙: LHS가 RHS의 오른쪽 끝에 나타나는 경우\n좌측의 \u003cfactor\u003e가 우측에도 나타난다.\u003cfactor\u003e\n\nif then else를 위한 모호하지 않은 문법 else의 위치가 어디에 있을까\n\nDangling else 문제 if if else \u003c 아무것도 출력이 안된다. \nif else if \u003c 출력\n\nif if else if statment?\n\nBNF보다 서술 능력이 향상된 것은 아니며 단지 가독성과 작성력만 향상\n\n\u003c\u003e 가 있는 건 논 터미널\n-\u003e 유도\n\u003cprogram\u003e -\u003e begin \u003c\u003e end -\u003e \u003c\u003e\nA = B + C; \u003c- 터미널   \n\n최좌단 유도 논미널 \u003c\u003e -\u003e 터미널로 유도\n\n구조상 파스트리와 같다.\n중간 노드는 논터미널\n잎 노드는 터미널\n```\n![image](https://github.com/chihyunwon/Programming-linguistics/assets/58906858/77c1ed68-fa4d-47b6-97e1-eed7d43b081c)\n\n```\n문법의 모호성 ? -\u003e 주어진 한 문장에 대해 두 개 이상의 다른 파스트리를 생성할 경우\n컴파일러가 의미를 결정할 수 없기 때문에\n\n모호할 경우 해결책 -\u003e 문법의 재작성, 비문법적 정보를 제공하여 하나의 올바른 파스트리를 구성\n\n해결책으로 연산자 우선순위를 도입\n\n낮은 곳이 먼저 계산된다. 우선순위가 높은 것을 파스트리의 최하단에 위치하게 함\n\nif else -\u003e 두 개의 파스트리(모호하다)\n\nelse 규칙 : 이전에 매칭되지 않은 가까운 then 에 매칭이 된다.\n\u003cmatch\u003e, \u003cunmatch\u003e 나누어서 작성\n\n\nyacc 구문 생성기가 parse 구문 분석기를 생성한다.\n\nc,c++ 컴파일러\njava 인터프리터\n\n어휘분석과 구문 분석과 분리하는 이유\n\n어휘분석(토큰과 렉심으로 구분) 토큰화 토큰, lexeme가 의미 -\u003e 심볼 쌍을 이룬다.\n\n어휘분석기의 역할 -\u003e 주석제거, 심볼 테이블 구축, 어휘 에러 탐지 및 통보\n\n어휘분석기 -\u003e lex 정규 표현식을 사용한 lex, 패턴을 정의하는 상태 전이도, 상태전이도에 대한 테이블 구동 구현을 직접 구성\n\n유한 오토마타 -\u003e 유향 그래프\n\n. 의미를 박탈해라 영문자가 여러개 오고 숫자가 오면 id다\n스페이스 -\u003e 뛰어넘어라\n\n구문 분석의 목적 (파서의 역할)\n\n파스트리를 구축\n\n하향식-\u003e 위에서 아래로 최좌단 유도와 같은 순서 LL 파서, 재귀 하향 파싱\n상향식-\u003e 아래에서 위로 최우단 유도의 역순 LL 파서, 이동-감축 알고리즘 yacc\n\n파싱 알고리즘 복잡도 O(n^3) 소스코드에 비례\n상업적 파서의 복잡도를 O(n)으로 줄임\n\n최좌단,우단이던 파스트리는 하나만 생성\n\n하향식 \u003c- 재귀 하향 파싱 , 전역 변수 nextToken 파싱할 때 다음 토큰을 미리본다. LL 문법\n좌측에서 1개의 터미널\n하향식 \u003c- LL , 재귀\n\nexpr term factor ( expr term factor sum expr + expr term factor 47 - 최종적으로 expr 다시\n\n직접 좌순환 \u003c- 재귀호출로 인한 스택오버플로우 발생\n간접 좌순환 \u003c- A -\u003e BaA A가 즉시 자신을 호출하는 부분이 발생\n\n하향식 순환을 안쓰는 데에는 이유가 있다.\n\n상향식 순환을 자주 사용한다.\n\n집합쌍 불일치 테스트\nnextToken(lookahead)이 하나여야하는데 여러 경우면 안된다. 여러 경우면 RHS를 선택할 수 없다.\n\nA 논터미널 a터미널 first의 집합의(a, b, c, d) 교집합이 공집합이므로(disjoin)하므로\n하향식 파싱이 가능하다.\n\nfirst가 a, a, b 서로 disjoint 하지 않으므로 하향식 파싱이 불가능하다.\n```\n[스택과 힙](https://blog.naver.com/gothevole/223232263442)\n```\n스택 : 지역변수, 함수 호출(지역변수,리턴되는 주소, 파라미터), 컴파일러\n힙 : 동적으로 할당, 프로그래머가 관리\n\nextern 전역변수 -\u003e Data영역\n실행-\u003e로더가 프로그램을 올려준다. 메모리 상에 코드부분은 코드부분\n데이터는 데이터부분, stack, heap\n\ncode, data, stack, heap\nos\n\n스택에는 main부터 쌓음\n```\n![image](https://github.com/chihyunwon/Programming-linguistics/assets/58906858/b62c5f2e-11e9-4ffa-9804-76bed8b281ca)\n```\n상향식 파싱 최우단 유도의 역순\n\n입력은 shift 토큰 스트림\n출력은 발견된 문법 규칙\n\nshift - Reduce 알고리즘\n\n푸시다운 오토마타 문법에대한 인식\n모든 파서는 푸시다운 오토마타\n재귀 하강 파서도 푸시다운 오토마타\n\nLR 파서의 장점, 단점을 서술하라\n\nLR파서는 상대적으로 작은 파서코드와 파싱테이블로 구성\nLR파서는 LL파서로 처리가능한 문법을 모두 처리 가능하다\nLR파서는 적은 파서코드로도 LL파서로 처리가능한 문법을 모두 처리 가능하다.\n\n단점 : 파싱테이블을 수작업으로 구축하기가 어렵다.\n문법을 입력받아서 파싱테이블을 자동으로 생성하는 Yacc 프로그램이 존재한다.\n\n0id5 스택 0, (id, 5) -\u003e 0,(F,3) -\u003e 0,(T,2)\n\n중간고사 시험\n\nLR 파싱테이블 ACTION이 어떻게 일어날까 \n하향식 파서 처리부분\n\n변수(타입 주소 값, 바인딩, 바인딩 시간)\n영역(scope, lifetime)\n초기화\n\n폰노이만의 컴퓨터 추상화 데이터를 저장과 데이터 가공을 위한 연산으로 구성\n메모리 셀에 대한 추상화 -\u003e 변수, 배열 등 \n\n```\n### 반대로\n![image](https://github.com/chihyunwon/Programming-linguistics/assets/58906858/e0a85559-4484-496d-8cc6-b0eef9320d3c)\n```\n0 \u003c- 스택에\n5 \u003c- R6 Reduce6 id가 f가되고 상태를 변화 감축되고 난 후에 상태 변화\n0F3 상태가 0에서 3이됨\n3, + -\u003e R4\n\n1, + S6\n\n문법을 반대로\n\n0 E 1 4 6 T 1 8 7 f 10\n\nt * f -\u003e t\n\n0 E 1 4 6 T 10\n\n6,T -\u003e 9\n\n0 E 1 4 6 T 9\n\nE+T -\u003e E\n\n0 E -\u003e 1\n\n0 E 1\n```\n\n```\n변수의 속성(타입, 주소, 값)이 설정되는 시점이 다 다르다.\n변수의 속성이 설정되는 시점이 바인딩 시간\n\n변수는 영역, 존속 기간이 있다.\n\n변수(타입, 주소, 값, 영역, 존속기간)\n\n예외를 허용하지 않는 순수 함수형 언어에서의 변수는 값의 변경을 허용하지 않는다.\n\n이름 case sensitive 대소문자구별\n\n특수어 : if, for, while 프로그래밍 언어에서 수행할 행동들을 명칭화한 것.\n예약어 : 특수어는 예약어로 분류, 특별한 의미로 해석하도록 선정이 되어있는 것.\n키워드 : integer, float같은 자료형 처럼 어떤 문맥에서만 특별하게 사용되는 단어.\n\n함수에서 자기 자신을 호출하는 경우 지역변수, 매개변수, 리턴값이 메모리의 영역을 벗어나는\n세그먼테이션 오류가 발생한다.\n\n스택변수 : 동일한 변수가 다른 시점에 다른 주소와 연관되는 것이 가능\nL-value : 배정문의 좌측에 위치 값의 좌측에 놓인다. x = 3 (x는 변수, 좌측)\n\n포인터 -\u003e 별칭인데 가독성을 떨어뜨리는 요소가 된다.\n\nx = x + 3\n\nL-value -\u003e x의 주소\nR-value -\u003e x + 3 -\u003e x의 내용에 3 더하고 x의 주소에 넣어라\n\n스택,데이터 영역 -\u003e 이름있는 변수\n힙 -\u003e 이름없는변수\n\n변수는 이름이 있을수도 있고 없을 수도 있다.\n\n타입 : 변수가 저장할 수 있는 값들의 범위와 연산들의 집합을 결정\n\n바인딩 : 속성과 개체간의 연관\n\n언어 설계 시간 design : * 곱셈기호(포인터)\n언어 구현 implementation 시간 C언어의 int type 1워드\u003c-레지스터크기에 따라 다름 사이즈\n\nedit time = desigin + implementation\n\n컴파일 시간 : c, java 변수와 타입\n\n링크 시간\n\n로딩 시간 : 전역변수와 그의 주소\n실행 시간 : 지역 변수와 그의 주소(main함수에서 콜이된 다음 설정)\n\n자바에서 값의 사이즈가 설계 시간에 바딩 \u003c 자바는 자바 virtual machine 설계 시간때 값의 범위 결정\n\n실매개변수와 형식 매개변수 간의 바인딩이 어떻게 일어나는가 \u003c- 실행 단계\n\n실행단계 전에서 바인딩된다. 정적바인딩\n실행 시간 중이거나 실행 과정에서 바인딩이 변경 될 수 있는 경우 -\u003e 동적바인딩\n\n하드웨어 바인딩은 고려하지 않음\nos가 개입하는 가상메모리와 실메모리사이의 매핑(바인딩)은 고려 x\n\n정적 타입 바인딩 \u003c- 컴파일 시에 변수의 타입이 결정 됨\n명시적 선언 : 컴파일러 방식, 변수 이름들을 나열하고 타입을 명세\n묵시적 선언 : 컴파일러 방식이나 인터프리터 방식\n\n명시적인것이 묵시적인것보다 좋다\n\n타입 추론 var \u003c- 실행시간이 아닌 컴파일 시간에 결정\n\n동적 타입 바인딩 \u003c- 변수의 타입이 명세 x 순수 인터프리터 언어 파이썬, 자스, c#\n```\n## 23.11.03\n\n```\n존속기간 = 기억장소에서 할당되고 회수되기 까지의 시간 (시간적인 개념)\n\n정적 변수 \u003c- 전역 변수, 정적 지역 변수에 해당. static 지정자는 클래스 변수를 생성\n-\u003e장점 : 어디에서나 존재하므로 프로그램의 어느 부분에서나 직접적 접근이 가능\n할당과 회수를 위한 부담이 없다. 할당하고 회수는 한 번만 이루어짐\n\n-\u003e단점 : 유연성이 감소한다. 재귀적 호출x 스택을 이용하지 못하기 때문에\n\n스택- 동적 변수 : 실행될 때 기억 공간에 바인딩 타입은 정적이지만 공간만 동적 바인딩되고 나머지 속성은 정적 바인딩\nc함수, java 메서드의 지역변수, 매개 변수,\n-\u003e 장점 : 각 부프로그램 마다 자신의 기억 공간을 가짐\n재귀 부프로그램의 작성에 활용\n\n-\u003e 단점 : 미미하지만) 할당과 회수에 따른 실행-시간 부담\n간접 주소지정 방식으로 접근하므로 정적 변수보다는 느림\n부프로그램이 과거 데이터의 접근에 제약\nCPU Time을 미미하게 잡아먹음\n\n명시적 힙 동적 변수\n프로그래머가 명시적으로 실행시간 명령어에 의해서 할당되고 회수되는 이름없는 메모리 셀\nc언어 :프로그래머가 관리하지 않는 힙\n-\u003e 장점 : 리스트나 트리와 같이 실행시간에 동적으로 크기가 변하는 자료구조 구축\n\n-\u003e 단점 : 프로그래머가 사용하기 어려움, 7포인터와 참조 변수의 올바른 사용의 어려움\n참조비용, 기억 공간 관리 구현의 복잡성 등\n\n힙공간에 접근할 수 없는 공간이 많아지는 현상 -\u003e memory leaking 메모리 누수\n\n암묵접 힙 동적 변수 (파이썬, 자바스크립트)\n값이 배정될 때 힙 기억 장소에 바인딩\n값이 배정될 때마다 변수의 모든 속성이 바인딩 됨\n\n장점 : 유연성과 일반화 프로그램 작성에 유리\n단점 : 실행시간에 속성을 관리해야함으로 비용이 많이듬\n컴파일러에 의한 오류 탐지 능력 상실\n\n```\n![image](https://github.com/chihyunwon/Programming-linguistics/assets/58906858/15cd3e68-239a-4c61-b0e6-57718797d38c)\n```\n정적 변수, 스택, 힙이 각각 잡혔다가 사라지는 시간들이 각각 다르다.\nmain의 시작과 끝 안에 foo의 시작과 끝안에 malloc의 시작과 끝이 있다.\n free(pi) pi가 가리키는 공간 -\u003eheap의 공간이 없어지는데 pi는 있음\n```\n```\n참조 가능한 변수 \u003c- 변수가 가시적이다.(visible)\n\n영역 규칙 : 이름을 어느 변수와 연관을 짓게 할 것인가를 결정하는 규칙\n\n지역 변수 vs 비지역 변수\n\n지역 변수 : 블록 내에 선언된 변수\n비지역 변수 : 프로그램이나 블록 내에는 선언되어 있지 않지만 해당 영역에서 가시적인 변수\n전역 변수가 비지역 변수의 한 예\n함수 안의 변수 밖의 전역 변수\n\n정적 영역 : static rule이 정해져있음 실행시간에 앎 프로그래머가 프로그래밍 한 시점에 알 수 있다.\n\n변수의 영역이 변수의 선언/위치 그리고 부프로그램들의 상호 간의 공간적 배치 관계에 의하여 결정 -\u003e 실행을 안시켜봐도\n프로그램을 보면 변수가 어디에 쓰였는 지, 함수와의 관계를 볼 때 결정할 수 있다.\n\n정적 언어 : c, c++, java 변수의 영역을 실행 전에 알 수 있다. scoping rule은 실행전에 결정될 수 있음\n\n두 가지 형태의 정적 영역 언어가 존재\n\n함수 안에 함수를 생성할 수 있는 언어 -\u003e Ada, JavaScript, Common LISP, Scheme, Python\n\n가능하지 않는 언어 -\u003e C기반 언어들 C, C++, JAVA\n중첩은 허용치 않으나 중첩된 클래스 정의나 블록에 의해서 중첩된 정적 영역 생성 가능\n함수 안에 블록을 넣어서 중첩된 정적 영역을 생성 가능하다.\n```\n![image](https://github.com/chihyunwon/Programming-linguistics/assets/58906858/92f75322-f2d5-4839-9299-2940a7f87356)\n```\nvar변수나 함수를 hoisting\n\nbig(부모영역), sub1, sub2(자식영역)\n\nnonlocal인 영역은 다른 영역(부모영역)\nsub2의 영역에 x가 없을 때 자기 영역에서 찾는데 없음 -\u003e 부모 영역(big 영역에서 x를 찾음 var x = 3;)\nsub2의 y는 3이 찍힘\n\nsub1은 7이 찍힘\n\nbig영역의 x는 7이 찍힘\n\n지역 변수 \u003e 외부변수\nlocal \u003e nonlocal\n\nLEGB룰 로컬에서 찾고 Enclosed, global, built-in-\u003e 없으면 NameError\n\nsub1은 x = 3\nsub2의 입장에서 sub2 enclosed x=2\nrpint(X)마지막 입장에서 local은 x= 2\nbig() x=2\n\n블록 : 변수의 참조 가능한 영역을 최소화하는 효과 \u003c- 좁으면 좁을 수록 에러를 찾기 쉬움\n블록 내에 생성된 영역은 스택과 동일 취급 블록에 진입될 때 확보됬다가 빠져나올 때 회수 \u003c- 함수콜의 처리방식과 같다.\nC,C++은 중첩된 함수를 허용하지 않음\n```\n![image](https://github.com/chihyunwon/Programming-linguistics/assets/58906858/30d87852-a9dc-4b94-a87f-bf40e8fea55e)\n```\nint x = 0; 은 데이터영역에\nint x = 1 스택\nint x = 2 스택 안의 스택에\n\n지역우선 -\u003e 블록에서나오면 스택에서 사라짐,-\u003e x= 2 블록에 빠져나오고 -\u003e x = 1; (3, 2, 1)\n\n지역변수\u003e전역변수인데 전역 쓰려면 c는 extern 키워드를 c++는 ::연산자를 사용한다.\n\njava는 중첩 블록은 허용하지만 변수명이 중복되는 경우를 배제\n\njs는 함수 블록은 제공 python은 블록기호가 없음\n```\n```\n6.11 pointer와 reference type\n11.1\n11.2\n11.3 pointer의 문제점들\n11.4 c와 c++에 있는 포인터들\n5 reference type\n6\n7\n\n299p부터 311p까지 정리\n위키피디아에서도 가능\n```\n```\n#define은 C의 전처리기가 처리하는 것이지 C의 문법에서 처리하는 것이 아니다.\n```\n## 23.11.24\n```\nCOBOL: 십진수 데이터 값의 정확도(accuracy)를 명세하는 것을 허용, 레코드 타입 제공\nPL/I :정확도 명세 기능을 정수와 부동 소수점 타입으로 확장, 많은 데이터 타입을 소개\nALGOL 60 : 사용자 정의 타입 제공\n\n타입이 언어의 각 식에 어떻게 연관되는지를 정의, 타입 동등성과 타입 호환성의 규칙을 포함\n역할\n1. 오류 탐지\n2. 프로그램 모듈화를 위한 지원\n3. 문서화\n4. 프로그램에서 타입의 선언은 그 데이터에 관한 정보를 문서화 하는 것\n\n구조화된 데이터 타입 : 명령형 언어에서 제공되는 구조화 데이터 타입 -\u003e 배열과 레코드\n\n기본 데이터 타입 : 기본 데이터 타입을 제공, 하드웨어 반영 정수, 실수\n약간의 비하드웨어적 지원을 받는 기본 데이터 타입도 있을 수 있음\n\n기본 데이터 타입은 구조화된 데이터 타입(배열, 구조체)를 제공하기 위해 활용\n\n수치 타입 : \n\n십진수 데이터 타입 : 사무용 데이터 처리 -\u003e 실수 타입에서 문제 \n\nASCII: 가장 공통적으로 사용되는 코딩\nC언어에서 char 타입은 ASCII 코드를 저장\nISO 8859-1: 8비트 문자 코딩 기법으로 256개의 문자를 제공\nAda 95+는 ISO 8859-1을 사용\nUnicode: 세상에 존재하는 대부분의 자연 언어에 속한 문자를 표현 -\u003e Java, JavaScript, Python, Perl, C#, F# 등에 채용\n대부분의 언어에서 단일 문자를 위한 타입을 제공\nC의 char, JAVA의 char등\n\n설계 고려사항 : c문자는 마지막문자가 공백으로 끝나는 문자들의 배열이 문자열이다.\n다른건 기본타입으로 제공\n\n문자열의 정적 길이 : 정해지면 변경x , 동적길이 :변경 가능\n문자열 연산 \n\nc: 조작함수가 안전하지 않음\nc++ : c char말고 표준 라이브러리에 있는 string\njava 는 string 클래스와 stringbuffer(동적) 컴파일시에 크기를 변경 가능 클래스에서 지원\nstring 클래스 객체는 immutable\nstringbuffer 클래스 객체는 : mutable\n\npython 문자열을 기본타입 immutable하다.\njavascript,php,perl, ruby : 언어에 내장되어있어서 그냥 쓰면 된다.\nF# : 유니코드 UTF-16으로 된 개개의 문자들\nML : 기본 데이터타입 IMMUTABLE\n\n정적길이 : 문자열의 길이는 정적이고 문자열이 생성될 때 설정\n제한된 동적길이 문자열, C의 문자열, C++에 사용하는 C스타일\n\n동적 길이 문자열 : 제한된 길이 없이 가변길이를 갖는 것을 허용\nJavascript, perl\n\nada 95+에서는 세가지를 모두 지원\n\nc스타일의 문자열 지원 방식의 부자연스러움\n문자열을 기본 타입에 포함시키는 것이 쉬워서 문자열은 기본 데이터타입으로 포함\n\n순서 타입(ordinal type)\n-기본 순서타입\n-사용자 정의 순서타입 : 열거와 부분 범위 두가지\n\n열거 타입(enumeration Type)\n장점 : 간결해지고 가독성이 좋아진다.\n\n설계 고려사항\n\n*str1 = \"Hello World\" 4바이트의 공간이 있는데 그 이름이 str1이다.\n\n\n4바이트 Hello World공간이 있다.\n\n스택 : main에 대한 스택이 생긴다.\nstringExam에 대한 스택이 생긴다.\n함수의 로컬 변수가 생긴다. *str1이라는 이름의 공간을 가리킨다. 그 공간의 값은 HELLLO이다.\nstr2는 총 13바이트가 스택공간에 잡힌다. str2[] = \"Hello World\"\n*str3 = NULL; NULL STR3이라는 이름의 공간을 가리킨다. 그 공간의 값은 NULL이다. 0번지\nstr4는 10바이트의 공간을 잡음 str4[10];\nstr5는 10바이트의 공간을 잡고 hello가 들어가 있음 6바이트가 들어가있고 4바이트는 비어있음\nstr5[10] = \"hello\"\n\n\nprintf null문자를 만날때까지 찍는다.\nstr1에 대한 strlen의 길이는\n\nstr2에 null을 넣을 수 없다. str2 배열 이름은 상수라서 readonly임\n이후에 str2 = null을 넣을 수 없다.\n\nmalloc 힙에다가 공간을 잡아라 *str3 = malloc \u003c- 힙영역을 가리키게하고\nstrcpy(str3, str1); str3에 str1 11바이트를 20바이트가 있는 곳에 넣어라 -\u003e 충분히 들어감\n힙영역에 그대로 복사하기 때문에 힙 영역에 hello 넣을 수 있음\n\n\nstr4에 str1을 넣는다면 str4의 크기는 10인데 str1 12바이트를 넣으면 오버플로우가 발생한다.\n널이 없어지므로 str5는 d만 찍힘\n\nstr3는 free -\u003e 메모리를 운영체제에 반납하겠다.\nstr3 = null -\u003e null로 가리키도록 하겠다.\n\njava\n\nclass loading \u003c - c에서의 data나 text영역\nstack \u003c- c에서와 같음\nheap \u003c- c에서와의 차이는 managing heap이다. 필요하면 jvm이 알아서 메모리를 잡아주고\ngarbarge collector가 자동으로 반납\n\nString msg = \"HellO World\" 모든 객체는 힙에 만들어진다. 따라서 msg의 hello world 객체는 힙에 만들어지고\nmsg가 hello world 객체를 가리킨다. 사이즈나 내용을 변경시키는 것이 불가능하다.\n\nstringbuffer msg1이라는 참조변수가 hello world는 string buffer 객체는 사이즈나 내용을 변경시키는 것이 가능하다.\n\n자바에서는 객체이기 때문에 자신에 대한 속성을 가지고 있다. hello world 객체의 길이가 msg에 저장되어 있다.\n카운팅하는 개념이 아니고 따로따로 들어가 있다.\n\nappend를 사용하여 값의 내용을 변경시키는 것이 가능하다 . msg.append(\"korea\") 붙이는거\n\npython도 마찬가지로 msg1 = \"Hello world\" 라면 hello world는 힙에 존재한다\n\njava, python는 힙에 객체가 만들어진다.\n\nlen이라는 내장함수를 호출한다. 슬라이스 연산 :5를 제공한다.\n\nenum days { } \n\nenum gender { male =1, female =2 } gender 타입이 생기고 gender.male = 1\n값을 따로 안주면 0이라는 값으로 ordinal() 수치값으로 접근하려면 gender.male.ordinal() 이렇게 접근해야\n1\n\n열거 타입의 타입을 int형처럼 취급해서 수치 연산이 불가능하다. 열거타입은 열거 타입일 뿐\n\n스크립트 언어(python, javascript, ruby, php)들 중 열거 타입을 기본 타입으로 지원하는 것은 없다.\n왜냐하면 표준 라이브러리로 제공한다.\n\n열거형은 가독성과 신뢰성을 향상 시킨다.\n산술연산을 허용하지 않는다. (열거형은 정수형이 아님)\n\n정의된 범위 밖의 값을 할당 받을 수 없다.\n\nC의 열거형은 열거 변수를 정수 변수 처럼 취급한다.\n-\u003e 가독성을 향상시키나 신뢰성의 면에서 문제를 야기할 수 있음\n\nC++의 열거형은 비교연산에서 여전히 정수형 타입처럼 다루어 질 수 있다.\n\n배열 타입 : 동질의 데이터 원소들의 연속된 데이터 모음\n0부터 시작함 메모리가 0이라\n\n배열 연산\n배정, 접합, 비교, 슬라이스 등\n\nC의 경우 배열 연산을 제공하지 않음 -\u003e 라이브러리를 통해 필요한 기능 사용\n\nJava, C++, C#은 배열이 객체로 제공되며 메소드로 수행\n\nPython은 리스트 형태의 요소를 제공하며 이질적인 요소를 포함할 수 있음\n배정, 접합(+), 원소 멤버쉽(in), 동일성 비교(is), 동등성 비교(==)\n\nFortran 95+는 elemental이라고 불리는 많은 배열 연산을 제공\n배정, 산술, 관계, 논리, 행렬 곱셈, 행렬 전치, 벡터 내적에 대한 내장 함수나 라이브러리 제공 \n\nAPL에서는 배열 연산을 핵심요소로 제공공\n\n이제까지 고안된 언어 중에서 가장 강력한 배열 처리 언어\n언어의 난해성으로 후속 언어에 미친 영향이 없음\n\n배열과 슬라이스\n슬라이스는 배열의 어떤 부분 구조(substructure)이다.\nPython, Ruby, Perl 등의 언어에서 배열의 슬라이스 연산을 제공 (slice.py 참조)\n\nslice(2:5)\na:b:2 a부터 b까지 2의 간격으로 배열을 끊어라\n\n모든 순서 타입을 첨자로 허용하거나 슬라이스 연산등의 진보가 있었음\n\nimmutable해야한다 hash를 사용하려면 immutable 변하기 쉽지 않아야 한다.\n\n연상배열이면 해시함수를 사용해서 검색 등이 빠르다.\n다만 키:값으로 키가 리스트면 mutable하다 값의 변경이 있을 수 있기 때문이다.\n\n연상배열을 쓰면 좋은 점 : 가독성이 좋아진다.\n```\n## 23.12.01\n```\n정적 배열 : void main() 밖에 선언 -데이터영역\n고정 스택-동적 배열 : 함수안에 선언\n스택-동적 배열 : 함수 매개변수 t 가 A[t] 이렇게 되서 크기가 동적으로 변하는 것\n\n스택은 런타임시에 컴파일러가 해줌\n\n고정 힙-동적 배열 : 힙영역에 메모리를 할당했다가 반납하는 것\nnew로 생성 free로 반납, 스택보다는 느리다.\n\n기억공간이 런타임시에 일어나야한다면 스택에 동적배열을 할당하는 것보다 힙에 할당하는 것이\n기본적이다. (유연성)\n힙-동적 배열 : 힙 영역에 기억공간의 할당이 동적으로 일어난다.\n힙은 프로그래머가 해야함, C는 제공하지않고 리스트를 만들어서 구현한다. java에서는 제공된다.\n\n배열 초기화 : int list[] = { 4, 5, 6, 7};\n\n배열 연산 : C의 경우 라이브러리를 통해 필요한 기능을 사용한다.\nC++,java는 배열이 객체로 제공되어 메소드를 이용해서 구현\npython은 리스트 형태의 요소를 제공 이질적인 요소를 포함할 수 있다.\n\n기본배열은 첨자로 연상 배열은 키값으로 인덱싱, 순서를 갖지않음\nC는 연상배열없음 \n\npython 키:값 키는 hashable = immutable 한값  변함없는 값이어야 함\nperl key는 문자열만 가능\nphp 키가 정수 혹은 문자열이 가능\njava map으로 불린다. 표준라이브러리에서 제공\n\n연상배열의 장점을 배열과 비교하여 서술하라.\n연상배열은 가독성과 작성력을 높인다. 원소들의 접근에 있어서 속도가 빠르다.\n하지만 모든 요소들을 하나씩 처리해야 하는 경우 배열이 효율적이다.\n```\n\n```\n레코드 타입 : 개개의 요소들이 이름으로 식별되고, 그 구조의 시작부터 오프셋을 통해\n접근되는 데이터 원소들의 집합\n\n개개의 원소들이 동일한 타입이나 크기가 아닌 데이터의 모임을 모델링할 때 빈번하게 사용\n\nC,C++,C#에서 레코드 타입은 struct 데이터 타입으로 지원\nc++, c#의 구조체는 캡슐구조체로서 사용\nJava, C#에서 레코드는 데이터 클래스로서 정의\n\n순서를 고려하지 않는다. 필드로 접근\n\n전역변수는 데이터영역에 20바이트로잡힘\n지역변수는 main이라는 스택에 만들어짐\n\n힙에 레코드를 만들려면\nStruct student *kim\nkim = (Struct Student*)malloc(sizeof(struct Student);\n(*kim).name = \"Kim DukBae\"; \u003c-초기화\n\nkim-\u003ename\n\n튜플은 배열과 유사하나 배열은 동질적인 요소들, 튜플은 이질적인 요소들로 이루어짐\n요소의 접근시 배열과 마찬가지로 첨자를 사용한다.\n\n리스트는 값의 변화가 가능하다.mutable하다\n튜플은 값의 변화가 불가능하다.immutable\n\nC#, Java에서는 List와 ArrayList를 제공\n리스트 요소들은 첨자에 의해서 참조\n\n튜플은 immutable하지만 리스트는 mutable함 변경가능하다.\n\n리스트의 요소를 del로 삭제 가능\n\n배열 int a[5] = {1, 2, 3, 4, 5}\n레코드 struct a[5] = {1, \"abc\", 3}\n튜플 a = (1, 2, 3,\"graph\")\n리스트 a = [1, 2, 3, \"graph\"]\n\nPython List Comprehension\n리스트 집합 표기법을 제공 [x for x for in range(1,101)] -\u003e 1, 2, 3, 4 ~ 101\n[2* x for x in range(1,101)] -\u003e 2, 4, 6 ,8 ~ 100\nset Comprehension { } 집합 기호도 가능\n\n구조체의 크기는 8바이트 단위로 잡는다 따로'따로\n\n인텔은 리틀엔디안 -\u003e 왼쪽에서부터 읽음\n네트워크 프로그래밍 =\u003e 빅엔디안 \n\n공용체 타입 공용체는 최고 큰 크기로 잡고 모든 요소가 그 크기를 사용한다.\n공용으로 사용한다. low-level 시스템 프로그래밍, 네트워크 프로그래밍에 공용체를 사용한다.\n그 이유는 high level과 다르게 시스템이 어떤 엔디안을 따르는지 고려해야 하기 때문이다.\nlow-level에 있는 것들에 있는 각각 다른 여러바이트를 관리하기에 공용체를 사용하는 것이 좋다.\n한 덩어리를 잡아놓고 전체를 가져올것인지 부분을 나눠서 부분을 가져올 것인지\n\nunion Edian {\n int i;\n char ch[4];\n short low;\n};\n\nch[0], ch[1], ch[2], ch[3] -\u003e 4바이트\nch[0] =\u003e 78\nch[1] =\u003e 56\nch[2] =\u003e 34\nch[3] =\u003e 12\nshort-\u003e2바이트 사용\n\nunion Endian value;\nvalue.i = 0x12345678;\nprintf(value.i) -\u003e 78 56 34 12\nprint(value.ch[0] -\u003e 78\nprint(value.short) -\u003e 5678\n\n\n들어갈 때 반대로 들어감 리틀엔디안 low level\n\n타입 검사를 하지 않는 공용체 C, C++ \nunion 키워드는 union 구조체를 명세하는 데 사용\n\n타입체킹을 하는 공용체 판별 공용체 -\u003e Ada, Algo, ML, Haskell\n\n공용체가 없음 안전상의 문제가 있을 수 있기 때문에 java, C#\n\n포인터의 참조 타입\n\n가상 메모리 프로그래머에게 메모리공간이 있다라고 부여해주는 공간\n실 메모리는 뒤에 있다. 1GB\n\n간접 주소지정 방식을 지원하기 위해\n동적 기억공간(힙 heap)을 관리하는 방식을 제공하기 위해\n\n힙-동적 변수\n힙공간에 동적으로 할당되는 변수\n식별자(이름)가 없음 -\u003e 무명 변수\n따라서 포인터를 이용하여 간접적으로 접근이 가능\n\n포인터는 동적 자료구조의 작성력을 향상시킴\n\n\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-won%2Fprogramming-linguistics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmr-won%2Fprogramming-linguistics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-won%2Fprogramming-linguistics/lists"}