언어 설계자들이주의를 기울이기를 바라는 것은 무엇입니까? [닫은]


38

이 질문의 목적은 당신이 살 수 없거나 원하는 언어로 원하는 프로그래밍 언어 기능의 세탁 목록을 구성하는 것이 아닙니다. 이 질문의 목적은 대부분의 언어 디자이너가 생각하지 못하는 언어 디자인의 구석을 밝히는 것입니다. 따라서 언어 기능 X에 대해 생각하는 대신 좀 더 철학적으로 생각하십시오.

저의 편견 중 하나는 아마도 논란의 여지가있을 수 있습니다. 엔지니어링의 부드러움 측면 (이유 및 그 이유)이보다 구체적인 측면보다 몇 배 더 중요하다는 것입니다. 예를 들어, Ruby는 개발자의 행복을 향상시키기위한 목표로 설계되었습니다. 당신의 의견이 그것이 전달되었는지의 여부에 따라 혼동 될 수 있지만, 목표라는 사실은 언어 디자인의 일부 선택이 그 철학에 영향을 받았다는 것을 의미합니다.

게시하지 마십시오 :

  • 구문 화염 전쟁. 우리가 선호하고 언어 디자인과 관련하여 구문이 중요합니다. 나는 단지 emacs vs. VI의 성격에 대한 서사시 싸움을 피하고 싶습니다 (요즘 많은 사람들이 알지 못합니다).
  • "특징 X가없는 언어는 존재하지 않아도됩니다."유형 설명. 모든 프로그래밍 언어가 존재해야하는 이유는 하나 이상입니다.

제발 게시물 :

  • 언어 디자이너가 놓친 철학적 아이디어.
  • 자주 구현되지 않은 기술 개념. 통증의 원인과 기능을 선호하는 방법에 대한 아이디어가 있다면 알려주십시오.
  • 원하는 것은 플랫폼의 공통 라이브러리에 있지만 거의 없습니다. 같은 토큰 중 하나는 일반적으로 원하는 공통 라이브러리에있는 것이 아닙니다.
  • 내장 된 테스트 / 어설 션 / 계약 / 오류 처리와 같은 개념적 기능은 모든 프로그래밍 언어가 올바르게 구현되고 올바르게 정의되기를 원합니다.

나는 이것이 재미 있고 자극적 인 주제가되기를 희망한다.

편집 : Syntax Flame Wars의 의미를 명확히했습니다. 구문은 프로그램 언어 디자인의 기본 부분이기 때문에 구문에 대한 모든 논의를 피하려고하지 않습니다.


구문이 구현 세부 사항이라고 말하는 것은 명백한 잘못입니다. 구문 디자인은 언어 디자인에서 기본적으로 중요한 부분입니다. 그리고 포인트의 많은 당신은 않습니다 실제로 구문을 포함 할 수있다 게시보고 싶어요. 동정. 흥미로운 질문처럼 보였습니다.
Konrad Rudolph

내가 피하고 싶은 것은 화염 전쟁입니다. 화염 전쟁을 시작하지 않고 구문에 대해 토론 할 수 있다면 계속하십시오.
Berin Loritsch

답변:


49

기본적으로 유니 코드 지원

오늘날, 프로그램은 국제적으로 사용되거나 국제적으로 사용될 수 있다는 가정하에 개발되고 있습니다. 그들은 있어야 자신의 문자 집합에 대한 지원을 제공하거나 쓸모 해당 언어로 작성된 프로그램을 렌더링합니다.


2
+1 실제로 언어 자체는 식별자에 문자를 사용할 수 있도록해야합니다. 우리는 모두 영어가 아닙니다.
Berin Loritsch

13
@Berin : 사실, 비록 프랑스어이지만 영어 프로그램을 선호합니다. 문제는 의사 소통 중 ​​하나입니다. 헝가리어, 스페인어 또는 포르투갈어 식별자로 프로그램을 작성하는 경우, 국제화의 맥락에서 개발자가 스스로 의사 소통 할 수있는 것이 매우 중요합니다. 이는 식별자, 주석 및 문서에 공통 언어를 사용함을 의미합니다. 영어는 개발자의 언어입니다.
Matthieu M.

11
나는 언어를 사용할 때 유니 코드 지원이 자연 스러워야한다고 덧붙였다. 가능하면 "추가"하기 위해 추가 노력을 기울이지 말고 "적절하게 작동"해야합니다.
RHSeeger

4
이와 관련하여 언어는 텍스트 (문자 순서)와 이진 (바이트 순서) 데이터를 근본적으로 구분해야합니다. C #은 stringand로 이것을 올바르게 얻습니다 byte[]. 파이썬 3.x와 strand도 마찬가지입니다 bytes. C (++) char는이 끔찍한 잘못을 얻습니다.
dan04

1
@RHSeeger-참으로 !!! 파이썬에서도을 입력해야합니다 u'My Unicode Štring'. 다루는 문자열 유형을 잊어 버리고 코드를 작성하는 것이 좋습니다.
orokusaki

25

나는 부부가있다 :

  • 제네릭 / 템플릿 예를 들어, Java 제네릭은 강력하지만 반드시 유연한 것은 아닙니다. 또한 유형 삭제를 사용하기 때문에 특히 인터페이스에서 추상적으로 구현하는 데 문제가 있음을 알았습니다. 그리고 비특이적 제네릭이 사용될 때 컴파일러는 경고하지 않아야합니다 ( Hashmap대신 Hashmap<String, int>). 나는 그들이 크게 향상 될 수 있다고 생각합니다. 훌륭한 템플릿은 매우 유용하지만 종종 무시됩니다.

  • 표준 라이브러리에서 좋은 날짜 지원. 나는 날짜, 시간 및 분을 더하고 뺄 수 있으며 1970 년 1 월 1 일 이후 밀리 초를 처리 할 필요가 없다는 것을 의미합니다.


2
"좋은 데이트 지원"은 꽤 가파른 요구 사항입니다! 그게 무슨 뜻입니까? 나는 날짜와 시간이 당신이 그것을 잘 얻을 수없는 것들 중 하나라고 생각합니다. 간단하고 틀리게 만들거나 옳고 불경건하게 복잡하게 만듭니다. 좋은 중간 지점을 치는 것은 정말 어렵습니다.
sara

@kai 요점은 날짜 지원이 대개 끔찍하다는 것입니다. 오래된 것에 java.util.Date는 거의 모든 가능한 문제와 문제가 있습니다. 새 java.time.*패키지 의 일부만 알고 있지만 깨끗하고 사용하기 쉬우 며 AFAICT 버그가 없습니다. 고급 사용자 일수록 문제가 발생할 수 있지만 크게 개선되었습니다. +++ 문제는 복잡한 문제이고 첫 번째 버전은 서두르고 깨져있는 것 같습니다.
maaartinus

24

컴퓨터 보안 담당자를 위해 언어를 분석 / 감사 할 수있게하십시오.

보안 담당자는 프로그램이 출시되기 전에 프로그램에서 취약점을 찾을 수 있어야합니다. 이상적으로, 우리는 초기에 부름을 받았으며 코드베이스가 개발 될 때 주석을 달 수 있지만 종종 그렇지 않습니다.

언어 나 핵심 라이브러리의 새 버전이 나오면 이전에 안전한 것들이 더 이상 없을 수 있습니다.

  1. 라이브러리가 더 강력해질 수 있습니다. 예 : 이제 URL 라이브러리가 지원합니다 javascript:
  2. 문자열이나 바이트를 코드로 변환하는 새로운 방법이있을 수 있습니다 : 예 eval또는 직렬화 해제 라이브러리
  3. 언어 반영 기술이 더욱 강력해질 수 있습니다. 예 : 지역 변수 노출

