프로그래밍 언어를 어떻게 설계 하시겠습니까? [닫은]


41

프로그래밍 언어를 디자인하려면 어떻게 하시겠습니까? 어떤 기능을 사용 하시겠습니까? 무엇을 빼시겠습니까? 정적으로 또는 동적으로 입력 했습니까? 강하거나 약한 유형? 컴파일되거나 해석 되었습니까? 답을 정당화하십시오.


12
이 질문은 너무 모호합니다. 언어의 목적은 언어의 목적이 결정될 때까지 실제로 논의 될 수 없습니다.
blucz

1
투표 할 수 있고 이것이 유용한 질문이거나 아래에 유용한 답변이 있다고 생각되면 투표하십시오. 좋은 커뮤니티를 구축하려면 StackExchange 사이트에 투표가 필요합니다. 하루에 30 표를 낼 수 있고 낭비하지 마십시오. 명성이 높고 카운트가 적은 투표권을 가진 사용자는 다음을 읽어보십시오. meta.programmers.stackexchange.com/questions/393/…
Maniero

3
한 가지 방법으로 매우 높은 수준의 언어를 만들려고합니다. public void DoWhatIMeant ();
Dave

6
이상적인 프로그래밍 언어? ... 컴파일러가 내 마음을 읽고 프로그램을 정확히 원하는 방식으로 생성하도록합니다 .. :) 시간이 걸릴 수 있지만 그만한 가치가 있습니다.
WalterJ89

2
컴파일과 해석은 언어가 아닌 컴파일러 나 인터프리터 (duh)의 특성입니다. 모든 언어는 컴파일러 또는 인터프리터로 구현할 수 있습니다. 사실, 그들 모두는 거의 대부분입니다. Ruby, Python, ECMAScript, PHP 용 컴파일러가 있으며 C, C ++, Java, Haskell 등을위한 인터프리터가 있습니다.
Jörg W Mittag

답변:


55
  • 나는 함수형 프로그래밍 언어가 따라 잡을 것이라고 생각한다 . 그래서 나의 언어는 기능적 일 것이다. 함수형 프로그래밍으로 길들이기 효과 보기

  • CPU는 곧 수백 개의 코어를 갖게 될 것이며 스레드는 관리하기가 쉽지 않을 것입니다. 따라서 액터 모델 은 스레드 대신 필수입니다. 동시 세계를위한 소프트웨어 Erlang 참조

  • 또한 OOP가 실패했다고 생각합니다. 객체 간의 통신은 비동기 적이라고 가정했습니다 . 따라서 불변의 메시지와 함께 메시지 전달이 필요하다고 생각 합니다. 보내고 잊어 버리십시오. 액터 모델 에서처럼. 객체 지향 프로그래밍 : 잘못된 경로를 참조하십시오 .

  • 나는 정적 타이핑 을하는 것이 좋을 것이라고 생각 하므로 개발주기 초기에 오류가 포착됩니다. 그러나 Haskell에서와 같이 형식 유추 를 사용 하므로 개발자는 C, C # 및 Java와 같이 코드의 어느 곳에서나 형식을 작성할 필요가 없습니다. 참조 중대한 좋은을 위해 당신은 하스켈 알아보기

  • 또한 WPF 및 Android에서와 같이 선언적 레이아웃을 사용 하여 훌륭한 UI 라이브러리를 디자인합니다 . 그러나 Functional Reactive Programming 에서와 같이하고 싶습니다 .

따라서 내 언어는 Erlang의 동시성과 같지만 Haskell에서와 같이 입력하고 WPF.NET에서와 같이 GUI 프레임 워크를 사용합니다.


4
실제로 훌륭한 UI 라이브러리를 제외하고는 Scala와 비슷합니다.
Ape-inago

스칼라는 메시지 전달과 배우가 있다고 생각했습니다. 나는 그것이 OOP와 어떻게 관련이없는 것 같아요.
Ape-inago

@Jonas : 멋져 보인다 :) 배우 모델에 대해 잘 몰라, Go가 goroutines로 한 것과 비슷합니까?
Matthieu M.

1
내가 회의적 인 유일한 것은 정적 타이핑입니다. 나는 약한 타이핑 대신 강한 것을 선호하지만 때로는 정적 타이핑이 너무 제한적입니다. 그러나 나는 Haskell에 익숙하지 않으며, 타이핑 시스템에 대해 좋은 점만 들었습니다 :)
sakisk

1
솔직히 OOP의 실패는 "객체 지향"언어가 실제로 그것을 구현 하지 않는다는 것입니다. 대부분 객체 모델을 절차 적 언어로 구두 약화하고이를 하루라고 부릅니다. 스몰 토크가 모든 절차 적 언어 요구 사항에 "어, 우리는 이런 식으로 뭔가를 할 수 있습니다"라고 말하지 않고 OOP의 요점을 완전히 놓치지 않기를 바랍니다.
cHao

22

참고 :이 게시물의 기능을 설명하기 위해 C와 같은 구문을 사용했지만 모든 키워드가 CAPS 인 것처럼 어리석지 않은 한 구문 자체는 까다 롭지 않습니다.

1. 타이핑 시스템

언어에서 원하는 최고의 기능은 동적 타이핑 옵션 이있는 정적 타이핑입니다 . 그 이유는 정적 타이핑을 사용하면 a) 늦지 않고 일찍 오류를 잡을 수 있고 b) 언어의 구별 여부에 관계없이 대부분의 코드는 암시 적으로 정적으로 유형이 지정되기 때문입니다. 그러나 동적 타이핑이 매우 유용한 몇 가지 사용 사례가 있습니다. 예를 들어, 파일에서 데이터를 읽을 때 종종 다양한 유형의 필드가 있으며 동적 유형 지정으로 이기종 컨테이너를 쉽게 만들 수 있습니다. 이상적인 언어는 다음과 같습니다.

