클래스를 통해 모든 코드를 구조화하고 Java와 같은 클래스로 컴파일 할 때의 장단점


13

편집 : 내 언어는 Java와 달리 다중 상속을 허용합니다.

교육, 레크리에이션 및 잠재적으로 유용한 목적을 위해 자체 프로그래밍 언어를 디자인하고 개발하기 시작했습니다.

처음에는 Java를 기반으로하기로 결정했습니다.

이것은 모든 코드가 클래스 형식으로 작성되고 해당 코드가 VM에 의해로드되는 클래스로 컴파일됨을 의미합니다.

그러나 인터페이스 및 추상 클래스와 같은 기능은 필요하지 않기 때문에 제외했습니다. 그들은 패러다임을 강요하는 것처럼 보였고, 나는 내 언어가 그렇게하지 않기를 바랍니다. 클래스를 컴파일 단위로 유지하고 싶었습니다. 구현하는 것이 편리하고 친숙했기 때문에 아이디어를 좋아했습니다.

그런 다음 기본적으로 모듈을 사용하여 클래스를 "네임 스페이스"로 사용하여 static지시문을 사용하여 상수와 함수를 제공 하거나 인스턴스화해야하는 객체의 템플릿 (클래스의 "실제"목적)으로 사용할 수 있습니다. 다른 언어로).

이제 클래스를 컴파일 단위로 사용하는 것의 장점과 단점은 무엇입니까?

또한 내 디자인에 대한 일반적인 논평은 크게 감사하겠습니다. 내 언어에 대한 유익한 게시물은 http://www.yannbane.com/2012/12/kava.html 에서 찾을 수 있습니다 .


1
클래스에 클래스의 모든 식별자를 명확하게하는 네임 스페이스가 포함 된 경우 완전히 자체 포함 된 컴파일 단위가 있습니다. 다른 클래스에 대한 모든 종속성이 컴파일 또는 어셈블리의 컴파일 된 클래스에 대한 참조로 충족 될 수 있으면 해당 클래스를 성공적으로 컴파일 할 수 있습니다. 그러한 원자 성은 명백한 장점을 가져야한다.
Robert Harvey

참고 : 추상 클래스와 인터페이스를 제거하면 사람들이 하위 유형 지정 및 다형성에 상속을 사용 하도록 강요 합니다. 그것은 끔찍한 코드를 생성해야합니다. 또한 여러 상속을 추가하고 관련 문제를 처리하지 않으면 엄청나게 제한됩니다.

1
@delnan : 실제로 컴포지션을 사용하여 기능을 구축 할 수 있습니다.
Robert Harvey

2
@RobertHarvey 다중 상속이 없기 때문에 제한 사항에 대해 이야기하고 있다고 가정합니다. 예, 충분한 구성으로 에뮬레이션 할 수는 있지만 허용되는 것으로는 거의 생각하지 않습니다. 예를 들어, 일반적으로 두 개의 인터페이스를 구현하는 객체는 고유 한 기본 클래스의 서브 클래스에서 두 번 구현되어야합니다 (두 구현 모두 공통 클래스에 위임 할 수는 있지만 여전히 추가 코드가 필요하므로 쉽게 전환 할 수 없습니다) 하나의 인스턴스가 다른 하나의 인스턴스로).

@delnan : 하위 유형 지정 및 다형성에 상속을 사용하면 무엇이 문제입니까? 그것이 상속의 대상입니다 ...
Mason Wheeler

답변:


6

클래스를 컴파일 단위로 사용하면 어떤 이점이 있습니까?

언어의 복잡성을 줄일 수 있습니다. 다른 구조가 필요하지 않으며 모든 것이 동일하게 취급됩니다. 특정 디자인에서는 (당신이 아닌 것 같지만) 정적 및 디자인 문제 (초기화 순서 문제, 동시성 제한, 제네릭 / 유형 클래스의 어색함)가없는 이점이 있습니다. 또한 샌드 박싱 또는 병렬화를위한 격리 된 모듈 인스턴스와 같은 모듈 개념의 이점을 제공합니다. 의존성이 어떤 인터페이스에 맞고 모듈 전체 구현 가치가 인스턴스화되고 빠질 수있는 모듈 타이핑.