이러한 변경 사항으로 인해 프로그램이 가용 한 권한의 양을 늘릴 수 있지만 프로그램이 사용하는 권한 (악의적이지 않은 클라이언트를 처리 할 때)의 권한이 변경되지 않았기 때문에 보안 담당자는 집중적으로이를 파악하기가 쉽지 않습니다. 재 감사.

따라서 언어를 디자인하고 버전을 지정할 때 우리를 생각하십시오. 다음은 몇 가지 팁입니다.

프로그램을 분해 할 수있는 몇 가지 기본 요소를 정의하십시오.

HTML5는 특히 이런 식으로 나쁩니다. 그들은 분명히 보안에 대해 많은 생각을하고 똑똑한 사람들을 가지고 있지만, <video>오래된 것과 같은 새로운 프로그램 요소를 지정 하거나 새로운 <video>것과 오래된 것을 <img>모두 지정할 수 있는 공통 추상화를 만드는 대신에 <video>아직 자체 보안 결과가있는 또 다른 일회성 프로그램 요소.

정적으로 입력하지 않아도 언어를 정적 분석에 사용할 수있게하십시오.

보안 담당자는 정적 분석을 사용하여 패턴을 찾고 프로그램의 일부를 배제하여 실제로 까다로운 비트에 집중할 수 있습니다.

어떤 식별자가 지역 변수이고 어떤 식별자가 아닌지는 분명해야합니다.

예를 들어, 구 버전의 JavaScript와 같은 실수를 저 지르지 마십시오 x. 이전 버전의 스펙을 문자 그대로 읽었을 때 아래의 지역 변수 참조 인지 여부를 알 수 없었습니다 .

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

분해 가능한 보안 허용

많은 보안 시스템은 보안 속성을 유지하는 보안 커널을 중심으로 설계되므로 보안 담당자는 적은 양의 코드를 분석하고 대부분의 프로그래머가 {성가신, 교육자, 편집증} 보안 담당자를 처리하지 않아도되도록 노력할 수 있습니다. .

귀하의 언어로 그러한 커널을 작성할 수 있어야합니다. 언어의 보안 속성 중 하나가 URL의 특정 하위 집합 만 가져 오게된다면 커널 작성자가 코드를 통해 모든 URL 가져 오기를 수행 할 수 있습니까? 또는 정적 빌드 확인 (예 : 가져 오기 확인)이 동일한 기능을 수행 할 수 있습니다.

Newspeak와 같은 일부 언어는 개체 기능 모델을 사용합니다. 그것은 분해 가능한 보안을 얻는 굉장하고 좋은 방법입니다.

그러나 그렇게 할 수 없다면 모듈 그래프를 정적으로 분석 가능한 아티팩트로 만들면 상당한 이점을 얻을 수 있습니다. 모듈이 TCB의 모듈에서 코드를 호출하는 것을 제외하고 파일 I / O 모듈에 도달 할 수 없음을 증명할 수 있으면 해당 모듈에서 모든 클래스의 문제를 배제 할 수 있습니다.

임베디드 스크립팅 언어의 권한 제한

많은 유용한 시스템은 동적 (심지어 기능적인) 언어로 작성된 많은 코드를 시작하는 정적 코어로 구성됩니다.

또한 스크립팅 언어를 포함하면 시스템을 훨씬 확장 할 수 있습니다.

그러나 스크립팅 언어에는 VM의 모든 권한이 없어야합니다.

내장 된 스크립팅 언어를 허용하도록 선택하면 호출자가 수행 할 수있는 작업을 쉽게 제한 할 수 있습니다. 객체 기능 모델 (위의 Newspeak에 대한 의견 참조)이 여기에 매우 적합합니다. 따라서 스크립팅 언어로 코드를 평가할 때 호출자는 실행할 코드와 해당 코드의 모든 전역 변수를 전달해야합니다.

eval자체를 스크립팅 언어로 포함하는 언어로 취급

언어에서 자체 컴파일러를 호출하여 문자열을 코드로 변환 할 수있는 경우 내장 된 스크립팅 언어와 같은 방식으로 샌드 박스를 만들 수 있습니다.

간단한 동시성 모델을 사용하십시오.

보안 담당자는 보안 속성이 유지되는지 파악하려고 할 때 경쟁 조건에 대해 걱정할 필요가 없습니다.

거의 불가능한 보안 기본 옵션으로 스레드를 설정하기 전에 스레딩의 대안을 고려하십시오.

간단한 하나는 E, Verilog 및 JavaScript에서 볼 수있는 것과 같은 이벤트 루프 동시성입니다.

인용 혼동을 장려하지 마십시오

일부 언어는 풀 언어이며 많은 다른 언어로 된 문자열을 처리합니다.

예를 들어, JavaScript는 종종 문자열을 HTML, CSS, XML, JSON 및 JavaScript로 구성합니다. 프로그래머가 일반 텍스트 문자열을 조합하여 다른 언어로 문자열을 만들 때 올바르게 인코딩하는 것을 기억하기는 매우 어렵 기 때문에 JS 프로그램은 의심 할 여지없이 모든 종류의 인용 혼동 문제가 있습니다 .XSS가 최악입니다.

문자열 구성 기능 을 포함 하려면 프로그래머의 보안 부담을 줄이십시오. DSL, 위생적 매크로 및 임베디드 템플릿 언어는 라이브러리 나 언어 개발자로의 이탈에 대한 부담을 최종 개발자로부터 멀어지게함으로써이 작업을 수행하는 좋은 방법이 될 수 있습니다.


아름다운 고장.
Qix

23

최고의 언어 중 일부는 스스로 언어를 만들고자하는 사람들이 설계했습니다.

따라서 언어 디자이너는 사용자에게 덜주의를 기울여야한다고 생각합니다. 당신은 모두를 기쁘게 할 수 없으며 시도하지 않아야합니다.


4
그것은 어느 정도 사실 일 수 있습니다. 그러나 사용자의 말을 듣지 않으면 뇌를 사용하려고 할 때 사용자가 겪는 고통을 알 수 없습니다. 그 고통을 듣거나 느끼지 않으면 그 문제와 다른 사람들을 해결하는 다음 위대한 아이디어를 결코 내놓지 않을 것입니다. 아무도 섬에 없다. 고통은 inovation에 큰 동기가 될 수 있습니다.
Berin Loritsch

5
@Berin : 나는 점은 당신이해야한다고 생각하지 않는다 결코 사용자에게들을 수 없지만, 그것은 할 수 있도록 설계되지 않았 음을 어떤 언어를 사용하고자하는 사용자들에게 듣지 않습니다. 특정 세트 또는 문제점을 해결하기 위해 언어를 설계 한 경우 해당 문제점을 해결해야하는 사용자에게도 서비스를 제공해야합니다. 그러나 극단적 인 문제를 해결하고 때로는 언어가 새로운 도메인에서 틈새를 찾을 수 있으므로 +1이됩니다.
Jeremy Heiler

2
@Jeremy, 그렇습니다. 그것이 바로 내가 말하는 것입니다. 그러나 언어가 의도하지 않은 도메인에서 언어가 잘 작동하는 것은 드문 일이라고 생각합니다.
dan_waterworth

@dan_waterworth : 성공적인 언어는 대개 의도하지 않은 영역에서 잘 작동합니다.
David Thornley

8
"사용자의 말을 듣지 마십시오"대신, "없는 사용자의 말을 듣지 마십시오"라고 조언하는 것이 좋습니다.
chrisaycock