//variable declarations
int anInt = 42 //anInt is now irrevocably an integer and assigning another type to it is an error
vartype aVariable = 42 //aVariable is currently an integer, but any type can be assigned to it in the future

//function definitions
int countElements(Collection c)
{
  return c.count();
} 

//c HAS to be a collection, since countElements doesn't make sense otherwise

void addToCollection(Collection& c, vartype v) 
{
  c.append(v)
}

//c is passed by reference here

2. 컴파일 및 해석

언어가 미리 컴파일되거나 JIT 컴파일되었지만 순전히 해석되지는 않기 때문에 속도가 이유입니다. 점에서이 관계 1 최적화 컴파일러 / 지터 이후는있을 것이다 많은 정적으로 입력 된 코드를 최적화 쉽게 시간을, 그리고 그대로 동적으로 입력 된 코드는 단순히 남아있을 수 있습니다.

3. 폐쇄

언어는 함수형 프로그래밍 구조를 지원해야하며 함수는 일류 객체 여야합니다.

4. 객체 지향

이 언어를 사용하면 객체 지향 코드를 작성할 수 있어야하지만 간단한 명령형 코드도 허용되어야합니다. 즉, 다음과 같은 hello world 프로그램을 작성할 수 있어야합니다.

int main(string<> args=null)
{
  printf("hello, world"); 
  return 0;
}

// this code also demonstrates two other features,
// default arguments for functions (not explained further)
// and immutable lists like string<> (see 6. Built-in datatypes)

5. 네임 스페이스

네임 스페이스는 좋은 것입니다. 전역 네임 스페이스에 들어가는 것은 거의 없습니다. 하지만 경우에 있어야합니다 , 당신이 할 수있는 (++ C ALA) 글로벌 네임 스페이스에 물건을 넣어.

6. 내장 데이터 타입

언어는 내장 데이터 유형으로 다음과 같은 구성을 가져야합니다.

  • int데이터 유형 또는 유형. int유형 이 하나만있는 경우 범위가 무제한이어야합니다. 더 많으면 무제한 범위 유형이 가장 큰 계산 결과를 보유 할 수있는 가장 작은 유형 으로 암시 적으로 업 캐스트해야합니다 .
  • floatIEEE 754에 해당 하는 단일 내장 이진 유형double
  • list이중 연결 목록 또는 각 요소에 대한 포인터를 보유하는 연속 메모리 블록으로 구현되는 가변 유형
  • list배열처럼 작동하지만 생성 후 크기를 변경할 수없는 불변 유형
  • 불변 및 불변 string유형으로, 기본값은 불변입니다.
  • map또는 dict형 가변이며, 불변 키 및 가변 및 / 또는 불변의 값을 보유하고있다.
  • 내장 컬렉션 유형은 기본적으로 동종 유형이어야하지만 vartype필요한 경우 d 일 수 있습니다
  • boolean유형
  • null또는 none어떤 유형의 변수에 할당 될 수있는 형태.
  • 가변 및 불변 set유형
  • decimal십진 부동 소수점 변수를 구현 하는 유형
  • fixed타입이 구현하는 고정 소수점 수

decimal, floatfixed유형은 공유해야 정확한 그들에게 투명하게 전달과 기능에서 반환 할 수 있도록 (중 상속 또는 오리 입력을 통해) 같은 공용 인터페이스를. 부모 유형은이라고 할 수 있습니다 real.

7. 가치와 참조에 의한 전화

기본값은 value (즉, 함수에서 인수의 사본이 작성되고 작동 됨)를 사용하여 값과 참조로 함수를 호출 할 수 있어야합니다.

8. 포인터

언어에는 포인터가 있어야하며 포인터 산술이 가능해야합니다. 포인터는 정적으로 만 입력 할 수 있습니다 (악몽을 피하기 위해 void*). vartype포인터가 명시 적으로 허용되지 않습니다. 포인터와 포인터 산술이 있으면 언어를 시스템 프로그래밍 언어로 심각하게 사용할 수 있습니다.

9. 인라인 어셈블리

8 과 관련하여 언어는 필요한 상황에 대해 인라인 어셈블리 언어 코드를 허용해야합니다.

10. 안전

언어는 예외 처리 등을 지원하여 사용하기에 안전해야합니다. 포인터 산술 및 인라인 어셈블리는 명시 적으로 안전하지 않은 것으로 표시된 코드 부분으로 강등 될 수 있습니다. 안전하지 않은 코드는 허용되지만 사용하지 않는 것이 좋습니다.

11. 정의되지 않은 행동

언어 표준은 안전하지 않은 것으로 명시 적으로 표시된 코드를 제외하고 모든 상황에서 프로그램이 작동하는 방식을 지정해야합니다. 즉, 안전하지 않은 블록 외부에는 정의되지 않은 동작이 없어야합니다. 이를 통해 언어를 실행 가능한 응용 프로그램 개발 언어로 사용할 수 있으며 OS를 작성할 수 있습니다.

그것이 지금 생각할 수있는 전부이지만, 더 많은 것을 생각할 때 게시물을 편집 / 업데이트 할 것입니다.


5
"D Programming Language"를보십시오 : digitalmars.com/d
Wizard79

내가 기억하는 한 D에는 선택적 동적 타이핑 또는 내장 무제한 범위 정수 유형이 없습니다. 정수 유형은 그리 큰 문제가 아니지만 선택적 동적 타이핑이 없으면 상당히 매력적입니다.
Chinmay Kanchi

