프로그래밍 언어는 컴퓨터를 상징하는 언어이자 인간과 컴퓨터 사이의 의사소통을 위한 언어이다. 새로운 프로그래밍 언어를 배울 때, 언어의 어떤 특성을 관찰해야 합니까? "SICP"라는 책의 저자는 세 가지 요점을 나열했습니다.
* 원시 요소. (기본 요소)
* 조합 수단. (조합 수단)
* 추상화 수단.
위의 세 가지 기능은 기본적으로 모든 프로그래밍 언어의 기능을 포괄하며, 언어 설계자가 처음부터 고려해야 할 사항이기도 합니다. 이 세 가지 사항에 대한 나의 이해: 기본 요소는 어휘 부분인 언어의 기본 기호(기본 데이터 유형, 키워드 등)를 나타냅니다. 조합의 수단은 기본 요소를 사용하여 조합하는 과정을 통해 대규모 프로그램을 구성하는 수단입니다. 추상화 수단은 추상화를 의미합니다. 추상화는 소프트웨어의 복잡성을 해결하고 소프트웨어의 가독성, 확장성, 재사용성 등을 향상시키는 중요한 수단입니다. 다음은 결합요소와 추상화 방식의 관점에서 언어의 특성을 비교한다. 프롤로그 언어는 완전히 패턴 매칭을 위한 논리적 언어입니다. 그의 사고는 수학의 기초가 "1 1 = 2"인 것처럼 세상의 모든 정리는 가장 간단한 정리에서 파생되며, 그래야만 "우주 중력", "상대성이론"의 법칙이 성립할 수 있다는 것입니다. 그리고 다른 법칙이 도출됩니다. C 언어부터 함수를 단위로 사용하여 프로그램의 추상화를 제공합니다. 이는 프로그램의 재사용성과 모듈성을 크게 향상시킵니다. 팀워크 코딩도 가능하게 만드세요.
객체 지향 프로그래밍: 기본적으로 컴퓨터의 세부 사항을 숨기는 개발자는 객체를 통해 특정 비즈니스를 추상화합니다. 하지만 엄밀히 말하면 자바도 명령형 언어의 범주에 속해 값으로 호출됩니다. 이에 비해 Python과 Ruby는 객체 지향적이며 함수형 프로그래밍 패러다임을 결합하고 자연어에 더 가깝습니다.
lisp로 대표되는 함수형 언어: 함수는 기본이자 유일한 추상화입니다. common-lisp도 매크로를 기반으로 한 일련의 객체 지향 프로그래밍 방법을 개발합니다. 나는 함수형 프로그래밍 개념을 선호합니다: 함수의 부작용 없음(특히 왜곡된 Haskell의 경우 스레드 안전성을 고려할 필요가 없음), 고차 함수, 클로저, 람다 등.
사람들은 종종 다음과 같이 말합니다. JavaScript는 약한 유형의 언어이고 Java 언어는 강력한 유형의 언어입니다. 타입 시스템 관점에서 프로그래밍 언어를 차별화하는 것도 흥미롭다. 일반적으로 약한 유형의 언어는 자연어에 더 가깝고 문법도 더 자유롭고 생생합니다. 요즘 언어의 추세도 약어형 방향으로 흘러가고 있습니다.
컴퓨터는 고도로 구조화되어 있으며 스택의 바이너리 비트 오류로 인해 오버플로, 버스 및 기타 오류가 발생합니다. 따라서 언어 수준의 자유는 컴파일러나 해석기의 이점을 얻습니다. 예를 들어 Java 및 C와 같은 언어에는 강력한 타이핑 드라이브 코더의 이점이 있어 문법 및 의미 오류가 거의 없는 코드를 작성할 수 있다는 점도 편리합니다. 대규모 기술 팀을 위한 협력.
약한 유형의 언어를 사용하면 자유를 얻을 수 있고(유형 정보가 필요하지 않음) 프로그래머가 더 적은 키보드 키를 입력할 수 있습니다. 자유에는 대가가 따릅니다. 유형 추론(유형 추론)은 컴파일러나 해석기에 내장되어 있습니다. (유형 추론은 명시적인 변수 유형, 연산자, 반환 값 및 컨텍스트의 기타 정보를 기반으로 정규화 방법을 사용합니다. 스택을 사용하고 점진적인 교체 과정을 통해 유형을 추론합니다.) 약한 유형은 쉽게 컴파일할 수 있지만(또는 컴파일할 필요 없이 해석하고 실행하는 경우) 유형 확인 프로세스도 있지만 이 프로세스가 지연됩니다. 런타임까지. 따라서 약한 유형의 언어는 그다지 구조화되지 않아 코딩 시 올바른 유형을 보장하기 어렵고 IDE 지원도 어렵습니다. 그러나 일부 분석기는 구문 및 의미 오류를 지속적으로 감지할 수 있으며 이는 강력한 형식의 언어의 IDE 효과를 얻는 것과 동일합니다. 최근에는 언어의 방향이 점차 컴퓨터 아키텍처에서 벗어나 자연어의 방향으로 진화하고 있습니다. 프로그래머는 예술가처럼 코드를 자유롭게 그릴 수 있습니다.
5. 컴파일/해석 Java 언어는 해석됩니까, 컴파일됩니까? Java 소스 코드 -> 클래스 바이트 코드의 절차적 javac 컴파일러 프로세스에서 말하기는 어렵습니다. 그러나 JVM에서 바이트 코드를 실행하는 과정은 해석되거나 컴파일될 수 있습니다. 해석된 유형과 컴파일된 유형은 모두 어휘 분석 -> 구문 분석 -> 컴파일러 백엔드 -> 컴파일 원칙의 프로세스를 따릅니다. 하지만 그들만의 장점도 있습니다:
인터프리터: 코드를 빠르게 로드합니다. 인터프리터는 런타임 컨텍스트와 같은 정보를 유지해야 합니다. 따라서 필요한 코드가 로드되고 조각이 해석되어 실행됩니다. 그러나 동일한 코드에 대해 컴파일 과정을 거치는 것이 중복되어 시간낭비가 발생하게 됩니다.
컴파일러: 빠른 실행. 더욱이 컴파일러 백엔드는 중간 코드를 최적화하기가 더 쉽습니다. 최적화 프로세스는 구조화된 프로세스이기 때문입니다. 전체 중간 코드를 순회하고 코드 전체를 최적화하며 운영 효율성을 향상시키는 것이 필요한 경우가 많습니다.
런타임: 일반적으로 해석된 언어는 실행 프로세스 중에 변수의 검색, 바인딩, 범위 등을 제공하기 위해 런타임 컨텍스트 정보를 메모리에 유지해야 합니다. 컴파일된 언어는 레지스터 스택 모델을 기반으로 코드를 실행합니다. 기본적으로 스택 구조에서 데이터 바인딩이 완료되어 실행 속도가 약간 빨라집니다.
Hotspot-jvm은 해석과 컴파일의 각각의 장점을 결합합니다. 먼저 실행 프로세스를 설명합니다. 메소드가 자주 실행되어 핫스팟에 도달하면 jvm은 컴파일 프로세스를 시작하고 하위 코드를 네이티브 코드로 컴파일합니다. 그런 다음 캐시하고 다음 호출에서 직접 실행합니다. hotspot-jvm은 레지스터 명령을 희생하면서 크로스 플랫폼 고려 사항을 기반으로 하는 스택 명령을 기반으로 바이트코드를 실행합니다(안드로이드 운영 체제 기반의 dalvik 가상 머신은 레지스터 명령을 기반으로 함). 따라서 언어 디자인은 종종 절충 과정입니다. 더 많은 "자유"를 얻을수록 "희생"도 커집니다.
6. 요약: 원래 라이프니츠의 질문을 해결하기 위해 Turing이 발명했습니다. 모든 컴퓨팅 작업을 해결하는 보편적인 모델이 있습니까? 폰 레이먼(Von Leyman)이 인간 뇌 뉴런의 사고 과정을 시뮬레이션하고 기억과 산술 장치를 기반으로 한 최초의 컴퓨터인 ENIAC을 생산하기 전까지는 무어의 법칙이 붕괴된 후에도 컴퓨터 하드웨어 기술은 크게 변하지 않았습니다. 여러 수준의 캐시, 멀티 코어 및 멀티 CPU 기술을 사용하여 점점 더 큰 규모의 컴퓨팅 작업을 지원합니다. 이 과정에서 사람들이 논리학, 기호학, 알고리즘을 계속 공부하면서 컴퓨터와 상호작용하는 데 사용되는 언어는 점점 더 추상화되고 풍부해지고 있습니다. 우리는 이 이미지 기호를 사용하여 시간과 공간을 추상화하고, 이 이미지 기호를 사용하여 소프트웨어의 복잡성을 해결하며, 이 이미지 기호를 사용하여 우리의 생각을 컴퓨터에 전달합니다. 첨부파일 및 텍스트 업로드 제한으로 인해 일부 사진과 텍스트가 표시되지 않을 수 있습니다. 자세한 내용은 http://mp.weixin.qq.com/s?__biz=MzI5ODI3NzY2MA==&mid=100000725&idx를 참조하세요. =2&sn=fde9b2af17a00679c89f3f6fc8be64c8#rd 모든 분들과의 소통을 환영합니다.
아래 QR코드를 스캔하시면 더 많은 아름다운 기사를 만나보실 수 있습니다! (예상치 못한 놀라움을 보려면 QR 코드를 스캔하세요!!)
|