16

실제로 코드를 작성하는 데 5-10 %의 시간 만 소요됩니다. 언어 설계자들은 실제로 소프트웨어를 만드는 어려움에주의를 기울여야합니다. 이는 오류와 버그를 수정하는 것을 의미합니다.

즉, 좋은 디버거가 있어야합니다. 엄청나게 많은 구문과 약간의 인쇄 명령문보다 더 나은 핵심 명령이있는 일부 도구는 아닙니다.


2
+1. 디버깅은 일부 언어가 다른 언어보다 나은 곳 중 하나이며, 일부 IDE는 사용 가능한 언어와 사용자의 언어에 차이가 있습니다.
Berin Loritsch

2
이것에 약간을 추가하고 가능한 경우 유용한 스택 추적을 말하겠습니다. 오류가 있거나 언어에 따라 예외가 발생하지 않으면 사용 된 인수 값과 함께 전체 호출 스택을 볼 수 있기를 원합니다. Tcl은이 작업을 매우 잘 수행합니다. 그러나 공정하게 말하면 모든 것이 Tcl의 문자열이므로 모든 값을 비교적 쉽게 인쇄 할 수 있습니다.
RHSeeger

1
디버깅뿐만 아니라 버그 작성이 어렵습니다. Java가 배열에 자동 경계 검사를 도입했을 때 매우 기뻤습니다. 그러나 15 년이 지난 지금도 여전히 다른 언어로 실수를하고 있습니다.
Alex Feinman

3
컴파일 타임에 버그를 찾는 언어를 사용하는 것이 좋지 않습니까? 예를 들어 Ada를 사용할 때 디버거에서 C 또는 C ++을 사용할 때 시간이 크게 줄어 듭니다.
Martin

12

필자는 다른 언어보다 더 많은 일을하는 Python에주의를 기울여야한다고 생각합니다 (그리고 일부 기능을 싫어하더라도). 그렇다고해서 파이썬을 에뮬레이트해야한다는 의미는 아니지만 파이썬과 같은 언어를 만들고 싶지 않더라도 파이썬이 무엇을 올바르게했는지 아는 것이 중요합니다.

거기에 관련된 철학적 아이디어와 관련하여, 이들은 Zen of Python에서 가장 중요한 아이디어입니다.

  • 암시적인 것보다 명시적인 것이 좋습니다.
  • 가독성이 중요합니다.
  • 특별한 경우는 규칙을 어길만큼 특별하지 않습니다.
  • 실용성은 순도를 능가하지만.
  • 그것을하는 명백한 방법이 있어야합니다.
  • 구현이 설명하기 어렵다면 나쁜 생각입니다.
  • 네임 스페이스는 훌륭한 아이디어 중 하나입니다. 더 많은 것을 해보자!

나는이 규칙을 따르는 언어가 반드시 괜찮을 것이라고 생각하지만, 나는 이것을하는 언어와 파이썬을 알고 있습니다. 루비와 같은 모든 유사점에서 루비는 가독성과 같은 것들을 놓치고 재미 있지만 전문적인 환경에서는 유용하지 않은 코드 골프를하도록 초대합니다.

내가 파이썬에서 놓친 유일한 기술적 특징은 "언제까지"문장이다 (처음에는 표현식을 테스트하지는 않는다). 그렇다면 파이썬과 다른 언어 표준 라이브러리에는 개선 될 수있는 많은 것들이 있지만 엄격하게 언어 가 아니기 때문에 다른 질문입니다. :-)


4
특히 언어 디자인 수준에서 두 가지 중요한 사항이 더 있다고 생각합니다. "특별 사례는 규칙을 어길 정도로 특별하지 않습니다." "실용성이 순결을 능가하기는하지만"과 함께 천개의 특수한 경우 나 비전 규칙을 가진 언어는 사용하기 어렵 기 때문입니다. 그렇지 않으면 당신은 타르타르 타르타르의 영역으로 표류하기 때문입니다.

15
명시 적이 암시 적보다 낫다면 왜 변수를 선언 할 필요가 없습니까? 간단한 오타가 디버깅하기 어려운 오류 (컴파일 타임에 잡히는 오류 또는 명백하고 디버깅하기 쉬운 런타임 오류와 반대)를 유발할 경우 이는 언어 IMO에 대한 주요 타격입니다.
메이슨 휠러

4
@Mason Wheeler : 다른 언어로 변수를 선언해야하는 유일한 이유는 변수의 유형을 선언해야하기 때문입니다. 파이썬은 동적이므로 타입 선언이 필요하지 않으므로 선언이 필요하지 않습니다. 나는 그것이 암묵적 / 명시 적과 어떤 관련이 있는지 보지 못했습니다. 파이썬의 유형은 명시 적입니다. 변수도 마찬가지입니다. 10 년이 지난 후에도 오타가 디버그 오류를 일으키지 않습니다. 사실, 그것들은 디버그하기가 쉽지 않습니다.
Lennart Regebro

8
목록에 +1, 팬보이에 -1 상당한 성공을 거둔 모든 언어에 주의를 기울이고 이러한 요소의 적용 가능성을 통합하거나 적어도 분석하려고 시도하는 것이 더 실용적인 접근 방식처럼 보입니다.
Steven Evers

3
@Lennart : 함수 유형을 명시 적으로 명시 할 수는 있지만 필수는 아니지만 규칙 4를 참조하는 것이 좋습니다. 계약에 의한 설계와 유사합니다. 그것이 내가 만들고 싶은 요점입니다.
Theo Belaire

11

귀하의 요구에 맞게 언어를 수정하는 능력은 저에게 큰 것입니다. Lisp의 경우 매크로로 수행되며 Tcl은 상위 수준으로 수행됩니다. 루비는 람다 등을 사용합니다. 사용 가능한 제어 구조를 중심으로 문제를 해결하는 대신 문제에 맞는 새로운 제어 구조를 추가하는 기능 만 원합니다. 간단한 예로, 일부 언어에서는 존재하지만 다른 언어에서는 존재하지 않는 "do .. until"구문은 "while"보다 일부 경우를 처리하는 더 확실한 방법이며, 다른 경우를 충족시키기 위해 새 구조를 추가 할 수있는 것이 매우 유용합니다.

좀 더 일반적인 의미에서 이것은 메타 프로그래밍입니다. 그러나 나는 주로 새로운 제어 구조를 구축하기 위해 사용합니다.


흥미 롭군 올바른 메타 프로그래밍 지원은 제대로하기 어려울 수 있지만 필요할 때 매우 강력합니다. 나는 Lisp을 좋아하는 사람들로부터 Lisp의 구현이 최고라고 들었지만 Lisp의 모든 것에 대해 말합니다. 메타 프로그래밍이 올바르게 수행되었다고 생각하는 예가 있습니까?
Berin Loritsch

"올바른 메타 프로그래밍"은 올바른 일을하는 것이 간단하고 (합리적이고 간단한 활동을 위해) 최종 결과가 언어의 자연스러운 부분 인 것처럼 느껴 져야합니다.
Donal Fellows

1
수정 가능할뿐만 아니라 해독 가능한 수정. 당신이 언어로 무언가를 다시 옮겼다면 독자로서 나는 그것을 빨리 알아낼 수있을 것입니다. 주석 또는 기타 외부 마커가 도움이 될 수 있습니다.
Alex Feinman

Mata-Lua 또는 Template Haskell이 이것을 제공하는 데 훌륭한 역할을한다고 생각합니다. (Scheme 매크로만큼 좋지는 않지만 언어에서 더 많은 양을 사용하는 것에 대해 지불하는 금액입니다)
Theo Belaire