1
decimal여기 에 유형을 추가 하겠습니다.
구성자

3
“모든 유형의 변수에 할당 할 수있는 null 또는 none 유형”— 부울 포함? :-p
Timwi

1
원래 게시물에 "유연한"내용이 없습니다. 프로그래밍 언어의 최고 요구 사항으로 인라인 어셈블러가 마음에 들지 않았습니다. 어쩌면 그것은 현재 Felix von Leitner에 따르면 어셈블러를 작성하면 대부분 잘못된 결과를 느리게합니다.
LennyProgrammers

7

이것이 내 꿈 프로그래밍 언어의 모습입니다 :

  • 의존적 인 타이핑을 지원하는 강력한 정적 타입 시스템.
  • 선택적 동적 타이핑.
  • Numeric Tower a la Lisp이지만 정적으로 입력되었습니다.
  • 매크로 la lasp.
  • 주로 ML 계열과 같은 명령형 프로그래밍을 기본적으로 지원하는 기능적 프로그래밍 언어입니다.
  • 가비지 콜렉션.
  • 타입 추론.
  • 계속.
  • 선택적인 게으른 의미론.
  • 모든 제어 구조는 라이브러리 함수 형태로 제공됩니다. (마지막 두 기능을 사용하여 가능할 수 있습니다.)
  • 최소 구문 (Lisps 만큼은 아니지만 Ioke / Seph의 일종)

좋은 데요 그래도 정적으로 유형 안전 매크로를 수행하는 좋은 방법을 보지 못했습니다.
Jörg W Mittag

@ 요 르그 : Nemerle?
missingfaktor

스몰 토크에서 모든 제어 구조는 실제로 메소드이며, 구현시 연속을 사용하지 않습니다. 하나는 다른 하나에 필요하지 않습니다.
Oak

@ 오크, yield스몰 토크 에서 파이썬을 구현할 수 있습니까? 사용하기에 깨끗해야합니다.
missingfaktor

수율과 같은 메커니즘이 이미 스몰 토크에서 라이브러리 방법으로 계속 구현되지 않고 구현되었습니다.
Oak

6

나는 C #과 거의 비슷하게 디자인했을 것이지만 Microsoft는 나를 이겼다. :)

(물론 내 생각은 덜 생각하고 아마추어는 많았을 것입니다.)

컴파일되거나 해석되는지 여부는별로 신경 쓰지 않으므로 해당 비트를 정당화 할 필요가 없습니다.

강력한 정적 타이핑과 관련하여 정당성이 요구되는 이유를 이해하기가 어렵습니다. 정적 타이핑은 컴파일 타임 동안 버그를 잡는 기능입니다. 동적 타이핑은 해당 기능이 없기 때문에 런타임까지 버그를 연기합니다. 내 개인적인 경험에는 동적 디스패치가 의미가 있고 유용한 유용한 사용 사례가 거의 없었으므로 4.0 이전에 C #에서 진행 한 컨볼 루션은 쉽게 정당화되었습니다. C # 4.0에서는 동적 디스패치가 있기 때문에 더 이상 정당화 할 필요가 없습니다.

그러나 아마도 C #처럼 종교적으로 오래된 C 구문을 고수하는 대신 새로운 구문을 만들었을 것입니다. switch 문은 특히 끔찍하며 캐스트 구문도 싫어합니다 (잘못된 방법입니다). 나는 구문의 세부 사항에 대해 큰 소문을 내지 않기 때문에 Visual Basic만큼 장황하게 표현하고 싶지 않다는 것을 제외하고는 세부적으로 정당화 할 필요가 없습니다.

내가 뭘 정당화하기를 원하십니까?


+1 좋은 답변! 나중에 나만의 게시물을 게시하겠습니다.
Chinmay Kanchi

4
C #은 강력한 언어이지만 구문이 지저분합니다. 나는 이것이 많은 기능들이 원래 디자인에 없었기 때문이라고 생각합니다.
Casebash

따라서 "4.0"이라고 생각합니다.
Mark C

5

다음은 내가 넣은 기능 목록입니다.


구문과 같은 리스프

리스프 스타일

찬성 :

  • 쉽게 확장 가능한 구문. C에서 foreach 루프를 구현하려고 시도한 적이 있습니까? 쉽지 않습니다. (마음에 들었 습니다 ).
  • 동질성. 당신은 단순히 할 수 있습니다(eval "your data files")

단점 :

  • 중첩 된 폴란드어 표기법은 종종 읽기 어렵습니다

기능적 프로그래밍

하스켈 스타일

찬성 :

  • 간편한 동시성, 모든 코드는 스레드로부터 안전합니다.

단점 :

  • 모나드는 잘 작동하는 것처럼 보이지만 순수한 기능 코드로 부작용을 구현하기가 어렵습니다.

강력한 동적 타이핑

파이썬 스타일

찬성 :

  • 다이내믹 타이핑은 코드를 깨끗하게 읽을 수있게 해주 며 강력한 타이핑은 타입 오류를 제거

구현 :

CL과 비슷한 유형을 기반으로 함수 오버로드를 허용하십시오 defgeneric.

(define (+ (a <int>) (b <int>))
  (ints-add a b))

(define (+ (a <string>) (b <string>))
  (string-concat a b))

(define (+ a b)
  (add-generic a b))

컴파일 가능하고 해석 가능

찬성 :

  • 컴파일 된 경우 성능 향상 (일반적으로 항상 그렇지는 않음)

단점 :

  • 언어의 기능을 제한 할 수 있지만 llvm은 좋은 지원입니다.