즉,이 개념은 그렇지 않은 것보다 더 많은 문제가있는 경향이 있습니다. 사실 '최상위'클래스는 기본 생성자를 갖는 것과 같은 특별한 규칙이 필요하기 때문에 모든 것을 동일하게 취급 할 수 없습니다 . 컴파일 단위의 모듈 성도 정말 어색한 경향이 있습니다. 수업은 수업 일 때 다른 사람을 어떻게 참조합니까? 이러한 종속성은 어떻게 처리되며 클래스 회전에 대한 올바른 순서를 어떻게 결정합니까? 앱의 다른 부분에서 중복 클래스 참조를 재사용하는지 어떻게 확인합니까 (또는 원하는 의미 론적 인 경우 중복 인스턴스를 어떻게 처리합니까)?

그것을 조사한 후 종속성, 범위 지정 및 초기화 문제와 관련된 많은 문제가 발생했습니다. 결국 '최상위 클래스'를 특별하게 만드는 문제가 발생하고 문제를 일으켜 간단한 네임 스페이스로 만들기 위해 많은 제한이 따릅니다.


나는 오직 하나의 최상위 클래스 인 Object. 나는 아마도 그것에 대해 특별한 행동이 필요하다는 것을 알고 있지만, 고립 된 경우라면 괜찮습니다. 나는 의존성 문제가 있다고 생각하지 않습니다. VM이 시작될 때로드되는 클래스 세트가 있으며 그 중 일부는 기본적으로 구현되어 있지만 (시스템 클래스) 모두 Object에서 상속됩니다. 모든 것이로드되면 KVM은로드하도록 지시 된 클래스를로드하고 종속성을 해결합니다. 그러나 나는 정적에 어떤 문제가 발생합니까?
jcora

@yannbane- object내 말 은 , 컴파일 유닛 외부에 반드시 공개되지 않는 내부 클래스가 아닌 모듈처럼 동작하는 클래스를 의미합니다. DLL 스타일 동작을 원한다면 '종속성을 계산하십시오'는 세부 사항에 거대한 호넷의 둥지로 바뀝니다. ymmv. 에 관해서는 정적 .
Telastyn

정적 모듈 / 변수를 사용하면 모듈과 같은 동작을 수행 할 수 있습니다. 인스턴스화 할 수있는 클래스를 만드는 대신 정적 멤버와 메서드 만있는 클래스를 만드는 것이 좋지 않습니까? 그 기사를 보았지만 상수 정적 멤버 나 정적 메소드 에는 적용되지 않는다고 생각합니다 . 예를 들어 Math클래스 를 만들 때 아무런 문제가 없습니다. 실제로 정적 메서드와라는 상수 정적 double 멤버가있는 모듈입니다 Pi.
jcora

@yannbane-아뇨. 모듈은 인스턴스화가 가능하기 때문에 모듈입니다. 그렇지 않으면 C ++ 스타일 네임 스페이스 만 있습니다. 최상위 클래스를 C ++ 스타일 네임 스페이스로 제한하면 더 이상 클래스가 아닙니다.
Telastyn

흠, 나는 여전히 괜찮고 클래스를 사용하여 모듈을 만드는 데 실제로 문제가 보이지 않습니다. 예, 모듈은 네임 스페이스, 특히 Python 모듈로 작동합니다.
jcora

4

이 질문에 대답하는 대신 한 단계 위로 올라가서 MIT OpenCourseWare , 특히 6.035 (컴퓨터 언어 공학)를 공부할 것을 제안합니다 . 이것은 전체 문제를 설명 할 것이므로 이와 같은 질문을 다시는하지 않아도됩니다.

컴퓨터 언어 공학

전제 조건은 Java뿐입니다.

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/

코스 설명

이 과정은 고급 프로그래밍 언어의 구현과 관련된 문제를 분석합니다. 기본 개념, 함수 및 컴파일러 구조, 이론과 실제의 상호 작용, 소프트웨어 구축 도구 사용 등의 주제를 다룹니다. 이 과정에는 컴파일러 디자인 및 구현에 관한 다 인간 프로젝트가 포함됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.