10

가장 중요한 것은 언어에 "스타일"이 있어야한다는 것입니다. 예를 들어, C를 포인터 기반 시스템 프로그래밍 언어라고 부릅니다. Erlang을 동시 기능 함수 프로그래밍 언어라고 부릅니다. C ++ 및 Java와 같은 일부 다른 언어는 Allan Kay가 "응집"언어라고 부르는 언어입니다. Frankenstein 언어는 여러 가지 기능으로 구성되어 있습니다.

다음으로 가장 중요한 것은 언어 자체의 변경이 최후의 수단이어야한다는 것입니다. 언어의 다른 기능과 결합하면 가장 양성적인 소리조차 복잡해질 수 있습니다. 언어로 새로운 기능을 사용하려면 다음을 수행해야합니다.

  1. 그것이 정말로 필요하다는 것을 증명하십시오.
  2. 라이브러리에서 수행 할 수 없음을 증명하십시오.
  3. 언어에 속한다는 것을 증명하십시오.

2
다시 말해, 언어는 하나의 중요한 디자인 원칙을 가져야하며 언어는 그 원칙과 일치해야합니다. 언어 진화에 대한 의견이 필요하다 (이것은 몇 번이나 봤다).
Berin Loritsch

1
내가 좋아하는 C ++ 인용문을 생각 나게한다 . 개에 여분의 다리를 박아 만든 문어.
ocodo

4
라이브러리에서 수행 할 수 없음을 증명하십시오 . +1
Qix

2
나는 도서관 tidbit를 좋아한다. haskell과 같은 언어에 루프, 예외 또는 연속과 같은 내장 된 제어 흐름 항목이없는 방법이 멋집니다. 그들은 언어 내에서 정의하기가 정말 간단합니다. 구문을 실제로 깨끗하게 유지하고 많은 영리한 언어 기능을 만드는 것보다 확장 성과 조합 성을 향상시킵니다.
sara

10

좋은 질문 감사합니다. 당신은 꽤 좋은 답변을 얻고 있습니다.

당신의 눈을 gla 지 말고 프로그래머를 정보 채널로 봅니다. 아이디어 / 개념 / 요구 사항은 한 쪽 끝에, 코드는 다른쪽에 나옵니다.

요구 사항 세트 (어떻게 설명되어 있든 상관 없음)와 막대한 화이트 보드에서 코드 세트를 가져 와서 각 요구 사항을이를 구현하는 코드에 매핑하는 선을 그리는 경우 해당 그래프의 복잡도는 코드의 정도에 따라 달라집니다 요구 사항을 표현합니다. 이상적으로는 매우 직접적이고 일대일이어야하지만 실제로는 어려워합니다.

언어의 도메인 별 특성을 해당 그래프를 단순화하는 정도로 측정합니다. 이는 매우 바람직한 속성이며 올바른 클래스 / 루틴 (명사 / 동사) 정의에서부터 매크로, 자체 파서 및 인터프리터 / 컴파일러 작성에 이르기까지 다양한 방식으로 접근 할 수 있습니다.

내가 무슨 뜻인지 예를 들어 보겠습니다. 융통성있는 대화 사용자 인터페이스를 만드는 데있어이 기술 은 이벤트 처리기, 데이터 이동, UI에서 일반적으로 수행되는 대부분의 작업을 작성할 필요가 없습니다. 또한 소스 코드가 약 10 배 정도 줄어 듭니다. 메타 언어는 실제로 C / C ++ / Lisp의 몇 가지 루틴 및 매크로이며 매크로가없는 언어로도 수행했습니다.

코드에 대한 5 포인트 편집 또는 10으로 요구 사항을 구현할 수있는 경우 5를 사용하여 코드를 작성하면 코드가 줄어들뿐만 아니라 단계를 놓치고 버그가 발생할 가능성이 줄어 듭니다. 따라서 도메인 고유의 언어가 많을수록 코드가 더 작고 유지 관리가 쉽고 버그가 없습니다. 우리는 그것을 향해 나아가는 방법을 알아야한다고 생각합니다. 독자가 기술을 이해하기 위해 학습 곡선에 투자 하지 않는 한 코드를 더 읽기 쉽다는 의미 는 아닙니다 .


9

Pascal 및 Ada와 같이 경계가 분명하고 정수가 큰 정수 유형. 솔직히 : 얼마나 자주 정수의 전체 범위가 필요합니까? 실제 세계를 더 잘 표현하기 위해 기본 유형이 많이 개선되어야한다고 생각합니다.


2
경계 정수 유형 ala C, C ++, D, Java, C # 등은 확실한 위치를 갖습니다. 일부 프로그래밍 유형은 상관하지 않으며 정수와 부동 소수점의 구별 만 필요합니다. 그럼에도 불구하고 아마도 숫자 유형이 필요하고 나중에 숫자의 정수 부분에 대해 걱정할까요? 즉, 비즈니스 프로그래밍은 숫자가 정수라는 사실보다 특정 정수 유형에 덜 민감합니다. 낮은 수준에서 프로토콜을 구현할 때 규칙이 크게 변경됩니다.
Berin Loritsch

2
type Date_Of_Month is 1 .. 31;16 또는 32 비트와 같은 결정을 옵티 마이저에게 말하고 맡길 수있는 Ada와 같은 유형의 위치에 대해 생각했습니다 . 그러나 더 중요한 것은 유형 변수에 32 또는 0 또는 -5를 할당하면 RANGE_ERROR.
Martin

범위가 같은 것들을 잘 작동 Date_Of_Month(또는 Month_Of_Year) 명백한 사용에 범위, 그러나 많은있을 경우 - 아마 대부분의 - 경우가 퍼지입니다. type Persons_Age is 0..120? 누군가 장수 기록을 어기면 어떻게됩니까? type Year is 0..9999? 이집트 학자라면 어떨까요?
dan04

당신이 이집트 학자라면, 당신은 명백히 필요합니다 type Egyptian_Year is -9999 .. 300;. 내 경험에 따르면 대부분 정수에 대한 유용한 경계를 찾을 수 있습니다. 이와 관련 type Scrolls_Found is array Egyptian_Year of Natural;하여 제한없는 유형을 배열 인덱스로 가질 수는 / 안해서는 안됩니다. 해커에 대한 공격 경로 일뿐입니다. BTW : Ada를 사용하면 런타임에 범위 범위를 계산할 수 있습니다.
Martin

1
@kai nobody는 유형 시스템의 이러한 특정 기능을 예외없이 모든 곳에서 사용해야 한다고 말했다 . 나는 Ada가 "정규"숫자 유형을 사용할 수 있도록 확신합니다. 그리고 제한된 숫자 유형은 일부 (일반적인) 문제에 확실히 유용합니다 .
Sarge Borsch

8

프로그래밍 언어를 배우면 쉽게 사용할 수있는 기능과 사용하기 쉽게 배울 수있는 기능이 있습니다. 언어 사용자는 언어와 장기적인 관계를 유지하는 것이 이상적이므로 사용 편의성을 최적화하는 것이 학습 편의성을 최적화하는 것보다 낫습니다. 필요한 것보다 더 어렵게 만들지 말고 언어에 익숙하지 않은 사람들이 읽을 수 있도록 표현력 (많은 일을하는 작은 코드를 작성할 수 있음)을 희생하지 마십시오. 다른 한편으로, 언어는 수년간 언어를 사용해온 사람들에게 라인 노이즈처럼 읽혀서는 안됩니다. 사용하기 쉽고 배우기 쉽지 않습니다.