시스템 프로그래밍

C 스타일

찬성 :

  • 아주 약간 더 넓은 범위의 사용자에게 호소합니다.
  • 응용 프로그램, 커널 및 장치 드라이버가 모두 동일한 언어로 작성된 경우 상호 작용하기 쉬움

단점 :

  • 언어의 추상화를 제한하므로 동적 입력이 적합하지 않은 경우가 많습니다.

위생 매크로 (CL 스타일 및 구성표 스타일)

찬성 :

  • 특히 Lispy ™ 구문으로 언어를 쉽게 확장
  • 내가 전에 말한 적이 있습니까?

단점 :

  • Lispy ™ 구문으로 완료된 경우 많지 않음

이것을 생각해 보면, 컴파일 및 시스템 프로그래밍 비트를 제외하고는 다소 체계를 정의합니다. libguile을 사용하고 C로 해당 비트를 작성하여 해결할 수 있습니다.


1
Ioke와 Seph를 살펴보십시오. S- 표현식과 비교할 때 아주 적은 양의 구문을 추가하고 여전히 완전한 매크로 기능을 가지고 있으면 언어를 훨씬 쉽게 읽을 수 있습니다. (기본적으로 "모든 함수 호출은 목록이고 목록은 일류입니다"대신 "모든 것이 메시지 전송이고 메시지 체인은 첫 번째 클래스"입니다. car함수이고 cdr인수 인 목록 대신에 name필드가 메소드이고 arguments필드가 인수 인 오브젝트 . 중첩 대신 필드 가 prev있고 next포인터가 있습니다.)
Jörg W Mittag

Clojure와 거의 비슷하게 들립니다 ( 시스템 프로그래밍 부분 -github.com/halgari/mjolnir 의 LLVM에서 네이티브 코드 일반화에 Mjolnir을 사용한다고 가정 )
mikera

3