8

명명 규칙 (PHP를보고 있습니다)


그러나 언어 디자인 문제는 적습니다. 물론, 표준 라이브러리에 들어간 내용을 항상 주시해야하지만 언어 디자이너는 명명 규칙을 적용 할 수 없습니다.)

3
표준 라이브러리를 사용할 수 있습니다.
Malfist

3
PHP도 언급하지 마십시오. 주변에서 가장 많이 사용되는 언어입니다. 컴퓨터 과학자가 디자인하지 않고 템플릿을 원했던 사람과 스테로이드가 추가되었습니다.
Keyo

@delnan : Mercury 또는 Eiffel과 같은 일부 언어는 명명 규칙 (모든 대문자 클래스 이름, 대문자로 시작하는 변수 등)을 적용하며 컴파일러에 의해 적용됩니다. 포트란은 i, j, k로 시작하는 변수는 정수 (따라서 대부분의 언어에서 루프 변수로 사용되는 전통)라고 말했다. 등등. 컨벤션이 마음에 들지 않으면 적어도 성가 시지만 최소한 소스 코드의 일관성에는 좋습니다.
PhiLho

@PhiLho : 매우 제한적입니다. 일관되고 의미있는 (인간 독자에게) 대문자 사용 또는 밑줄 사용을 강요 할 수는 없습니다 (프로세스에서 프로그래머의 정신 건강을 시도 할 수는 있지만 위험 할 수 있습니다).

7

개발 환경과의 일류 통합.

오늘날에는 코딩이 풍부한 환경에서 수행됩니다. HTML / CSS / JS에는 Firebug 및 기타 대화식 도구가 있습니다. Java, Eclipse 및 IDEA 및 기타 실제 IDE의 경우. 기타 등등. 편집기부터 시작하지만 끝나지 않는 도구의 생태가 있습니다.

  • 파일 내 및 파일 간 코드 구성
  • 스마트 한 하이라이트
  • 스마트 완성 / 예측 타이핑
  • 정적 디버깅 (플래 깅 구문, 의미 및 스타일 오류)
  • 템플릿 및 매크로 생성 및 사용
  • 버전 관리 (버전 관리, 병합, 분기 등)
  • 여러 저자 (의견, 인라인 문서, 주석 등)를 사용한 분산 개발
  • 런타임 디버깅 (스택 추적, 스테핑, 감시 등)
  • 대화 형 "실시간"디버깅 (Firebug와 같은-실시간 시스템의 동작 편집)
  • ... 다음에 무엇을해야할지 모르겠습니다.

이러한 활동을 지원하기 위해 언어를 구축해야합니다. 예를 들어 다른 개발자가 코드의 의도를 이해하도록 돕기 위해 Java로 주석을 달았습니다.

그러나 대부분 CVS 제어 소스가 버전 번호를 포함 할 수 있도록 주석에 $ Id $를 사용하는 것과 같이 해킹당했습니다. 언어 자체에서 이와 같은 작업을 수행 할 수없는 이유는 무엇입니까?


ASIS (ISO / IEC 15291 : 1999“Ada Semantics Interface Specification”)와 같은 의미입니까? ASIS는 여러분이 원하는 모든 것을 다루지는 않지만 상당히 많이 다룹니다. 나는 종종 다른 프로그래밍 언어를 위해 ASIS와 같은 것을 원했습니다. 자세한 내용은 sigada.org/wg/asiswg 를 참조하십시오.
Martin

이러한 것들 중 일부는 코드 구성, 구문 강조, 코드 폴딩, 버전 제어, 템플릿 / 매크로와 같이 상대적으로 저렴하거나 IDE에서 무료로 제공됩니다. 런타임 디버깅, 정적 디버깅, 스마트 완성 / 예측 타이핑, 리팩토링 등 많은 노력이 필요한 경우도 있습니다. 간과되는 경우가 많지만 IDE 플러그인에 대해 걱정해야하는 경우 일관된 언어를 설계하는 것이 훨씬 어렵습니다.
Berin Loritsch

6

분산 계산

무료 점심 식사는 끝났습니다. 오늘날에는 여러 개의 코어 / 여러 프로세서 (및 특수한 환경에서 여러 컴퓨터)에서 실행되는 프로그램이 필요합니다.

불행히도 멀티 스레드 코드를 작성하는 것은 개념적으로 어렵 기 때문에 언어를 장벽으로 추가 할 필요가 없습니다.

C ++ 0x 미래의 사용 은 확실히 흥미 롭습니다. 라이브러리로 가져 왔으며 실제 동기화 문제에서 벗어날 수는 없기 때문입니다 (알다시피 너무 쉽게 해결할 수 있습니다 ...)

나는 문제에 대한 Go 의 접근 방식을 정말로 좋아 합니다 . 멀티 스레딩이 내장되어 있으며 (채널 및 고 루틴) 접근 방식은 기존 세마포어 / 뮤텍스 / 잠금 방식보다 훨씬 쉬운 사고 방식을 설정합니다. 그래도 동기화되지 않은 구조에 액세스하는 것은 여전히 ​​쉽지만 (Go에는 포인터가 있음) 또는 교착 상태 (채널에서 대기주기 ...)가 있습니다.

기능적 언어와 같이 데이터의 불변성을 선호하는 언어가 그 권리를 가질 수 있다고 생각합니다 (나는 경험을 좋아합니다).

또한 액터 모델이 다음 대상이 될 수도 있습니다. 분산 컴퓨팅에도 사용되었습니다.


또 다른 예는 Erlang입니다. 이런 종류의 언어들 사이에서 공통된 주제는 상태가 본질적으로 메시지와 함께 전달되는 무 공유 접근법입니다. 접근 방식은 잘 확장됩니다.
Berin Loritsch

@Berin : Erlang을 거의 알지 못했기 때문에 메시지에 Erlang을 인용하지 않았음에도 불구하고 Actor 모델을 올바르게 구현한다는 것을 기억합니다.
Matthieu M.

6

나에게 미쳤지 만 나에게 가장 중요한 언어 기능 중 하나는 예제와 함께 좋은 온라인 참조의 가용성입니다. 모든 언어에 대해 좋은 검색 결과를 찾을 수 있다는 것을 알고 있지만 MSDN 및 Java API 사이트를 정말 좋아합니다. 특정 언어에 대한 경험이없는 사람에게는 프로그래밍이 훨씬 쉬워집니다.


JavaDoc, CppDoc, RubyDoc 등은 표준 라이브러리와 사용자가 작성하는 라이브러리를 이해하는 데 큰 자산이되었습니다. 그것들은 모두 동등하게 만들어지지는 않았으며 일부는 다른 것보다 탐색하기가 더 쉽습니다.
Berin Loritsch

동의, Java API 사이트는 훌륭한 자산입니다. API 문서를 작성하기위한 표준 형식도 있습니다. JavaDoc (netbeans) 분석 지원 기능이 내장 된 IDE를 사용하면 생산성이 크게 향상됩니다. 나는 끔찍한 기억을 가지고 있지만 다른 사람들보다 나에게 더 많은 혜택을 줄 것입니다.
toc777

6

컴파일러가 코드를 확인하도록 도와주는 더 많은 기능.

임베디드 시스템 프로그래머이기 때문에 항상 C를 사용합니다.하지만 항상 코드에서 기대할 수있는 것을 컴파일러에게 알려줄 수있는 더 많은 방법을 원합니다.

EG 나는 기능을 가질 수있다

f(int x)