거기에 꽤 좋은 것으로 생각되는 몇 가지 언어가 있습니다 (C #은 현재 가장 좋아합니다). 이것이 나의 환상 언어이기 때문에 여기에 내가 정말로 원하는 것은 다음과 같습니다.

  • 킥 어스 공식 API 설명서. Java API는 이와 같이 좋고 C # /. NET은 꽤 좋습니다. 루비 / 레일은 여기서 끔찍합니다.
  • Kick-ass 공식 일반 문서 (사용법, 일반적인 용도, 많은 예제 코드). C # /. Net이 이것에 좋습니다.
  • 블로그 기반 문서 작성기 및 StackOverflow 문제 해결 도구로 구성된 커뮤니티로 어려운 장소에서 벗어날 수 있습니다.
  • 광범위하게 잘 지원되고 문서화되어 있으며 강력한 플러그인 / 라이브러리 / 확장 프로그램 (Ruby / Rails에는 '강력한'기능이 있지만 다른 두 가지 기능은 없습니다).
  • 합리적으로 안정적입니다. 모든 기존 코드를 매년 변경하지 않아도됩니다 (루비 / 레일을 보면).
  • 너무 안정적이지 않습니다-언어 디자인의 진보에 적응할 수 있습니다 (C ++)

2
"Kick-ass documentation"포인트는 PHP : D
Corey

3

컴파일러 힌트

언어 디자인에 대해 많이 알지 못해서 부끄러운 이야기를하고 있지만, 내가 말하는 기능 을 다른 언어의 힌트 라고 생각합니다 . 컴파일러 힌트 ?

나는 이것을 Perl6 초안으로 읽었는지 또는 당시에 너무 높았는지 모르겠지만 기본적으로 모든 것이 어둡고 구식 인 언어를 상상합니다. 그러나 실제로 성능을 높이고 싶다면이 값은 항상 정수이거나 절대 null이 아니거나 병렬 일 수도 있고 stateless 일 수도 있습니다. 컴파일러가 자동으로 마을로 갈 수 있습니다 이러한 특정 표시 영역에.

E : 요청한 내용을 분명히하거나 이미 존재하는 예를 인용 한 의견에 감사드립니다.


1
Common Lisp에서이 중 일부를 수행 할 수 있습니다. 예를 들어, 컴파일러에게 i가 적당한 크기의 정수라고 알릴 수 있습니다. 한 가지 유용한 점은 safetyand와 speed값 을 변경하여 컴파일러에서 확인 및 적용 (문제를 찾기 위해)하거나 자신이하는 말이 사실이라고 가정하고 더 빠른 코드를 컴파일 할 수 있다는 것입니다.
David Thornley

2

새로운 아이디어를 시도하려면 :

동적 형식의 함수형 프로그래밍 언어를 만들면 모든 문 표현 트릭과 패턴 일치로 가장 간단한 람다 구문을 수행 할 수 있습니다. 오프사이드 규칙이 활성화되었습니다.

// a view pattern (or Active Pattern in F#)
default = \def val: !!val.Type val def

// usage of the pattern
greet = \name<(default "world") `and` hasType Str>:
  p "Hello, \{name}!"

(p "Enter your name", .input).greet // (, ) is a sequence expression, returning the last value

여기에 설명이 있습니다 :

default =저장을 설정하고, \def val두 인자 커리 기능을 시작 val.Type과 동일 Type[val], !!변환 부울하고, 부울 적용 할 수 있으므로, valdef are after it.

f x= f[x]= x.f .f=f[]

그리고에서 greet사용 name<(default "world")되었으며 hasType Str>, 이는 패턴 default "world"이 사용되고 바인딩 될 것임을 의미합니다 name. 기본 패턴은 기본값을 지정합니다. and두 패턴을 연결하는 또 다른 패턴입니다. default동안 패턴은 실패 할 수 없습니다 hasType실패 할 수 있습니다. 이 경우 예외가 발생합니다.

변수는 실제로 스토리지이며 기능적으로 전달 될 수 있으며 범위가 변경되면 스토리지 테이블을 참조, 작성 및 파기 할 수 있습니다.

해시와 같은 것은 루아와 자바 스크립트와 같습니다.

컴파일 된 언어를 만들려면 Haskell과 유사한 기능을 사용하여 Java 용 F #을 만들 것입니다. 의사 코드와 같은 블록을 작성하여 명령 및 프로그래밍을 혼합하여 명령형 프로그래밍을 달성하는 기능을 제외하고는 순수한 기능 언어입니다.


1
역동적 인 타입의 함수형 프로그래밍 언어 인 Erlang과 약간 비슷하며, 매우 독창적 인 동시 언어 구성에 추가되었습니다.
Jonas

2

내가 아는 유일한 언어는 PHP와 자바 스크립트이며 언어를 디자인하기 전에 몇 가지를 더 배워야한다는 것을 명심하십시오.

구문 : 함수 이름과 인수 순서에 대해 신중하게 생각하십시오 (즉, PHP보다 덜 복잡합니다).

특징 : 의 설정 string바이트의 일련의 변수에서 작동하지만, 텍스트를 이해하지 못하는 기능, 그리고 세트 text인코딩을 많이 이해하고 UTF-8 및 기타 멀티 바이트 문자열을 작동 할 수있는 기능을. (그리고 text.isValidEncoding(text, encoding)바이트 시퀀스가 ​​잘못되어 텍스트로 취급하기에 안전하지 않은지를 알려주 는 함수를 사용하여 언어에 인코딩 무결성 검사가 내장되어 있습니다 .

나는 강력한 정적 타이핑이라는 아이디어가 마음에 들지만 결코 사용하지 않았기 때문에 실제로 말할 수는 없습니다.


2

프로그래밍 언어를 디자인하기 전에 질문에 대한 답을 찾을 수있을 것입니다. 왜 또 다른 프로그래밍 언어가 필요한가요? 이 글을 쓰는 시점의 Rosetta Code 는 344 개 언어를 나열합니다. 그 중 어느 것도 내 요구를 충족시키지 못하면 시작점 (가장 가까운 언어)을 결정하지 않은 이유와 추가 할 내용에 대한 세부 사항이 있습니다.

추첨에서 이겼는데 어떤 이유로 든 더 나은 것이 없다면 Liskell로 시작하여 GHC 프론트 엔드와 달리 본격적인 언어로 만든 다음 FFI를 더 쉽고 자동화하여 사용할 수 있도록하십시오. C / C ++ 라이브러리.


2

좋은 언어는 다음과 같은 언어입니다.

  • 쉽게 추론 가능
  • 최소한의 왜곡으로 아이디어를 표현할 수 있습니다
  • 중요한 세부 정보를 숨 깁니다 (최적화 / 자원 관리)
  • 쉽게 병렬화 가능 (다중 코어, 분산 컴퓨팅)

이것을 기능 목록으로 바꾸는 것은 매우 어렵지만, 자연스럽게 느껴지 지는 않지만 함수형 프로그래밍 은 명령형 프로그래밍보다 특히 더 가깝습니다 (특히 구체적인 세부 사항 숨기기)

  • C- 인터페이스 : C는 프로그래밍 언어의 언어이며 C로 개발 된 라이브러리의 수는 놀랍습니다. C와의 쉬운 인터페이스 (Python과 같은)를 통해 언어는 모든 해당 라이브러리에서 자동으로 혜택을받으며 금속 언어에 가깝게 최적화 할 수없는 무거운 작업을 보낼 수도 있습니다.
  • 분산 : Go가 스레드에서 활동에 따라 런타임을 전달하는 경량 루틴을 사용하여 멀티 스레딩을 수행하는 것을 좋아합니다. 이러한 언어는 프로그래머가 작업에 대해 추론하고 서로 분리하도록 권장합니다.
  • 가비지 콜렉션 : 요즘 말하지 않고 간다.)
  • 변경할 수 없음 : 절대 변경할 수없는 무언가에 대해 추론하기가 쉽고, 멀티 스레딩 / 분산 컴퓨팅을 구현하기가 훨씬 쉽습니다 (라이브러리 작업 인 수명을 처리하기 위해 동기화 만 필요합니다)
  • 람다 : 내가 생각하는 일급 함수와 함께 간다
  • 메시지 전달 : 불변성은 뮤텍스가 없음을 의미하므로 Tony Hoares의 제안을 따릅니다.
  • 모듈 : 네임 스페이스와 다소 유사하지만 더 나은 캡슐화
  • 반사 : 분산 계산에는 직렬화가 필요하며 컴파일러에 맡겨야하며 역 직렬화는 일부 형태의 반사로 더 쉽게 달성됩니다.
  • 정적 강력한 타이핑 : 오류가 빨리 감지 될수록 비용이 가장 적게 듭니다

현재이 목록에 가장 가까운 언어는 아마도 Haskell 일 것입니다.

  • 그것은 루틴이 부족합니다 : 나는 아직 Haskell에서 평행을 표현 하는 자연스러운 방법을 보지 못했습니다 (그러나 내 무지 일지 모릅니다)
  • 그것은 불명확 한 구문을 가지고 있습니다 : 어떻게 든 Haskell 프로그래머는 단어가 아닌 이상한 연산자를 사용하는 것처럼 보입니다. 매끄럽게 보이지만 진행 상황을 이해하는 데 큰 도움이되지 않습니다.

2

첫 번째 질문에, "어떻게 하시겠습니까?"-짧은 대답입니다. 나는 그것을 풀기에 충분한 파서 / 컴파일러 이론이 없다. 그러나 저는 25 년 동안 프로그래밍을 해왔으므로 공유 할 아이디어와 의견이 있습니다.

먼저, 실제로 연결된 모델을 만들 수있는 OOP 접근 방식을 생각해 보겠습니다. 즉, 모델은 거의 모든 종류의 프로그래밍 프로젝트에서 가장 중요한 것 중 하나입니다. 모델을 올바르게 만들기 위해서는 항상 많은 성가신 작업과 지속적인 리팩토링이 필요합니다. OO 언어.

보여줄 수있게 해줘 House 클래스에 Door 속성이 있다고 가정 해 봅시다.

var door = house.Door;

이제 Door 인스턴스를 참조하는 로컬 변수가 생겼습니다.

그러나 방금 일어난 일을 고려하십시오 : 당신은 방금 문을 찢어 버렸습니다. 이제 문을 통과하게되어 매우 기쁩니다. 그리고 나머지 코드는이 문이 실제로 집에 붙어 있다는 사실을 알지 못합니다.

나에게 이것은 근본적으로 잘못되었습니다.

그리고 예, 이것은 사례별로 "쉽게"수정됩니다.이 경우 현재 연결된 모든 문에서 집까지의 역 참조를 유지합니다. 물론 두 개의 역 참조를 정확하게 유지하는 것이 의무이므로 모델을 오류로 엽니 다. 따라서 House.Doors 및 Door.House 속성을 비공개로 만들고 House.AddDoor (), House.RemoveDoor ( ), Door.SetHouse () 등을 모두 연결하고 실제로 작동하는지 확인하십시오.

이처럼 단순한 관계를 모델링하는 데 많은 노력을 기울이지 않습니까? 유지해야 할 코드가 많습니까? 모델이 발전함에 따라 리팩토링 할 코드가 많습니까?

문제는 포인터입니다. 내가 본 모든 OO 언어는 본질적으로 객체 참조가 실제로 포인터라는 사실로 인해 어려움을 겪습니다. 왜냐하면 그것이 컴퓨터가 사용하기 때문입니다.

포인터는 실제 세계를 모델링하는 좋은 방법이 아닙니다. 모델링하려는 세계에 관계없이 해당 세계의 모든 관계가 양방향 관계가되는 것이 거의 보장됩니다. 포인터는 한 방향으로 만 가리 킵니다.

기본 데이터 모델이 그래프 인 언어를보고 싶습니다. 기본적으로 모든 관계에는 두 개의 끝이 있습니다. 이것은 실제 세계를 모델링하는 데 훨씬 더 자연스럽게 맞을 것입니다. 이것은 실제로 컴퓨터가 처음 필요한 유일한 것입니다. (그것과 비디오 게임.)

그러한 언어의 구문이 어떻게 생겼는지 또는 텍스트를 사용하여 표현할 수 있는지 여부는 알 수 없습니다. (어떻게 그런 언어가 그래픽이어야하는지 궁금했습니다.)

또한 모든 형태의 우발적 인 상태가 제거되는 것을보고 싶습니다.

예를 들어, 웹 개발에서 데이터베이스, 비즈니스 모델, 프리젠 테이션을위한 뷰 모델로 데이터를 만드는 데 많은 시간을 소비합니다. 그런 다음 일부 데이터는 양식에 표시됩니다. 이는 또 다른 변형 일뿐입니다. .. 및 상태가 양식 게시물에서 돌아온 다음 데이터를 재구성하고이를 뷰 모델에 다시 투영합니다 (예 : 뷰 모델 바인더). 그런 다음 뷰 모델에서 비즈니스로 다시 투영합니다. 모델 ... 그런 다음 객체 관계형 매퍼 (또는 거친 작업)를 사용하여 데이터를 뷰 모델에서 변환하여 관계형 데이터베이스에 투영합니다.

이것이 중복되는 소리가 들리기 시작합니까? 이 광기의 어느 시점에서 우리는 실제로 유용한 것을 성취 했습니까? 그리고 유용하다는 것은 최종 사용자가 이해하고 관심을 가질 수있는 유형의 무언가를 의미합니다. 하루가 끝나면 실제로 사용자가 이해할 수있는 것을 만드는 데 소비 한 시간은 실제로 유일하게 잘 소비 한 시간입니다. 다른 모든 것은 부작용입니다.

매우 역동적 인 언어를 원합니다. 쓰기 / 컴파일 / 실행주기는 지루한 시간 낭비입니다. 이상적으로 언어는 변경된 내용을 파악하고 필요에 따라 백그라운드에서 투명하게 컴파일 /로드해야합니다.

이상적으로는 "실행"을 누르지 않아도됩니다. 변경 사항을 적용하면 변경 사항이 즉시 반영되어 화면에 표시됩니다. 쓰기 / 컴파일 / 실행주기의 문제 또는 심지어보다 직접적인 쓰기 / 실행주기의 문제는 사용자가 수행중인 작업과 너무 연결이 끊어져 있다는 것입니다. 즉각적인 피드백, 즉각적인 결과가 필요합니다. 기다림이 너무 깁니다!

다시 말하지만, 이것이 전통적인 IDE로 달성 할 수 있는지, 또는 완전히 새로운 종류의 인터페이스가 필요한지조차 모릅니다.

작업중인 문제에 가장 적합한 약한 유형과 강한 유형의 조합을 사용할 수 있어야합니다.

일반적으로 상태는 언어가 귀하를 위해 완전히 관리하는 것이어야합니다. 지속성을 위해 왜 데이터베이스에 의존해야합니까? 이상적으로는 하나의 웹 요청, 하나의 세션, 24 시간, 모델에서 변수의 수명을 간단하게 지정할 수 있기를 원합니다.

다른 미디어 및 수명 기간 동안 스토리지 솔루션의 전체 어레이 중에서 선택해야하는 이유는 무엇입니까? -각 미디어에 맞게 데이터를 변환하고 구성하는 것은 말할 것도 없습니다. 브라우저 캐시, 데이터베이스, 메모리, 디스크, 누가 신경 써요! 데이터는 데이터입니다. 당신이 당신의 데이터를 저장하는 곳 (그리고 얼마나 오래 동안)은 신들과의 싸움이 아니라 단순한 선택이어야합니다!

음, 행운을 빌어 요


1

아마도 다음을 지원하는 다중 패러다임 언어 일 것입니다.

  • 구조적 / 절차 적 프로그래밍
  • 객체 지향 프로그래밍
  • 기능적 프로그래밍

왜 이런가요? 특히 데이터를 구성하기 위해 큰 프로그램을 구성하는 좋은 방법이기 때문에 객체 지향. 항상 (OOP)를 원하지 않거나 필요로하지 않기 때문에 사람들이 선택해야합니다. 프로그래머가 쉽게 디버깅하고 프로그램을보다 명확하게 만들 수 있기 때문에 기능적입니다.

코드 블록을 표시하기 위해 들여 쓰기 블록이있는 Python 모델을 사용합니다. 매우 떨리고 읽기가 좋습니다.

파이썬은 아주 좋은 언어이기 때문에 실제로 파이썬에서 많은 아이디어를 훔칠 것입니다. 나는 진술을하고 맵, 목록 및 튜플을 복사 할 것입니다.

이제는 파이썬에서 역동적 인 개념을 취하지 않을 것입니다. 한 가지 이유는 아마도 명시 적으로 정적으로 입력되었을 것입니다. 프로그램이 더 명확 해 졌다고 생각합니다. 변수는 아마도 메소드가있는 객체 일 것이므로 str.length()문자열의 길이를 얻는 것과 같은 것을 할 수 있습니다. 함수 정의에서 반환 유형과 인수 유형을 지정해야합니다 (일부 종류의 일반 유형도 지원).

파이썬에서 복사로 돌아가 보자 ;-). 선택적 프로 시저 인수를 갖는 방법을 좋아하므로 아마도 그럴 것입니다. 그러나 파이썬은 프로 시저 오버로드를 지원하지 않습니다.