그러나 나는 선호한다

f(int range[-5..25] x)

EG Lisp 나 Haskell과 같은 고급 기능 언어를 사용하여 함수에 대한 어설 션을 작성하고 싶습니다. 이들은 코드로 컴파일되지 않지만 정적 또는 동적 분석에 사용될 수 있습니다.


본질적으로 범위 검사를 수행하는 효율적인 방법은 무엇입니까? 꽤 시원 할 것입니다. 비록 적어도 컴파일 시간 검사뿐만 아니라 런타임 검사에 포함되기를 원합니다. 데이터베이스 또는 사용자 인터페이스에서 정보를 가져올 때 항상 값이 유효하다는 것을 보증합니다. 이것이 언어 기능이라면이 목적을 위해서도 사용하고 싶습니다.
Berin Loritsch

3
파스칼을 사용해야합니다. 컴파일러가 컴파일 타임에 확인할 수있는 임의의 숫자 범위 (예 : -5..25)를 포함하는 유형을 정의 할 수 있습니다. (물론 상수 만 할당하는 한)
Mason Wheeler

1
@ Kugel : 컴파일러 기능 외에 다른 것은 무엇입니까? 그리고 단위 테스트는 생산 코드를 확인하지 않습니다. 그리고 생산을 확인하지 않는 것은 처녀 항해 후 라이브 보트를 벗는 것과 같습니다. 연료를 절약하고 선박을 더 빠르게 만듭니다.
Martin

1
내가 작업중 인 플랫폼에 Ada 컴파일러가 없다는 것을 제외하고는 Ada를 사용할 것입니다. 그것은 단지 C 컴파일러를 가지고 있기 때문에 이것은 모두 학문입니다.
Rocketmagnet

1
나는 이미 많은 주장을 사용하지만 언어 기능으로 이것과 다른 것들을 갖는 것이 더 낫습니다.
Rocketmagnet

5

자세한 구문은 배우기 어렵고 가독성을 높이 지 않기 때문에 가능한 적은 키워드를 가진 작은 구문입니다.

최악의 예는 Ada입니다.

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

is와 같은 필러 단어는 프로그래밍 언어에 적합하지 않습니다.


4
최악의 예는 당신이 말하는 언어라고 생각합니다 public static void.
Joey Adams

1
아이디어는 새로운 것이 아니며 이미 키워드가없는 SmallTalk 형태로 구현되었습니다. 따라서 귀하는 스몰 토크를 귀하의 주장에 대한 긍정적 인 예로 사용 했어야합니다. BTW : 당신이 무엇인지 모르는 경우 ISAda를 이해하지 못합니다 (Ada를 프로그래밍 했습니까?) : IS프로 시저 선언을 로컬 변수 선언과 분리하고 사양과 구현을 구별합니다. 물론 함수의 사양과 구현을 비교할 때만 IS완벽하게 이해되고 필러가 아님을 알 수 있습니다.
Martin

1
언급을 잊어 버렸습니다 : SmallTalk 구문은 엽서 뒷면에도 적합합니다. 따라서“소형”에 대한 귀하의 욕구도 충족시킬 것입니다. 물론 여기서 대부분의 아이디어는 어딘가에서 이미 일부 언어로 구현되어 있으며 대부분의 포스터 는 잘못된 부정적인 예 를 만드는 대신 해당 언어를 긍정적 인 예로 사용 합니다. 내가 충분히 평판이 좋지 않다면 투표 해 드리겠습니다. 당신의 생각이 나쁘지 않기 때문에-부정적인 예를 사용하십시오.
Martin

7
필러 단어는 구문을 명확하게하는 데 도움이되는 경우 실제로 목적에 도움이 될 수 있습니다. 예를 들어, 나는 훨씬 선호 if x then …합니다 if (x) …. 문맥 키워드에 대해 한 쌍의 괄호를 거래했습니다. 조건 x은 자체 괄호가있는 복잡한 표현 일 수 있으므로 의미 가 있습니다. 가장 바깥 쪽 쌍을 제거하면 가독성이 크게 향상 될 수 있습니다. 물론 대안은 파이썬처럼 콜론을 사용하는 것입니다. 실제로, 나는 이러한 명확한 필러가 콜론으로 대체 될 수 있다고 생각합니다. 어떤 방법을 선호하는지 잘 모르겠습니다.
Konrad Rudolph

3
@ Konrad : 구문이 명확 하지 않으면 필러 가 아닙니다 . 가 is 있다 에이다이 때문에 필러 있게되었다 procedure Hello begin ... end모호함으로.
dan04

4

더 많은 학습 언어 를보고 싶습니다 . 모든 토큰 사이에 공백을 요구하는 것과 같이 제한적인 초보자를위한 언어뿐만 아니라 프로그래밍을 이미 알고 있고 새로운 개념을 배우거나 일반적인 프로그래밍을 더 잘하고 싶은 사람들을위한 언어.

나에게 Haskell은 내가 "학습 언어"라는 의미의 훌륭한 예입니다 (수년에 걸쳐 인기와 일반 유틸리티도 성장했습니다). Haskell 은 친숙한 C 구문을 포기하고 이전에 함수 구성 연산자 (예 : (+2) . (*3)3을 곱한 다음 2 더하는 함수)를 가짐 으로써 더 짧은 함수를 작성하도록 가르쳤다. 무자비한 유형 검사기는 언어를 더 빨리 배우고 코드에 대해 논리적으로 생각하는 능력을 향상 시켰습니다. 이 두 가지 이점은 다른 언어, 심지어 어셈블리까지 쏟아졌습니다.

언어 학습의 목표와 범용 언어의 목표는 종종 상충됩니다. 학습 언어는 학습하기에 도전적이고 보람이 있어야하며, 해당 스타일이 많은 응용 분야에 적합하지 않더라도 특정 스타일을 적용해야합니다. 범용 언어는 작업 수행에 적합해야하며 추상화 사용을 신중하게 측정하고 "이해해야"합니다. 예를 들어, 웹 사이트를 고칠 때, 모나드 에 대해 배우는 것이 프로그래머에게는 마지막 일입니다. 동전의 반대편에서, 누군가 프로그래밍을 배우고있을 때, 아직 기능에 대해 배우지 않았다면 "공공 정적 공백"넌센스를 극복 할 필요가 없습니다.

언어 디자이너 인 경우 언어가 학습 언어인지 적용 언어인지를 염두에 두십시오. 이것은 디자인에 순도를 어느 정도 적용 할 것인지 결정합니다.


2
Haskell의 기능 구성은 어떤 식으로 거꾸로 되나요? 의 직접 번역입니다 (f ∘ g)(x) = f(g(x)).
Jon Purdy

@Jon Purdy : 함수의 반대 순서로 함수를 작성해야한다는 의미입니다. 두 형식 모두 g에서 인수에 먼저 적용되고 그 뒤에가 적용됩니다 f. 목록을 정렬하고 그룹화 한 다음 해당 목록의 첫 번째 항목을 얻으려면 (map head . group . sort) list또는 map head $ group $ sort list또는을 쓰십시오 map head (group (sort list)). 모든 경우에 작업을 거꾸로 작성하게됩니다. 그건 그렇고, 수입 Control.Arrow은 말할 수 (sort >>> group >>> map head) list있지만 >>>연산자는 다소 어색하고 장황하게 보입니다.
Joey Adams