클래스를 보자. 다중 상속을 버릴 것이다. 남용하기 쉽다. 개인 및 유사한 범위를 구현하고 C ++에서 수행되는 방식으로 구현했을 것입니다. 나는 또한 추상 클래스와 인터페이스를 가질 것이다. 나는 파이썬이 그것을 믿지 않는다.

내부 클래스를 지원할 것입니다. 사실 매우 강력한 객체 지향 언어를 원합니다.

아마 해석 될 것입니다. 좋은 JIT 컴파일 (프로그래머 생산성이 우선이지만 빠른 언어를 원함)을 사용하여 실제로 빠르게 얻을 수 있으며 컴파일은 여러 번 생산성에 좋지 않습니다. 해석 된 언어는 또한 플랫폼 독립성을 증진 시키며 매일 매일 점점 더 중요합니다.

기본 제공되는 유니 코드 지원이 있습니다. 요즘 국제화는 중요합니다.

확실히 가비지 수집됩니다. 젠장, 나는 메모리 관리를 직접하는 것을 싫어한다. 생산성에도 좋지 않습니다.

마지막으로 좋은 표준 라이브러리가 있습니다.

와, 내가 정말 파이썬을 얼마나 좋아하는지 깨달았습니다.


Interpreted languages also promote platform independance? 컴파일러 (백분율)보다 크로스 플랫폼 인터프리터가 더 있다고 생각하지만이 문장이 왜 참인지 알 수 없었습니까? 크로스 플랫폼 능력에 대해서는 전혀 차이가 없다고 생각합니다.
Mahdi

1

우선, 컴파일러에 관한 몇 권의 책, 몇 가지 표준을 구입하고 언어와 컴파일러에 대한 코스를 2 ~ 2 개 수강 할 것입니다. PEP에 기여 하고 C ++ 표준위원회 회의를 방문했습니다. 필자는 기능과 버그 모두를 위해 내가 사용하는 컴파일러에 패치를 제공 할 것입니다.

그런 다음 되돌아 가서 제가 지금 올라온이 목록에서 공포를 봅니다. 이것은 제가 지금 시작했을 때 어떤 방향으로 갈 것인지에 대한 것입니다.

  • Functional , 나는 현재 어떤 기능적 언어에 정통하지 않고 언어를 배우는 것이 좋은 방법이기 때문입니다. 직접 따르지 않는 경우 : 모든 것이 일정 합니다.
  • 나는 그것을 수용 할 수있는만큼 많은 유형 유추 로 채울 것이지만 인터페이스를 명시 적으로 지정하는 옵션으로 채 웁니다 . 다른 유형에 대해서는 확실하지 않습니다. 기본적 으로 모든 기능이 일반 으로 두 배가됩니다 .
  • 당신이 짐작할 수 있듯이, 인터페이스 ; 즉, 사용 가능한 작업에 대한 약속 만 제공하는 유형이 있습니다.
  • 내가 말할 수있는 한, 언어가 강력하거나 약한 유형인지 여부를 말하는 것은 그다지 의미가 없습니다. 나는 어떤 인터페이스가 구현하는 인터페이스를 절대 변경하지 않기 때문에 강력하게 유형이라고 부릅니다 .
  • 계약 지원에 의해 많은 디자인 이 필요합니다 . 다시 말하지만, 내가 할 수있는 한, 전제 조건과 사후 조건은 필수입니다. 함수형 프로그래밍에서 변이가 얼마나 중요한지 모르겠습니다.
  • 내가 그것을 보면서, 나는 당신이 공식적으로 정확성을 입증 하고 내가 거기에서 무엇을 선택할 수 있는지 볼 수있는 언어를 살펴볼 것입니다.
  • 나는 나가서 멋진 테스트 라이브러리를 작성합니다 . 내가 그것을 굉장하게 만들지 못하는 경우에도, 나는 그것이 모든 언어가 가져야 할 것으로 생각하기 때문에 적어도 그것에 많은 시간을 할애 할 것입니다.
  • 구문에 관해서는, 언어 중 하나를 것 상당한 공백을 파이썬처럼 많이 보이는 , 또는 그것이 될 것이다 로지 반을 기준으로 하고, 문법과 어휘를 많이 공유. 첫 번째 경우, 문법을 최대한 CFG에 가깝게 만들기 위해 최선을 다하겠습니다.
  • 언어를 구현 한 사람들이 사전에 언어를 컴파일하고, JIT하거나, 해석 하거나, 캠프 파이어에서 노래를 부르 거나, 대학생들에게 비용을 지불하도록할지 상관하지 않습니다. 내 구현은 아마도 인터프리터 또는 C 컴파일러로 시작하여 결국 JITter로 이동합니다.