2
나는 몰라, 나는 오른쪽에서 왼쪽으로 이해하는 것이 여전히 타당하다고 생각한다. (map head . group . sort) list"정렬 한 각 그룹의 첫 번째 항목"으로 읽 힙니다 list. 이는 매우 자연스럽고, 내 귀에는보다 기능적이며 (sort >>> group >>> map head) list, "그룹을 정렬 한 다음 각 그룹의 첫 번째 항목을 가져옵니다. .. list".
Jon Purdy

@JoeyAdams - 오히려 어색하고 운영자 외모 자세한 - 몇 최근 함수형 언어는 사용하기 시작했다 ... 아마도 눈에 좀 더 쉽게하는 왼쪽에서 오른쪽으로 체인 사업자로>>>|>

4

우리는 2011 년부터

  • 절대적으로 완전한 사양. C와 같이 아키텍처에 의존하는 구멍이 없음
  • 멀티 스레딩 지원; 동기화 기능 (잠금)뿐만 아니라 루프를 작성하는 것만 큼 멀티 스레딩을 쉽게하는 언어 기능 :

    all (o in myCollection) {o.someMethod ()}

  • 다중 패러다임; 프로그래머가 정적 언어의 컴파일 타임 안전 또는 동적 언어의 간결함을 사례별로 결정하도록하겠습니다. 객체 지향 기능, 기능 기능 등을 제공합니다.

  • 일관성 (일관성과 다중 패러다임 모두에 대해 조금 많이 요구한다는 것을 알고 있습니다 ...)


완전한 사양을 위해 100 % 함께 있습니다. 다중 패러다임과 일관성은 균형 잡힌 행동이 될 것입니다. 정적 검사에 대한 동작의 하위 집합으로 동적 패러다임에 대한 동작 집합을 지정할 수 있지만이 두 가지 접근 방식은 매우 다른 프로그래밍 스타일에 적합 할 수 있다고 생각합니다. 그들은 실제로 그 시점에서 별도의 언어가되어야했습니다. 아마도 100 % 호환성을 가진 일관된 언어 쌍이 원하는 것일 것입니다.
Berin Loritsch

스칼라 (그리고 아마도 Haskell? 나는 그것을 충분히 모른다)와 같은 언어는 유형 유추와 암시 적 덕분에 강력한 정적 유형 시스템과 간결성을 가지고 있습니다.
PhiLho

2
언어가 프로그래머가 중요하거나 중요하지 않은 것을 지정할 수 있도록 허용하면 아키텍처에 따른 기능이 좋습니다. C를 끔찍하게 만드는 것은 "모듈로 65536을 감싸는 숫자 유형"을 선언 할 방법이 없다는 것입니다. 플랫폼이 uint16_t를 구현하더라도 표준에 따르면 일부 구현에서는 두 uint16_t값의 차이를 부호있는 것으로 간주하고 다른 것에서는 차이를 부호없는 것으로 간주해야합니다. 프로그래머 가 원하는 동작을 지정할 수있는 방법이 없습니다 .
supercat

나는 다중 패러다임에 동의하지 않습니다. 코딩 스타일의 전투를하기에는 너무 많은 흔들림의 여지가 남아 있습니다. 라이브러리 A는 많은 동적 패러다임으로 작성되었습니다 . 라이브러리 B는 많은 정적 패러다임으로 작성되었습니다 . 이제 도서관 A는 도서관 B와 대화해야합니다. 중간 지점은 어디입니까? 동일한 언어로 두 코드 조각 사이에 접착제를 작성해야하는 경우, 언어는 본질적으로 결함이있는 IMO입니다.
Qix

3

경량 프로세스

Erlang과 같이 경량 프로세스를 원합니다. 주로 런타임의 문제입니다. JVM 및 .NET CLR에서 누락되었습니다. LWP는 대량의 동시 소프트웨어를 만드는 데 도움이됩니다. 언어로 객체를 생성하는 것보다 프로세스를 생성하는 데 비용이 많이 들지 않는 것이 이상적입니다. 내 응용 프로그램에서 수백만 개의 프로세스를 만들고 싶습니다.

사전 예약 기능이있는 스레드 풀로 구현되므로 단일 작업이 다른 작업을 차단하지 않으며 사용 가능한 모든 CPU 코어에서 작업을 예약 할 수 있습니다.

꼬리 재귀 지원

꼬리 재귀를 지원하고 싶습니다. 런타임 환경에서도 문제가 될 수 있습니다. 예를 들어 JVM은 꼬리 재귀를 지원하지 않습니다.

손쉬운 분산 프로그래밍

Erlang과 같은 단어로 다른 컴퓨터에서 실행되는 응용 프로그램의 일부에 send ( ! ) 및 receive 프리미티브를 지원하고 싶습니다 . 따라서 분산 데이터 저장소와 같은 확장 가능한 응용 프로그램을 쉽게 구축 할 수 있습니다. 언어에 내장 된 직렬화에 추가하면 erlang과 마찬가지로 매우 유용합니다. 그리고 Java와는 달리 수동으로해야합니다.



스칼라는 꼬리 재귀를 가지며 JVM으로 컴파일됩니다. IBM Java 컴파일러도 때때로 꼬리 재귀를 수행 할 수 있습니다.
Martin

3

메타 프로그래밍을 용이하게합니다.

특별한 형태를 제한하다

파이썬에서는 내장 함수가 아닌 이유는 없습니다. 그것은 parens와 관련이없는 것을 제외하고는 함수처럼 보이고 작동합니다.

수행 우리가 정말 필요 for, foreach, while자신의 특별한 형태로 각각처럼. 변형 루핑 형태의 구문 설탕을 제공하기 위해 하나의 루핑 구성과 일부 기본 매크로는 어떻습니까?

특수한 형태를위한 메타 프로그래밍

form['if'](test-fn, body-fn)


루비는 일종의 반복을위한 "특수 형식"을 가지고 있는데, 적어도 반복 가능한 객체는 보통 each코드 블록을 인수로 사용하는 것과 같은 방법을 가지고 있다는 의미입니다 . (루비는이 forwhile루프,하지만 자존심 루비 프로그래머는 실제로 사용하지 않습니다.)
mipadi

@ mipadi : 나는 Ruby 블록과 관련 관용구를 좋아합니다.
dietbuddha

아마 그들은 생각합니다-당신은 당신의 눈을 쏠 것입니다. :) 내 생각에 그것은 모두 강력한 "Python"과 "이유가없는 이유"의 연관성이었다. 그럼에도 불구하고 메타 프로그래밍은 종종 무시되는 유효한 언어 디자인 문제입니다. 그런 이유로 나는 이것을지지 할 것입니다.
Berin Loritsch

@Berin : 실제로 사용하고 있으며 더 재미있게 만드는 Python의 팬입니다.
dietbuddha

한 가지 유형의 루프는 코드 흐름을 흐리게합니다. 예를 들어, do..while최상위에 평가를 한 루프 유형이 있으면 루프를 어떻게 볼 수 있습니까? do..while 루프처럼 보이지 않습니다.
Qix

2

네트워크 기능

네트워크 지원없이 제공되는 언어는 오늘날 세계에서 상당히 불충분합니다.

대부분의 실제 응용 프로그램은 다음과 같은 네트워크를 통해 통신해야합니다.

  • 자동 업데이트
  • 데이터베이스 액세스
  • 웹 서비스

또한 분산 / 클라우드 컴퓨팅 지원의 초석이기도합니다.


8
그러나 표준 라이브러리 기능 일 수 있습니다 .
Donal Fellows

@Donal : 나는 달리 말하지 않았거나 적어도 그렇게 생각하지 않았습니다. 질문은 언어와 라이브러리 기능 모두에 열려 있습니다. 내 요점은 당신이 언어 패키지를 받고 거기에 네트워크 기능이 없다면, 당신은 나중에보다 오히려 빨리 고통을 채울 것입니다 :)
Matthieu M.

3
표준 라이브러리는 실제로 언어 경험의 일부이므로 동일한주의와 존중으로 처리해야합니다. 또한 표준 라이브러리에 대한이 요구 사항에 동의합니다.
Berin Loritsch

1

나는 배우기 쉽고, 새로운 것을 만들기 위해 결합하기 쉬운 프로그래밍 언어를 좋아합니다.

예를 들어, 여러 가지 방법으로 글을 쓰는 것이 매력적이지만 한두 가지만 쓰는 것이 더 좋습니다. 그렇게하면 프로그램을보다 쉽게 ​​유지할 수 있습니다.

모든 요소에 개념을 적용 할 수있는 언어가 매우 유용합니다 (직교성이라고 생각합니다). 따라서 다음에 새 언어 기능에 직면 할 때이를 사용하는 방법을 추론 할 수 있습니다.

때로는 컴파일 / 통역 단계에서 언어 구문이 더 나은 성능을 발휘해야한다는 것을 이해하지만, 언어 디자이너가이 작업을 개발자에게 미루고 있다고 생각합니다. 예를 들어 Java 또는 Javascript의 여러 줄 문자열입니다.

마지막으로 언어 구문은 사용자 인터페이스이므로 명확하고 간결하며 직관적이며 사용하기 쉬워야하며 습관을 존중해야합니다.


직교는 각 기능이 다른 것을 수행한다는 것을 의미합니다. grep 또는 awk와 같은 도구를보십시오. 그들은 한 가지 일을 잘합니다. 그런 다음 필요한 순서대로 다른 순서로 연결하십시오.
Theo Belaire

1
  • 가독성 : 문법에 사용 된 기호가 적거나 작을수록 더 깨끗하고 좋습니다.
  • 객체 지향 유형 : 함수가 아닌 메서드.
  • 이해 : 내장 된 유창한 인터페이스, 라이브러리 클래스 / 인터페이스 및 정렬을위한 포괄적이고 짧은 이름.

1
미안하지만, 이것에 대해 완전히 틀린 것에 대해 -1을 주어야합니다. 간결함은 코드를 더 빨리 작성 하는 데 도움이 되지만, 특정 최소값 이상으로 코드를 더 읽기 쉽게 만들지는 않습니다. 특정 수준의 자세한 표시로 인해 코드를 훨씬 쉽게 읽을 수 있습니다. 추가 단어와 기호는 무언가를 의미하고 프로그래머에게 의미있는 정보를 제공합니다. 특히 다른 사람이 원래 작성했으며 이미 당신의 머리에 그것의 모델입니다.
메이슨 휠러

나에게 깨끗한 코드는 읽을 수있는 코드입니다. PHP 배열에서 "=>"대신 ":"또는 "." "->"대신에 확실히 개선 될 것입니다 (그리고 이미 PHP를 즐깁니다).
dukeofgaming 2018 년

4
@Mason : 저와 많은 훌륭한 기술 저술가 (William Zinsser)는 동의하지 않습니다. 자세한 정보는 간결함이 아니라 가독성의 적입니다.
Konrad Rudolph 2019 년

2
나는 상징으로 정의 된 간결한 형태를 추구한다 . 그러나 다중 문자 기호는 독자가 자연스럽게 단일 기호로 취급하는 것 (예 : 단어는 기호)에 매우 만족합니다.
Donal Fellows

1
첫 번째 요점은 후자의 두 요점과 직접 충돌합니다.
Qix

1

기존 프로그래밍 언어에 기능 추가 따라서 새로운 언어 B는 오래된 언어 A와 기능 X입니다.

기존 예 :

  1. C 클래스 추가 => C ++
  2. Java가 물건을 추가하는 것 => C #

2
이것은 매우 단순화 된 것입니다. C와 Objective-C의 차이점이 훨씬 더 좋은 예입니다.
Jon Purdy

0

기술 / 플랫폼 / 언어 / 데이터베이스 등에 관해서는 대부분 성능에 달려 있습니다. 미래에는 많은 컴퓨팅 기능이 있기 때문에 오늘날 많은 소프트웨어가 그래픽 언어를 사용하여 설계 될 수 있습니다.

우리가 계산 능력과 응용 프로그램 을 디자인 하는 언어가 있고 언어 세부 사항에 대해 걱정할 필요가없는 날을 바랍니다 .

업데이트 : 해당 언어 LabView에 대한 링크를 보냅니다.

업데이트 : 나는“컴퓨팅 강력”이라는 말의 의미를 더 설명해야합니다. 컴파일 된 소프트웨어의 성능은 구문 언어를 기반으로하는 컴파일 된 소프트웨어만큼 강력하지 않을 수 있습니다. 그래픽 프로그래밍을 더 높은 수준의 프로그래밍으로 생각하고 있으며 더 많은 오버 헤드가있을 수 있습니다. 오늘날의 컴퓨터는 그래픽 프로그래밍 언어를 쉽게 실행할 수 있습니다.


3
컴퓨터는 이미이를 수행 할 수있을만큼 강력합니다. 어떤 이유로 든 코드에 들어가야하기 때문에 실용적이지 않습니다 .
Jeremy Heiler

2
여전히 일종의 언어입니다. 이것을 현실로 만들려는 시도가 여러 번있었습니다. UML 도구는 일정량의 코드를 생성하지만 모델이 작동하는 제품을 생산하기에 충분히 상세하면 코드를 이해하는 데 더 이상 사용할 수 없습니다. 응용 프로그램의 그래픽 배선을 위해 유닉스 환경에 무언가가 있다고 생각하지만 올바르게 구성하려면 많은 구성이 필요했습니다. 워크 플로 엔진은이 메타 포어를 사용하여 프로그래머가 아닌 사람이 워크 플로를 디자인 할 수 있도록합니다.
Berin Loritsch

1
요컨대, 나는이 접근법이 일반적인 용어로 유용하다는 것을 심각하게 의심하지만, 현재 사용되고 있으며 그 응용에 잘 적용되는 특정 응용이 있습니다. 다시 : 당신의 요점 ... 1. 컴퓨터는 계산 능력을 가지고 기술 측면 문제가되지 않습니다. 2. 문제는 세부 사항을 잃지 않고 일반적인 의미에서 작업을 수행 할 수있을 정도로 표현력이 뛰어난 시각적 언어를 제공하는 것입니다. 틈새 응용 프로그램 이외의 텍스트는 프로그램을 훨씬 간결하게 표현한 것 같습니다. 나는 제기 된 질문에 적용 할 수 있기 때문에 공감했습니다.
Berin Loritsch

1
@Amir : 그렇다면 "그래픽 프로그래밍"이 소프트웨어 개발을 추진하기 위해 왜 컴퓨터가 더 강력해야하는지 설명해주세요.
Jeremy Heiler

7
@Amir : 더 근본적인 한계와 기술적 한계를 혼란스럽게하고 있습니다. 우리가 많은 그래픽 컴퓨터 언어를 가지고 있지 않은 이유는 우리가 어떻게 그것을 잘하는지 (그리고 잘 할 수 있는지 알지 못하기) 때문입니다. LabView에 대해 알고 있으며 복잡한 작업이나 간단한 작업 변경에 대한 암기가 들었습니다. 또한 그러한 언어를 디자인하기 위해 더 강력한 컴퓨터가 필요하지 않으므로 그러한 가상의 언어로 일부 샘플 프로그램을 스케치하십시오.
David Thornley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.