언어를 구현하기 시작하면 이러한 상당히 넓은 지점조차도 빠르게 변경 될 수 있으므로 더 자세히 설명 할 필요가 없다고 생각합니다.


0

시간이 있으면 스칼라를 기반으로 하는 지역화 가능한 프로그래밍 언어를 디자인 하므로 XML을 제외한 대부분의 기능을 갖습니다. 저의 목표는 아랍어 (내 모국어)와 같이 영어와 다른 구조의 언어로 거의 자연스럽게 읽는 언어를 만드는 것입니다. 다음과 같은 기능을 생각하고 있습니다.

  • 전 처리기 #lang지시문으로, 전처리기에 프로그래밍에 사용되는 휴먼 언어를 알리는 데 사용됩니다. 예를 들어 : 대신 , 대신 #lang ar이라는 단어 فئة를 사용할 수 있습니다. 휴먼 언어 별 키워드는 표준 프리 프로세서 파일에 정의되어 있습니다.classعرفdef
  • 전처리 기는 코드에 명확성을 추가하는 것이 유일한 목적인 일부 선택적 키워드를 제거합니다. 예를 들어, 제거 할에서 "구성된다" class MyClass is composed of {되기 class MyClass {에 "로", 제거 def MyMethod(x: Int) as {가되는 def MyMethod(x: Int) {. 일부 (인간) 언어에서는 특히 학생의 경우 코드를 이해하기가 훨씬 쉽습니다.
  • 컴파일러는 속성 액세스에 접두사 표기법을 사용할 수 있습니다. 이것은 대부분의 라틴어 기반 언어 사용자에게는 의미가 없지만 다른 언어의 경우에는 완벽하게 이해됩니다. 예를 들어, 아랍어의 속성 액세스는 일반적으로와 같이 접두사 로 프로그래밍 영어 اعرض طول اسم محمد와 같습니다 print(length(name(Mohammad))). (괄호는 명확성을위한 것입니다.)

전처리 기와 컴파일러에 대한 이러한 최소한의 변화는 영어가 아닌 사람들에게 프로그래밍을 훨씬 간단하게 만들 것이라고 믿습니다.


5
Microsoft (및 그 이전의 일부)는 지역화 된 VBA 버전 (Visual Basic for Office 응용 프로그램)을 만들었습니다. 엉망이었습니다. 초보자, 청소년 및 영어가 아닌 사람들이 모국어로 코드를 읽는 것이 좋지만, 자국 이외의 사람들과 코드를 공유하는 것은 매우 어렵습니다. 인터넷 시대에 격리 작업은 그리 생산적이지 않습니다. 스칼라를 배우기 위해 프랑스어 자료 (블로그 기사, 서적 등)에만 의존해야한다면 (현재와 같이) 유용한 정보가 많이 없습니다. 도서관을 현지화하는 작업의 어려움 / 금액은 말할 것도없고 ...
PhiLho

1
@PhiLho : 당신 말이 맞아요. 그러나 그런 언어를 만드는 나의 주된 목적은 영어를 잘 못하는 K-12 학생과 노인을 포함하여 훨씬 더 많은 청중에게 프로그래밍을 소개 할 수 있도록하는 것입니다. 입문 수준에서는 외부 라이브러리를 사용할 필요가 없으며 일부 작은 라이브러리 (예 :)에 대해 현지화 된 래퍼를 만드는 print것은 아프지 않을 것입니다.
Hosam Aly

1
다른 요점은 많은 사람들이 이미 클래스와 메소드 이름에 모국어를 사용하고 있다는 것입니다. 키워드가 영어가 아닌 코드를 이해하기에 충분하지 않기 때문에 키워드가 영어로되어 있거나 다른 사람과 차이가있는 것은 아닙니다. 그럼에도 불구하고 전처리 기는 항상 키워드를 영어로 바꾸고 필요한 경우 다른 언어로 바꿀 수 있습니다.
Hosam Aly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.